This commit is contained in:
syngna_qiao 2024-11-20 10:46:04 +08:00
commit 97c336de32
137 changed files with 29497 additions and 0 deletions

View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query,obj) {
return request({
url: '/wms/barcode-creation/log',
method: 'post',
params: query,
data: obj
})
}
export function itemPage(query) {
return request({
url: '/wms/barcode-creation/item-page',
method: 'get',
params: query
})
}
export function boxTypePage(query) {
return request({
url: '/wms/barcode-creation/box-type-page',
method: 'get',
params: query
})
}
export function storageBinPage(query) {
return request({
url: '/wms/barcode-creation/storage-bin-page',
method: 'get',
params: query
})
}
export function save(obj) {
return request({
url: '/wms/barcode-creation',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,16 @@
import request from '@/router/axios'
export function getObjByInventoryId(inventoryId) {
return request({
url: '/wms/barCodeQuery/getObjByInventoryId/' + inventoryId,
method: 'get',
})
}
export function labelPrint(carrier) {
return request({
url: '/wms/barCodeQuery/labelPrint',
method: 'get',
params: carrier
})
}

View File

@ -0,0 +1,80 @@
import request from '@/router/axios'
export function fetchPageList(query) {
return request({
url: '/wms/carrier-bind-inventory/getBindPage',
method: 'get',
params: query
})
}
export function fetchList(query) {
return request({
url: '/wms/carrier-bind-inventory/getBindList',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/carrier-bind-inventory',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/carrier-bind-inventory/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/carrier-bind-inventory/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/carrier-bind-inventory',
method: 'put',
data: obj
})
}
//通过id查询载具库存绑定表,扫描主条码
export function getBindList(carrier) {
return request({
url: '/wms/carrier-member/getBindList/' + carrier,
method: 'get',
})
}
//扫描子条码
export function getItem(carrierOrInventory) {
return request({
url: '/wms/carrier-member/getItem/' + carrierOrInventory,
method: 'get',
})
}
//绑定
export function bind(obj) {
return request({
url: '/wms/carrier-member/bind',
method: 'post',
data: obj
})
}
export function getBindListByTray(carrier) {
return request({
url: '/wms/carrier-member/getBindListByTray/' + carrier,
method: 'get',
})
}

View File

@ -0,0 +1,95 @@
import request from '@/router/axios'
export function fetchPageList(query) {
return request({
url: '/wms/carrier-bind-inventory/getBindPage',
method: 'get',
params: query
})
}
export function fetchList(query) {
return request({
url: '/wms/carrier-bind-inventory/getBindList',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/carrier-bind-inventory',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/carrier-bind-inventory/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/carrier-bind-inventory/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/carrier-bind-inventory',
method: 'put',
data: obj
})
}
//通过id查询载具库存绑定表,扫描主条码
export function getBindList(carrier) {
return request({
url: '/wms/carrier-member/getBindList/' + carrier,
method: 'get',
})
}
//扫描子条码
export function getItem(carrierOrInventory) {
return request({
url: '/wms/carrier-member/getItem/' + carrierOrInventory,
method: 'get',
})
}
//解绑
export function unbind(obj) {
return request({
url: '/wms/carrier-member/unbind',
method: 'post',
data: obj
})
}
export function getCarrier(query) {
return request({
url: '/wms/carrier/getCarrier',
method: 'get',
params: query
})
}
export function getBindListByTray(carrier) {
return request({
url: '/wms/carrier-member/getBindListByTray/' + carrier,
method: 'get',
})
}
export function confirmUnBind(obj) {
return request({
url: '/wms/carrier/confirmUnBind',
method: 'post',
data: obj
})
}

48
src/api/wms/carrier.js Normal file
View File

@ -0,0 +1,48 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/carrier/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/carrier',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/carrier/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/carrier/' + id,
method: 'delete'
})
}
export function labelPrint(printList, printer) {
return request({
url: '/wms/carrier/by-labelRePrint',
method: 'post',
data: printList
})
}
export function putObj(obj) {
return request({
url: '/wms/carrier',
method: 'put',
data: obj
})
}

View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/carriertype/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/carriertype',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/carriertype/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/carriertype/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/carriertype',
method: 'put',
data: obj
})
}

View File

@ -0,0 +1,10 @@
import request from '@/router/axios'
//一键下架
export function unShelve(storageLocation) {
return request({
url: '/wms/storage-bin-bind-inventory/unbindByStorageLocation?storageLocation=' + storageLocation,
method: 'post',
})
}

View File

@ -0,0 +1,17 @@
import request from '@/router/axios'
export function page(query) {
return request({
url: '/wms/complexReport/page',
method: 'get',
params: query
})
}
export function list(query) {
return request({
url: '/wms/complexReport/list',
method: 'get',
params: query
})
}

View File

@ -0,0 +1,57 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getInventoryOriginalQty(obj) {
return request({
url: '/wms/document/getInventoryOriginalQty',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit',
method: 'post',
data: obj
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}
export function oneClickPassValidate(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit/oneClickPassValidate',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,48 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getInventoryOriginalQty(obj) {
return request({
url: '/wms/document/getInventoryOriginalQty',
method: 'get',
params: obj
})
}
//提交
export function returnSubmit(obj) {
return request({
url: '/wms/document/returnSubmit',
method: 'post',
data: obj
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
export function rejectDocumentByNo(documentNo) {
return request({
url: '/wms/document/rejectDocumentByNo?documentNo=' + documentNo,
method: 'post'
})
}

39
src/api/wms/customer.js Normal file
View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/customer/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/customer',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/customer/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/customer/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/customer',
method: 'put',
data: obj
})
}

53
src/api/wms/data-field.js Normal file
View File

@ -0,0 +1,53 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/mes-core/data-field/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/mes-core/data-field',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/mes-core/data-field/' + id,
method: 'get'
})
}
export function getByCode(code) {
return request({
url: '/mes-core/data-field/by-code?code=' + code,
method: 'get'
})
}
export function delByCode(code) {
return request({
url: '/mes-core/data-field/delete-by-code?code=' + code,
method: 'delete'
})
}
export function delObj(id) {
return request({
url: '/mes-core/data-field/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/mes-core/data-field',
method: 'put',
data: obj
})
}

25
src/api/wms/dn-order.js Normal file
View File

@ -0,0 +1,25 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/dn-order/page',
method: 'get',
params: query
})
}
export function selectDetailByID(query) {
return request({
url: '/wms/dn-order/selectDetailByID',
method: 'get',
params: query
})
}
export function updateDetailBatchById(param) {
return request({
url: '/wms/dn-order/updateDetailBatchById',
method: 'put',
data: param
})
}

View File

@ -0,0 +1,31 @@
import request from '@/router/axios'
export function pageForCancel(query) {
return request({
url: '/wms/document/detail/pageForCancel',
method: 'get',
params: query
})
}
export function cancelCloseDocument(documentNo) {
return request({
url: '/wms/document/cancelCloseDocument',
method: 'post',
data: documentNo,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
}
export function saleReturnCancel(documentNo) {
return request({
url: '/wms/document/saleReturn/cancel',
method: 'post',
data: documentNo,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
}

View File

@ -0,0 +1,23 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
//提交
export function submit(documentNo) {
return request({
url: '/wms/document/closeDocumentByNo?documentNo=' + documentNo,
method: 'post'
})
}

View File

@ -0,0 +1,131 @@
import request from '@/router/axios'
export function getOperationRules(site,activityId) {
return request({
url: '/wms/document/operationRules/'+site+'/'+activityId,
method: 'get'
})
}
export function getCWarehouse(site) {
return request({
url: '/wms/document/getCWarehouse/'+site,
method: 'get'
})
}
export function getWarehouse(site) {
return request({
url: '/wms/document/getWarehouse/'+site,
method: 'get'
})
}
export function getRetrieve(current,size,obj) {
return request({
url: '/wms/document/getRetrieve/'+current+'/'+size,
method: 'post',
data: obj
})
}
export function saveOrUpdate(obj) {
return request({
url: '/wms/document/save',
method: 'post',
data: obj
})
}
export function submit(obj) {
return request({
url: '/wms/document/submit',
method: 'post',
data: obj
})
}
export function cancel(obj) {
return request({
url: '/wms/document/cancel',
method: 'post',
data: obj
})
}
export function reject(obj) {
return request({
url: '/wms/document/reject',
method: 'post',
data: obj
})
}
export function itemDialog(obj) {
return request({
url: '/wms/document/item/page',
method: 'get',
params: obj
})
}
export function itemDialogs(obj) {
return request({
url: '/wms/document/item/pages',
method: 'get',
params: obj
})
}
export function itemCustomFieldDialog(obj) {
return request({
url: '/wms/document/item/itemPage',
method: 'get',
params: obj
})
}
export function getItem(obj) {
return request({
url: '/wms/document/item',
method: 'get',
params: obj
})
}
export function documentDialog(query) {
return request({
url: '/wms/document/getDocumentList',
method: 'get',
params:query
})
}
export function userCheck(param) {
return request({
url: '/wms/document/userCheck/'+param +'/STORES_RETURNED',
method: 'get',
})
}
export function getDetails(site,documentNo,seq,item) {
return request({
url: '/wms/document/selectSfc/'+site+'/'+documentNo+'/'+seq + '/' + item,
method: 'get',
})
}
export function getOaProjectCode(params) {
return request({
url: '/mom-mes-nei/cust-data-field-list/page',
method: 'get',
params:params
})
}
export function fertItemPage(obj) {
return request({
url: '/wms/document/item/fertItemPage',
method: 'get',
params: obj
})
}
export function validateImport(obj) {
return request({
url: '/wms/document/validateImport',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,41 @@
import request from '@/router/axios';
export function fetchList(query) {
return request({
url: '/wms/false-warehoursing/page',
method: 'get',
params: query
})
}
export function fetchList2(query) {
return request({
url: '/wms/false-warehoursing/page2',
method: 'get',
params: query
})
}
export function transfer(obj) {
return request({
url: '/wms/false-warehoursing/transfer/',
method: 'post',
data: obj
});
}
export function transIn(obj) {
return request({
url: '/wms/false-warehoursing/transIn',
method: 'post',
data: obj
});
}
export function transOut(obj) {
return request({
url: '/wms/false-warehoursing/transOut',
method: 'put',
data: obj
});
}

View File

@ -0,0 +1,49 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//成品提交
export function submit(obj) {
return request({
url: '/wms/document/finishedProductsWarehouseSubmit',
method: 'post',
data: obj
})
}
//成品查询数量
export function getFinishedProductQty(obj) {
return request({
url: '/wms/document/getFinishedProductQty',
method: 'get',
params: obj
})
}
export function rejectDocumentByNo(documentNo) {
return request({
url: '/wms/document/rejectDocumentByNo?documentNo=' + documentNo,
method: 'post'
})
}

View File

@ -0,0 +1,42 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/finishedProductsPurchaseSubmit',
method: 'post',
data: obj
})
}
export function getFinishedProductsPurchaseQty(obj) {
return request({
url: '/wms/document/getFinishedProductsPurchaseQty',
method: 'get',
params: obj
})
}

View File

@ -0,0 +1,42 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/transferSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}

View File

@ -0,0 +1,25 @@
import request from '@/router/axios'
export function scanCode(query) {
return request({
url: '/wms/inventory-group/scanCode',
method: 'get',
params: query
})
}
export function bindGroup(obj) {
return request({
url: '/wms/inventory-group/bindGroup',
method: 'post',
data: obj
})
}
export function unBindGroup(obj) {
return request({
url: '/wms/inventory-group/unBindGroup',
method: 'delete',
data: obj
})
}

View File

@ -0,0 +1,24 @@
import request from '@/router/axios'
export function getInventoryList(inventoryIdOrCarrier) {
return request({
url: '/wms/carrier-member/getInventoryList/'+inventoryIdOrCarrier,
method: 'get',
})
}
export function freeze(obj) {
return request({
url: '/wms/wms-inventory/freeze',
method: 'post',
data: obj
})
}
export function unfreeze(obj) {
return request({
url: '/wms/wms-inventory/unfreeze',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,53 @@
import request from '@/router/axios'
//执行移动
export function moveInventory(obj) {
return request({
url: '/wms/storage-bin-bind-inventory/inventoryTransfer',
method: 'post',
data: obj
})
}
export function getInventoryQtyNewPassBox(params) {
return request({
url: '/wms/document/getInventoryQtyNewPassBox',
method: 'post',
data: params
})
}
//获取是包材的物料
export function fetchKmatItemList(query) {
return request({
url: '/wms/storage-bin-bind-inventory/fetchKmatItemList',
method: 'get',
params: query
})
}
//根据来源位置和物料查询库存
export function getKmatInventoryQty(storageLocation, item) {
return request({
url: '/wms/storage-bin-bind-inventory/getKmatInventoryQty?storageLocation=' + storageLocation + '&&item=' + item,
method: 'get',
})
}
//执行移动
export function inventoryTransferForKmat(obj) {
return request({
url: '/wms/storage-bin-bind-inventory/inventoryTransferForKmat',
method: 'post',
data: obj
})
}
//获取全区条码和托
export function selectAllByStorageLocation(query) {
return request({
url: '/wms/storage-bin-bind-inventory/selectAllByStorageLocation',
method: 'get',
params: query
})
}

117
src/api/wms/inventory.js Normal file
View File

@ -0,0 +1,117 @@
import request from '@/router/axios';
export function fetchList(query) {
return request({
url: '/wms/wms-inventory/page',
method: 'get',
params: query
});
}
export function fetchDtoList(query) {
return request({
url: '/wms/wms-inventory/getInventoryDtoPage',
method: 'get',
params: query
});
}
export function fetchDtoListByCarrier(query) {
return request({
url: '/wms/wms-inventory/getInventoryDtoPageByCarrier',
method: 'get',
params: query
});
}
export function inventoryDto(query) {
return request({
url: '/wms/wms-inventory/inventoryDto',
method: 'get',
params: query
});
}
export function addObj(obj) {
return request({
url: '/wms/inventory',
method: 'post',
data: obj
});
}
export function getObj(id) {
return request({
url: '/wms/wms-inventory/' + id,
method: 'get'
});
}
export function getByCode(code) {
return request({
url: '/wms/wms-inventory/by-code?code=' + code,
method: 'get'
});
}
export function delByCode(code) {
return request({
url: '/wms/wms-inventory/delete-by-code?code=' + code,
method: 'delete'
});
}
export function delObj(id) {
return request({
url: '/wms/wms-inventory/' + id,
method: 'delete'
});
}
export function putObj(obj) {
return request({
url: '/wms/wms-inventory',
method: 'put',
data: obj
});
}
export function splitInventory(obj) {
return request({
url: '/wms/wms-inventory/splitInventory',
method: 'post',
data: obj
});
}
export function mergeInventory(obj) {
return request({
url: '/wms/wms-inventory/mergeInventory',
method: 'post',
data: obj
});
}
export function selectForSplit(query) {
return request({
url: '/wms/wms-inventory/selectForSplit',
method: 'get',
params: query
});
}
export function selectForStocktaking(query) {
return request({
url: '/wms/wms-inventory/selectForStocktaking',
method: 'get',
params: query
});
}
export function inventoryStocktaking(obj) {
return request({
url: '/wms/wms-inventory/inventoryStocktaking',
method: 'post',
data: obj
});
}

View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/item-safe-inventory/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/item-safe-inventory',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/item-safe-inventory/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/item-safe-inventory/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/item-safe-inventory',
method: 'put',
data: obj
})
}

View File

@ -0,0 +1,31 @@
import request from '@/router/axios'
export function operationOPType(operation,shopOrder) {
return request({
url: '/wms/z-knives-entry/operationOPType/' + operation + "/" + shopOrder,
method: 'get'
})
}
export function reprint(param) {
return request({
url: '/wms/picking/reprint',
method: 'post',
data: param
})
}
export function deleteKnivesEntry(param) {
return request({
url: '/wms/z-knives-entry/deleteKnivesEntry',
method: 'post',
data: param
})
}
export function select(param) {
return request({
url: '/wms/picking/select',
method: 'get',
params: param
})
}

View File

@ -0,0 +1,49 @@
import request from '@/router/axios'
export function pageForNoEntity(query) {
return request({
url: '/wms/document/detail/pageForNoEntity',
method: 'get',
params: query
})
}
export function noEntityPost(obj) {
return request({
url: '/wms/document/noEntity/post',
method: 'post',
data: obj,
})
}
export function noEntityPostCancel(obj) {
return request({
url: '/wms/document/noEntity/cancel',
method: 'post',
data: obj,
})
}
export function noEntityPickingPost(documentNo) {
return request({
url: '/wms/picking/noEntity/post',
method: 'post',
data: documentNo,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
}
export function noEntityPickingPostCancel(documentNo) {
return request({
url: '/wms/picking/noEntity/cancel',
method: 'post',
data: documentNo,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
}

View File

@ -0,0 +1,42 @@
import request from '@/router/axios'
export function fetchNextNumberList(query) {
return request({
url: '/wms/wms-numbering-rule',
method: 'get',
params: query
})
}
export function getObj(obj) {
return request({
url: '/wms/wms-numbering-rule/doRetrieve',
method: 'post',
data: obj
})
}
export function addObj(obj) {
return request({
url: '/wms/wms-numbering-rule',
method: 'post',
data: obj
})
}
export function putObj(obj) {
return request({
url: '/wms/wms-numbering-rule',
method: 'put',
data: obj
})
}
export function delObj(query) {
return request({
url: '/wms/wms-numbering-rule',
method: 'delete',
params: query
})
}

View File

@ -0,0 +1,49 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}
export function getInventoryQtyNewOnlyTray(params) {
return request({
url: '/wms/document/getInventoryQtyNewOnlyTray',
method: 'post',
data: params
})
}

58
src/api/wms/picking.js Normal file
View File

@ -0,0 +1,58 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getPickInventory(obj) {
return request({
url: '/wms/picking/getPickInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/pickingSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/picking/getInventoryQty',
method: 'get',
params: obj
})
}
//清楚记录
export function pickingRemove(obj) {
return request({
url: '/wms/picking/pickingRemove',
method: 'post',
data: obj
})
}
//暂存记录
export function saveTempPicking(obj) {
return request({
url: '/wms/picking/saveTempPicking',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,74 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(params) {
return request({
url: '/wms/document/getInventoryQty',
method: 'post',
data: params
})
}
export function getInventoryQtyNew(params) {
return request({
url: '/wms/document/getInventoryQtyNew',
method: 'post',
data: params
})
}
export function checkFiFo(params) {
return request({
url: '/wms/document/checkFiFo',
method: 'post',
data: params
})
}
export function getPickingInventoryQty(params) {
return request({
url: '/wms/document/getPickingInventoryQty',
method: 'post',
data: params
})
}
//提交
export function submitFreePostDate(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit/freePostDate',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,50 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//成品提交
export function submit(obj) {
return request({
url: '/wms/document/finishedProductsWarehouseSubmit',
method: 'post',
data: obj
})
}
//成品查询数量
export function getFinishedProductQty(obj) {
return request({
url: '/wms/document/getFinishedProductQty',
method: 'get',
params: obj
})
}
export function rejectDocumentByNo(documentNo) {
return request({
url: '/wms/document/rejectDocumentByNo?documentNo=' + documentNo,
method: 'post'
})
}

View File

@ -0,0 +1,49 @@
import request from '@/router/axios'
export function pagePurchaseInToStorageReg(query) {
return request({
url: '/wms/document/purchase/pagePurchaseInToStorageReg',
method: 'get',
params: query
})
}
export function selectPoDetail(query) {
return request({
url: '/wms/po-order/selectPoDetail',
method: 'get',
params: query
})
}
export function registeSubmit(obj) {
return request({
url: '/wms/document/purchase/registerSubmit',
method: 'post',
data: obj
})
}
export function selectPoWithDocumentDetail(query) {
return request({
url: '/wms/po-order/selectPoWithDocumentDetail',
method: 'get',
params: query
})
}
export function pagePoOrder(query) {
return request({
url: '/wms/po-order/page',
method: 'get',
params: query
})
}
export function registerCancel(obj) {
return request({
url: '/wms/document/purchase/registerCancel',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,50 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/procurementStorageSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}
export function getDdvanceBindQtyOnlyTray(params) {
return request({
url: '/wms/document-advance-bind/scanCodeOnlyTray',
method: 'get',
params: params
})
}

View File

@ -0,0 +1,42 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}

View File

@ -0,0 +1,49 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getInventoryOriginalQty(obj) {
return request({
url: '/wms/document/getInventoryOriginalQty',
method: 'get',
params: obj
})
}
//提交
export function returnSubmit(obj) {
return request({
url: '/wms/document/returnSubmit',
method: 'post',
data: obj
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
export function rejectDocumentByNo(documentNo) {
return request({
url: '/wms/document/rejectDocumentByNo?documentNo=' + documentNo,
method: 'post'
})
}

View File

@ -0,0 +1,85 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}
//退货提交
export function submit(obj) {
return request({
url: '/wms/document/saleReturn/submit',
method: 'post',
data: obj
})
}
//扫描箱条码
export function getSaleOutQty(obj) {
return request({
url: '/wms/document/getSaleOutQty',
method: 'get',
params: obj
})
}
//展开时扫描箱条码
export function getSaleInventoryId(carrier) {
return request({
url: '/wms/document/getSaleInventoryId?carrier=' + carrier,
method: 'get',
})
}
//扫描卷条码
export function getInventoryOriginalQty(obj) {
return request({
url: '/wms/document/getInventoryOriginalQty',
method: 'get',
params: obj
})
}
export function getDdvanceBindQty(params) {
return request({
url: '/wms/document-advance-bind/scanCode',
method: 'get',
params: params
})
}
export function noInventorySubmit(obj) {
return request({
url: '/wms/document/saleReturn/noInventorySubmit',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/role-area-bind/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/role-area-bind',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/role-area-bind/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/role-area-bind/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/role-area-bind',
method: 'put',
data: obj
})
}

View File

@ -0,0 +1,72 @@
import request from '@/router/axios'
export function selectSaleOutDetail(query) {
return request({
url: '/wms/picking/saleOut/selectSaleOutDetail',
method: 'get',
params: query
})
}
export function selectPickingSuggest(query) {
return request({
url: '/wms/picking/selectPickingSuggest',
method: 'get',
params: query
})
}
export function pickingPrint(obj) {
return request({
url: '/wms/picking/print',
method: 'post',
data: obj
})
}
export function pickingPost(documentNo) {
return request({
url: `/wms/picking/post`,
method: 'post',
data: documentNo,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
}
export function saleOutPost(obj) {
return request({
url: `/wms/picking/saleOut/post`,
method: 'post',
data: obj,
})
}
export function pickingPostCancel(documentNo) {
return request({
url: `/wms/picking/cancel`,
method: 'post',
data: documentNo,
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
}
export function saleOutPostCancel(obj) {
return request({
url: `/wms/picking/saleOut/cancel`,
method: 'post',
data: obj,
})
}
export function pickingPrintA4(obj) {
return request({
url: '/wms/picking/print/a4',
method: 'post',
data: obj
})
}

View File

@ -0,0 +1,42 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}

42
src/api/wms/scrap.js Normal file
View File

@ -0,0 +1,42 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/document/productionRequisition/page',
method: 'get',
params: query
})
}
export function getDocumentDetail(documentNo) {
return request({
url: '/wms/document/' + documentNo,
method: 'get',
})
}
export function getItemInventory(obj) {
return request({
url: '/wms/document/getItemInventory',
method: 'get',
params: obj
})
}
//提交
export function submit(obj) {
return request({
url: '/wms/document/productionRequisitionSubmit',
method: 'post',
data: obj
})
}
export function getInventoryQty(obj) {
return request({
url: '/wms/document/getInventoryQty',
method: 'get',
params: obj
})
}

View File

@ -0,0 +1,40 @@
import request from "@/router/axios";
export function fetchErpStorageLocationList(query) {
return request({
url: '/wms/shelf-management/erp-storage-location',
method: 'get',
params: query
})
}
export function fetchStorageLocationList(query) {
return request({
url: '/wms/shelf-management/storage-location',
method: 'get',
params: query
})
}
export function fetchStorageBinList(query) {
return request({
url: '/wms/shelf-management/storage-bin',
method: 'get',
params: query
})
}
export function getStorageLocationData(query) {
return request({
url: '/wms/shelf-management/storage-location-data',
method: 'get',
params: query
})
}
export function getStorageBinData(query) {
return request({
url: '/wms/shelf-management/storage-bin-data',
method: 'get',
params: query
})
}

32
src/api/wms/shelves.js Normal file
View File

@ -0,0 +1,32 @@
import request from '@/router/axios'
//上架功能
export function upObj(obj) {
return request({
url: '/wms/storage-bin-bind-inventory/upDefault',
method: 'post',
data: obj
})
}
//查询已上架的托条码(根据货架和货格号)
export function getCarrierList(storageBin) {
return request({
url: '/wms/storage-bin-bind-inventory/getCarrierList?storageBin=' + storageBin,
method: 'get',
})
}
//上架操作时扫描托条码
export function getUpCarrier(carrier) {
return request({
url: '/wms/storage-bin-bind-inventory/getInDefaultCarrier/' + carrier,
method: 'get'
})
}

View File

@ -0,0 +1,65 @@
import request from "@/router/axios";
export function getFreezeList(query) {
return request({
url: '/wms/wms-inventory/getFreezeList',
method: 'get',
params: query
})
}
export function freeze(obj) {
return request({
url: '/wms/wms-inventory/freeze',
method: 'post',
data: obj
})
}
export function unfreeze(obj) {
return request({
url: '/wms/wms-inventory/unfreeze',
method: 'post',
data: obj
})
}
export function fetchErpStorageLocationList(query) {
return request({
url: '/wms/shelf-management/erp-storage-location',
method: 'get',
params: query
})
}
export function fetchItemList(query) {
return request({
url: '/wms/wms-inventory/fetchItemList',
method: 'get',
params: query
})
}
export function fetchItemGroesList(query) {
return request({
url: '/wms/wms-inventory/fetchItemGroesList',
method: 'get',
params: query
})
}
export function fetchCarrierList(query) {
return request({
url: '/wms/carrier/page',
method: 'get',
params: query
})
}
export function pageFreezeList(query) {
return request({
url: '/wms/wms-inventory/pageFreezeList',
method: 'get',
params: query
})
}

View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/storage-location-type/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/storage-location-type',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/storage-location-type/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/storage-location-type/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/storage-location-type',
method: 'put',
data: obj
})
}

View File

@ -0,0 +1,80 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/wms-storage-location/page',
method: 'get',
params: query
})
}
export function getStorageLocationPageBycode(str) {
return request({
url: '/wms/wms-storage-location/getStorageLocationPageBycode',
method: 'get',
params: str
})
}
export function addObj(obj) {
return request({
url: '/wms/wms-storage-location',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/wms-storage-location/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/wms-storage-location/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/wms-storage-location',
method: 'put',
data: obj
})
}
export function labelPrint(printList) {
return request({
url: '/wms/wms-storage-location/by-labelRePrint',
method: 'post',
data: printList
})
}
export function getStorageBin(storageLocation) {
return request({
url: '/wms/wms-storage-location/getStorageBin/' + storageLocation,
method: 'get'
})
}
export function updateBatchById(obj) {
return request({
url: '/wms/wms-storage-location/updateBatchById',
method: 'put',
data: obj
})
}
export function getDefaultLocationsMap(erpStorageLocationList) {
return request({
url: '/wms/wms-storage-location/getDefaultLocationsMap/',
method: 'get',
params: {
erpStorageLocationList: erpStorageLocationList
}
});
}

View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/storagebin-type/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/storagebin-type',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/storagebin-type/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/storagebin-type/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/storagebin-type',
method: 'put',
data: obj
})
}

62
src/api/wms/storagebin.js Normal file
View File

@ -0,0 +1,62 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/wms-storagebin/page',
method: 'get',
params: query
})
}
export function labelPrint(printList, printer) {
return request({
url: '/wms/wms-storagebin/by-labelRePrint',
method: 'post',
data: printList
})
}
export function addObj(obj) {
return request({
url: '/wms/wms-storagebin',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/wms-storagebin/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/wms-storagebin/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/wms-storagebin',
method: 'put',
data: obj
})
}
export function getStorageLocationByStorageBin(storageBin) {
return request({
url: '/wms/wms-storagebin/getStorageLocationByStorageBin/' + storageBin,
method: 'get'
})
}
export function updateBatchById(obj) {
return request({
url: '/wms/wms-storagebin/updateBatchById',
method: 'put',
data: obj
})
}

View File

@ -0,0 +1,9 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/wms-temp-inventory/page',
method: 'get',
params: query
})
}

29
src/api/wms/unShelve.js Normal file
View File

@ -0,0 +1,29 @@
import request from '@/router/axios'
//下架功能
export function downObj(obj) {
return request({
url: '/wms/storage-bin-bind-inventory/downDefault',
method: 'post',
data: obj
})
}
//查询已上架的托条码(根据货架和货格号)
export function getCarrierList(storageBin) {
return request({
url: '/wms/storage-bin-bind-inventory/getCarrierList?storageBin=' + storageBin,
method: 'get',
})
}
//下架操作时扫描托条码(需要返回货架和货格号)
export function getNotInDefaultCarrier(carrier) {
return request({
url: '/wms/storage-bin-bind-inventory/getNotInDefaultCarrier/' + carrier,
method: 'get'
})
}

48
src/api/wms/up-down.js Normal file
View File

@ -0,0 +1,48 @@
import request from '@/router/axios'
//上架功能
export function upObj(obj) {
return request({
url: '/wms/storage-bin-bind-inventory/up',
method: 'post',
data: obj
})
}
//下架功能
export function downObj(obj) {
return request({
url: '/wms/storage-bin-bind-inventory/down',
method: 'post',
data: obj
})
}
//查询已上架的托条码(根据货架和货格号)
export function getCarrierList(storageBin) {
return request({
url: '/wms/storage-bin-bind-inventory/getCarrierList?storageBin=' + storageBin,
method: 'get',
})
}
//上架操作时扫描托条码
export function getUpCarrier(carrier) {
return request({
url: '/wms/storage-bin-bind-inventory/getUpCarrier/' + carrier,
method: 'get'
})
}
//下架操作时扫描托条码(需要返回货架和货格号)
export function getDownCarrier(carrier) {
return request({
url: '/wms/storage-bin-bind-inventory/getDownCarrier/' + carrier,
method: 'get'
})
}

18
src/api/wms/vendor.js Normal file
View File

@ -0,0 +1,18 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/vendor/page',
method: 'get',
params: query
})
}
export function pageText(query) {
return request({
url: '/wms/vendor/pageText',
method: 'get',
params: query
})
}

39
src/api/wms/warehouse.js Normal file
View File

@ -0,0 +1,39 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/wms-warehouse/page',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/wms-warehouse',
method: 'post',
data: obj
})
}
export function getObj(id) {
return request({
url: '/wms/wms-warehouse/' + id,
method: 'get'
})
}
export function delObj(id) {
return request({
url: '/wms/wms-warehouse/' + id,
method: 'delete'
})
}
export function putObj(obj) {
return request({
url: '/wms/wms-warehouse',
method: 'put',
data: obj
})
}

View File

@ -0,0 +1,75 @@
import request from '@/router/axios'
export function fetchList(query) {
return request({
url: '/wms/wms-inventory-check/page',
method: 'get',
params: query
})
}
export function fetchErpStorageLocationList(query) {
return request({
url: '/wms/wms-inventory-check/storageLocationPage',
method: 'get',
params: query
})
}
export function addObj(obj) {
return request({
url: '/wms/wms-inventory-check',
method: 'post',
data: obj
})
}
export function putObj(obj) {
return request({
url: '/wms/wms-inventory-check',
method: 'put',
data: obj
})
}
export function fetchinventoryCheckDetailList(query) {
return request({
url: '/wms/wms-inventory-check/inventoryCheckDetailpage',
method: 'get',
params: query
})
}
export function selectInventoryCheck(obj,params) {
return request({
url: '/wms/wms-inventory-check/select',
method: 'post',
data: obj,
params: params
})
}
export function selectIdCode(checkNo, erpStorageLocation, carrier1, carrier2, inventoryId) {
return request({
url: '/wms/wms-inventory-check/selectId?checkNo=' + checkNo + "&erpStorageLocation=" + erpStorageLocation + "&carrier1=" + carrier1 + "&carrier2=" + carrier2 + "&inventoryId=" + inventoryId,
method: 'get'
})
}
export function selectCheckNoSummary(obj,params) {
return request({
url: '/wms/wms-inventory-check/selectCheckNoSummary',
method: 'post',
data: obj,
params: params
})
}
export function doComplete(checkNo) {
return request({
url: '/wms/wms-inventory-check/doComplete?checkNo=' + checkNo,
method: 'get'
})
}

View File

@ -0,0 +1,48 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"editDisabled": true,
"label": "载具",
"prop": "carrier",
"span": 12,
"required": true,
"rules": [{
"message": "请输入载具",
"required": true
}]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
},
{
"type": "input",
"search": true,
"label": "载具类型",
"prop": "carrierType",
"span": 12,
"required": true,
"rules": [{
"message": "请输入载具类型",
"required": true
}]
},
{
"type": "input",
"label": "状态",
"prop": "status",
"span": 12
}
]
}

View File

@ -0,0 +1,44 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"label": "载具类型",
"prop": "carrierType",
"span": 12,
"required": true,
"rules": [{
"message": "请输入载具类型",
"required": true
}]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
},
{
"type": "switch",
"label": "可否混料",
"prop": "mixItem",
"span": 12,
dicData: [{
label: '否',
value: "N"
},
{
label: '是',
value: "Y"
}],
value: "N"
}
]
}

View File

@ -0,0 +1,25 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"menu":false,
"column": [
{
"type": "input",
"label": "客户",
"prop": "customer",
"span": 12,
"search": true
},
{
"type": "input",
"label": "客户名称",
"prop": "customerName",
"span": 12
}
]
}

View File

@ -0,0 +1,134 @@
export const formatterConst = {
"innerState": {
"SAVE": "保存",
"SUBMIT": "提交",
"CLOSE": "关闭",
"CANCEL": "取消",
"POST": "过账"
},
"podStatus": {
"A": '未POD确认',
"C": '已POD确认'
}
};
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"menu": false,
"searchLabelWidth": 110,
"column": [
{
"type": "input",
"label": "操作",
"prop": "handle",
"span": 12
},
{
"type": "input",
"label": "销售组织",
"prop": "salesOrganization",
"span": 12
},
{
"search": true,
"type": "input",
"label": "DN单号",
"prop": "dnNumber",
"span": 12
},
{
"type": "input",
"label": "交货类型",
"prop": "deliveryType",
"span": 12
},
{
"type": "input",
"label": "项目类别",
"prop": "projectType",
"span": 12
},
{
"search": true,
"type": "input",
"label": "内部单号",
"prop": "innerOrder",
"span": 12
},
{
"type": "input",
"label": "到货单状态",
"prop": "innerState",
"span": 12,
formatter: (val, value, label) => {
return formatterConst.innerState[value];
},
},
{
"search": true,
"type": "input",
"label": "下单日期",
"prop": "deliveryDate",
"span": 12
},
{
"type": "input",
"label": "POD状态",
"prop": "podStatus",
"span": 12,
formatter: (val, value, label) => {
return formatterConst.podStatus[value];
},
},
{
"search": true,
"type": "input",
"label": "客户编码",
"prop": "customerCode",
"span": 12
},
{
"type": "input",
"label": "送达方",
"prop": "deliveryParty",
"span": 12
},
{
"type": "input",
"label": "送达方地址",
"prop": "deliveryPartyAddressd",
"span": 12
},
{
"type": "input",
"label": "联系人及联系方式",
"prop": "contact",
"span": 12
},
{
"type": "input",
"label": "计划发货日期",
"prop": "deliveryPlanDate",
"span": 12,
"search": true,
},
{
"type": "input",
"label": "备注",
"prop": "dnRemarks",
"span": 12
},
{
"type": "input",
"label": "外仓",
"prop": "extWarehourseRemarks",
"span": 12
},
]
};

View File

@ -0,0 +1,85 @@
export const formatterConst = {
"state": {
"SAVE": "保存",
"SUBMIT": "提交",
"CLOSE": "关闭",
"CANCEL": "取消",
},
"documentType": {
"PURCHASE_RETURN": "采购退货",
"COST_CENTER_RECEIVE": "成本中心领料",
"SALES_RETURN": "销售退货",
"SCRAP_OUT": "报废出库",
"OUTSOURCING": "委外",
},
};
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"menu": false,
"searchLabelWidth": 110,
"column": [
{
"type": "input",
"label": "内部单号",
"prop": "documentNo",
"span": 12,
"search":true
},
{
"type": "input",
"label": "内部类型",
"prop": "documentType",
"span": 12
},
{
"type": "input",
"label": "单据状态",
"prop": "state",
"span": 12
},
{
"type": "input",
"label": "物料",
"prop": "item",
"span": 12
},
{
"type": "input",
"label": "物料描述",
"prop": "itemDescription",
"span": 12
},
{
"type": "input",
"label": "数量",
"prop": "actualQuantity",
"span": 12
},
{
"type": "input",
"label": "单位",
"prop": "unitOfMeasure",
"span": 12
},
{
"type": "input",
"label": "来源仓",
"prop": "sourceWarehouse",
"span": 12
},
{
"type": "input",
"label": "目标仓",
"prop": "targetWarehouse",
"span": 12
},
]
};

View File

@ -0,0 +1,72 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"label": "物料",
"prop": "item",
"span": 12,
"formslot":true,
"search": true
},
{
"type": "input",
"label": "物料描述",
"prop": "itemDescription",
"span": 12
},
{
"type": "number",
"label": "安全库存数量",
"prop": "safeQty",
"span": 12,
"min": 0,
"rules": [{
"message": "请输入安全库存数量",
"required": true
}]
},
{
"type": "number",
"label": "预警数量",
"prop": "almQty",
"span": 12,
"min": 0,
"rules": [{
"message": "请输入安全库存数量",
"required": true
}]
},
{
"type": "select",
"label": "是否预警",
"prop": "almFlag",
"span": 12,
"search": true,
"dicData": [
{
"label": '是',
"value": true
},
{
"label": '否',
"value": false
}
],
"searchValue": true,
"value": true
},
{
"type": "input",
"label": "采购周期",
"prop": "purchaseCycle",
"span": 12
}
]
}

View File

@ -0,0 +1,91 @@
export const formatterConst = {
"state": {
"SAVE": "保存",
"SUBMIT": "提交",
"CLOSE": "关闭",
"CANCEL": "取消",
},
"documentType": {
"PURCHASE_RETURN": "采购退货",
"COST_CENTER_RECEIVE": "成本中心领料",
"SALES_RETURN": "销售退货",
"SCRAP_OUT": "报废出库",
"OUTSOURCING": "委外",
},
};
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 10,
"menu": false,
"searchLabelWidth": 110,
"column": [
{
"type": "input",
"label": "内部单号",
"prop": "documentNo",
"span": 12,
"search":true
},
{
"type": "input",
"label": "内部类型",
"prop": "documentType",
"span": 12
},
{
"type": "input",
"label": "单据状态",
"prop": "state",
"span": 12
},
{
"type": "input",
"label": "物料",
"prop": "item",
"span": 12
},
{
"type": "input",
"label": "物料描述",
"prop": "itemDescription",
"span": 12
},
{
"type": "input",
"label": "需求数量",
"prop": "applicationsQuantity",
"span": 12
},
{
"type": "input",
"label": "过账数量",
"prop": "actualQuantity",
"span": 12
},
{
"type": "input",
"label": "单位",
"prop": "unitOfMeasure",
"span": 12
},
{
"type": "input",
"label": "来源仓",
"prop": "sourceWarehouse",
"span": 12
},
{
"type": "input",
"label": "目标仓",
"prop": "targetWarehouse",
"span": 12
},
]
};

View File

@ -0,0 +1,88 @@
export const formatterConst = {
"state": {
"SAVE": "保存",
"SUBMIT": "提交",
"CLOSE": "关闭",
"CANCEL": "取消",
},
"iqcResults": {
"MJ": "免检",
"BJ": "报检",
"YJ": "已检",
}
};
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"menu": false,
"searchLabelWidth": 110,
"column": [
{
"type": "input",
"label": "操作",
"prop": "handle",
"span": 12
},
{
"type": "input",
"label": "采购订单号",
"prop": "poNumber",
"span": 12,
"search": true,
"searchSlot":true
},
{
"type": "input",
"label": "采购到货单号",
"prop": "documentNo",
"span": 12,
"search": true,
},
{
"type": "input",
"label": "到货单状态",
"prop": "state",
"span": 12,
formatter: (val, value, label) => {
return formatterConst.state[value];
},
},
{
"type": "input",
"label": "供应商",
"prop": "customerNo",
"span": 12,
"search": true,
},
{
"type": "input",
"label": "采购日期",
"prop": "procurementTime",
"span": 12
},
{
"type": "input",
"label": "采购人",
"prop": "purchaser",
"span": 12,
},
{
"type": "input",
"label": "登记日期",
"prop": "createDateTime",
"span": 12
},
{
"type": "input",
"label": "登记人",
"prop": "createUser",
"span": 12,
},
]
};

View File

@ -0,0 +1,50 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"label": "角色",
"prop": "roleCode",
"span": 12,
"search":true,
"editDisabled": false,
},
{
"type": "input",
"label": "区域",
"prop": "storageLocation",
"span": 12,
"editDisabled": false,
},
{
"type": "input",
"label": "区域描述",
"prop": "storageLocationDesc",
"span": 12,
"disabled": true
},
{
"type": "select",
"label": "是否启用",
"prop": "status",
"span": 12,
"dicData": [
{
"label": '是',
"value": "Y"
},
{
"label": '否',
"value": "N"
}
],
"value": "Y"
},
]
};

View File

@ -0,0 +1,32 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"editDisabled": true,
"label": "存储位置类型",
"prop": "storageLocationType",
"required": true,
"searchLabelWidth": 120,
"searchSpan": 8,
"labelWidth": 120,
"rules": [{
"message": "请输入存储位置类型名称",
"required": true
}]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
}
]
}

View File

@ -0,0 +1,78 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"label": "存储位置",
"search": true,
"editDisabled": true,
"prop": "storageLocation",
"span": 12,
"required": true,
"rules": [{
"message": "请输入存储位置",
"required": true
}]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
},
{
"type": "input",
"label": "存储位置类型",
"search": true,
"prop": "storageLocationType",
"formslot": true,
"span": 12,
"required": true,
"rules": [{
"message": "请选择存储位置类型",
"required": true
}]
},
{
"type": "input",
"label": "仓库",
"search": true,
"prop": "warehouse",
"formslot": true,
"span": 12,
"required": true,
"rules": [{
"message": "请选择仓库",
"required": true
}]
},
{
"type": "input",
"label": "ERP仓库编号",
"prop": "erpStorageLocation",
"span": 12
},
{
"type": "switch",
"label": "默认存储位置",
"prop": "isDefault",
"span": 12,
dicData: [{
label: '否',
value: "N"
},
{
label: '是',
value: "Y"
}],
value: "Y"
}
]
}

View File

@ -0,0 +1,90 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"editDisabled": true,
"label": "存储货格类型",
"prop": "storageBinType",
"span": 12,
"searchLabelWidth": 120,
"searchSpan": 8,
"rules": [{
"message": "请输入存储货格类型",
"required": true
}]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
},
{
"type": "number",
"label": "长度",
"prop": "length",
"span": 12,
"min": "",
"rules": [{
"message": "请输入长度",
"required": true
}]
},
{
"type": "number",
"label": "宽度",
"prop": "width",
"span": 12,
"min": "",
"rules": [{
"message": "请输入宽度",
"required": true
}]
},
{
"type": "number",
"label": "高度",
"prop": "height",
"span": 12,
"min": "",
"rules": [{
"message": "请输入高度",
"required": true
}]
},
{
"type": "number",
"label": "最大承重",
"prop": "maxWeight",
"span": 12,
"min": "",
"rules": [{
"message": "请输入最大承重",
"required": true
}]
},
{
"type": "switch",
"label": "可否混料",
"prop": "mixItem",
"span": 12,
dicData: [{
label: '否',
value: "N"
},
{
label: '是',
value: "Y"
}],
value: "N"
}
]
}

View File

@ -0,0 +1,76 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"editDisabled": true,
"label": "存储货格",
"prop": "storageBin",
"span": 12,
"required": true,
"rules": [{
"message": "请输入存储货格",
"required": true
}]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
},
{
"type": "input",
"search": true,
"label": "存储货格类型",
"prop": "storageBinType",
"span": 12,
"required": true,
"rules": [{
"message": "请输入存储货格类型",
"required": true
}]
},
{
"type": "input",
"search": true,
"label": "存储位置",
"prop": "storageLocation",
"span": 12
},
{
"type": "input",
"label": "行",
"prop": "shelfRow",
"span": 12
},
{
"type": "input",
"label": "列",
"prop": "shelfColumn",
"span": 12
},
{
"type": "switch",
"label": "默认货格",
"prop": "isDefault",
"span": 12,
dicData: [{
label: '否',
value: "N"
},
{
label: '是',
value: "Y"
}],
value: "Y"
}
]
}

View File

@ -0,0 +1,26 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"searchLabelWidth": 110,
"menu":false,
"column": [
{
"type": "input",
"label": "供应商代码",
"prop": "vendorCode",
"span": 12,
"search": true
},
{
"type": "input",
"label": "供应商名称",
"prop": "vendorName",
"span": 12
}
]
}

View File

@ -0,0 +1,25 @@
export const tableOption = {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"editDisabled": true,
"label": "仓库",
"prop": "warehouse",
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
}
]
}

View File

@ -0,0 +1,76 @@
/** 弹窗配置对象样例
* <el-input ref="inputWorkCenter" v-model="workCenter" style="width: 200px;" :disabled="!lock">
* <i slot="suffix" class="el-input__icon el-icon-copy-document" @click.stop="inputShowDialog(dialog.workCenterDialog,form,{'WORK_CENTER':'workCenter','DESCRIPTION':'workCenterDesc'})"></i>
* </el-input>
* dialog: {
* workCenterDialog: {
* id: "workCenter", //必需
* queryParam:{},
* page: false, //必需
* tableColumn: [
* {prop: "WORK_CENTER", label: "工作中心", width: "200"},
* {prop: "DESCRIPTION", label: "描述"},
* ], //必需
* visible: false, //必需
* fetchFun: fetchWorkCenterList, //必需
* callBack: {
* target: null,
* keys: null
* },
* },
* }
*/
/**
* 弹窗开启
* @param dialog 弹窗配置对象
* @param target 回调对象,如 formObj,回调时根据传入的key将值赋值入该对象
* @param keys 类型支持数组['key','key2'],和对象{'dialogKey','vueDataKey'}
* @param requiredCheck 自定义判断
* @param prepareQueryParams 自定义查询参数
*/
export function inputShowDialog(dialog, target, keys, requiredCheck, prepareQueryParams) {
let me = this;
requiredCheck instanceof Function ? requiredCheck.call(me,dialog.id) : null;
dialog.queryParam = prepareQueryParams instanceof Function ? prepareQueryParams.call(me) : dialog.queryParam;
if (!dialog.callBack) {
dialog.callBack = {
target: target,
keys: keys
};
} else {
dialog.callBack.target = target;
dialog.callBack.keys = keys;
}
dialog.visible = true;
}
/**
* 弹窗回调
* @param row 弹窗中选中的行
* @param dialog 弹窗配置对象
*/
export function inputCallBack(row, dialog) {
let me = this;
if (dialog.callBack && dialog.callBack.target) {
let rowKeys = dialog.tableColumn.map(o => o.prop), callBackKeys = dialog.callBack.keys;
if (callBackKeys) {
if (callBackKeys instanceof Array) {
for (let key of callBackKeys) {
me.$set(dialog.callBack.target, key, row[key]);
}
} else if (callBackKeys instanceof Object) {
for (let key of Object.keys(callBackKeys)) {
if (dialog.multiple && dialog.callBack.target[callBackKeys[key]] && dialog.callBack.target[callBackKeys[key]] !== '') {
me.$set(dialog.callBack.target, callBackKeys[key],dialog.callBack.target[callBackKeys[key]] + "," +row[key]);
} else {
me.$set(dialog.callBack.target, callBackKeys[key], row[key]);
}
}
}
} else {
me.$set(dialog.callBack.target, rowKeys[0], row[rowKeys[0]]);
}
} else {
me.$message.error("dialog:" + dialog.id + " 未维护回调目标");
}
}

View File

@ -0,0 +1,437 @@
<template>
<div class="execution">
<basic-container>
<el-form label-width="100px">
<el-row>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="条码类型">
<el-select v-model="barcodeType" style="width: 100%">
<el-option label="卷条码" :value="'INVENTORY'"></el-option>
<el-option label="箱条码" :value="'BOX'"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="条码号">
<el-input v-model="barcode"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="4" :xl="4">
<el-form-item>
<el-button type="primary" @click="getDataList">检索</el-button>
<el-button type="primary" @click="doClear">清除</el-button>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="时间">
<el-date-picker type="datetime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" v-model="startDateTime" @change="dateChange('START')"></el-date-picker>
- <el-date-picker type="datetime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" v-model="endDateTime" @change="dateChange('END')"></el-date-picker>
</el-form-item>
</el-form>
<br>
<el-button type="primary" @click="doAdd">新增</el-button>
<el-button type="primary" @click="doPrint">打印</el-button>
<el-divider style="margin-top: 0px;"></el-divider>
<el-table ref="table" :data="dataList" border row-key="id" @selection-change="handleSelectionChange" >
<el-table-column :reserve-selection="true" type="selection" width="40"></el-table-column>
<el-table-column header-align="center" align="center" label="序号">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="barcode" header-align="center" align="center" label="条码号"></el-table-column>
<el-table-column prop="barcodeType" header-align="center" align="center" label="类型(箱/卷)" :formatter="formatterBarcodeType"></el-table-column>
<el-table-column prop="createTime" header-align="center" align="center" label="创建时间"></el-table-column>
<el-table-column prop="creator" header-align="center" align="center" label="创建人"></el-table-column>
</el-table>
<div class="avue-crud__pagination">
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
background
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<el-dialog title="创建条码" :visible.sync="addDialogVisible" center :close-on-click-modal="false">
<el-form v-if="barcodeType === 'INVENTORY'">
<el-row :gutter="5">
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="物料">
<el-input v-model="item"><i slot="suffix" class="el-input__icon el-icon-search" @click.stop="openItemDialog"></i></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="规格型号">
<el-input v-model="groes" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="单位">
<el-input v-model="unitOfMeasure" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="原始数量">
<el-input v-model="qty" type="number"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="生产日期">
<el-date-picker type="datetime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" v-model="productionDataTime"></el-date-picker>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="失效日期">
<el-date-picker type="datetime" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss" v-model="validityDate"></el-date-picker>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="实际长度">
<el-input v-model="itemLength" type="number"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="宽度">
<el-input v-model="itemWidth" type="number"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="6" :xl="6">
<el-form-item label="质量等级">
<el-select v-model="status" style="width: 100%;">
<el-option label="" value=""></el-option>
<el-option label="A1" value="A1"></el-option>
<el-option label="A2" value="A2"></el-option>
<el-option label="A3" value="A3"></el-option>
<el-option label="A4" value="A4"></el-option>
<el-option label="B" value="B"></el-option>
<el-option label="PASS" value="PASS"></el-option>
<el-option label="NG" value="NG"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-form v-else-if="barcodeType === 'BOX'">
<el-form-item label="创建数量">
<el-input v-model="barcodeQty" onkeyup="value=value.replace(/^(0+)|[^\d]+/g,'')"></el-input>
</el-form-item>
<el-form-item label="类型">
<el-input v-model="boxType"><i slot="suffix" class="el-input__icon el-icon-search" @click.stop="boxTypeDialogVisible = true"></i></el-input>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="status" style="width: 100%">
<el-option label="有效" :value="'Y'"></el-option>
<el-option label="无效" :value="'N'"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取消</el-button>
<el-button type="primary" @click="doCreate">创建</el-button>
</div>
</el-dialog>
<input-select-dialog :modal-obj="itemDialogObj" :modal-fetch-fun='itemListFun' :modal-show.sync="itemDialogVisible" @inputDialogSelected="doItemSelected"></input-select-dialog>
<input-select-dialog :modal-obj="boxTypeDialogObj" :modal-fetch-fun='boxTypeListFun' :modal-show.sync="boxTypeDialogVisible" @inputDialogSelected="doBoxTypeSelected"></input-select-dialog>
</div>
</basic-container>
</div>
</template>
<script>
import {getStore} from '@/util/store'
import {showLoading, hideLoading} from '@/const/loading'
import {stringFormat, isBlank} from "@/util/string"
import {fetchList,itemPage,boxTypePage,storageBinPage,save} from '@/api/wms/barcode-creation'
import {listByActivityId} from "@/api/admin/activity-option"
export default {
data() {
return {
site: '',
INVENTORY_CODE_RULE: '',
BOX_CODE_RULE: '',
TYPE_OF_MATERIAL: '',
barcode: '',
barcodeType: 'INVENTORY',
startDateTime: '',
endDateTime: '',
dataList:[],
multipleSelection: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
addDialogVisible: false,
storageBin: '',
storageBinBO: '',
item: '',
itemBO: '',
groes: '',
unitOfMeasure: '',
qty: 0,
productionDataTime: '',
validityDate: '',
itemLength: '',
itemWidth: '',
barcodeQty: 1,
status: '',
boxType: '',
boxTypeBO: '',
itemDialogObj: {
"condition": "searchText",
tableColumn: [
{prop: "ITEM", label: "物料编码"},
{prop: "ITEM_DESCRIPTION", label: "物料描述"},
{prop: "GROES", label: "规格型号"},
{prop: "UNIT_OF_MEASURE", label: "单位"}
]
},
itemDialogVisible: false,
itemListFun:itemPage,
boxTypeDialogObj:{
"condition": "searchText",
tableColumn: [
{prop: "carrierType", label: "载具类型"},
{prop: "description", label: "载具描述"},
{prop: "mixItem", label: "是否混料"},
{prop: "grade", label: "等级"}
]
},
boxTypeDialogVisible: false,
boxTypeListFun:boxTypePage
}
},
created() {
//加载站点信息
this.site = getStore({name: 'tenantId'})
},
beforeRouteEnter(to, from, next){
next(vm => {
try {
//获取作业规则
let me = vm
let activityId = me.$route.query.ACTIVITY_ID
listByActivityId(activityId).then(response =>{
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
let data = response.data.data;
if (data && data.length > 0) {
for (let i = 0; i < data.length; i++) {
if (data[i].optionName && data[i].optionName.toUpperCase() == "INVENTORY_CODE_RULE") {
me.INVENTORY_CODE_RULE = data[i].optionValue
}
if (data[i].optionName && data[i].optionName.toUpperCase() == "BOX_CODE_RULE") {
me.BOX_CODE_RULE = data[i].optionValue
}
if (data[i].optionName && data[i].optionName.toUpperCase() == "TYPE_OF_MATERIAL") {
me.TYPE_OF_MATERIAL = data[i].optionValue
}
}
}
}).catch(e=>{
console.log(e)
})
} catch (e) {
console.log(e)
}
})
},
methods: {
formatterBarcodeType(row, column, cellValue, index){
switch (cellValue) {
case 'INVENTORY':
return '卷条码'
case 'BOX':
return '箱条码'
default:
return cellValue
}
},
// 每页数
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
// 当前页
currentChangeHandle (val) {
this.pageIndex = val
this.getDataList()
},
//表格多选
handleSelectionChange(val) {
this.multipleSelection = val;
},
//日期判断
dateChange(t) {
let me = this
if (isBlank(me.startDateTime) && isBlank(me.endDateTime)) {
return
}
let date1 = Date.parse(me.startDateTime)
let date2 = Date.parse(me.endDateTime)
if (t === 'START') {
if (date1 > date2) {
me.startDateTime = ''
return me.$message.warning('开始时期不能大于结束日期')
}
}
if (t === 'END') {
if (date1 > date2) {
me.endDateTime = ''
return me.$message.warning('结束时期不能小于开始日期')
}
}
},
//打开物料类型
openItemDialog(){
this.itemDialogObj.queryParam = {'materialType': this.TYPE_OF_MATERIAL}
this.itemDialogVisible = true
},
doItemSelected(row) {
this.item = row['ITEM']
this.groes = row['GROES']
this.unitOfMeasure = row['UNIT_OF_MEASURE']
this.itemBO = row['HANDLE']
},
doBoxTypeSelected(row){
this.boxType = row['carrierType']
this.boxTypeBO = row['handle']
},
//清除
doClear(){
this.barcode = null
this.barcodeType = 'INVENTORY'
this.startDateTime = null
this.endDateTime = null
this.dataList = []
this.multipleSelection = []
this.pageIndex = 1
this.pageSize = 10
this.totalPage = 0
},
//检索数据
getDataList(){
let dto = {
site: this.site,
barcode: this.barcode,
barcodeType: this.barcodeType,
startDateTime: this.startDateTime,
endDateTime: this.endDateTime
}
showLoading()
fetchList({current: this.pageIndex, size: this.pageSize},dto).then(response => {
hideLoading()
this.dataList = response.data.data.records
this.totalPage = response.data.data.total
}).catch(e =>{
hideLoading()
console.log(e)
});
},
//新增
doAdd(){
if(this.barcodeType === 'INVENTORY'){
this.status = ''
this.item = ''
this.itemBO = ''
this.groes = ''
this.unitOfMeasure = ''
this.qty = 0
this.productionDataTime = ''
this.validityDate = ''
this.itemLength = ''
this.itemWidth = ''
this.barcodeQty = 1
}else {
this.status = 'Y'
this.barcodeQty = 1
this.boxType = ''
this.boxTypeBO = ''
}
this.addDialogVisible = true
},
//创建
doCreate(){
let dto = {}
dto.site = this.site
dto.barcodeType = this.barcodeType
if(this.barcodeType === 'INVENTORY'){
if(isBlank(this.itemBO)){
this.$message.warning('请选择物料')
return false
}
if(isBlank(this.qty) || this.qty < 0 || this.qty == 0){
this.$message.warning('数量不能小于等于0')
return false
}
if(isBlank(this.status)){
this.$message.warning('质量等级不能为空')
return false
}
if(isBlank(this.productionDataTime)){
this.$message.warning('请输入生产日期')
return false
}
if(isBlank(this.itemLength)){
this.$message.warning('请输入实际长度')
return false
}
if(isBlank(this.itemWidth)){
this.$message.warning('请输入宽度')
return false
}
dto.barcodeQty = 1
dto.qty = this.qty
dto.itemBo = this.itemBO
dto.groes = this.groes
dto.unitOfMeasure = this.unitOfMeasure
dto.qualityInspectionStatus = this.status
dto.validityDate = this.validityDate
dto.productionDataTime = this.productionDataTime
dto.length = this.itemLength
dto.width = this.itemWidth
dto.rule = this.INVENTORY_CODE_RULE
}else {
if(isBlank(this.boxTypeBO)){
this.$message.warning('请选择载具类型')
return false
}
if(isBlank(this.barcodeQty) || this.barcodeQty < 0 || this.barcodeQty == 0){
this.$message.warning('条码数量不能小于0')
return false
}
dto.barcodeQty = this.barcodeQty
dto.boxType = this.boxTypeBO
dto.qualityInspectionStatus = this.status
dto.rule = this.BOX_CODE_RULE
}
showLoading()
save(dto).then(response => {
hideLoading()
this.dataList = response.data.data
this.addDialogVisible = false
}).catch(e =>{
hideLoading()
console.log(e)
})
},
doPrint(){
this.$message.warning(stringFormat('{0}暂不支持打印',this.site))
}
}
}
</script>
<style scoped>
/deep/.el-form-item{
margin-bottom: 0px !important;
}
</style>

View File

@ -0,0 +1,146 @@
<template>
<div class="execution">
<basic-container>
<el-form :model="formObj" ref="formObj" label-width="auto">
<el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="库存条码:" prop="inventoryId" :required="true">
<el-input @keyup.enter.native="getObjByInventoryId()" v-model="formObj.inventoryId"
placeholder="请输入库存条码">
</el-input>
</el-form-item>
</el-col>
</el-row>
<div>
<el-button type="primary" @click="getObjByInventoryId()">查询</el-button>
<el-button type="primary" @click="doClear">清除</el-button>
<el-button type="primary" @click="labelRePrint">打印</el-button>
</div>
</el-form>
<el-tabs>
<el-tab-pane label="条码信息">
<el-descriptions :model="list" :column="2" border :labelStyle="lableWidth">
<el-descriptions-item label="条码:">{{ list.inventoryId }}</el-descriptions-item>
<el-descriptions-item label="条码状态:">{{ list.status }}</el-descriptions-item>
<el-descriptions-item label="物料号:">{{ list.item }}</el-descriptions-item>
<el-descriptions-item label="质量等级:">{{ list.qualityInspectionStatus }}</el-descriptions-item>
<el-descriptions-item label="物料描述:">{{ list.description }}</el-descriptions-item>
<el-descriptions-item label="规则型号:">{{ list.groes }}</el-descriptions-item>
<el-descriptions-item label="箱条码:">{{ list.box }}</el-descriptions-item>
<el-descriptions-item label="托条码:">{{ list.pallet }}</el-descriptions-item>
<el-descriptions-item label="长度:">{{ list.length }}</el-descriptions-item>
<el-descriptions-item label="货格号:">{{ list.storageBin }}</el-descriptions-item>
<el-descriptions-item label="宽度:">{{ list.width }}</el-descriptions-item>
<el-descriptions-item label="ERP仓库:">{{ list.erpStorageLocation }}</el-descriptions-item>
<el-descriptions-item label="厚度:">{{ list.bismt }}</el-descriptions-item>
<el-descriptions-item label="接收数量:">{{ list.originalQty }}</el-descriptions-item>
<el-descriptions-item label="入库日期:">{{ list.createTime }}</el-descriptions-item>
<el-descriptions-item label="现有数量:">{{ list.qtyOnHand }}</el-descriptions-item>
<el-descriptions-item label="生产日期:">{{ list.productionDate }}</el-descriptions-item>
<el-descriptions-item label="有效截至日期:">{{ list.expireDate }}</el-descriptions-item>
<el-descriptions-item label="采购批次">{{ list.batchNo }}</el-descriptions-item>
<el-descriptions-item label="供应商批次">{{ list.vendorBatchNo }}</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</basic-container>
</div>
</template>
<script>
import { getObjByInventoryId,labelPrint } from "@/api/wms/barcode-query"
import { isBlank } from "@/util/string";
import { hideLoading, showLoading } from "@/const/loading"
import { getByActivityOption } from "@/api/admin/activity-option";
import {getStore} from '@/util/store'
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
formObj: {
"inventoryId": ""
},
printer :"",
list: {}
}
},
created() {
//加载站点信息
this.site = getStore({ name: 'tenantId' })
//加载作业规则
let activityId = this.$route.query.ACTIVITY_ID
showLoading();
getByActivityOption(activityId, 'PRINTER').then(response => {
hideLoading();
if (response.data.code != 0) {
return this.$message.error(response.data.msg)
}
this. printer = response.data.data.optionValue;
}).catch(e => {
console.log(e)
hideLoading()
})
},
methods: {
getObjByInventoryId() {
let me = this;
let inventoryId = me.formObj.inventoryId;
if (isBlank(inventoryId)) {
me.$message.error("库存条码不能为空");
return;
}
showLoading();
getObjByInventoryId(inventoryId).then(res => {
if (res.data.code == 0 && res.data.data != null) {
hideLoading();
me.list = res.data.data;
me.formObj.inventoryId = "";
} else {
me.$message.error("不存在此条码");
hideLoading();
return;
}
}).catch(e => {
hideLoading();
console.log(e);
})
},
labelRePrint(){
let me = this
if (isBlank(me.printer)){
this.$message.error('打印机编号不能为空')
return false;
}
if (isBlank(me.list.inventoryId)){
this.$message.error('条码信息不能为空')
return false;
}
showLoading();
let obj ={
"inventoryId": me.list.inventoryId,
"printer":me.printer
}
labelPrint(obj).then(respData => {
hideLoading()
this.$message.success(row.carrier + '打印成功')
}).catch(error => {
hideLoading()
});
},
doClear() {
let me = this;
me.formObj.inventoryId = "";
me.list = {}
}
}
}
</script>

View File

@ -0,0 +1,292 @@
<template>
<div class="execution">
<basic-container>
<el-form ref="formObj" :model="formObj" :rules="rules" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="已绑数量:" prop="bindNum">
<el-input placeHolder="已绑数量" v-model="formObj.bindNum" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="已扫数量:" prop="scanNum">
<el-input placeHolder="已扫数量" v-model="formObj.scanNum" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="主条码:" prop="carrier">
<el-input placeHolder="手动输入或者扫码" v-model="formObj.carrier" :disabled="isDisabled"
@keyup.enter.native="scanCarrier">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="子条码:" prop="carrierOrInventory">
<el-input placeHolder="手动输入或者扫码" v-model="formObj.carrierOrInventory"
@keyup.enter.native="scancarrierOrInventory">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-table :data="formObj.list" :row-style="rowStyle">
<el-table-column label="序号" prop="seq"></el-table-column>
<el-table-column label="子条码" prop="carrierOrInventory"></el-table-column>
<el-table-column label="物料号" prop="item"></el-table-column>
</el-table>
</el-form>
<div style="margin-top: 10px;">
<el-button type="warning" @click="doClear">清除</el-button>
<el-button type="primary" @click="bind">绑定</el-button>
</div>
</basic-container>
</div>
</template>
<script>
import { getBindList, getItem, bind, getBindListByTray } from '@/api/wms/carrier-bind-inventory';
import { getStore } from '@/util/store';
import {showLoading, hideLoading} from '@/const/loading'
import { isBlank } from '@/util/string';
import {
mapGetters
} from 'vuex'
export default {
data() {
return {
formObj: {},
isDisabled: false,
wms_carrier_member_bind: false,
isBind: "",
needBindList: [],
scanCodeList: [],
rules: {
carrier: [
{ required: true, message: "主条码不可为空" }
],
carrierOrInventory: [
{ required: true, message: "子条码不可为空" }
],
},
initData: {
site: getStore({ name: 'tenantId' }),
bindNum: 0,
scanNum: 0,
list: []
}
}
},
created() {
this.wms_carrier_member_bind = this.permissions["wms_carrier_member_bind"];
this.formObj = Object.assign({}, this.initData);
this.list = [];
this.needBindList = [];
this.scanCodeList = [];
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//扫描主条码
scanCarrier() {
let me = this;
let carrier = me.formObj.carrier;
me.formObj.list = [];
me.needBindList = [];
me.formObj.scanNum = 0;
if (isBlank(carrier)) {
me.$message.error("不可扫描空条码");
return;
}
getBindListByTray(carrier).then(res => {
if (res.data.code == 0) {
let data = res.data.data;
for (let i = 0; i < data.length; i++) {
let obj = Object.assign({}, {
"seq": i + 1,
"carrierOrInventory": data[i].carrierOrInventory,
"item": data[i].item,
"status": data[i].status,
"isBind": "Y",
});
me.formObj.list.push(obj);
}
me.formObj.bindNum = data.length;
me.isDisabled = true;
} else {
me.formObj.carrier = "";
}
})
},
//扫描子条码
scancarrierOrInventory() {
let me = this;
let carrierOrInventory = me.formObj.carrierOrInventory;
if (isBlank(carrierOrInventory)) {
me.$message.error("不可扫描空条码");
return;
}
let maxSeq = 0;
//获得当前列表的序号
for (let i = 0; i < me.formObj.list.length; i++) {
let list = me.formObj.list[i];
if (list.seq > maxSeq) {
maxSeq = list.seq
}
}
//判断子条码是否被扫描
if (me.scanCodeList.length > 0) {
for (let i = 0; i < me.scanCodeList.length; i++) {
if (me.scanCodeList[i].code === carrierOrInventory) {
me.delListItem(carrierOrInventory);
return;
}
}
}
for (let i = 0; i < me.formObj.list.length; i++) {
if (carrierOrInventory === me.formObj.list[i].carrierOrInventory) {
me.$message.error("已存在此子条码");
return;
}
}
getItem(carrierOrInventory).then(res => {
if (res.data.code == 0) {
let data = res.data.data;
if (me.formObj.list.length > 0) {
if (data.status !== me.formObj.list[0].status) {
me.$message.error("库存状态不一致,不允许混装");
return;
}
}
let obj = Object.assign({}, {
"seq": maxSeq + 1,
"carrierOrInventory": data.carrierOrInventory,
"item": data.item,
"status": data.status,
"isBind": "N"
});
me.formObj.list.push(obj);
me.needBindList.push(obj);
//将已经扫描过的子条码存入一个集合
me.scanCodeList.push({ "code": carrierOrInventory });
me.formObj.scanNum += 1;
}
})
//扫描之后清空子条码输入框
me.formObj.carrierOrInventory = "";
},
//绑定
bind() {
let me = this;
let bindList = [];
//判断需绑定条码是否为空
if (me.needBindList.length > 0) {
for (let i = 0; i < me.needBindList.length; i++) {
let obj = Object.assign({}, {
"carrier": me.formObj.carrier,
"carrierOrInventory": me.needBindList[i].carrierOrInventory,
"item": me.needBindList[i].item
})
bindList.push(obj);
}
me.$refs['formObj'].validateField('carrier', ErrorMsg => {
if (!ErrorMsg) {
showLoading();
bind({
str: me.$route.query.ACTIVITY_ID,
list: bindList
}).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("绑定成功,请及时更新托盘清单");
me.doClear();
} else {
me.$message.error("绑定失败");
}
}).catch(() => {
hideLoading();
});
}
})
} else {
me.$message.error("不存在需要绑定的条码")
}
},
//清除操作
doClear() {
this.formObj = Object.assign({}, this.initData);
this.formObj.list = [];
this.list = [];
this.bindList = [];
this.isDisabled = false;
this.$refs['formObj'].resetFields();
this.needBindList = [];
this.scanCodeList = [];
},
//在列表中删除重复扫描的子条码
delListItem(code) {
let me = this;
//已经扫过的子条码再次扫描则删除
for (let i = 0; i < me.needBindList.length; i++) {
if (code === me.needBindList[i].carrierOrInventory) {
me.needBindList.splice(i, 1);
}
}
for (let i = 0; i < me.formObj.list.length; i++) {
if (code === me.formObj.list[i].carrierOrInventory) {
me.formObj.list.splice(i, 1);
me.formObj.scanNum = me.formObj.scanNum - 1;
//更新显示列表中的序号
for (let j = i; j < me.formObj.list.length; j++) {
me.formObj.list[j].seq = me.formObj.list[j].seq - 1;
}
}
}
for (let i = 0; i < me.scanCodeList.length; i++) {
if (code === me.scanCodeList[i].code) {
me.scanCodeList.splice(i, 1);
}
}
me.formObj.carrierOrInventory = "";
},
// 更改选中行背景色
rowStyle({ row }) {
if (row.isBind === "N") {
return { 'background-color': '#00FF00', cursor: 'pointer' };
}
return { cursor: 'pointer' };
},
}
}
</script>
<style>
.el-table__row:hover>td {
background-color: transparent;
}
</style>

View File

@ -0,0 +1,198 @@
<template>
<div class="execution">
<basic-container>
<avue-crud ref="crud" :page.sync="page" :data="tableData" :permission="permissionList"
:table-loading="tableLoading" :option="tableOption" @on-load="getList" @search-change="searchChange"
@refresh-change="refreshChange" @size-change="sizeChange" @current-change="currentChange"
@row-update="handleUpdate" @row-save="handleSave" @row-del="handleDel">
</avue-crud>
</basic-container>
</div>
</template>
<script>
import { fetchList, getObj, addObj, putObj, delObj } from '@/api/wms/carriertype'
import { tableOption } from '@/const/crud/wms/carriertype'
import { mapGetters } from 'vuex'
export default {
name: 'carriertype',
data() {
var validateName = (rule, value, callback) => {
let acount = /[\u4E00-\u9FA5]/g;
if (value === '') {
callback(new Error('名称不可为空'));
} else if (acount.test(value)) {
callback(new Error('名称不可包含中文'));
} else {
callback();
}
};
return {
searchForm: {},
tableData: [],
page: {
total: 0, // 总页数
currentPage: 1, // 当前页数
pageSize: 20 // 每页显示多少条
},
tableLoading: false,
tableOption: {
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"editDisabled": true,
"maxlength": 12,
"label": "载具类型",
"prop": "carrierType",
"span": 12,
"required": true,
"rules": [{ validator: validateName, trigger: 'blur', "required": true }]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
},
{
"type": "input",
"label": "最大承载数量",
"prop": "maxLoadQty",
"span": 12
},
{
"type": "switch",
"label": "可否混料",
"prop": "mixItem",
"span": 12,
dicData: [{
label: '否',
value: "N"
},
{
label: '是',
value: "Y"
}],
value: "N"
},
{
"type": "select",
"label": "等级",
"required": true,
"prop": "grade",
"rules": [{
"message": "请选择等级",
"required": true
}],
dicData: [{
label: '1',
value: 1
},
{
label: '2',
value: 2
},
{
label: '3',
value: 3
}],
value: 1
},
]
}
}
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {
addBtn: this.vaildData(this.permissions.wms_carrier_type_add, false),
delBtn: this.vaildData(this.permissions.wms_carrier_type_del, false),
editBtn: this.vaildData(this.permissions.wms_carrier_type_edit, false)
};
}
},
methods: {
// 列表查询
getList(page, params) {
this.tableLoading = true
fetchList(Object.assign({
current: page.currentPage,
size: page.pageSize
}, params, this.searchForm)).then(response => {
this.tableData = response.data.data.records
this.page.total = response.data.data.total
this.tableLoading = false
}).catch(() => {
this.tableLoading = false
})
},
// 删除
handleDel: function (row, index) {
this.$confirm('是否确认删除载具类型' + row.carrierType, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
return delObj(row.handle)
}).then(data => {
this.$message.success('删除成功')
this.getList(this.page)
})
},
// 更新
handleUpdate: function (row, index, done, loading) {
putObj(row).then(data => {
this.$message.success('修改成功')
done()
this.getList(this.page)
}).catch(() => {
loading();
});
},
// 保存
handleSave: function (row, done, loading) {
addObj(row).then(data => {
this.$message.success('添加成功')
done()
this.getList(this.page)
}).catch(() => {
loading();
});
},
// 每页条数改变事件
sizeChange(pageSize) {
this.page.pageSize = pageSize
},
// 当前页发生改变事件
currentChange(current) {
this.page.currentPage = current
},
// 查询事件
searchChange(form, done) {
this.searchForm = form
this.page.currentPage = 1
this.getList(this.page, form)
done()
},
// 刷新事件
refreshChange() {
this.getList(this.page)
},
// 导出excel
exportExcel() {
this.downBlobFile('/wms/carriertype/export', this.searchForm, 'carriertype.xlsx')
}
}
}
</script>

View File

@ -0,0 +1,403 @@
<template>
<div class="execution">
<basic-container>
<el-form ref="formObj" :model="formObj" :rules="rules" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="已绑数量:" prop="bindNum">
<el-input placeHolder="已绑数量" v-model="formObj.bindNum" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="已扫数量:" prop="scanNum">
<el-input placeHolder="已扫数量" v-model="formObj.scanNum" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="主条码:" prop="carrier">
<el-input placeHolder="手动输入或者扫码" v-model="formObj.carrier" :disabled="isDisabled"
@keyup.enter.native="scanCarrier">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="子条码:" prop="carrierOrInventory">
<el-input placeHolder="手动输入或者扫码" v-model="formObj.carrierOrInventory"
@keyup.enter.native="scancarrierOrInventory">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
</el-col>
<el-col>
<el-button type="primary" @click="selectionAll">全选</el-button>
</el-col>
</el-row>
<el-table :data="formObj.list" :row-style="rowStyle">
<el-table-column label="序号" prop="seq"></el-table-column>
<el-table-column label="子条码" prop="carrierOrInventory"></el-table-column>
<el-table-column label="物料号" prop="item"></el-table-column>
</el-table>
</el-form>
<div style="margin-top: 10px;">
<el-button type="warning" @click="doClear">清除</el-button>
<el-button type="primary" @click="unBind">解绑</el-button>
<el-button type="primary" @click="print">托盘清单打印</el-button>
</div>
</basic-container>
</div>
</template>
<script>
import {getBindList, getItem, unbind, getCarrier, getBindListByTray,confirmUnBind} from '@/api/wms/carrier-unbind-inventory';
import {getStore} from '@/util/store';
import {isBlank} from '@/util/string';
import {showLoading, hideLoading} from '@/const/loading';
import {listByActivityId} from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex';
import axios from "axios";
export default {
data() {
return {
formObj: {},
isDisabled: false,
wms_carrier_member_unbind: false,
isBind: "",
needBindList: [],
scanCodeList: [],
rules: {
carrier: [
{required: true, message: "主条码不可为空", trigger: 'blur'}
],
carrierOrInventory: [
{required: true, message: "子条码不可为空", trigger: 'blur'}
],
},
initData: {
site: getStore({name: 'tenantId'}),
carrierOrInventory: "",
bindNum: 0,
scanNum: 0,
list: []
}
};
},
created() {
this.wms_carrier_member_unbind = this.permissions["wms_carrier_member_unbind"];
this.formObj = Object.assign({}, this.initData);
this.list = [];
this.needBindList = [];
this.scanCodeList = [];
},
beforeRouteEnter(to, from, next) {
next(vm => {
try {
//获取作业规则
let me = vm;
let activityId = me.$route.query.ACTIVITY_ID;
listByActivityId(activityId).then(response => {
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
let data = response.data.data;
if (data && data.length > 0) {
for (let i = 0; i < data.length; i++) {
if (data[i].optionName && data[i].optionName.toUpperCase() === "UNBIND_XNT") {
me.unbindXnt = data[i].optionValue;
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "CONFIRM_ID") {
me.confirmId = data[i].optionValue;
}
}
}
}).catch(e => {
console.log(e);
});
} catch (e) {
console.log(e);
}
});
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//扫描主条码
scanCarrier() {
let me = this;
let carrier = me.formObj.carrier;
me.formObj.list = [];
me.needBindList = [];
me.formObj.carrierOrInventory = "";
me.formObj.scanNum = 0;
if (isBlank(carrier)) {
me.$message.error("不可扫描空条码");
return;
}
getBindListByTray(carrier).then(res => {
if (res.data.code == 0) {
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"seq": i + 1,
"carrierOrInventory": res.data.data[i].carrierOrInventory,
"item": res.data.data[i].item,
"isBind": "Y"
});
me.formObj.list.push(obj);
}
me.formObj.bindNum = res.data.data.length;
me.isDisabled = true;
} else {
me.formObj.carrier = "";
}
});
},
//扫描子条码
scancarrierOrInventory() {
let me = this;
let carrierOrInventory = me.formObj.carrierOrInventory;
if (isBlank(carrierOrInventory)) {
me.$message.error("不可扫描空条码");
return;
}
//判断子条码是否被扫描
if (me.scanCodeList.includes(carrierOrInventory)) {
me.delListItem(carrierOrInventory);
return;
}
//判断是否为与主条码绑定
if (me.formObj.list.length > 0) {
for (let j = 0; j < me.formObj.list.length; j++) {
if (me.formObj.list[j].carrierOrInventory === carrierOrInventory) {
me.formObj.list[j].isBind = "N";
me.needBindList.push(me.formObj.list[j]);
me.scanCodeList.push(carrierOrInventory);
me.formObj.scanNum += 1;
me.formObj.carrierOrInventory = "";
me.sort(j);
return;
}
}
me.$message.error("此条码与主条码不存在绑定关系");
me.formObj.carrierOrInventory = "";
return;
} else {
me.$message.error("请先扫描主条码");
me.formObj.carrierOrInventory = "";
return;
}
},
//解绑
unBind() {
let me = this;
let unbindList = [];
//判断需绑定条码是否为空
if (me.needBindList.length > 0) {
for (let i = 0; i < me.needBindList.length; i++) {
let obj = Object.assign({}, {
"carrier": me.formObj.carrier,
"carrierOrInventory": me.needBindList[i].carrierOrInventory,
"item": me.needBindList[i].item
});
unbindList.push(obj);
}
me.$refs['formObj'].validateField('carrier', ErrorMsg => {
if (!ErrorMsg) {
let fun = () => {
showLoading();
unbind({
str: me.$route.query.ACTIVITY_ID,
list: unbindList
}).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("解绑成功,请及时更新托盘清单");
me.doClear();
} else {
me.$message.error("解绑失败");
}
}).catch(() => {
hideLoading();
});
}
let text;
if (me.unbindXnt === 'Y'){
text = "此次解绑为绑定虚拟托模式!";
} else {
text = "此次解绑为直接解绑模式!";
}
if (!isBlank(me.confirmId)) {
me.$prompt(text, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(({value}) => {
if (value === me.confirmId) {
fun();
} else {
me.$message.error("解绑密码错误");
}
}).catch(() => {
hideLoading();
});
} else {
me.$confirm(text, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
fun();
})
}
}
});
} else {
me.$message.error("不存在需要解绑的条码");
}
},
//清除操作
doClear() {
this.formObj = Object.assign({}, this.initData);
this.formObj.list = [];
this.list = [];
this.isDisabled = false;
this.$refs['formObj'].resetFields();
this.needBindList = [];
this.scanCodeList = [];
},
//在列表中删除重复扫描的子条码
delListItem(code) {
let me = this;
//已经扫过的子条码再次扫描则删除
for (let i = 0; i < me.needBindList.length; i++) {
if (code === me.needBindList[i].carrierOrInventory) {
me.needBindList.splice(i, 1);
}
}
for (let i = 0; i < me.formObj.list.length; i++) {
if (code === me.formObj.list[i].carrierOrInventory && "N" === me.formObj.list[i].isBind) {
me.formObj.list[i].isBind = "Y";
}
}
let index = me.scanCodeList.findIndex(o => code === o);
if (index >= 0) {
me.scanCodeList.splice(index, 1);
}
me.formObj.carrierOrInventory = "";
},
//列表重新排序
sort(index) {
let newList = [];
let obj = Object.assign({}, this.formObj.list[index], {"seq": 1});
newList.push(obj);
this.formObj.list.splice(index, 1);
for (let i = 0; i < this.formObj.list.length; i++) {
let listObj = Object.assign({}, this.formObj.list[i], {"seq": i + 2});
newList.push(listObj);
}
this.formObj.list = newList;
},
// 更改选中行背景色
rowStyle({row}) {
if (row.isBind === "N") {
return {'background-color': '#FF0000', cursor: 'pointer'};
}
return {cursor: 'pointer'};
},
print() {
let me = this;
let carrier = me.formObj.carrier;
if (carrier) {
showLoading();
getCarrier({carrier: carrier}).then(respData => {
if (respData.data.code != 0) {
return me.$message.error(respData.data.msg);
}
let data = respData.data.data;
if (!data.carrierTypeBo || data.carrierTypeBo.indexOf("TP") < 0) {
return me.$message.error("主条码非托条码");
} else {
// me.downBlobFile("/wms/carrier-member/print", {carrier: carrier}, carrier + ".pdf");
axios({
method: 'get',
url: '/wms/carrier-member/print/',
params: {carrier: carrier},
headers: {
'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
},
responseType: 'blob' //设置响应的数据类型为一个包含二进制数据的 Blob 对象,必须设置!!!
}).then(response => {
hideLoading();
// 处理返回的文件流
const binaryData = [];
binaryData.push(response);
if (binaryData[0].size === 0) {
return this.$notify.error("内容为空,无法下载");
}
let pdfUrl = window.URL.createObjectURL(new Blob([response.data], {type: response.data.type}));
const newPage = window.open(pdfUrl, "_blank", "scrollbars=yes,resizable=1,modal=false,alwaysRaised=yes");
newPage.document.title = carrier + '.pdf';
}).catch(e => {
console.log(e);
hideLoading();
});
}
}).catch(() => {
hideLoading();
});
}
},
selectionAll(){
let me = this;
let list = me.formObj.list;
me.needBindList = [];
me.scanCodeList = [];
if (list.length > 0) {
for (let j = 0; j < list.length; j++) {
let row = list[j];
row.isBind = "N";
me.needBindList.push(row);
me.scanCodeList.push(row.carrierOrInventory);
}
me.formObj.scanNum = list.length;
} else {
me.$message.error("请先扫描主条码");
return;
}
}
}
};
</script>
<style>
.el-table__row:hover > td {
background-color: transparent;
}
</style>

View File

@ -0,0 +1,318 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='carrierTypeDialogObj' :modal-fetch-fun='carrierTypeDialogFetchFun'
:modal-show.sync="carrierTypeDialogVisible" @inputDialogSelected="carrierTypeSelect">
</input-select-dialog>
<basic-container>
<avue-crud ref="crud" :page.sync="page" :data="tableData" v-model="form" :permission="permissionList"
:table-loading="tableLoading" :option="tableOption" @selection-change="selectionChange"
@on-load="getList" @search-change="searchChange" @search-reset="searchReset"
@refresh-change="refreshChange" @size-change="sizeChange" @current-change="currentChange"
@row-update="handleUpdate" @row-save="handleSave" @row-del="handleDel">
<template slot-scope="scope" slot="carrierTypeForm">
<el-input placeholder="请输入载具类型" v-model="form.carrierType">
<i slot="suffix" class="el-input__icon el-icon-search" @click.stop="showCarrierTypeDialog"></i>
</el-input>
</template>
<template slot="menuLeft" slot-scope="{size}">
<el-button type="primary" icon="el-icon-printer" :size="size" @click="printCode()" :disabled="!print_permissions">打印</el-button>
<el-button type="danger" icon="el-icon-delete" :size="size"
@click="toggleSelection()">取消选择</el-button>
</template>
</avue-crud>
</basic-container>
</div>
</template>
<script>
import { fetchList, getObj, addObj, putObj, delObj,labelPrint} from '@/api/wms/carrier'
import { tableOption } from '@/const/crud/wms/carrier'
import { getByActivityOption } from "@/api/admin/activity-option";
import { showLoading, hideLoading } from '@/const/loading'
import { mapGetters } from 'vuex'
import {getStore} from '@/util/store'
import {stringFormat, isBlank} from "@/util/string"
import { fetchList as FetchCarrierTypeList } from "@/api/wms/carriertype"
export default {
name: 'carrier',
data() {
var validateName = (rule, value, callback) => {
let acount = /[\u4E00-\u9FA5]/g;
if (value === '') {
callback(new Error('名称不可为空'));
} else if (acount.test(value)) {
callback(new Error('名称不可包含中文'));
} else {
callback();
}
};
return {
form: {},
printer :"",
selectList: [], //打印传的数据
searchForm: {},
tableData: [],
page: {
total: 0, // 总页数
currentPage: 1, // 当前页数
pageSize: 20 // 每页显示多少条
},
tableLoading: false,
tableOption: {
"tip": false,
"reserveSelection": true,
"selection": true,
"border": true,
"index": true,
"indexLabel": "序号",
"stripe": true,
"menuAlign": "center",
"align": "center",
"searchMenuSpan": 6,
"column": [
{
"type": "input",
"search": true,
"editDisabled": true,
"label": "载具",
"prop": "carrier",
"maxlength": 20,
"span": 12,
"required": true,
"rules": [{ validator: validateName, trigger: 'blur', "required": true }]
},
{
"type": "input",
"label": "描述",
"prop": "description",
"span": 12
},
{
"type": "input",
"search": true,
"label": "载具类型",
"prop": "carrierType",
"span": 12,
"required": true,
"rules": [{
"message": "请输入载具类型",
"required": true
}]
},
{
"type": "select",
"label": "状态",
"prop": "status",
"span": 12,
dicData: [{
label: '有效',
value: "Y"
}, {
label: '无效',
value: "N"
}],
value: "Y"
}
]
},
carrierTypeDialogVisible: false,
carrierTypeDialogFetchFun: FetchCarrierTypeList,
carrierTypeDialogObj: {
"condition": "carrierType",
tableColumn: [
{ prop: "carrierType", label: "载具类型", width: "200" },
{ prop: "description", label: "描述" }
]
},
}
},
created() {
//加载站点信息
this.site = getStore({ name: 'tenantId' })
this.print_permissions = this.permissions['wms_carrier_print'];
},
beforeRouteEnter(to, from, next){
next(vm => {
try {
//获取作业规则
let me = vm
let activityId = me.$route.query.ACTIVITY_ID
getByActivityOption(activityId, 'PRINTER').then(response => {
if (response.data.code != 0) {
return me.$message.error(response.data.msg)
}
if(response.data.data && response.data.data != {} && !isBlank(response.data.data.optionValue)){
me.printer = response.data.data.optionValue
}
}).catch(e => {
console.log(e)
})
} catch (e) {
console.log(e)
}
})
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {
addBtn: this.vaildData(this.permissions.wms_carrier_add, false),
delBtn: this.vaildData(this.permissions.wms_carrier_del, false),
editBtn: this.vaildData(this.permissions.wms_carrier_edit, false)
};
}
},
methods: {
//载具类型弹出框
showCarrierTypeDialog() {
let me = this;
me.carrierTypeDialogVisible = true;
},
carrierTypeSelect(row) {
let me = this;
me.form.carrierType = row.carrierType;
me.form.carrierTypeBo = row.handle;
},
//表格多选
selectionChange(list) {
let me = this;
me.selectList = list;
},
//取消选择
toggleSelection(val) {
if(this.$refs.crud){
this.$refs.crud.toggleSelection(val);
}
},
searchReset() {
this.selectList = [];
},
printCode(){
let me = this
if (isBlank(me.printer)){
this.$message.error('打印机编号不能为空')
return false;
}
if (me.selectList.length==0){
this.$message.error('请选择打印数据')
return false;
}
let printList=[];
for (let i = 0; i < me.selectList.length; i++) {
let obj ={
"carrier": me.selectList[i].carrier,
"description": me.selectList[i].description,
"printer": me.printer
}
printList.push(obj);
}
showLoading();
labelPrint(printList).then(respData => {
hideLoading();
this.$message.success('打印成功')
}).catch(error => {
hideLoading()
});
},
// 列表查询
getList(page, params) {
this.tableLoading = true;
this.toggleSelection();
fetchList(Object.assign({
current: page.currentPage,
size: page.pageSize
}, params, this.searchForm)).then(response => {
this.tableData = response.data.data.records
this.page.total = response.data.data.total
this.tableLoading = false
}).catch(() => {
this.tableLoading = false
})
},
// 删除
handleDel: function (row, index) {
this.$confirm('是否确认删除载具' + row.carrier, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
return delObj(row.handle)
}).then(data => {
this.$message.success('删除成功')
this.getList(this.page)
})
},
labelRePrint(row){
let me = this
console.log(row)
if (isBlank(me.printer)){
this.$message.error('打印机编号不能为空')
return false;
}
showLoading();
let carrier = row.carrier
let description = row.description
let printNumber = me.printer
labelPrint(carrier,description, printNumber).then(respData => {
hideLoading()
this.$message.success(row.carrier + '打印成功')
}).catch(error => {
hideLoading()
});
},
// 更新
handleUpdate: function (row, index, done, loading) {
putObj(row).then(data => {
this.$message.success('修改成功')
done()
this.getList(this.page)
}).catch(() => {
loading();
});
},
// 保存
handleSave: function (row, done, loading) {
addObj(row).then(data => {
this.$message.success('添加成功')
done()
this.getList(this.page)
}).catch(() => {
loading();
});
},
// 每页条数改变事件
sizeChange(pageSize) {
this.page.pageSize = pageSize
},
// 当前页发生改变事件
currentChange(current) {
this.toggleSelection();
this.page.currentPage = current
},
// 查询事件
searchChange(form, done) {
this.searchForm = form
this.page.currentPage = 1
this.getList(this.page, form)
done()
},
// 刷新事件
refreshChange() {
this.getList(this.page)
},
// 导出excel
exportExcel() {
this.downBlobFile('/wms/carrier/export', this.searchForm, 'carrier.xlsx')
}
}
}
</script>

View File

@ -0,0 +1,107 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='storageLocationDialogObj' :modal-fetch-fun='storageLocationDialogFetchFun'
:modal-show.sync="storageLocationDialogVisible" @inputDialogSelected="storageLocationSelect">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :rules="rules" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="货架选择:" prop="storageLocation">
<el-input placeHolder="货架选择" v-model="formObj.storageLocation">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showstorageLocationDialog"></i></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-button type="warning" @click="doClear">清除</el-button>
<el-button type="primary" @click="unShelve">一键下架</el-button>
</el-col>
</el-row>
</el-form>
</basic-container>
</div>
</template>
<script>
import { unShelve } from "@/api/wms/click-unShelve"
import { fetchList as fetchstorageLocationList } from "@/api/wms/storage-location"
import { showLoading, hideLoading } from '@/const/loading';
import {
mapGetters
} from 'vuex'
export default {
data() {
return {
formObj: {
storageLocation: ""
},
rules: {
storageLocation: [{ required: true, message: '请输入货架名称', trigger: 'blur' }]
},
storageLocationDialogVisible: false,
storageLocationDialogFetchFun: fetchstorageLocationList,
storageLocationDialogObj: {
"condition": "storageLocation",
tableColumn: [
{ prop: "storageLocation", label: "货架", width: "200" },
{ prop: "description", label: "描述" }
]
},
}
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//货格弹出框
showstorageLocationDialog() {
let me = this;
me.storageLocationDialogVisible = true;
},
storageLocationSelect(row) {
let me = this;
me.formObj.storageLocation = row.storageLocation;
},
//一键下架
unShelve() {
let me = this
this.$refs['formObj'].validate((valid) => {
if (valid) {
showLoading();
unShelve(me.formObj.storageLocation).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("下架成功");
}
}).catch(() => {
hideLoading();
});
} else {
console.log('error submit!!');
return false;
}
});
},
//清除
doClear() {
let me = this;
me.formObj.storageLocation = "";
this.$refs['formObj'].resetFields();
}
}
}
</script>

View File

@ -0,0 +1,299 @@
<template>
<div class="execution">
<basic-container>
<c-top-bar :offset="50">
<el-button type="text" @click="doRetrieve()">检索</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" @click="doRest()">清除</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" @click="doExport()">导出</el-button>
<el-divider style="margin-top: 0px;"></el-divider>
</c-top-bar>
<el-form ref="search" :model="search" label-width="100px">
<el-row>
<el-col :span="4">
<el-form-item label="单据号:">
<el-input v-model.trim="search.documentNo"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="DN单号:">
<el-input v-model.trim="search.erpNo"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="日期:" class="">
<el-date-picker
v-model="search.tempDateTime"
style="width: 100%"
type="datetimerange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss"
format="yyyy-MM-dd HH:mm:ss"
@change="dateChange">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table size="mini" :data="table" border
style="width: 100%;margin-top: 15px;"
height="600"
@current-change="handleSelectionChange"
highlight-current-row>
<el-table-column label="单据号" prop="documentNo" align="center" width="120"></el-table-column>
<el-table-column label="单据总量" prop="documentQty" align="center"></el-table-column>
<el-table-column label="物料编码" prop="item" align="center"></el-table-column>
<el-table-column label="物料描述" prop="description" width="160" align="center"
:show-overflow-tooltip="true"></el-table-column>
<el-table-column label="规格型号" prop="groes" align="center" :show-overflow-tooltip="true"></el-table-column>
<el-table-column label="宽度" prop="width" align="center"></el-table-column>
<el-table-column label="长度" prop="standardLength" align="center"></el-table-column>
<el-table-column label="DN单号" prop="externalDocumentNo" align="center" width="110"></el-table-column>
<el-table-column label="出货批次" prop="salesBatch" align="center" width="110"></el-table-column>
<el-table-column align="center" label="托数">
<template slot-scope="scope">
<el-button @click="showPallet(scope.row)" type="text">{{scope.row.palletNum}}</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="箱数">
<template slot-scope="scope">
<el-button @click="showBox(scope.row)" type="text">{{scope.row.boxNum}}</el-button>
</template>
</el-table-column>
<el-table-column label="卷数" prop="reelNum" align="center"></el-table-column>
<el-table-column label="生产日期" prop="productionDate" align="center"
:show-overflow-tooltip="true"></el-table-column>
</el-table>
<el-dialog :visible.sync="dialog.palletDialog.visible" @close="dialog.palletDialog.visible=false" center
title="托明细" v-el-drag-dialog width="35%">
<el-table size="mini" :data="dialog.palletDialog.table" border highlight-current-row style="user-select:text;">
<el-table-column label="托号" prop="pallet" align="center"></el-table-column>
<el-table-column label="托总面积" prop="palletQty" align="center"></el-table-column>
</el-table>
</el-dialog>
<el-dialog :visible.sync="dialog.boxDialog.visible" @close="dialog.boxDialog.visible=false" center title="箱明细"
v-el-drag-dialog width="35%">
<el-table size="mini" :data="dialog.boxDialog.table" border highlight-current-row style="user-select:text;">
<el-table-column label="箱号" prop="box" align="center"></el-table-column>
<el-table-column label="箱总面积" prop="boxQty" align="center"></el-table-column>
</el-table>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {list} from '@/api/wms/complex-report';
import {mapGetters} from 'vuex';
import {getStore} from '@/util/store';
import {hideLoading, showLoading} from '@/const/loading';
import {trimHandle} from '@/util/handle';
import {isBlank, trimString} from '@/util/string';
export default {
name: 'reportCompleteView',
data() {
return {
containerMarginTopStyle: {
marginTop: "30px"
},
changeStamp: 0,
site: getStore({name: 'tenantId'}),
search: {},
dialog: {
palletDialog: {
table: [],
visible: false,
},
boxDialog: {
table: [],
visible: false,
},
},
table: [],
tableSelection: null
};
},
computed: {
...mapGetters(['permissions', 'userInfo']),
permissionList() {
return {};
}
},
directives: { // 使用局部注册指令的方式
resize: { // 指令的名称
bind(el, binding) { // el为绑定的元素,binding为绑定给指令的对象
let width = '', height = '';
function isReize() {
const style = document.defaultView.getComputedStyle(el);
if (width !== style.width || height !== style.height) {
binding.value(); // 关键
}
width = style.width;
height = style.height;
}
el.__vueSetInterval__ = setInterval(isReize, 300); // 监听组件尺寸变化事件
},
unbind(el) {
clearInterval(el.__vueSetInterval__);
}
}
},
mounted() {
this.urlParam = this.$route.query;
this.loadData(this.urlParam);
},
methods: {
resize() {
let affixRef = this.$refs["affixRef"];
this.containerMarginTopStyle.marginTop = affixRef.clientHeight + 'px';
},
loadData(urlParam) {
let me = this;
},
doRest() {
this.search = {};
this.queryParam = {current: 1, size: 20};
this.table = [];
},
doRetrieve() {
let me = this, oData = this.search;
let param = {
documentNo: oData.documentNo,
startS: oData.startDate,
endS: oData.endDate,
erpNo: oData.erpNo
};
showLoading();
list(param).then(respData => {
hideLoading();
if (respData.data.code != 0) {
return this.$message.error(respData.data.msg);
}
this.table = respData.data.data;
}).catch(() => {
hideLoading();
});
},
isNotBank(str) {
return !(isBlank(str));
},
toFixed(num, digit) {
return Math.round(parseFloat(num) * Math.pow(10, digit)) / Math.pow(10, digit);
},
doExport() {
let me = this, oData = this.search;
let param = {
documentNo: oData.documentNo,
startS: oData.startDate,
endS: oData.endDate,
erpNo: oData.erpNo
};
let url = "/wms/complexReport/export";
this.downBlobFile(url, param, "备货汇总表.xlsx");
},
handleSizeChange(val) {
this.queryParam.size = val;
this.doRetrieve();
},
handleCurrentChange(val) {
this.queryParam.current = val;
this.doRetrieve();
},
handleSelectionChange(row) {
this.tableSelection = row;
},
tableColumnFormatter(row, column, cellValue, index) {
switch (column.property) {
}
},
dateChange(array) {
if (array && array.length == 2) {
this.search.startDate = array[0];
this.search.endDate = array[1];
}
},
showPallet(row) {
this.dialog.palletDialog.table = row.palletDetail;
this.dialog.palletDialog.visible = true;
},
showBox(row) {
this.dialog.boxDialog.table = row.boxDetail;
this.dialog.boxDialog.visible = true;
}
}
};
</script>
<style scoped lang="scss">
.requiredclass ::v-deep div.cell::before {
content: "*";
width: 10px;
height: 20px;
display: inline-block;
vertical-align: middle;
text-align: center;
line-height: 26px;
font-size: large;
color: #f00;
}
.inputRequired ::v-deep .el-form-item__label::before {
content: "*";
width: 10px;
height: 20px;
display: inline-block;
vertical-align: middle;
text-align: center;
line-height: 26px;
font-size: large;
color: #f00;
}
.line {
float: right;
width: 99%;
height: 1px;
margin-top: 1.4em;
margin-bottom: 2em;
background: #E6E6E6;
position: relative;
text-align: center;
}
.relationContainer {
display: flex;
justify-content: center; /*主轴上居中*/
align-items: center; /*侧轴上居中*/
}
.el-dialog__body ::v-deep {
user-select: all;
}
</style>

View File

@ -0,0 +1,819 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='productionRequisitionDialogObj'
:modal-fetch-fun='productionRequisitionDialogFetchFun'
:modal-show.sync="productionRequisitionDialogVisible"
@inputDialogSelected="productionRequisitionSelect" ref="documentDialog">
</input-select-dialog>
<input-select-dialog :modal-obj='storageLocationDialogObj' :modal-fetch-fun='storageLocationDialogFetchFun'
:modal-show.sync="storageLocationDialogVisible" @inputDialogSelected="storageLocationSelect">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item prop="documentNo">
<el-input v-model="formObj.documentNo" placeholder="单据号" autofocus
@keyup.enter.native="scanProductionRequisitionOrder">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
<el-button slot="append" icon="el-icon-search"
@click.stop="showProductionRequisitionDialog"></el-button>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="formObj.itemList" border>
<el-table-column label="物料" prop="item">
</el-table-column>
<el-table-column label="物料描述" prop="itemDescription">
</el-table-column>
<el-table-column label="来源仓" prop="sourceWarehouse">
</el-table-column>
<el-table-column :label="targetWarehouseDesc" prop="targetWarehouse">
</el-table-column>
<el-table-column label="需求数量" prop="applicationsQuantity">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="showItemDialog(scope.$index, scope.row)">出库执行
</el-button>
</template>
</el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-tag v-if="scope.row.state === 'CLOSE'" type="warning" disable-transitions>
已执行
</el-tag>
<el-tag v-if="scope.row.state === 'SUBMIT'" disable-transitions>
待执行
</el-tag>
<el-tag v-if="scope.row.state === 'SAVING'" type="success" disable-transitions>
已保存
</el-tag>
</template>
</el-table-column>
</el-table>
<div style="margin-top: 10px;">
<el-button type="primary" @click="openPostDateDialog">提交</el-button>
<el-button type="primary" @click="oneClickExecute">一键出库</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
<el-dialog :visible.sync="dialogItemType1FormVisible" center fullscreen @close="backUpCodeList">
<div style="margin-top: 10px;">
<el-form :model="itemForm" label-width="auto">
<el-descriptions :column="1" border :labelStyle="lableWidth">
<el-descriptions-item label="单据号">
{{ itemForm.documentNo }}
</el-descriptions-item>
<el-descriptions-item label="物料">
{{ itemForm.item }}
</el-descriptions-item>
<el-descriptions-item label="物料描述">
{{ itemForm.itemDescription }}
</el-descriptions-item>
<el-descriptions-item label="来源仓">
{{ itemForm.sourceWarehouse }}
</el-descriptions-item>
<el-descriptions-item :label="targetWarehouseDesc">
{{ itemForm.targetWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="需求数量">
{{ itemForm.applicationsQuantity }}
</el-descriptions-item>
<el-descriptions-item label="汇总数量">
{{ itemForm.sumQuantity }}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ itemForm.unitOfMeasure }}
</el-descriptions-item>
<el-descriptions-item label="批次">
{{ itemForm.batch }}
</el-descriptions-item>
</el-descriptions>
<div style="margin-top: 10px;">
<el-form-item prop="code">
<el-input v-model="itemForm.code" placeholder="扫描条码" autofocus
@keyup.enter.native="scanCode" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
<el-table :data="itemForm.inventoryList" border>
<el-table-column label="序号" prop="seq"></el-table-column>
<el-table-column label="条码" prop="inventoryIdOrCarrier"></el-table-column>
<el-table-column label="数量" prop="inventoryQty"></el-table-column>
<el-table-column label="载具类型" prop="type" v-if="itemForm.itemType === 'FERT'"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="delRow(scope.$index, scope.row)"
:disabled="scope.row.isScan === 'N'">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveItemType1" :disabled="isUse">保存</el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="dialogItemType2FormVisible" center fullscreen>
<div style="margin-top: 10px;">
<el-form :model="itemForm" label-width="auto">
<el-descriptions :column="1" border :labelStyle="lableWidth">
<el-descriptions-item label="单据号">
{{ itemForm.documentNo }}
</el-descriptions-item>
<el-descriptions-item label="物料">
{{ itemForm.item }}
</el-descriptions-item>
<el-descriptions-item label="物料描述">
{{ itemForm.itemDescription }}
</el-descriptions-item>
<el-descriptions-item label="来源仓">
{{ itemForm.sourceWarehouse }}
</el-descriptions-item>
<el-descriptions-item :label="targetWarehouseDesc">
{{ itemForm.targetWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="需求数量">
{{ itemForm.applicationsQuantity }}
</el-descriptions-item>
<el-descriptions-item label="出货数量">
<el-input type="number" v-model="itemForm.sumQuantity" :disabled="isUse"></el-input>
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ itemForm.unitOfMeasure }}
</el-descriptions-item>
<el-descriptions-item label="存储区域">
<el-input v-model="itemForm.storageLocation" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showStorageLocationDialog"></i>
</el-input>
</el-descriptions-item>
</el-descriptions>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveItemType2" :disabled="isUse">保存</el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="postDateDialogVisible" center width="20%">
<el-form label-width="auto">
<el-form-item label="选择日期:">
<el-date-picker
v-model="postDate"
placeholder="选择日期"
style="width: 100%"
type="date"
format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submit">确认</el-button>
<el-button type="primary" @click="closeDialog">返回</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {
fetchList as fetchProductionRequisitionList,
getDocumentDetail,
getInventoryQty,
getItemInventory,
oneClickPassValidate
} from "@/api/wms/cost-center-requisition";
import {submitFreePostDate} from "@/api/wms/production-out-inventory";
import {fetchList as fetchStorageLocationList, getStorageLocationPageBycode} from '@/api/wms/storage-location';
import {getInventoryQtyNew} from "@/api/wms/production-out-inventory";
import {isBlank} from "@/util/string";
import {getStore} from '@/util/store';
import {add} from '@/util/bigNumber';
import {dateFormatCustom} from '@/util/date';
import {showLoading, hideLoading} from '@/const/loading';
import {listByActivityId} from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex';
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
isUse: false,
wms_document_return: false,
formObj: {},
documentNo: "",
itemForm: {},
submitList: [],
codeList: [],
verifyDefaultStorageBin: "",
storageLocationList: "",
postDate: null,
postDateDialogVisible: false,
dialogItemType1FormVisible: false,
dialogItemType2FormVisible: false,
productionRequisitionDialogFetchFun: fetchProductionRequisitionList,
productionRequisitionDialogVisible: false,
productionRequisitionDialogObj: {
"condition": "searchText",
tableColumn: [
{prop: "documentNo", label: "单据"},
{
prop: "state", label: "状态", formatter: (row, column, cellValue, index) => {
if (cellValue == "SUBMIT") {
return "提交";
}
if (cellValue == "CLOSE") {
return "关闭";
}
}
},
{prop: "sourceWarehouse", label: "来源仓"},
]
},
storageLocationDialogVisible: false,
storageLocationDialogFetchFun: fetchStorageLocationList,
storageLocationDialogObj: {
"condition": "storageLocation",
tableColumn: [
{prop: "storageLocation", label: "存储位置", width: "200"},
{prop: "description", label: "描述"}
]
},
initData: {
documentNo: "",
itemList: [],
site: getStore({name: 'tenantId'})
},
documentType: "",
targetWarehouseDesc:"",
};
},
created() {
this.wms_document_return = this.permissions["wms_document_return"];
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, {"inventoryList": [], "sumQuantity": 0, "code": "", "storageLocation": ""});
this.documentNo = "";
this.codeList = [];
},
beforeRouteEnter(to, from, next) {
next(vm => {
try {
//获取作业规则
let me = vm;
let activityId = me.$route.query.ACTIVITY_ID;
listByActivityId(activityId).then(response => {
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
let data = response.data.data;
if (data && data.length > 0) {
for (let i = 0; i < data.length; i++) {
if (data[i].optionName && data[i].optionName.toUpperCase() === "IS_DOWN") {
me.verifyDefaultStorageBin = isBlank(data[i].optionValue) ? true : data[i].optionValue === "Y";
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "STORAGE_LOCATION") {
me.storageLocationList = data[i].optionValue;
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "FINISH_QTY_CONTROL") {
me.finishQtyControl = data[i].optionValue;
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "ALLOW_ONE_SUBMIT") {
me.allowOneSubmit = data[i].optionValue === "Y";
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "FREEZE_STATUS") {
me.transferFreeze = data[i].optionValue === "Y";
}
if (data[i].optionName && data[i].optionName === "DOCUMENT_TYPE") {
let value = data[i].optionValue;
if (!isBlank(value) && (value === "COST_CENTER_RECEIVE" || value === "ENGINEER_RECEIVE")) {
me.documentType = value;
me.targetWarehouseDesc = me.documentType === 'COST_CENTER_RECEIVE' ? '成本中心' : '在建工程编号';
}
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "ALLOW_CHECK_WAREHOUSE") {
me.oneClickWarhouses = data[i].optionValue.split(",");
}
}
if (isBlank(me.documentType)) {
me.documentType = "COST_CENTER_RECEIVE";
me.targetWarehouseDesc = "成本中心";
}
}
}).catch(e => {
console.log(e);
});
} catch (e) {
console.log(e);
}
});
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//存储区域弹出框
showStorageLocationDialog() {
let me = this;
me.storageLocationDialogVisible = true;
if (this.storageLocationList != "") {
this.storageLocationDialogFetchFun = getStorageLocationPageBycode;
this.storageLocationDialogObj.queryParam = {"str": this.storageLocationList};
} else {
this.storageLocationDialogObj.queryParam = {"erpStorageLocation": me.itemForm.sourceWarehouse};
}
},
storageLocationSelect(row) {
let me = this;
me.itemForm.storageLocation = row.storageLocation;
console.log(me.itemForm);
},
//单据号弹出框
showProductionRequisitionDialog() {
let me = this;
me.productionRequisitionDialogVisible = true;
me.$refs.documentDialog.clear();
me.productionRequisitionDialogObj.queryParam = {"documentType": me.documentType};
},
productionRequisitionSelect(row) {
let me = this;
me.formObj.itemList = [];
me.submitList = [];
me.formObj.documentNo = row.documentNo;
me.documentNo = me.formObj.documentNo;
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"storageLocation": res.data.data[i].storageLocation,
"itemType": res.data.data[i].itemType,
"batch": res.data.data[i].batch,
});
me.formObj.itemList.push(obj);
}
}
});
},
//扫描单据号
scanProductionRequisitionOrder() {
let me = this;
let code = me.formObj.documentNo;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
}
if (me.documentNo === code) {
me.$message.error("不可重复扫描");
return;
}
me.formObj.itemList = [];
me.submitList = [];
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
if (res.data.data[0].documentType != me.documentType) {
if (me.documentType === 'COST_CENTER_RECEIVE') {
return me.$message.error("单据类型不是成本中心领料");
}
if (me.documentType === 'ENGINEER_RECEIVE') {
return me.$message.error("单据类型不是在建工程领料");
}
return me.$message.error("单据类型不支持");
}
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.formObj.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"storageLocation": res.data.data[i].storageLocation,
"itemType": res.data.data[i].itemType,
"batch": res.data.data[i].batch,
});
me.formObj.itemList.push(obj);
me.documentNo = me.formObj.documentNo;
}
}
});
},
showItemDialog(index, row) {
//判断是物料类型弹出不同的表单
let me = this;
//判断行项目是否已经关闭,关闭则不可扫描条码和保存
this.isUse = row.state === "CLOSE";
if (row.itemType === 'ROH' || row.itemType === 'VERP' || row.itemType === 'FERT') {
//获取汇总数量
let obj = Object.assign({
"inventoryList": [],
"code": "",
"sumQuantity": 0,
"storageLocation": ""
}, row);
if (me.submitList.length > 0) {
let saveObj = me.submitList.find(o => o.seq === row.seq);
if (saveObj) {
obj = Object.assign({}, saveObj);
obj.inventoryList = saveObj.inventoryList.slice();
}
}
me.itemForm = obj;
me.dialogItemType1FormVisible = true;
me.loadSaveData(row);
} else if (row.itemType === 'KMAT') {
//获取汇总数量
let obj = Object.assign({
"inventoryList": [],
"sumQuantity": row.applicationsQuantity,
"storageLocation": ""
}, row);
if (me.submitList.length > 0) {
let saveObj = me.submitList.find(o => o.seq === row.seq);
if (saveObj) {
obj = Object.assign({}, saveObj);
obj.inventoryList = saveObj.inventoryList.slice();
}
}
me.itemForm = obj;
me.dialogItemType2FormVisible = true;
me.loadMatSaveData(row);
} else {
me.$message.error("不支持的物料类型");
}
},
loadMatSaveData(row) {
let me = this;
getItemInventory(row).then(res => {
let sumInventoryQty = 0;
if (res.data.code === 0 && res.data.data.length > 0) {
me.itemForm.inventoryList = [];
for (let i = 0; i < res.data.data.length; i++) {
sumInventoryQty = add(sumInventoryQty, res.data.data[i].inventoryQty);
}
me.$set(me.itemForm, "sumQuantity", sumInventoryQty);
}
});
},
loadSaveData(row) {
let me = this;
getItemInventory(row).then(res => {
let sumInventoryQty = 0;
if (res.data.code === 0 && res.data.data.length > 0) {
let array = [], length = res.data.data.length;
for (let data of res.data.data) {
sumInventoryQty = add(sumInventoryQty, data.inventoryQty);
array.push({
"inventoryIdOrCarrier": data.inventoryIdOrCarrier,
"inventoryQty": data.inventoryQty,
"isScan": "N",
"seq": length--
});
}
me.$set(me.itemForm, "inventoryList", array);
me.$set(me.itemForm, "sumQuantity", sumInventoryQty);
}
});
},
getInventoryList() {
let me = this;
let obj = Object.assign({}, {
"item": me.itemForm.item,
"sourceWarehouse": me.itemForm.sourceWarehouse,
"inventoryIdOrCarrier": me.itemForm.code,
"batch": me.itemForm.batch,
"verifyDefaultStorageBin": me.verifyDefaultStorageBin,
"checkStatus": false,
"documentType": me.itemForm.documentType,
"transferFreeze": me.transferFreeze
});
showLoading();
getInventoryQtyNew(obj).then(res => {
hideLoading();
if (res.data.code === 0) {
//库存总数大于需求数量
let data = res.data.data;
let qty = 0, rowArray = [], codeArray = [];
let length = me.itemForm.inventoryList.length;
if (length > 0) {
data = data.filter(o => {
for (let code of me.codeList) {
if (code === o.inventoryIdOrCarrier || code === o.carrier) {
return false;
}
}
return true;
});
}
if (data.length === 0) {
me.$message.error("不可重复扫描");
} else {
for (let row of data) {
let inventoryQty = row.inventoryQty;
qty = add(qty, inventoryQty);
rowArray.push({
"inventoryIdOrCarrier": row.inventoryIdOrCarrier,
"inventoryQty": row.inventoryQty,
"group": row.group,
"carrier": row.carrier,
"isScan": "Y",
"type": row.type,
"seq": ++length,
});
codeArray.push(row.inventoryIdOrCarrier);
}
if (!isBlank(data[0].carrier) && data[0].inventoryIdOrCarrier !== data[0].carrier) {
codeArray.push(data[0].carrier);
}
if ((add(qty, me.itemForm.sumQuantity) > me.itemForm.applicationsQuantity) && me.finishQtyControl !== "2") {
me.$message.error("汇总数量大于需求数量");
} else {
rowArray.reverse();
me.itemForm.sumQuantity = add(me.itemForm.sumQuantity, qty);
me.itemForm.inventoryList = rowArray.concat(me.itemForm.inventoryList);
me.codeList = me.codeList.concat(codeArray);
me.itemForm.code = "";
}
}
}
}).catch(e => hideLoading());
},
scanCode() {
let me = this;
if (isBlank(me.itemForm.code)) {
me.$message.error("不可扫描空条码");
return;
}
if (me.itemForm.inventoryList.length > 0) {
if (me.codeList.includes(me.itemForm.code)) {
me.$message.error("不可重复扫描");
return;
}
this.getInventoryList();
} else {
this.getInventoryList();
}
},
submit() {
let me = this;
for (let i = 0; i < me.submitList.length; i++) {
let list = me.submitList[i].inventoryList;
for (let j = 0; j < list.length; j++) {
if (list[j].isScan === "N") {
me.submitList[i].inventoryList.splice(j, 1);
}
}
}
showLoading();
submitFreePostDate({
date: dateFormatCustom(me.postDate,"yyyy-MM-dd"),
list: me.submitList,
}).then(res => {
hideLoading();
me.$message.success("提交成功");
me.doClear();
}).catch(() => {
hideLoading();
});
},
saveItemType1() {
let me = this;
if (me.itemForm.state === "CLOSE") {
me.$message.error("此行项目已关闭");
} else if (me.itemForm.inventoryList.length === 0) {
me.$message.error("无信息可以保存,请点击返回按钮");
} else if (me.itemForm.sumQuantity !== me.itemForm.applicationsQuantity && isBlank(me.finishQtyControl)) {
me.$message.error("汇总数量不等于需求数量,请确认");
} else {
me.backUpList = [];
let fun = () => {
let obj = me.itemForm;
obj.state = "SAVING";
if (me.submitList.length > 0) {
let index = me.submitList.findIndex(o => o.seq === obj.seq);
if (index >= 0) {
me.submitList.splice(index, 1, obj);
} else {
me.submitList.push(obj);
}
} else {
me.submitList.push(obj);
}
me.$set(me.formObj.itemList.find(o => o.seq === obj.seq), "state", obj.state);
me.dialogItemType1FormVisible = false;
};
fun();
}
},
saveItemType2() {
let me = this;
if (me.itemForm.state === "CLOSE") {
me.$message.error("此行项目已关闭");
} else if (isBlank(me.itemForm.storageLocation)) {
me.$message.error("无信息可以保存,请点击返回按钮");
} else {
me.itemForm.inventoryList = [{
"inventoryQty": me.itemForm.sumQuantity
}];
let obj = me.itemForm;
obj.state = "SAVING";
if (me.submitList.length > 0) {
let index = me.submitList.findIndex(o => o.seq === obj.seq);
if (index >= 0) {
me.submitList.splice(index, 1, obj);
} else {
me.submitList.push(obj);
}
} else {
me.submitList.push(obj);
}
me.$set(me.formObj.itemList.find(o => o.seq === obj.seq), "state", obj.state);
me.dialogItemType2FormVisible = false;
}
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, {"inventoryList": [], "sumQuantity": 0, "code": ""});
this.documentNo = "";
this.codeList = [];
this.submitList = [];
this.postDateDialogVisible = false;
},
delRow(index, row) {
let me = this;
//删除已扫描过条码中集合的信息
let inventoryList = me.itemForm.inventoryList, delList = [], delQty = 0;
let groupOrCarrier = isBlank(row.group) ? row.carrier : row.group;
if (!isBlank(groupOrCarrier)) {
let startIndex = -1, endIndex = -1;
for (let i = 0; i < inventoryList.length; i++) {
if (startIndex < 0 && (inventoryList[i].group === groupOrCarrier || inventoryList[i].carrier === groupOrCarrier)) {
startIndex = i;
}
if (startIndex >= 0 && (inventoryList[i].group === groupOrCarrier || inventoryList[i].carrier === groupOrCarrier)) {
endIndex = i + 1;
}
}
for (let delRow of me.itemForm.inventoryList.splice(startIndex, endIndex === -1 ? 1 : endIndex)) {
delQty = add(delQty, row.inventoryQty);
delList.push(delRow.inventoryIdOrCarrier);
}
if (!isBlank(row.carrier) && row.inventoryIdOrCarrier !== row.carrier) {
delList.push(groupOrCarrier);
}
} else {
delQty = row.inventoryQty;
delList = me.itemForm.inventoryList.splice(index, 1).map(o => o.inventoryIdOrCarrier);
}
for (let i = 0; i < me.itemForm.inventoryList.length; i++) {
me.itemForm.inventoryList[i].seq = me.itemForm.inventoryList.length - i;
}
me.codeList = me.codeList.filter(o => !delList.includes(o));
if (me.itemForm.state === "SAVING") {
me.backUpList = me.backUpList.concat(delList.filter(o => !me.backUpList.includes(o)));
}
me.itemForm.sumQuantity -= delQty;
},
backUpCodeList() {
let me = this;
if (me.backUpList.length > 0) {
me.codeList = me.codeList.concat(me.backUpList.filter(o => !me.codeList.includes(o)));
}
},
openPostDateDialog() {
let me = this;
if (me.submitList.length > 0) {
if (!me.allowOneSubmit) {
for (let row of me.formObj.itemList) {
if (row.state !== "SAVING") {
if (row.state === "CLOSE") {
me.$message.error("行项目" + row.seq + "已关闭,不可以提交,请修改作业规则");
} else {
me.$message.error("行项目" + row.seq + "无保存信息可以提交,请确认");
}
return;
}
}
}
me.postDate = new Date();
me.postDateDialogVisible = true;
} else {
me.$message.error("没有可提交的行");
}
},
oneClickExecute() {
let me = this;
if (me.oneClickWarhouses && me.oneClickWarhouses.length > 0) {
let itemList = me.formObj.itemList;
itemList = itemList.filter(o => o.state === 'SUBMIT');
if (itemList.length > 0) {
if (itemList.every(o => o.itemType === 'KMAT')) {
if (itemList.every(o => me.oneClickWarhouses.includes(o.sourceWarehouse))) {
if (Array.from(new Set(itemList.map(o => o.item))).length === itemList.length) {
showLoading();
oneClickPassValidate(itemList).then(res => {
hideLoading();
let data = res.data.data;
for (let item of Object.keys(data)) {
let row = itemList.find(o => o.item === item);
let itemForm = Object.assign({}, row);
itemForm.inventoryList = [{
"inventoryQty": row.applicationsQuantity
}];
itemForm.sumQuantity = row.applicationsQuantity;
me.submitList.push(itemForm);
me.$set(row, "state", "SAVING");
}
me.openPostDateDialog();
}).catch(() => {
hideLoading();
});
} else {
me.$message.error("待执行项物料重复,不允许一键出库");
}
} else {
me.$message.error("待执行项含有不允许一键出库的来源仓");
}
} else {
me.$message.error("待执行项含有非五金备件物料,不允许一键出库");
}
} else {
me.$message.error("单据没有待执行的行项目");
}
} else {
me.$message.error("未维护可一键出库的来源仓");
}
},
closeDialog() {
this.postDateDialogVisible = false;
},
},
};
</script>

View File

@ -0,0 +1,473 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='productionRequisitionDialogObj'
:modal-fetch-fun='productionRequisitionDialogFetchFun' :modal-show.sync="productionRequisitionDialogVisible"
@inputDialogSelected="productionRequisitionSelect" ref="documentDialog">
</input-select-dialog>
<input-select-dialog :modal-obj='storageLocationDialogObj' :modal-fetch-fun='storageLocationDialogFetchFun'
:modal-show.sync="storageLocationDialogVisible" @inputDialogSelected="storageLocationSelect">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item prop="documentNo">
<el-input v-model="formObj.documentNo" placeholder="单据号" autofocus
@keyup.enter.native="scanProductionRequisitionOrder">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
<el-button slot="append" icon="el-icon-search"
@click.stop="showProductionRequisitionDialog"></el-button>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-table :data="formObj.itemList" border>
<el-table-column label="物料" prop="item">
</el-table-column>
<el-table-column label="物料描述" prop="itemDescription">
</el-table-column>
<el-table-column label="成本中心" prop="sourceWarehouse">
</el-table-column>
<el-table-column label="目标仓" prop="targetWarehouse">
</el-table-column>
<el-table-column label="需求数量" prop="applicationsQuantity">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="showItemDialog(scope.$index, scope.row)">入库执行
</el-button>
</template>
</el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-tag v-if="scope.row.state === 'CLOSE'" type="warning" disable-transitions>
已执行</el-tag>
<el-tag v-if="scope.row.state === 'SUBMIT'" disable-transitions>
待执行</el-tag>
<el-tag v-if="scope.row.state === 'SAVING'" type="success" disable-transitions>
已保存</el-tag>
</template>
</el-table-column>
</el-table>
</el-form>
<div style="margin-top: 10px;">
<el-button type="primary" @click="returnSubmit">提交</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
<el-button type="danger" @click="reject">拒收</el-button>
</div>
<el-dialog :visible.sync="dialogItemType2FormVisible" center fullscreen>
<div style="margin-top: 10px;">
<el-form :model="itemForm" label-width="auto">
<el-descriptions :column="1" border :labelStyle="lableWidth">
<el-descriptions-item label="单据号">
{{ itemForm.documentNo }}
</el-descriptions-item>
<el-descriptions-item label="物料">
{{ itemForm.item }}
</el-descriptions-item>
<el-descriptions-item label="物料描述">
{{ itemForm.itemDescription }}
</el-descriptions-item>
<el-descriptions-item label="成本中心">
{{ itemForm.sourceWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="目标仓">
{{ itemForm.targetWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="需求数量">
{{ itemForm.applicationsQuantity }}
</el-descriptions-item>
<!-- <el-descriptions-item label="实际数量">
<el-input type="number" v-model="itemForm.sumQuantity" :disabled="isUse"></el-input>
</el-descriptions-item> -->
<el-descriptions-item label="单位">
{{ itemForm.unitOfMeasure }}
</el-descriptions-item>
<el-descriptions-item label="存储区域">
<el-input v-model="itemForm.storageLocation" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showStorageLocationDialog"></i>
</el-input>
</el-descriptions-item>
</el-descriptions>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveItemType2" :disabled="isUse">保存</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {
fetchList as fetchProductionRequisitionList,
getDocumentDetail,
returnSubmit,
getInventoryOriginalQty,
getItemInventory,
rejectDocumentByNo
} from "@/api/wms/cost-center-return";
import {
fetchList as fetchStorageLocationList,
getStorageLocationPageBycode
} from '@/api/wms/storage-location'
import { isBlank } from "@/util/string";
import { showLoading, hideLoading } from '@/const/loading'
import { getStore } from '@/util/store';
import { getByActivityOption } from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex'
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
isUse: false,
wms_document_return: false,
formObj: {},
documentNo: "",
itemForm: {},
submitList: [],
codeList: [],
storageLocationList: "",
dialogItemType1FormVisible: false,
dialogItemType2FormVisible: false,
productionRequisitionDialogFetchFun: fetchProductionRequisitionList,
productionRequisitionDialogVisible: false,
productionRequisitionDialogObj: {
"condition": "searchText",
tableColumn: [
{ prop: "documentNo", label: "单据", },
{
prop: "state", label: "状态", formatter: (row, column, cellValue, index) => {
if (cellValue == "SUBMIT") {
return "提交"
}
if (cellValue == "CLOSE") {
return "关闭"
}
}
}
]
},
storageLocationDialogVisible: false,
storageLocationDialogFetchFun: fetchStorageLocationList,
storageLocationDialogObj: {
"condition": "storageLocation",
tableColumn: [
{ prop: "storageLocation", label: "存储位置", width: "200" },
{ prop: "description", label: "描述" }
]
},
initData: {
documentNo: "",
itemList: [],
site: getStore({ name: 'tenantId' })
},
}
},
created() {
this.wms_document_return = this.permissions["wms_document_return"];
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, { "inventoryList": [], "sumQuantity": 0, "code": "", "storageLocation": "" });
this.documentNo = "";
this.codeList = [];
let activityId = this.$route.query.ACTIVITY_ID
getByActivityOption(activityId, 'STORAGE_LOCATION').then(response => {
if (response.data.code != 0) {
return this.$message.error(response.data.msg)
}
this.storageLocationList = response.data.data.optionValue
}).catch(e => {
console.log(e)
})
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//存储区域弹出框
showStorageLocationDialog() {
let me = this;
me.storageLocationDialogVisible = true;
if (this.storageLocationList != "") {
this.storageLocationDialogFetchFun = getStorageLocationPageBycode;
this.storageLocationDialogObj.queryParam = { "str": this.storageLocationList };
} else {
this.storageLocationDialogObj.queryParam = { "erpStorageLocation": me.itemForm.targetWarehouse };
}
},
storageLocationSelect(row) {
let me = this;
me.itemForm.storageLocation = row.storageLocation;
console.log(me.itemForm);
},
//单据号弹出框
showProductionRequisitionDialog() {
let me = this;
me.productionRequisitionDialogVisible = true;
me.$refs.documentDialog.clear();
me.productionRequisitionDialogObj.queryParam = { "documentType": "COST_CENTER_RETURNED" }
},
productionRequisitionSelect(row) {
let me = this;
me.formObj.itemList = [];
me.submitList = [];
me.formObj.documentNo = row.documentNo;
me.documentNo = me.formObj.documentNo;
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"storageLocation": res.data.data[i].storageLocation
})
me.formObj.itemList.push(obj);
}
}
})
},
showItemDialog(index, row) {
//判断是物料类型弹出不同的表单
let me = this;
let sumInventoryQty = 0;
//判断行项目是否已经关闭,关闭则不可扫描条码和保存
if (row.state === "CLOSE") {
this.isUse = true;
} else {
this.isUse = false;
}
//获取汇总数量
/* getItemInventory(row).then(res => {
if (res.data.code == 0 && res.data.data.length > 0) {
me.itemForm.inventoryList = [];
for (let i = 0; i < res.data.data.length; i++) {
sumInventoryQty += res.data.data[i].inventoryQty;
}
me.itemForm.sumQuantity = sumInventoryQty;
}
}) */
if (me.submitList.length > 0) {
console.log(me.submitList);
for (let i = 0; i < me.submitList.length; i++) {
let obj = Object.assign({}, me.submitList[i]);
if (me.submitList[i].seq === row.seq) {
me.itemForm = obj;
me.dialogItemType2FormVisible = true;
return;
} else {
me.dialogItemType2FormVisible = true;
me.itemForm = Object.assign(obj, { "inventoryList": [], "storageLocation": "", "sumQuantity": row.applicationsQuantity }, row);
}
}
} else {
me.dialogItemType2FormVisible = true;
me.itemForm = Object.assign(me.itemForm, { "inventoryList": [], "storageLocation": "", "sumQuantity": row.applicationsQuantity }, row);
}
},
//扫描单据号
scanProductionRequisitionOrder() {
let me = this;
let code = me.formObj.documentNo;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
};
if (me.documentNo === code) {
me.$message.error("不可重复扫描");
return;
};
me.formObj.itemList = [];
me.submitList = [];
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
if (res.data.data[0].documentType != "COST_CENTER_RETURNED") {
return me.$message.error("单据类型不是成本中心退料");
}
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.formObj.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"storageLocation": res.data.data[i].storageLocation
})
me.formObj.itemList.push(obj);
me.documentNo = me.formObj.documentNo;
}
}
})
},
getinventoryList() {
let me = this;
console.log(me.itemForm);
let obj = Object.assign({}, {
"item": me.itemForm.item,
"sourceWarehouse": me.itemForm.sourceWarehouse,
"inventoryIdOrCarrier": me.itemForm.code
})
getInventoryOriginalQty(obj).then(res => {
if (res.data.code == 0) {
//库存总数大于需求数量
if (res.data.data.inventoryQty + me.itemForm.sumQuantity > me.itemForm.applicationsQuantity) {
me.$message.error("汇总数量大于需求数量");
return;
}
let obj = Object.assign({},
{
"inventoryIdOrCarrier": res.data.data.inventoryIdOrCarrier,
"inventoryQty": res.data.data.inventoryQty,
"isScan": "Y"
});
me.itemForm.sumQuantity = res.data.data.inventoryQty;
me.itemForm.inventoryList.push(obj);
}
me.codeList.push({ "code": me.itemForm.code });
});
},
returnSubmit() {
let me = this;
if (me.submitList.length > 0) {
if (me.submitList.length != me.formObj.itemList.length) {
me.$message.error("未执行所有行项目");
return;
}
for (let i = 0; i < me.submitList.length; i++) {
let list = me.submitList[i].inventoryList;
for (let j = 0; j < list.length; j++) {
if (list[j].isScan === "N") {
me.submitList[i].inventoryList.splice(j, 1);
}
}
}
showLoading();
returnSubmit(me.submitList).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("提交成功");
me.doClear();
}
}).catch(() => {
hideLoading();
});
} else {
me.$message.error("没有可提交的行");
return;
}
},
saveItemType2() {
let me = this;
me.itemForm.inventoryList = [];
me.dialogItemType2FormVisible = false;
let obj1 = Object.assign({}, {
"inventoryQty": me.itemForm.applicationsQuantity
});
me.itemForm.inventoryList.push(obj1);
let obj = Object.assign({}, me.itemForm);
if (me.submitList.length > 0) {
for (let i = 0; i < me.submitList.length; i++) {
if (me.submitList[i].seq === obj.seq) {
me.submitList[i] = obj;
return;
}
}
me.submitList.push(obj);
} else {
me.submitList.push(obj);
}
//保存之后改变行项目状态为已保存
//item和seq都相等时候,找到行项目列表改变其状态
for (let i = 0; i < me.formObj.itemList.length; i++) {
if (me.itemForm.seq == me.formObj.itemList[i].seq && me.itemForm.item == me.formObj.itemList[i].item) {
me.formObj.itemList[i].state = "SAVING"
}
}
console.log(me.submitList);
},
//拒收
reject() {
let me = this;
if (isBlank(me.formObj.documentNo)) {
me.$message.error("请选择单据");
return;
}
console.log(me.formObj.documentNo);
rejectDocumentByNo(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
me.$message.success("拒收成功");
me.doClear();
}
})
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, { "inventoryList": [], "sumQuantity": 0, "code": "" });
this.documentNo = "";
this.codeList = [];
this.submitList = [];
}
},
}
</script>

View File

@ -0,0 +1,137 @@
<template>
<div class="execution">
<basic-container>
<avue-crud ref="crud"
:page.sync="page"
:data="tableData"
:permission="permissionList"
:table-loading="tableLoading"
:option="tableOption"
@on-load="getList"
@search-change="searchChange"
@refresh-change="refreshChange"
@size-change="sizeChange"
@current-change="currentChange"
@row-update="handleUpdate"
@row-save="handleSave"
@row-del="handleDel">
<template slot="menuLeft">
<el-button
v-if="permissions.wms_customer_export"
class="filter-item"
plain
type="primary"
size="small"
icon="el-icon-download"
@click="exportExcel">导出
</el-button>
</template>
</avue-crud>
</basic-container>
</div>
</template>
<script>
import {fetchList, getObj, addObj, putObj, delObj} from '@/api/wms/customer'
import {tableOption} from '@/const/crud/wms/customer'
import {mapGetters} from 'vuex'
export default {
name: 'customer',
data() {
return {
searchForm: {},
tableData: [],
page: {
total: 0, // 总页数
currentPage: 1, // 当前页数
pageSize: 20 // 每页显示多少条
},
tableLoading: false,
tableOption: tableOption
}
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {
addBtn: this.vaildData(this.permissions.wms_customer_add, false),
delBtn: this.vaildData(this.permissions.wms_customer_del, false),
editBtn: this.vaildData(this.permissions.wms_customer_edit, false)
};
}
},
methods: {
// 列表查询
getList(page, params) {
this.tableLoading = true
fetchList(Object.assign({
current: page.currentPage,
size: page.pageSize
}, params, this.searchForm )).then(response => {
this.tableData = response.data.data.records
this.page.total = response.data.data.total
this.tableLoading = false
}).catch(() => {
this.tableLoading=false
})
},
// 删除
handleDel: function (row, index) {
this.$confirm('是否确认删除ID为' + row.handle, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
return delObj(row.handle)
}).then(data => {
this.$message.success('删除成功')
this.getList(this.page)
})
},
// 更新
handleUpdate: function (row, index, done,loading) {
putObj(row).then(data => {
this.$message.success('修改成功')
done()
this.getList(this.page)
}).catch(() => {
loading();
});
},
// 保存
handleSave: function (row, done,loading) {
addObj(row).then(data => {
this.$message.success('添加成功')
done()
this.getList(this.page)
}).catch(() => {
loading();
});
},
// 每页条数改变事件
sizeChange(pageSize){
this.page.pageSize = pageSize
},
// 当前页发生改变事件
currentChange(current){
this.page.currentPage = current
},
// 查询事件
searchChange(form, done) {
this.searchForm = form
this.page.currentPage = 1
this.getList(this.page, form)
done()
},
// 刷新事件
refreshChange() {
this.getList(this.page)
},
// 导出excel
exportExcel() {
this.downBlobFile('/wms/customer/export',this.searchForm, 'customer.xlsx')
}
}
}
</script>

View File

@ -0,0 +1,363 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj="dataFieldDialogObj" :modal-fetch-fun='dataFieldDialogFetchFun'
:modal-show.sync="dataFieldDialogVisible" @inputDialogSelected="dataFieldSelected"></input-select-dialog>
<basic-container style="margin-top: -20px">
<c-top-bar :offset="50">
<el-button type="text" icon="el-icon-search" @click="doRetrive('formObj')">检索</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-circle-check" @click="doSave('formObj')">保存</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-circle-close" @click="restForm('formObj')">清除</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-delete" @click="doRemove('formObj')">删除</el-button>
<el-divider style="margin-top: 0px;"></el-divider>
</c-top-bar>
<el-form ref="formObj" :rules="rules" :model="formObj" label-width="200px">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="数据字段:" prop="dataField">
<el-input placeHolder="数据字段" v-model="formObj.dataField">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showDataFieldDialog()"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="类型:" prop="validationType" placeholder="请选择类型">
<el-select v-model="formObj.validationType" @change="validationTypeChange">
<el-option label="文本" value="TEXT"></el-option>
<el-option label="文本区域" value="TEXT_AREA"></el-option>
<el-option label="日期" value="DATE"></el-option>
<el-option label="数字" value="NUMBER"></el-option>
<el-option label="复选框" value="CHECK"></el-option>
<el-option label="列表" value="LIST"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="描述:" prop="description">
<el-input placeHolder="描述" v-model="formObj.description"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="字段标签:" prop="dataTag">
<el-input placeHolder="字段标签" v-model="formObj.dataTag"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="QM选定集:" prop="isErp">
<el-switch v-model="formObj.isErp" active-value="Y" inactive-value="N" active-text="是"
inactive-text="否"></el-switch>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="浏览图标:" prop="isBrowse">
<el-switch v-model="formObj.isBrowse" active-value="Y" inactive-value="N" active-text="是"
inactive-text="否" :disabled="isBan"></el-switch>
</el-form-item>
</el-col>
<!-- 掩码组和预保存作业暂时注释 -->
<!-- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="掩码组:" prop="maskGroupBo">
<el-input placeHolder="掩码组" v-model="formObj.maskGroupBo"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="预保存作业:" prop="validationActivityBo">
<el-input placeHolder="预保存作业" v-model="formObj.validationActivityBo"></el-input>
</el-form-item>
</el-col> -->
</el-row>
<el-tabs v-model="tabActiveName" v-if="formObj.validationType == 'LIST'">
<el-tab-pane label="列表明细" name="dataFieldListTab">
<el-col :span="24">
<el-button type="primary" @click="addDataFieldListDetail()">新增</el-button>
</el-col>
<el-table size="mini" height="250" :data="formObj.dataFieldListList" border style="width: 100%"
highlight-current-row>
<el-table-column prop="seq" label="顺序">
<template slot-scope="scope">
<el-input v-model="scope.row.seq"></el-input>
</template>
</el-table-column>
<el-table-column prop="dataValue" label="字段值">
<template slot-scope="scope">
<el-input v-model="scope.row.dataValue"></el-input>
</template>
</el-table-column>
<el-table-column prop="dataTag" label="标签值">
<template slot-scope="scope">
<el-input v-model="scope.row.dataTag"></el-input>
</template>
</el-table-column>
<el-table-column prop="isDefault" label="缺省标签">
<template slot-scope="scope">
<el-switch v-model="scope.row.isDefault" active-value="Y" inactive-value="N"
active-text="是" inactive-text="否"></el-switch>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60">
<template slot-scope="scope">
<span class="el-tag el-tag--danger el-tag--mini" style="cursor: pointer;"
@click="removeDataFieldListDetail(scope.row,scope.$index)">删除</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</el-form>
</basic-container>
</div>
</template>
<script>
import {
fetchList,
getByCode,
delByCode,
addObj,
putObj,
delObj
} from '@/api/wms/data-field'
import { showLoading, hideLoading } from '@/const/loading'
import { stringFormat, isBlank } from "@/util/string"
import {
mapGetters
} from 'vuex'
import IconSelect from '../../../components/element-ui/icon-select.vue'
export default {
name: "data-field_maintain",
data() {
return {
tabActiveName: "dataFieldListTab",
formObj: {},
retrivedDataField: "",
mes_data_field_save: false,
mes_data_field_del: false,
mes_data_field_retrive: false,
dataFieldDialogVisible: false,
isBan: false,
initData: {
handle: "",
site: "",
dataField: "",
validationType: "",
description: "",
dataTag: "",
fieldType: "",
isBrowse: "",
isErp: "",
maskGroupBo: "",
validationActivityBo: "",
creator: "",
updater: "",
dateCreate: "",
dateUpdate: "",
dataFieldListList: [],
},
rules: {
dataField: [
{ required: true, message: "请输入数据字段名称" }
],
validationType: [
{ required: true, message: "请输入数据字段验证类型" }
],
dataTag: [
{ required: true, message: "请输入字段标签" }
]
},
dataFieldDialogFetchFun: fetchList,
dataFieldDialogObj: {
condition: "searchText",
tableColumn: [
{ prop: "dataField", label: "数据字段" },
{ prop: "description", label: "描述" }
]
}
};
},
created() {
this.mes_data_field_save = this.permissions["mes_data_field_save"];
this.mes_data_field_del = this.permissions["mes_data_field_del"];
this.mes_data_field_retrive = this.permissions["mes_data_field_retrive"];
this.formObj = Object.assign({}, this.initData);
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//显示操作弹窗框
showDataFieldDialog() {
this.dataFieldDialogVisible = true;
},
dataFieldSelected(row) {
let me = this;
me.formObj.dataField = row.dataField;
},
doRetrive(formName) {
let me = this;
me.$refs[formName].validateField(["dataField"], (errorMessage) => {
if (errorMessage) {
return false;
}
else {
showLoading();
let handle = me.formObj.dataField;
getByCode(handle).then(response => {
hideLoading();
if (!response.data.data || response.data.data.length === 0) {
me.doClear({ handle: handle });
let errorMsg = stringFormat("{0} 不存在", handle);
return me.$message.error(errorMsg);
}
me.formObj = Object.assign({}, response.data.data);
me.retrivedDataField = me.formObj.dataField;
}).catch(() => {
hideLoading();
});
}
});
},
doSave(formName) {
let me = this;
me.$refs[formName].validate((valid) => {
if (valid) {
if (me.isUpdate()) {
me.doUpdate();
}
else {
me.doAdd();
}
}
else {
return false;
}
});
},
doAdd() {
let me = this;
showLoading();
addObj(me.formObj).then(respData => {
hideLoading();
me.doRetrive("formObj");
this.$message.success("新增成功");
}).catch(error => {
hideLoading();
});
},
doUpdate() {
let me = this;
showLoading();
if (me.formObj.validationType != 'LIST') {
me.formObj.dataFieldListList = [];
}
putObj(me.formObj).then(respData => {
hideLoading();
me.doRetrive("formObj");
this.$message.success("更新成功");
}).catch(error => {
hideLoading();
});
},
doRemove(formName) {
let me = this;
let code = me.formObj.dataField;
me.$refs[formName].validateField(["dataField"], (errorMessage) => {
if (errorMessage) {
return;
}
else {
if (!me.isUpdate()) {
return this.$message.warning("必须先检索记录,然后才能将其删除");
}
showLoading();
me.$confirm("是否确认删除" + code, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
hideLoading();
return delByCode(code);
}).then(data => {
hideLoading();
this.$message.success("删除成功");
me.doClear();
}).catch(() => {
hideLoading();
});
}
});
},
doClear(retainData) {
let me = this;
me.formObj = retainData ? Object.assign({}, this.initData, retainData) : Object.assign({}, this.initData);
me.retrivedDataField = "";
me.formObj.dataFieldListList = [];
},
isUpdate() {
let me = this;
if (me.formObj.dataField === me.retrivedDataField) {
return true;
}
return false;
},
addDataFieldListDetail() {
let me = this;
if (!me.formObj.dataFieldListList) {
me.formObj.dataFieldListList = [];
}
let maxSeq = 0;
for (let i = 0; i < me.formObj.dataFieldListList.length; i++) {
let dataFieldListList = me.formObj.dataFieldListList[i]
if (dataFieldListList.seq > maxSeq) {
maxSeq = dataFieldListList.seq
}
}
let obj = { seq: Math.floor(maxSeq / 10) * 10 + 10, dataValue: "", dataTag: "", isDefault: "N" };
me.formObj.dataFieldListList.push(obj);
},
removeDataFieldListDetail(row, index) {
let me = this
me.formObj.dataFieldListList.splice(index, 1);
let maxSeq = row.seq
for (let i = index; i < me.formObj.dataFieldListList.length; i++) {
me.formObj.dataFieldListList[i].seq = maxSeq
maxSeq += 10
}
},
validationTypeChange(e) {
if (e == 'LIST') {
this.isBan = true;
} else
this.isBan = false;
},
restForm(formName) {
this.$refs[formName].resetFields();
this.doClear();
}
},
components: { IconSelect }
}
</script>
<style>
.el-transfer-panel {
width: 40%;
}
.el-divider--horizontal {
margin-top: 5px !important;
}
</style>

View File

@ -0,0 +1,290 @@
<template>
<div class="execution">
<basic-container>
<avue-crud ref="crud"
:page.sync="page"
:data="tableData"
:permission="permissionList"
:table-loading="tableLoading"
:option="tableOption"
@on-load="getList"
@search-change="searchChange"
@refresh-change="refreshChange"
@size-change="sizeChange"
@current-change="currentChange"
@search-reset="searchReset">
<template slot-scope="scope" slot="handle">
<el-link type="primary" @click="showDetail(scope.row)" style="color: #66b1ff !important;">展开</el-link>
</template>
<template slot-scope="scope" slot="deliveryDateSearch">
<el-date-picker type="date" value-format="yyyy-MM-dd" format="yyyy-MM-dd" v-model="searchForm.deliveryDate" style="width: 100%" placeholder="请选择 下单日期"></el-date-picker>
</template>
<template slot-scope="scope" slot="deliveryPlanDateSearch">
<el-date-picker type="date" value-format="yyyy-MM-dd" format="yyyy-MM-dd" v-model="searchForm.deliveryPlanDate" style="width: 100%" placeholder="请选择 计划发货日期"></el-date-picker>
</template>
</avue-crud>
<el-dialog :visible.sync="dialogVisible" center fullscreen>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row>
<el-col :span="6">
<el-form-item label="DN单号:" prop="dnOrder">
{{formObj.dnNumber}}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="销售出库单号:" prop="dnNumber">
{{formObj.innerOrder}}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="到货单状态:" prop="innerState">
{{formatterConst.innerState[formObj.innerState]}}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="客户编码:" prop="customerCode">
{{formObj.customerCode}}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="POD状态:" prop="podStatus">
{{formatterConst.podStatus[formObj.podStatus]}}
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="detailList" border @selection-change="selectionChange" :key="changeStamp">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column label="序号" align="center" width="55">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column v-for="item in columnList" :label="item.label" :prop="item.prop" align="center">
<template slot-scope="scope">
<el-input v-if="item.editable" v-model="scope.row[item.prop]"></el-input>
<span v-else>{{ scope.row[item.prop] }}</span>
</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveDetail" v-if="onEdit">保存</el-button>
<el-button type="primary" @click="editSwitch" v-else :disabled="detailList.length === 0">修改</el-button>
<el-button @click="dialogVisible = false">关闭</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {fetchList, selectDetailByID, updateDetailBatchById} from '@/api/wms/dn-order';
import {getByCode} from '@/api/wms/data-field';
import {isBlank} from "@/util/string";
import {showLoading, hideLoading} from '@/const/loading';
import {tableOption, formatterConst} from '@/const/crud/wms/dn-order';
import {mapGetters} from 'vuex';
export default {
name: 'dn-order',
data() {
return {
searchForm: {},
tableData: [],
tableSelection: [],
detailList: [],
changeStamp: 0,
page: {
total: 0, // 总页数
currentPage: 1, // 当前页数
pageSize: 20 // 每页显示多少条
},
tableLoading: false,
tableOption: tableOption,
formatterConst: formatterConst,
dialogVisible: false,
onEdit: false,
formObj: {},
columnList: [
{
label: "物料编号",
prop: "material",
name: "MATERIAL"
},
{
label: "物料名称",
prop: "materialDescription",
name: "MATERIAL_DESCRIPTION"
},
{
label: "客户物料编码",
prop: "customerItem",
name: "CUSTOMER_ITEM"
},
{
label: "客户物料描述",
prop: "customerItemDesc",
name: "CUSTOMER_ITEM_DESC"
},
{
label: "客户PO单号",
prop: "customerPoNumber",
name: "CUSTOMER_PO_NUMBER"
},
{
label: "数量",
prop: "qty",
name: "QTY"
},
{
label: "单位",
prop: "unit",
name: "UNIT"
},
{
label: "批次",
prop: "charg",
name: "CHARG"
},
{
label: "到货单批次",
prop: "deliveryBatch",
name: "DELIVERY_BATCH"
},
{
label: "出货仓库",
prop: "storagLocation",
name: "STORAG_LOCATION"
},
{
label: "备注",
prop: "deliveryLineRemarks",
name: "DELIVERY_LINE_REMARKS"
}
]
};
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {
addBtn: false,
delBtn: false,
editBtn: false
};
}
},
methods: {
// 列表查询
getList(page, params) {
this.tableLoading = true;
fetchList(Object.assign({
current: page.currentPage,
size: page.pageSize
}, params, this.searchForm)).then(response => {
this.tableData = response.data.data.records;
this.page.total = response.data.data.total;
this.tableLoading = false;
}).catch(() => {
this.tableLoading = false;
});
},
// 每页条数改变事件
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
// 当前页发生改变事件
currentChange(current) {
this.page.currentPage = current;
},
// 查询事件
searchChange(form, done) {
this.page.currentPage = 1;
this.getList(this.page, form);
done();
},
// 刷新事件
refreshChange() {
this.getList(this.page);
},
showDetail(row) {
let me = this;
me.reSetDialog();
showLoading();
selectDetailByID({
dnOrderBo: row.handle
}).then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
}
me.formObj = row;
me.detailList = res.data.data;
me.dialogVisible = true;
}).catch(e => hideLoading());
},
editSwitch() {
let me = this;
me.onEdit = true;
showLoading();
getByCode("ALLOW_UPDATE_FIELD").then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
}
let data = res.data.data.dataFieldListList;
if (data.length > 0) {
let editColumns = data.map(o => o.dataValue);
for (let column of me.columnList) {
if (editColumns.includes(column.name)) {
column.editable = true;
}
}
me.reLoadTable();
}
}).catch(e => hideLoading());
},
saveDetail() {
let me = this;
let tableSelection = me.tableSelection;
if (tableSelection.length === 0) {
return me.$message.error("请选择要保存的数据");
} else {
showLoading();
updateDetailBatchById(me.detailList).then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
}
me.reSetDialog();
me.dialogVisible = false;
return me.$message.success("保存成功");
}).catch(e => hideLoading());
}
},
reSetDialog() {
let me = this;
me.onEdit = false;
me.columnList.forEach(o => o.editable = false);
},
reLoadTable() {
this.changeStamp = Date.now();
},
selectionChange(rows) {
this.tableSelection = rows;
},
searchReset() {
this.searchForm={}
}
}
};
</script>

View File

@ -0,0 +1,144 @@
<template>
<div class="execution">
<basic-container>
<avue-crud ref="crud"
:page.sync="page"
:data="tableData"
:permission="permissionList"
:table-loading="tableLoading"
:option="tableOption"
@search-change="searchChange"
@refresh-change="refreshChange"
@size-change="sizeChange"
@current-change="currentChange"
@search-reset="searchReset">
<template slot="searchMenu" slot-scope="{row,size}">
<el-button type="primary" @click="doCancel">冲销</el-button>
</template>
</avue-crud>
</basic-container>
</div>
</template>
<script>
import {pageForCancel, cancelCloseDocument, saleReturnCancel} from '@/api/wms/document-cancel';
import {isBlank} from "@/util/string";
import {hideLoading, showLoading} from '@/const/loading';
import {formatterConst, tableOption} from '@/const/crud/wms/document-cancel';
import {mapGetters} from 'vuex';
export default {
name: 'document-cancel',
data() {
return {
searchForm: {},
tableData: [],
tableSelection: [],
changeStamp: 0,
page: {
total: 0, // 总页数
currentPage: 1, // 当前页数
pageSize: 20 // 每页显示多少条
},
tableLoading: false,
tableOption: tableOption,
formatterConst: formatterConst,
dialogVisible: false,
onEdit: false,
formObj: {},
};
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {
addBtn: false,
delBtn: false,
editBtn: false
};
}
},
methods: {
// 列表查询
getList(page, params) {
let me = this;
if (!params || isBlank(params.documentNo)) {
return me.$message.error("内部单号不能为空");
} else {
me.tableLoading = true;
pageForCancel(Object.assign({
current: page.currentPage,
size: page.pageSize
}, params, me.searchForm)).then(response => {
me.tableData = response.data.data.records;
me.page.total = response.data.data.total;
me.tableLoading = false;
}).catch(() => {
me.tableLoading = false;
});
}
},
// 每页条数改变事件
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
// 当前页发生改变事件
currentChange(current) {
this.page.currentPage = current;
},
// 查询事件
searchChange(form, done) {
this.searchForm = form;
this.page.currentPage = 1;
this.getList(this.page, form);
done();
},
searchReset(form, done) {
this.tableData = [];
done();
},
// 刷新事件
refreshChange() {
this.getList(this.page,this.searchForm);
},
selectionChange(rows) {
this.tableSelection = rows;
},
doCancel() {
let me = this;
if (me.tableData.length === 0) {
return me.$message.error("没有待冲销数据");
} else if (me.tableData[0].state === "CANCEL") {
return me.$message.error("单据已冲销");
} else {
let documentNo = me.tableData[0].documentNo;
let documentType = me.tableData[0].documentType;
let fun;
switch (documentType) {
case "PURCHASE_RETURN":
case "COST_CENTER_RECEIVE":
case "SCRAP_OUT":
case "OUTSOURCING":
case "ENGINEER_RECEIVE":
fun = cancelCloseDocument;
break;
case "SALES_RETURN":
fun = saleReturnCancel;
break;
default:
return me.$message.error("不支持的单据类型");
}
me.tableLoading = true;
fun(documentNo).then(resp => {
me.tableLoading = false;
me.$message.success("冲销成功");
me.refreshChange();
}).catch(() => {
me.tableLoading = false;
});
}
}
}
};
</script>

View File

@ -0,0 +1,136 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='productionRequisitionDialogObj'
:modal-fetch-fun='productionRequisitionDialogFetchFun'
:modal-show.sync="productionRequisitionDialogVisible"
@inputDialogSelected="productionRequisitionSelect" ref="documentDialog">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item prop="documentNo">
<el-input v-model="formObj.documentNo" placeholder="单据号" autofocus
@keyup.enter.native="scanProductionRequisitionOrder">
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div style="margin-top: 10px;">
<el-button type="primary" @click="submit">关闭</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
</basic-container>
</div>
</template>
<script>
import {
getDocumentDetail,
fetchList as fetchProductionRequisitionList,
submit
} from "@/api/wms/document-close";
import {isBlank} from "@/util/string";
import {getStore} from '@/util/store';
import {showLoading, hideLoading} from '@/const/loading'
import {
mapGetters
} from 'vuex'
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
formObj: {},
productionRequisitionDialogFetchFun: fetchProductionRequisitionList,
productionRequisitionDialogVisible: false,
productionRequisitionDialogObj: {
"condition": "searchText",
tableColumn: [
{prop: "documentNo", label: "单据"},
{
prop: "state", label: "状态", formatter: (row, column, cellValue, index) => {
if (cellValue == "SUBMIT") {
return "提交"
}
if (cellValue == "CLOSE") {
return "关闭"
}
}
}
]
},
initData: {
documentNo: "",
site: getStore({name: 'tenantId'})
},
}
},
created() {
this.formObj = Object.assign({}, this.initData);
this.documentNo = "";
},
methods: {
//单据号弹出框
showProductionRequisitionDialog() {
let me = this;
me.productionRequisitionDialogVisible = true;
me.$refs.documentDialog.clear();
me.productionRequisitionDialogObj.queryParam = {"documentType": "STORES_REQUISITION", "state": "SUBMIT"}
},
productionRequisitionSelect(row) {
let me = this;
me.formObj.documentNo = row.documentNo;
},
//扫描单据号
scanProductionRequisitionOrder() {
let me = this;
let code = me.formObj.documentNo;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
}
;
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
}
})
},
submit() {
let me = this;
showLoading();
submit(me.formObj.documentNo).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("关闭成功");
me.doClear();
}
}).catch(() => {
hideLoading();
});
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
}
},
}
</script>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,340 @@
<template>
<div class="execution">
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row>
<el-col :span="8">
<el-form-item label="客户编码:" prop="customer">
<el-input v-model="formObj.customer"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="物料:" prop="material">
<el-input v-model="formObj.material"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="类型:" prop="type">
<el-select v-model="formObj.type" style="width: 100%">
<el-option value="MAT_SERVICE" label="备件维修仓"/>
<el-option value="CUSTOMER" label="客户仓"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" @click="doRetrieve">查询</el-button>
<el-button type="primary" @click="doExport">导出</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="list.records" border @current-change="handleSelectionChange" highlight-current-row>
<el-table-column label="序号" align="center" width="50">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column label="类型" prop="type" align="center">
<template slot-scope="scope">
{{formatterConst[scope.column.property][scope.row[scope.column.property]]}}
</template>
</el-table-column>
<el-table-column label="客户编码" prop="customer" align="center"></el-table-column>
<el-table-column label="物料" prop="material" align="center"></el-table-column>
<el-table-column label="数量" prop="qty" align="center"></el-table-column>
<el-table-column label="单位" prop="unit" align="center"></el-table-column>
</el-table>
<el-pagination
layout="total, sizes, prev, pager, next, jumper"
:total="list.total"
:page-size="list.size"
@size-change="handleSizeChange"
@current-change="handleCurrentChange">
</el-pagination>
<div style="margin-top: 10px;">
<el-button type="primary" @click="openDialog('IN')">转入</el-button>
<el-button type="primary" @click="openDialog('OUT')">转出</el-button>
<el-button type="primary" @click="openDialog('TRANSFER')">转移</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
<el-dialog :visible.sync="transferDialogVisible" center width="20%">
<el-form :model="dialogFormObj" label-width="auto">
<el-form-item label="转移数量:" class="inputRequired">
<el-input v-model="dialogFormObj.qty" type="number"></el-input>
</el-form-item>
<el-form-item label="客户编码:" v-if="selection && selection.type === 'MAT_SERVICE'">
<el-input v-model="dialogFormObj.customer"></el-input>
</el-form-item>
<el-form-item label="备注:">
<el-input v-model="dialogFormObj.remarks"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="transfer">确认</el-button>
<el-button type="primary" @click="transferDialogVisible = false">返回</el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="transInDialogVisible" center width="20%">
<el-form :model="dialogFormObj" label-width="auto">
<el-form-item label="类型:" class="inputRequired">
<el-select v-model="dialogFormObj.type" style="width: 100%">
<el-option value="MAT_SERVICE" label="备件维修仓"/>
<el-option value="CUSTOMER" label="客户仓"/>
</el-select>
</el-form-item>
<el-form-item label="客户编码:" class="inputRequired">
<el-input v-model="dialogFormObj.customer" :disabled="dialogFormObj.type === 'MAT_SERVICE'"></el-input>
</el-form-item>
<el-form-item label="物料:" class="inputRequired">
<el-input v-model="dialogFormObj.material" type="number"></el-input>
</el-form-item>
<el-form-item label="转入数量:" class="inputRequired">
<el-input v-model="dialogFormObj.qty" type="number"></el-input>
</el-form-item>
<el-form-item label="备注:">
<el-input v-model="dialogFormObj.remarks"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="transIn">确认</el-button>
<el-button type="primary" @click="transInDialogVisible = false">返回</el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="transOutDialogVisible" center width="20%">
<el-form :model="dialogFormObj" label-width="auto">
<el-form-item label="转出数量:" class="inputRequired">
<el-input v-model="dialogFormObj.qty" type="number"></el-input>
</el-form-item>
<el-form-item label="备注:">
<el-input v-model="dialogFormObj.remarks"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="transOut">确认</el-button>
<el-button type="primary" @click="transOutDialogVisible = false">返回</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {fetchList2, transfer, transIn, transOut} from '@/api/wms/false-warehoursing';
import {isBlank} from "@/util/string";
import {getStore} from '@/util/store';
import {hideLoading, showLoading} from '@/const/loading';
import {listByActivityId} from "@/api/admin/activity-option";
import {mapGetters} from 'vuex';
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
site: getStore({name: 'tenantId'}),
formObj: {},
initData: {},
list: {
records: [],
total: 0,
size: 0
},
selection: null,
dialogFormObj: {},
transferDialogVisible: false,
transOutDialogVisible: false,
transInDialogVisible: false,
queryParam: {current: 1, size: 20},
formatterConst: {
type: {
"MAT_SERVICE": "备件维修仓",
"CUSTOMER": "客户仓",
},
}
};
},
created() {
this.doClear();
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
doRetrieve() {
let me = this;
let param = Object.assign({
type: me.formObj.type,
material: me.formObj.material,
customer: me.formObj.customer,
}, me.queryParam);
showLoading();
fetchList2(param).then(respData => {
hideLoading();
this.list = respData.data.data;
}).catch(() => {
hideLoading();
});
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.list = {};
this.queryParam = {current: 1, size: 20};
this.selection = null;
},
openDialog(actionType) {
let me = this;
me.dialogFormObj = {};
switch (actionType) {
case "OUT":
if (!me.selection) {
me.$message.error('请选择要转出的库存');
} else {
me.transOutDialogVisible = true;
}
break;
case "IN":
me.transInDialogVisible = true;
break;
case "TRANSFER":
if (!me.selection) {
me.$message.error('请选择要转移的库存');
} else {
me.transferDialogVisible = true;
}
break;
}
},
cancel() {
this.transferDialogVisible = false;
},
transfer() {
let me = this;
if (!me.dialogFormObj.qty || me.dialogFormObj.qty <= 0) {
return me.$message.error("转移数量必须大于0");
} else {
let selection = me.selection;
let param = {
type: selection.type,
qty: me.dialogFormObj.qty,
customer: isBlank(me.dialogFormObj.customer) ? selection.customer : me.dialogFormObj.customer,
material: selection.material,
remarks: me.dialogFormObj.remarks,
};
showLoading();
transfer(param).then(res => {
hideLoading();
me.transferDialogVisible = false;
me.doRetrieve();
return me.$message.success("转移成功");
}).catch(e => hideLoading());
}
},
handleSelectionChange(row) {
this.selection = row;
},
handleSizeChange(val) {
this.queryParam.size = val;
this.doRetrieve();
},
handleCurrentChange(val) {
this.queryParam.current = val;
this.doRetrieve();
},
transIn() {
let me = this;
let param = {
type: me.dialogFormObj.type,
customer: me.dialogFormObj.customer,
material: me.dialogFormObj.material,
qty: me.dialogFormObj.qty,
remarks: me.dialogFormObj.remarks,
};
if (isBlank(param.type)) {
return me.$message.error("请选择类型");
} else if (isBlank(param.customer) && param.type !== 'MAT_SERVICE') {
return me.$message.error("客户不能为空");
} else if (isBlank(param.material)) {
return me.$message.error("物料不能为空");
} else if (isBlank(param.qty)) {
return me.$message.error("数量不能为空");
} else {
showLoading();
transIn(param).then(res => {
hideLoading();
me.transInDialogVisible = false;
me.doRetrieve();
return me.$message.success("转入成功");
}).catch(e => hideLoading());
}
},
transOut() {
let me = this;
let selection = me.selection;
let param = {
type: selection.type,
customer: selection.customer,
material: selection.material,
qty: me.dialogFormObj.qty,
remarks: me.dialogFormObj.remarks,
};
if (isBlank(param.qty)) {
return me.$message.error("数量不能为空");
} else {
showLoading();
transOut(param).then(res => {
hideLoading();
me.transOutDialogVisible = false;
me.doRetrieve();
return me.$message.success("转出成功");
}).catch(e => hideLoading());
}
},
doExport() {
let me = this;
let param = {
type: me.formObj.type,
material: me.formObj.material,
customer: me.formObj.customer,
};
this.downBlobFile("/wms/false-warehoursing/export2", param, "备件维修仓导出.xlsx");
},
},
};
</script>
<style scoped lang="scss">
.inputRequired ::v-deep .el-form-item__label::before {
content: "*";
width: 10px;
height: 20px;
display: inline-block;
vertical-align: middle;
text-align: center;
line-height: 26px;
font-size: large;
color: #f00;
}
</style>

View File

@ -0,0 +1,249 @@
<template>
<div class="execution">
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row>
<el-col :span="8">
<el-form-item label="客户编码:" prop="customer">
<el-input v-model="formObj.customer"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="外仓:" prop="externalWarehouse">
<el-input v-model="formObj.externalWarehouse"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="物料:" prop="material">
<el-input v-model="formObj.material"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="类型:" prop="type">
<el-select v-model="formObj.type" style="width: 100%">
<el-option value="EXTERNAL_WAREHOUSE" label="外仓"/>
<el-option value="CONSIGN_FOR_SALE" label="寄售"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" @click="doRetrieve">查询</el-button>
<el-button type="primary" @click="doExport">导出</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="list.records" border @current-change="handleSelectionChange" highlight-current-row>
<el-table-column label="序号" align="center" width="50">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column label="类型" prop="type" align="center">
<template slot-scope="scope">
{{formatterConst[scope.column.property][scope.row[scope.column.property]]}}
</template>
</el-table-column>
<el-table-column label="客户编码" prop="customer" align="center"></el-table-column>
<el-table-column label="外仓编号" prop="externalWarehouse" align="center"></el-table-column>
<el-table-column label="物料" prop="material" align="center"></el-table-column>
<el-table-column label="数量" prop="qty" align="center"></el-table-column>
<el-table-column label="单位" prop="unit" align="center"></el-table-column>
</el-table>
<el-pagination
layout="total, sizes, prev, pager, next, jumper"
:total="list.total"
:page-size="list.size"
@size-change="handleSizeChange"
@current-change="handleCurrentChange">
</el-pagination>
<div style="margin-top: 10px;">
<el-button type="primary" @click="doTransfer">转移</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
<el-dialog :visible.sync="confirmDialogVisible" center width="20%">
<el-form :model="formObj" label-width="auto">
<el-form-item label="转移数量:" class="inputRequired">
<el-input v-model="formObj.qty" type="number"></el-input>
</el-form-item>
<el-form-item label="外仓:" v-if="selection && selection.type === 'CONSIGN_FOR_SALE'">
<el-input v-model="formObj.transferNo"></el-input>
</el-form-item>
<el-form-item label="备注:">
<el-input v-model="formObj.remarks"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="confirm">确认</el-button>
<el-button type="primary" @click="cancel">返回</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {fetchList, transfer} from '@/api/wms/false-warehoursing';
import {isBlank} from "@/util/string";
import {getStore} from '@/util/store';
import {hideLoading, showLoading} from '@/const/loading';
import {listByActivityId} from "@/api/admin/activity-option";
import {mapGetters} from 'vuex';
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
site: getStore({name: 'tenantId'}),
formObj: {},
initData: {},
list: {
records: [],
total: 0,
size: 0
},
selection: null,
confirmDialogVisible: false,
queryParam: {current: 1, size: 20},
formatterConst: {
type: {
"EXTERNAL_WAREHOUSE": "外仓",
"CONSIGN_FOR_SALE": "寄售仓",
},
}
};
},
created() {
this.doClear();
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
doRetrieve() {
let me = this;
let param = Object.assign({
type: me.formObj.type,
material: me.formObj.material,
externalWarehouse: me.formObj.externalWarehouse,
customer: me.formObj.customer,
}, me.queryParam);
showLoading();
fetchList(param).then(respData => {
hideLoading();
this.list = respData.data.data;
}).catch(() => {
hideLoading();
});
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.list = {};
this.queryParam = {current: 1, size: 20};
this.selection = null;
},
doTransfer() {
let me = this;
let selection = me.selection;
if (!selection) {
me.$message.error('请选择要转移的外仓/寄售仓');
} else {
me.$set(me.formObj, "qty", 0);
me.$set(me.formObj, "remarks", "");
me.$set(me.formObj, "transferNo", "");
me.confirmDialogVisible = true;
}
},
cancel() {
this.confirmDialogVisible = false;
},
confirm() {
let me = this;
if (!me.formObj.qty || me.formObj.qty <= 0) {
return me.$message.error("转移数量必须大于0");
} else {
let selection = me.selection;
let param = selection.type === "CONSIGN_FOR_SALE" ? {
consignForSaleNo: selection.externalWarehouse,
externalWarehouse: me.formObj.transferNo,
type: selection.type,
qty: me.formObj.qty,
remarks: me.formObj.remarks,
customer: selection.customer,
material: selection.material,
} : {
externalWarehouse: selection.externalWarehouse,
type: selection.type,
customer: selection.customer,
material: selection.material,
qty: me.formObj.qty,
remarks: me.formObj.remarks,
};
showLoading();
transfer(param).then(res => {
hideLoading();
me.confirmDialogVisible = false;
me.doRetrieve();
return me.$message.success("转移成功");
}).catch(e => hideLoading());
}
},
handleSelectionChange(row) {
this.selection = row;
},
handleSizeChange(val) {
this.queryParam.size = val;
this.doRetrieve();
},
handleCurrentChange(val) {
this.queryParam.current = val;
this.doRetrieve();
},
doExport() {
let me = this;
let param = {
type: me.formObj.type,
material: me.formObj.material,
externalWarehouse: me.formObj.externalWarehouse,
customer: me.formObj.customer,
};
this.downBlobFile("/wms/false-warehoursing/export", param, "外仓库存导出.xlsx");
},
},
};
</script>
<style scoped lang="scss">
.inputRequired ::v-deep .el-form-item__label::before {
content: "*";
width: 10px;
height: 20px;
display: inline-block;
vertical-align: middle;
text-align: center;
line-height: 26px;
font-size: large;
color: #f00;
}
::v-deep .el-table__body tr.current-row > td {
background-color: rgba(79, 169, 255, 0.81) !important; /* 改变为你想要的颜色 */
}
</style>

View File

@ -0,0 +1,549 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='productionRequisitionDialogObj'
:modal-fetch-fun='productionRequisitionDialogFetchFun' :modal-show.sync="productionRequisitionDialogVisible"
@inputDialogSelected="productionRequisitionSelect" ref="documentDialog">
</input-select-dialog>
<input-select-dialog :modal-obj='storageLocationDialogObj' :modal-fetch-fun='storageLocationDialogFetchFun'
:modal-show.sync="storageLocationDialogVisible" @inputDialogSelected="storageLocationSelect">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item prop="documentNo">
<el-input v-model="formObj.documentNo" placeholder="单据号" autofocus
@keyup.enter.native="scanProductionRequisitionOrder">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
<el-button slot="append" icon="el-icon-search"
@click.stop="showProductionRequisitionDialog"></el-button>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-table :data="formObj.itemList" border>
<el-table-column label="物料" prop="item">
</el-table-column>
<el-table-column label="物料描述" prop="itemDescription">
</el-table-column>
<el-table-column label="来源仓" prop="sourceWarehouse">
</el-table-column>
<el-table-column label="目标仓" prop="targetWarehouse">
</el-table-column>
<el-table-column label="入库数量" prop="applicationsQuantity">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="showItemDialog(scope.$index, scope.row)">入库执行
</el-button>
</template>
</el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-tag v-if="scope.row.state === 'CLOSE'" type="warning" disable-transitions>
已执行</el-tag>
<el-tag v-if="scope.row.state === 'SUBMIT'" disable-transitions>
待执行</el-tag>
<el-tag v-if="scope.row.state === 'SAVING'" type="success" disable-transitions>
已保存</el-tag>
</template>
</el-table-column>
</el-table>
</el-form>
<div style="margin-top: 10px;">
<el-button type="primary" @click="submit">提交</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
<el-button type="danger" @click="reject">拒收</el-button>
</div>
<el-dialog :visible.sync="dialogItemType1FormVisible" center fullscreen>
<div style="margin-top: 10px;">
<el-form :model="itemForm" label-width="auto">
<el-descriptions :column="1" border :labelStyle="lableWidth">
<el-descriptions-item label="单据号">
{{ itemForm.documentNo }}
</el-descriptions-item>
<el-descriptions-item label="物料">
{{ itemForm.item }}
</el-descriptions-item>
<el-descriptions-item label="物料描述">
{{ itemForm.itemDescription }}
</el-descriptions-item>
<el-descriptions-item label="来源位置">
{{ itemForm.sourceWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="目标位置">
{{ itemForm.targetWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="入库数量">
{{ itemForm.applicationsQuantity }}
</el-descriptions-item>
<el-descriptions-item label="汇总数量">
{{ itemForm.sumQuantity }}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ itemForm.unitOfMeasure }}
</el-descriptions-item>
<el-descriptions-item label="存储区域">
<el-input v-model="itemForm.storageLocation" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showStorageLocationDialog"></i>
</el-input>
</el-descriptions-item>
</el-descriptions>
<div style="margin-top: 10px;">
<el-form-item prop="code">
<el-input v-model="itemForm.code" placeholder="扫描条码" autofocus
@keyup.enter.native="scanCode" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
<el-table :data="itemForm.inventoryList" border>
<el-table-column label="托条码" prop="inventoryIdOrCarrier">
</el-table-column>
<el-table-column label="数量" prop="inventoryQty">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="delRow(scope.$index, scope.row)"
:disabled="scope.row.isScan === 'N'">
删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveItemType1" :disabled="isUse">保存</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {
fetchList as fetchProductionRequisitionList,
getDocumentDetail,
submit,
getFinishedProductQty,
getItemInventory,
rejectDocumentByNo
} from "@/api/wms/finished-product-production-return";
import {
fetchList as fetchStorageLocationList,
getStorageLocationPageBycode
} from '@/api/wms/storage-location';
import { isBlank } from "@/util/string";
import { getStore } from '@/util/store';
import { showLoading, hideLoading } from '@/const/loading'
import { getByActivityOption } from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex'
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
isUse: false,
//wms_document_save: false,
formObj: {},
documentNo: "",
itemForm: {},
submitList: [],
codeList: [],
storageLocationList: "",
dialogItemType1FormVisible: false,
productionRequisitionDialogFetchFun: fetchProductionRequisitionList,
productionRequisitionDialogVisible: false,
productionRequisitionDialogObj: {
"condition": "documentNo",
tableColumn: [
{ prop: "documentNo", label: "单据" },
{
prop: "state", label: "状态", formatter: (row, column, cellValue, index) => {
if (cellValue == "SUBMIT") {
return "提交"
}
if (cellValue == "CLOSE") {
return "关闭"
}
}
}
]
},
storageLocationDialogVisible: false,
storageLocationDialogFetchFun: fetchStorageLocationList,
storageLocationDialogObj: {
"condition": "storageLocation",
tableColumn: [
{ prop: "storageLocation", label: "存储位置", width: "200" },
{ prop: "description", label: "描述" }
]
},
initData: {
documentNo: "",
itemList: [],
site: getStore({ name: 'tenantId' })
},
}
},
created() {
//this.wms_document_save = this.permissions["wms_document_save"];
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, { "inventoryList": [], "sumQuantity": 0, "code": "", "storageLocation": "" });
this.documentNo = "";
this.codeList = [];
let activityId = this.$route.query.ACTIVITY_ID
getByActivityOption(activityId, 'STORAGE_LOCATION').then(response => {
if (response.data.code != 0) {
return this.$message.error(response.data.msg)
}
this.storageLocationList = response.data.data.optionValue
}).catch(e => {
console.log(e)
})
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//存储区域弹出框
showStorageLocationDialog() {
let me = this;
me.storageLocationDialogVisible = true;
if (this.storageLocationList != "") {
this.storageLocationDialogFetchFun = getStorageLocationPageBycode;
this.storageLocationDialogObj.queryParam = { "str": this.storageLocationList };
} else {
this.storageLocationDialogObj.queryParam = { "erpStorageLocation": me.itemForm.targetWarehouse };
}
},
storageLocationSelect(row) {
let me = this;
me.itemForm.storageLocation = row.storageLocation;
console.log(me.itemForm);
},
//单据号弹出框
showProductionRequisitionDialog() {
let me = this;
me.productionRequisitionDialogVisible = true;
me.$refs.documentDialog.clear();
me.productionRequisitionDialogObj.queryParam = { "documentType": "ME_RETURN_SLIP" }
},
productionRequisitionSelect(row) {
let me = this;
me.formObj.itemList = [];
me.submitList = [];
me.formObj.documentNo = row.documentNo;
me.documentNo = me.formObj.documentNo;
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"storageLocation": res.data.data[i].storageLocation
})
me.formObj.itemList.push(obj);
}
}
})
},
showItemDialog(index, row) {
//判断是物料类型弹出不同的表单
let me = this;
let sumInventoryQty = 0;
//判断行项目是否已经关闭,关闭则不可扫描条码和保存
if (row.state === "CLOSE") {
this.isUse = true;
} else {
this.isUse = false;
}
//获取汇总数量
getItemInventory(row).then(res => {
if (res.data.code == 0 && res.data.data.length > 0) {
me.itemForm.inventoryList = [];
for (let i = 0; i < res.data.data.length; i++) {
sumInventoryQty += res.data.data[i].inventoryQty;
let obj = Object.assign({},
{
"inventoryIdOrCarrier": res.data.data[i].inventoryIdOrCarrier,
"inventoryQty": res.data.data[i].inventoryQty,
"isScan": "N"
});
me.itemForm.inventoryList.push(obj);
}
me.itemForm.sumQuantity = sumInventoryQty;
}
})
if (me.submitList.length > 0) {
console.log(me.submitList);
for (let i = 0; i < me.submitList.length; i++) {
let obj = Object.assign({}, me.submitList[i]);
if (me.submitList[i].seq === row.seq) {
me.dialogItemType1FormVisible = true;
me.itemForm = obj;
return;
} else {
me.dialogItemType1FormVisible = true;
me.itemForm = Object.assign(obj, { "inventoryList": [], "code": "", "sumQuantity": 0, "storageLocation": "" }, row);
}
}
} else {
me.dialogItemType1FormVisible = true;
me.itemForm = Object.assign(me.itemForm, { "inventoryList": [], "code": "", "sumQuantity": sumInventoryQty, "storageLocation": "" }, row);
}
},
//扫描单据号
scanProductionRequisitionOrder() {
let me = this;
let code = me.formObj.documentNo;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
};
if (me.documentNo === code) {
me.$message.error("不可重复扫描");
return;
};
me.formObj.itemList = [];
me.submitList = [];
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
if (res.data.data[0].documentType != "ME_RETURN_SLIP") {
return me.$message.error("单据类型不是成品生产退货");
}
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.formObj.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"storageLocation": res.data.data[i].storageLocation
})
me.formObj.itemList.push(obj);
me.documentNo = me.formObj.documentNo;
}
}
})
},
getinventoryList() {
let me = this;
let obj = Object.assign({}, {
"documentNo": me.itemForm.documentNo,
"item": me.itemForm.item,
"sourceWarehouse": me.itemForm.sourceWarehouse,
"inventoryIdOrCarrier": me.itemForm.code
})
getFinishedProductQty(obj).then(res => {
if (res.data.code == 0) {
//库存总数大于需求数量
if (me.accAdd(res.data.data.inventoryQty, me.itemForm.sumQuantity) > me.itemForm.applicationsQuantity) {
console.log(res.data.data.inventoryQty + me.itemForm.sumQuantity);
me.$message.error("汇总数量大于需求数量");
return;
}
let obj = Object.assign({},
{
"inventoryIdOrCarrier": res.data.data.inventoryIdOrCarrier,
"inventoryQty": res.data.data.inventoryQty,
"isScan": "Y"
});
me.itemForm.sumQuantity = me.accAdd(res.data.data.inventoryQty, me.itemForm.sumQuantity);
me.itemForm.inventoryList.push(obj);
}
me.codeList.push({ "code": me.itemForm.code });
me.itemForm.code = "";
});
},
//扫描条码
scanCode() {
let me = this;
let sum = 0;
if (isBlank(me.itemForm.code)) {
me.$message.error("不可扫描空条码");
return;
};
if (me.itemForm.inventoryList.length > 0) {
for (let i = 0; i < me.codeList.length; i++) {
if (me.codeList[i].code === me.itemForm.code) {
me.$message.error("不可重复扫描");
return;
}
}
this.getinventoryList();
} else {
this.getinventoryList();
}
},
submit() {
let me = this;
if (me.submitList.length > 0) {
if (me.submitList.length != me.formObj.itemList.length) {
me.$message.error("未执行所有行项目");
return;
}
for (let i = 0; i < me.submitList.length; i++) {
let list = me.submitList[i].inventoryList;
for (let j = 0; j < list.length; j++) {
if (list[j].isScan === "N") {
me.submitList[i].inventoryList.splice(j, 1);
}
}
}
showLoading();
submit(me.submitList).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("提交成功");
me.doClear();
}
}).catch(() => {
hideLoading();
});
} else {
me.$message.error("没有可提交的行");
return;
}
},
saveItemType1() {
let me = this;
me.dialogItemType1FormVisible = false;
if (me.itemForm.state === "CLOSE") {
me.$message.error("此行项目已关闭");
return;
}
//保存之后改变行项目状态为已保存
//item和seq都相等时候,找到行项目列表改变其状态
for (let i = 0; i < me.formObj.itemList.length; i++) {
if (me.itemForm.seq == me.formObj.itemList[i].seq && me.itemForm.item == me.formObj.itemList[i].item) {
me.formObj.itemList[i].state = "SAVING"
}
}
let obj = Object.assign({}, me.itemForm);
if (me.submitList.length > 0) {
for (let i = 0; i < me.submitList.length; i++) {
if (me.submitList[i].seq === obj.seq) {
me.submitList[i] = obj;
return;
}
}
me.submitList.push(obj);
} else {
me.submitList.push(obj);
}
console.log(me.submitList);
},
//拒收
reject() {
let me = this;
if (isBlank(me.formObj.documentNo)) {
me.$message.error("请选择单据");
return;
}
console.log(me.formObj.documentNo);
rejectDocumentByNo(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
me.$message.success("拒收成功");
me.doClear();
}
})
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, { "inventoryList": [], "sumQuantity": 0, "code": "" });
this.documentNo = "";
this.codeList = [];
this.submitList = [];
},
//
delRow(index, row) {
let me = this;
let sum = 0;
//删除已扫描过条码中集合的信息
for (let j = 0; j < me.codeList.length; j++) {
if (me.itemForm.inventoryList[index].inventoryIdOrCarrier === me.codeList[j].code) {
me.codeList.splice(j, 1);
}
}
me.itemForm.inventoryList.splice(index, 1);
for (let i = 0; i < me.itemForm.inventoryList.length; i++) {
sum += me.itemForm.inventoryList[i].inventoryQty;
}
me.itemForm.sumQuantity = sum;
},
accAdd(arg1, arg2) {
var r1, r2, m;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2))
return (arg1 * m + arg2 * m) / m
}
},
}
</script>

View File

@ -0,0 +1,59 @@
<template>
<div class="execution">
<basic-container>formObj
<c-top-bar :offset="50">
<el-button type="text" icon="el-icon-document-copy" @click="exportExcel">导出</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-delete" @click="doClear">清除</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-refresh" @click="doSearch">查询</el-button>
<el-divider style="margin-top: 0px;"></el-divider>
</c-top-bar>
<el-form label-width="120px" v-model="formObj">
<el-row>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
<el-form-item label="站点">
<el-input v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
<el-form-item label="ERP仓库" :required="true">
<el-input ref="barcode" v-model="formObj.erpStorageLocation" placeholder="选择ERP仓库" autofocus
@keyup.enter.native="doSearch">
<i slot="suffix" class="el-input__icon el-icon-copy-document"
@click.stop="openErpStorageLocationDialog"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
<el-form-item label="货架">
<el-input ref="barcode" v-model="formObj.storageLocation" placeholder="选择仓库"
@keyup.enter.native="doSearch">
<i slot="suffix" class="el-input__icon el-icon-copy-document"
@click.stop="openStorageLocationDialog"></i>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</basic-container>
</div>
</template>
<script>
export default {
data() {
return {
formObj: {
site: '',
erpStorageLocation: '',
storageLocation: '',
storageBin: '',
used: '',
isDefault: ''
},
}
},
}
</script>

View File

@ -0,0 +1,554 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='productionRequisitionDialogObj'
:modal-fetch-fun='productionRequisitionDialogFetchFun' :modal-show.sync="productionRequisitionDialogVisible"
@inputDialogSelected="productionRequisitionSelect" ref="documentDialog">
</input-select-dialog>
<input-select-dialog :modal-obj='storageLocationDialogObj' :modal-fetch-fun='storageLocationDialogFetchFun'
:modal-show.sync="storageLocationDialogVisible" @inputDialogSelected="storageLocationSelect">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item prop="documentNo">
<el-input v-model="formObj.documentNo" placeholder="单据号" autofocus
@keyup.enter.native="scanProductionRequisitionOrder">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
<el-button slot="append" icon="el-icon-search"
@click.stop="showProductionRequisitionDialog"></el-button>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-table :data="formObj.itemList" border>
<el-table-column label="物料" prop="item">
</el-table-column>
<el-table-column label="物料描述" prop="itemDescription">
</el-table-column>
<el-table-column label="目标仓" prop="targetWarehouse">
</el-table-column>
<el-table-column label="入库数量" prop="applicationsQuantity">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="showItemDialog(scope.$index, scope.row)">入库执行
</el-button>
</template>
</el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-tag v-if="scope.row.state === 'CLOSE'" type="warning" disable-transitions>
已执行</el-tag>
<el-tag v-if="scope.row.state === 'SUBMIT'" disable-transitions>
待执行</el-tag>
<el-tag v-if="scope.row.state === 'SAVING'" type="success" disable-transitions>
已保存</el-tag>
</template>
</el-table-column>
</el-table>
</el-form>
<div style="margin-top: 10px;">
<el-button type="primary" @click="submit">提交</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
<el-dialog :visible.sync="dialogItemType1FormVisible" center fullscreen>
<div style="margin-top: 10px;">
<el-form :model="itemForm" label-width="auto">
<el-descriptions :column="1" border :labelStyle="lableWidth">
<el-descriptions-item label="单据号">
{{ itemForm.documentNo }}
</el-descriptions-item>
<el-descriptions-item label="物料">
{{ itemForm.item }}
</el-descriptions-item>
<el-descriptions-item label="物料描述">
{{ itemForm.itemDescription }}
</el-descriptions-item>
<el-descriptions-item label="目标仓">
{{ itemForm.targetWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="入库数量">
{{ itemForm.applicationsQuantity }}
</el-descriptions-item>
<el-descriptions-item label="汇总数量">
{{ itemForm.sumQuantity }}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ itemForm.unitOfMeasure }}
</el-descriptions-item>
<el-descriptions-item label="存储区域">
<el-input v-model="itemForm.storageLocation" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showStorageLocationDialog"></i>
</el-input>
</el-descriptions-item>
</el-descriptions>
<div style="margin-top: 10px;">
<el-form-item prop="code">
<el-input v-model="itemForm.code" placeholder="扫描条码" autofocus
@keyup.enter.native="scanCode" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
<el-table :data="itemForm.inventoryList" border>
<el-table-column label="条码" prop="inventoryIdOrCarrier">
</el-table-column>
<el-table-column label="数量" prop="inventoryQty">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="delRow(scope.$index, scope.row)"
:disabled="scope.row.isScan === 'N'">
删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveItemType1" :disabled="isUse">保存</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {
fetchList as fetchProductionRequisitionList,
getDocumentDetail,
submit,
getFinishedProductsPurchaseQty,
getItemInventory
} from "@/api/wms/finished-products-purchase";
import {
fetchList as fetchStorageLocationList,
getStorageLocationPageBycode
} from '@/api/wms/storage-location';
import { isBlank } from "@/util/string";
import { getStore } from '@/util/store';
import {hideLoading, showLoading} from '@/const/loading';
import { getByActivityOption } from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex'
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
isUse: false,
wms_document_save: false,
formObj: {},
documentNo: "",
itemForm: {},
submitList: [],
codeList: [],
storageLocationList: "",
dialogItemType1FormVisible: false,
productionRequisitionDialogFetchFun: fetchProductionRequisitionList,
productionRequisitionDialogVisible: false,
productionRequisitionDialogObj: {
"condition": "documentNo",
tableColumn: [
{ prop: "documentNo", label: "单据" },
{ prop: "externalDocumentNo", label: "ERP单据号" },
{
prop: "state", label: "状态", formatter: (row, column, cellValue, index) => {
if (cellValue == "SUBMIT") {
return "提交"
}
if (cellValue == "CLOSE") {
return "关闭"
}
}
}
]
},
storageLocationDialogVisible: false,
storageLocationDialogFetchFun: fetchStorageLocationList,
storageLocationDialogObj: {
"condition": "storageLocation",
tableColumn: [
{ prop: "storageLocation", label: "存储位置", width: "200" },
{ prop: "description", label: "描述" }
]
},
initData: {
documentNo: "",
itemList: [],
site: getStore({ name: 'tenantId' })
},
}
},
created() {
this.wms_document_save = this.permissions["wms_document_save"];
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, { "inventoryList": [], "sumQuantity": 0, "code": "", "storageLocation": "" });
this.documentNo = "";
this.codeList = [];
let activityId = this.$route.query.ACTIVITY_ID
getByActivityOption(activityId, 'STORAGE_LOCATION').then(response => {
if (response.data.code != 0) {
return this.$message.error(response.data.msg)
}
this.storageLocationList = response.data.data.optionValue
}).catch(e => {
console.log(e)
})
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//存储区域弹出框
showStorageLocationDialog() {
let me = this;
me.storageLocationDialogVisible = true;
if (this.storageLocationList != "") {
this.storageLocationDialogFetchFun = getStorageLocationPageBycode;
this.storageLocationDialogObj.queryParam = { "str": this.storageLocationList };
} else {
this.storageLocationDialogObj.queryParam = { "erpStorageLocation": me.itemForm.targetWarehouse };
}
},
storageLocationSelect(row) {
let me = this;
me.itemForm.storageLocation = row.storageLocation;
console.log(me.itemForm);
},
//单据号弹出框
showProductionRequisitionDialog() {
let me = this;
me.productionRequisitionDialogVisible = true;
me.$refs.documentDialog.clear();
me.productionRequisitionDialogObj.queryParam = { "documentType": "PROCUREMENT_STORAGE" }
},
productionRequisitionSelect(row) {
let me = this;
me.formObj.itemList = [];
me.submitList = [];
me.formObj.documentNo = row.documentNo;
me.documentNo = me.formObj.documentNo;
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
//"documentNo": me.documentNo,
"documentNo": res.data.data[i].documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"batch": res.data.data[i].batch,
"storageLocation": res.data.data[i].storageLocation
})
me.formObj.itemList.push(obj);
}
}
})
},
showItemDialog(index, row) {
//判断是物料类型弹出不同的表单
let me = this;
let sumInventoryQty = 0;
//判断行项目是否已经关闭,关闭则不可扫描条码和保存
if (row.state === "CLOSE") {
this.isUse = true;
} else {
this.isUse = false;
}
//获取汇总数量
getItemInventory(row).then(res => {
if (res.data.code == 0 && res.data.data.length > 0) {
me.itemForm.inventoryList = [];
for (let i = 0; i < res.data.data.length; i++) {
sumInventoryQty += res.data.data[i].inventoryQty;
let obj = Object.assign({},
{
"inventoryIdOrCarrier": res.data.data[i].inventoryIdOrCarrier,
"inventoryQty": res.data.data[i].inventoryQty,
"isScan": "N"
});
me.itemForm.inventoryList.push(obj);
}
me.itemForm.sumQuantity = sumInventoryQty;
}
})
if (me.submitList.length > 0) {
console.log(me.submitList);
for (let i = 0; i < me.submitList.length; i++) {
let obj = Object.assign({}, me.submitList[i]);
if (me.submitList[i].seq === row.seq) {
me.dialogItemType1FormVisible = true;
me.itemForm = obj;
return;
} else {
me.dialogItemType1FormVisible = true;
me.itemForm = Object.assign(obj, { "inventoryList": [], "code": "", "sumQuantity": 0, "storageLocation": "" }, row);
}
}
} else {
me.dialogItemType1FormVisible = true;
me.itemForm = Object.assign(me.itemForm, { "inventoryList": [], "code": "", "sumQuantity": sumInventoryQty, "storageLocation": "" }, row);
}
},
//扫描单据号
scanProductionRequisitionOrder() {
let me = this;
let code = me.formObj.documentNo;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
};
if (me.documentNo === code) {
me.$message.error("不可重复扫描");
return;
};
me.formObj.itemList = [];
me.submitList = [];
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
if (res.data.data[0].documentType != "PROCUREMENT_STORAGE") {
return me.$message.error("单据类型不是采购单据");
}
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
//"documentNo": me.formObj.documentNo,
"documentNo": res.data.data[i].documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"batch": res.data.data[i].batch,
"storageLocation": res.data.data[i].storageLocation
})
me.formObj.itemList.push(obj);
me.documentNo = me.formObj.documentNo;
}
}
})
},
getinventoryList() {
let me = this;
console.log(me.itemForm);
let obj = Object.assign({}, {
"item": me.itemForm.item,
"sourceWarehouse": me.itemForm.sourceWarehouse,
"inventoryIdOrCarrier": me.itemForm.code,
"seq": me.itemForm.seq,
"batch": me.itemForm.batch
})
getFinishedProductsPurchaseQty(obj).then(res => {
if (res.data.code == 0) {
//库存总数大于需求数量
if (res.data.data.inventoryQty + me.itemForm.sumQuantity > me.itemForm.applicationsQuantity) {
me.$message.error("汇总数量大于需求数量");
return;
}
let obj = Object.assign({},
{
"inventoryIdOrCarrier": res.data.data.inventoryIdOrCarrier,
"inventoryQty": res.data.data.inventoryQty,
"isScan": "Y"
});
me.itemForm.sumQuantity += res.data.data.inventoryQty;
me.itemForm.inventoryList.push(obj);
}
me.codeList.push({ "code": me.itemForm.code });
me.itemForm.code = "";
});
},
//扫描条码
scanCode() {
let me = this;
let sum = 0;
if (isBlank(me.itemForm.code)) {
me.$message.error("不可扫描空条码");
return;
};
if (me.itemForm.inventoryList.length > 0) {
for (let i = 0; i < me.codeList.length; i++) {
if (me.codeList[i].code === me.itemForm.code) {
me.$message.error("不可重复扫描");
return;
}
}
this.getinventoryList();
} else {
this.getinventoryList();
}
},
submit() {
let me = this;
console.log("以下为提交的数据");
console.log(me.submitList);
if (me.submitList.length > 0) {
for (let i = 0; i < me.submitList.length; i++) {
let list = me.submitList[i].inventoryList;
for (let j = 0; j < list.length; j++) {
if (list[j].isScan === "N") {
me.submitList[i].inventoryList.splice(j, 1);
}
}
}
showLoading();
submit(me.submitList).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("提交成功");
me.doClear();
}
}).catch(() => {
hideLoading();
});
} else {
me.$message.error("没有可提交的行");
return;
}
},
saveItemType1() {
let me = this;
me.dialogItemType1FormVisible = false;
if (me.itemForm.state === "CLOSE") {
me.$message.error("此行项目已关闭");
return;
}
let obj = Object.assign({}, me.itemForm);
if (me.submitList.length > 0) {
for (let i = 0; i < me.submitList.length; i++) {
if (me.submitList[i].seq === obj.seq) {
me.submitList[i] = obj;
return;
}
}
me.submitList.push(obj);
} else {
me.submitList.push(obj);
}
//保存之后改变行项目状态为已保存
//item和seq都相等时候,找到行项目列表改变其状态
for (let i = 0; i < me.formObj.itemList.length; i++) {
if (me.itemForm.seq == me.formObj.itemList[i].seq && me.itemForm.item == me.formObj.itemList[i].item) {
me.formObj.itemList[i].state = "SAVING"
}
}
console.log(me.submitList);
},
saveItemType2() {
let me = this;
me.itemForm.inventoryList = [];
me.dialogItemType2FormVisible = false;
let obj1 = Object.assign({}, {
"inventoryQty": me.itemForm.sumQuantity
});
me.itemForm.inventoryList.push(obj1);
let obj = Object.assign({}, me.itemForm);
if (me.submitList.length > 0) {
for (let i = 0; i < me.submitList.length; i++) {
if (me.submitList[i].seq === obj.seq) {
me.submitList[i] = obj;
return;
}
}
me.submitList.push(obj);
} else {
me.submitList.push(obj);
}
//保存之后改变行项目状态为已保存
//item和seq都相等时候,找到行项目列表改变其状态
for (let i = 0; i < me.formObj.itemList.length; i++) {
if (me.itemForm.seq == me.formObj.itemList[i].seq && me.itemForm.item == me.formObj.itemList[i].item) {
me.formObj.itemList[i].state = "SAVING"
}
}
console.log(me.submitList);
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, { "inventoryList": [], "sumQuantity": 0, "code": "" });
this.documentNo = "";
this.codeList = [];
this.submitList = [];
},
//
delRow(index, row) {
let me = this;
let sum = 0;
//删除已扫描过条码中集合的信息
for (let j = 0; j < me.codeList.length; j++) {
if (me.itemForm.inventoryList[index].inventoryIdOrCarrier === me.codeList[j].code) {
me.codeList.splice(j, 1);
}
}
me.itemForm.inventoryList.splice(index, 1);
for (let i = 0; i < me.itemForm.inventoryList.length; i++) {
sum += me.itemForm.inventoryList[i].inventoryQty;
}
me.itemForm.sumQuantity = sum;
}
},
}
</script>

View File

@ -0,0 +1,304 @@
<template>
<div class="execution">
<basic-container>
<c-top-bar :offset="50">
<el-button type="text" @click="doClear" icon="el-icon-circle-close">清除</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" @click="doSubmit" icon="el-icon-upload2">导入</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" @click="exportDocumentTemplate" icon="el-icon-document-copy">模板下载</el-button>
<el-divider style="margin-top: 0px;"></el-divider>
</c-top-bar>
<el-form label-width="120px" style="width: 40%">
<el-form-item label="站点">
<el-input v-model="site" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="导入类型" :required="true">
<el-select v-model="importType" style="width: 100%" placeholder="请选择导入类型" :disabled="importTypeDisabled">
<el-option v-for="(item,index) in importTypes" :key="index" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="文件选择" :required="true">
<el-upload ref="upload" class="upload-demo" :http-request="doUpload" action="/" :on-change="handleSelectFile"
:before-upload="beforeUpload" :auto-upload="false" :limit="2" accept=".xls,.xlsx">
<el-button type="primary" size="small">浏览文件...</el-button>
</el-upload>
</el-form-item>
</el-form>
<el-button type="text">导入结果</el-button>
<el-input type="textarea" rows="10" v-model="resultMessage"></el-input>
</basic-container>
</div>
</template>
<script>
import {getStore} from '@/util/store';
import {showLoading, hideLoading} from '@/const/loading';
import {stringFormat, isBlank} from "@/util/string";
import {listByActivityId} from "@/api/admin/activity-option";
export default {
data() {
return {
site: '*',
importType: '',
importTypes: [],
defaultTypes: [
{label: '原材料/包材库存导入', value: '1'},
{label: '五金备件库存导入', value: '2'},
//{label: '半成品库存导入', value: '3'},
{label: '成品库存导入', value: '4'},
/*{label: '更新库存生产日期', value: '5'},
{label: '临时半成品库存导入', value: '6'},*/
{label: '载具主数据导入', value: '7'},
{label: '货格主数据导入', value: '8'},
/*{label: '采购成品导入', value: '9'},
{label: '销售退货导入', value: '10'},*/
{label: '存储位置导入', value: '11'},
{label: '库存说明导入', value: '12'},
{label: '库存&质检数据导入', value: '20'},
{label: '物料安全库存导入', value: '21'},
],
routerTypes: [
{label: '角色区域绑定信息', value: '13'},
{label: '原材料/包材盘盈导入', value: '14'},
{label: '原材料/包材盘亏导入', value: '15'},
{label: '五金备件盘盈导入', value: '16'},
{label: '五金备件盘亏导入', value: '17'},
{label: '成品盘盈导入', value: '18'},
{label: '成品盘亏导入', value: '19'},
{label: '成本中心领料单导入', value: '22'},
],
importTypeDisabled: false,
resultMessage: '',
ACTIVITY_OPTIONS: []
};
},
created() {
this.site = getStore({name: 'tenantId'});
},
beforeRouteUpdate(to, from, next) {
this.loadData(to.query);
next();
},
beforeRouteEnter(to, from, next) {
next(vm => {
try {
//获取作业规则
vm.loadData.call(vm, vm.$route.query);
} catch (e) {
console.log(e);
}
});
},
methods: {
loadData(urlParam) {
let me = this;
let activityId = urlParam.ACTIVITY_ID;
let visibleType = urlParam.visibleType;
me.$refs.upload.clearFiles();
me.resultMessage = "";
if (activityId) {
listByActivityId(activityId).then(response => {
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
me.ACTIVITY_OPTIONS = response.data.data;
}).catch(e => {
console.log(e);
});
}
if (visibleType) {
let array = visibleType.split(",")
me.importTypes = me.routerTypes.filter(o => array.includes(o.value));
if (array.length === 1) {
me.importType = visibleType;
me.importTypeDisabled = true;
} else {
me.importTypeDisabled = false;
}
} else {
me.importTypes = me.defaultTypes;
me.importType = '';
me.importTypeDisabled = false;
}
},
handleSelectFile(file, fileList) {
if (fileList.length > 1) {
fileList.shift();
}
},
beforeUpload(file) {
let fileTypes = ['xls', 'xlsx'];
if (fileTypes.indexOf(file.name.split('.')[1]) > -1) {
return true;
} else {
this.$message.warning('请上传xls或xlsx文件;暂不支持其他类型文件导入');
return false;
}
},
doUpload(params) {
let me = this;
let file = params.file;
let formData = new FormData();
formData.append("file", file);
formData.append("importType", me.importType);
let optionName, optionValue = '';
if (me.importType == '1') {
optionName = 'ROH_IMPORT_ST';
} else if (me.importType == '2') {
optionName = 'VERP_IMPORT_ST';
} else if (me.importType == '3') {
optionName = 'HALB_IMPORT_ST';
} else if (me.importType == '4') {
optionName = 'FERT_IMPORT_ST';
}
if (!isBlank(optionName)) {
for (let i = 0; i < me.ACTIVITY_OPTIONS.length; i++) {
if (optionName === me.ACTIVITY_OPTIONS[i].optionName) {
optionValue = me.ACTIVITY_OPTIONS[i].optionValue;
}
}
}
formData.append("optionValue", optionValue);
showLoading();
axios.post('/wms/initial-data/import-document', formData).then(function (response) {
hideLoading();
me.$refs.upload.clearFiles();
let message = response.data.data;
if (isBlank(message)) {
me.resultMessage = '导入成功';
return me.$message.success('导入成功');
} else if (message.startsWith("S")) {
me.resultMessage = message.substring(1, message.length);
return me.$message.success('导入成功');
} else {
me.resultMessage = message;
return me.$message.error('导入失败');
}
}).catch(function (error) {
hideLoading();
console.log(error);
});
},
exportDocumentTemplate() {
let me = this;
if (isBlank(me.site)) {
me.$message.warning('站点丢失请刷新界面');
return false;
}
if (isBlank(me.importType)) {
me.$message.warning('请选择导入类型');
return false;
}
let fileName = '';
switch (me.importType) {
case '1':
fileName = '原材料/包材库存导入';
break;
case '2':
fileName = '五金备件库存导入';
break;
/*case '3':
fileName = '半成品库存导入';
break;*/
/* case '4':
fileName = '成品库存导入';
break;
case '5':
fileName = '更新库存生产日期';
break;*/
case '6':
fileName = '临时半成品库存导入';
break;
case '7':
fileName = '载具主数据导入';
break;
case '8':
fileName = '货格主数据导入';
break;
/* case '9':
fileName = '采购成品导入';
break;
case '10':
fileName = '销售退货(期初前)导入';
break;*/
case '11':
fileName = '存储位置导入';
break;
case '12':
fileName = '库存说明导入';
break;
case '13':
fileName = '角色区域绑定信息导入';
break;
case '14':
fileName = '原材料/包材盘盈导入';
break;
case '15':
fileName = '原材料/包材盘亏导入';
break;
case '16':
fileName = '五金备件盘盈导入';
break;
case '17':
fileName = '五金备件盘亏导入';
break;
case '18':
fileName = '成品盘盈导入';
break;
case '19':
fileName = '成品盘亏导入';
break;
case '20':
fileName = '库存&质检数据导入';
break;
case '21':
fileName = '物料安全库存导入';
break;
case '22':
fileName = '成本中心领料单导入';
break;
default:
break;
}
this.downBlobFile("/wms/initial-data/export-document-template", {importType: me.importType}, fileName + '模板.xlsx');
},
doSubmit() {
let me = this;
if (isBlank(me.site)) {
me.$message.warning('站点丢失请刷新界面');
return false;
}
if (isBlank(me.importType)) {
me.$message.warning('请选择导入类型');
return false;
}
let params = me.$refs.upload.uploadFiles;
if (params == null || params == undefined || params.length < 1) {
me.$message.warning('请选择文件');
return false;
} else {
me.$refs.upload.submit();
}
},
doClear() {
this.importType = '';
this.resultMessage = '';
this.$refs.upload.clearFiles();
}
}
};
</script>
<style scoped>
</style>

View File

@ -0,0 +1,242 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj="inventoryIdDialogObj" :modal-fetch-fun='inventoryIdDialogFetchFun' :modal-show.sync="inventoryIdDialogVisible" @inputDialogSelected="inventoryIdSelected"></input-select-dialog>
<basic-container style="margin-top: -20px">
<el-form ref="formObj" :rules="rules" :model="formObj" label-width="100px">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="1">
<el-form-item label="条码:" prop="inventoryId">
<el-input v-model="formObj.inventoryId" placeHolder="条码" autofocus
@keyup.enter.native="doSearch(formObj.inventoryId)">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
<el-button slot="append" icon="el-icon-search"
@click.stop="showInventoryIdDialog()"></el-button>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-table :data="formObj.inventoryList" border>
<el-table-column prop="inventoryId" label="条码">
<template slot-scope="scope">
{{scope.row.inventoryId}}
</template>
</el-table-column>
<el-table-column prop="qty" label="库存数量">
<template slot-scope="scope">
{{scope.row.qty}}
</template>
</el-table-column>
<el-table-column prop="qtyOnHand" label="调整数量为">
<template slot-scope="scope">
<input v-model="scope.row.qtyOnHand" :disabled="scope.row.isUpdate === 'true' ? true : false"></input>
</template>
</el-table-column>
<el-table-column prop="adjustmentReason" label="调整原因">
<template slot-scope="scope">
<el-select placeHolder="请选择" v-model="scope.row.adjustmentReason" :disabled="scope.row.isUpdate === 'true' ? true : false">
<el-option label="盘点" value="盘点"/>
<el-option label="线下处理" value="线下处理"/>
<el-option label="误产出" value="误产出"/>
</el-select>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60">
<template slot-scope="scope">
<el-button type="danger" @click="removeInventoryList(scope.row,scope.$index)" :disabled="scope.row.isUpdate === 'true' ? true : false">删除</el-button>
</template>
</el-table-column>
</el-table>
<div v-if="this.formObj.inventoryList.length != 0" style="width: 100%;display: flex;flex-direction: column;align-items: center;justify-content: center;">
<el-row :gutter="20">
<el-col :span="10">
<el-button size="medium" type="primary" @click="doUpdate('formObj')">提交</el-button>
</el-col>
<el-col :span="10">
<el-button size="medium" type="primary" @click="doClear('formObj')">清除</el-button>
</el-col>
</el-row>
</div>
</el-form>
</basic-container>
</div>
</template>
<script>
import {fetchList, getByCode, putObj} from '@/api/wms/inventory'
import {hideLoading} from '@/const/loading'
import {isBlank} from "@/util/string"
import {mapGetters} from 'vuex'
import {getStore} from "@/util/store";
export default {
name: "inventory_adjustment",
data(){
return {
formObj: {},
inventoryIdDialogVisible : false,
initData: {
handle: "",
site: getStore({ name: 'tenantId' }),
inventoryId: "",
inventoryList: [],
},
rules: {
inventoryId: [
{ required: true, message: '请输入库存标识' }
],
},
inventoryIdDialogFetchFun: fetchList,
inventoryIdDialogObj: {
condition: "searchText",
tableColumn: [
{prop: "inventoryId", label: "库存标识"},
]
}
}
},
created() {
this.formObj = Object.assign({}, this.initData)
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {
};
}
},
methods:{
//显示操作弹窗框
showInventoryIdDialog() {
this.inventoryIdDialogVisible = true
},
inventoryIdSelected(row) {
let me = this
me.formObj.inventoryId = row.inventoryId
if(me.formObj.inventoryList && me.formObj.inventoryList.length > 0) {
for (let i = 0; i < me.formObj.inventoryList.length; i++) {
if (me.formObj.inventoryList[i].inventoryId == me.formObj.inventoryId){
me.formObj.inventoryId = ""
me.$message.error("不可重复扫描同一条码")
me.formObj.inventoryId = ""
return
}
}
}
getByCode(me.formObj.inventoryId).then(res => {
if (!me.formObj.inventoryList) {
me.formObj.inventoryList = []
}
if (res.data.code == 0) {
let obj = Object.assign({}, {
"handle": res.data.data.handle,
"inventoryId": res.data.data.inventoryId,
"qty": res.data.data.qtyOnHand,
"qtyOnHand": "",
"adjustmentReason": "",
"isUpdate": "",
})
me.formObj.inventoryList.unshift(obj);
me.formObj.inventoryId = ""
}
})
},
doSearch(){
let me = this
let code = me.formObj.inventoryId;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
};
if(me.formObj.inventoryList && me.formObj.inventoryList.length > 0) {
for (let i = 0; i < me.formObj.inventoryList.length; i++) {
if (me.formObj.inventoryList[i].inventoryId == me.formObj.inventoryId){
me.formObj.inventoryId = ""
me.$message.error("不可重复扫描同一条码")
me.formObj.inventoryId = ""
return
}
}
}
getByCode(code).then(res => {
if(!res.data.data.inventoryId || res.data.data.inventoryId == ""){
return me.$message.error("未检索到此条码")
}
if (!me.formObj.inventoryList) {
me.formObj.inventoryList = []
}
if (res.data.code == 0) {
let obj = Object.assign({}, {
"handle": res.data.data.handle,
"inventoryId": res.data.data.inventoryId,
"qty": res.data.data.qtyOnHand,
"qtyOnHand": "",
"adjustmentReason": "",
"isUpdate": "",
})
me.formObj.inventoryList.unshift(obj);
me.formObj.inventoryId = ""
}
})
},
doUpdate(formName){
let me = this
for (let i = 0; i < me.formObj.inventoryList.length; i++) {
if (me.formObj.inventoryList[i].qtyOnHand == ""){
setTimeout(() => {
this.$message.error('条码'+ me.formObj.inventoryList[i].inventoryId +'的调整数量为空')
}, 500);
continue
}
if (me.formObj.inventoryList[i].adjustmentReason == ""){
setTimeout(() => {
this.$message.error('条码'+ me.formObj.inventoryList[i].inventoryId +'的调整原因为空')
}, 500);
continue
}
if (me.formObj.inventoryList[i].qtyOnHand == me.formObj.inventoryList[i].qty){
setTimeout(() => {
this.$message.error('条码'+ me.formObj.inventoryList[i].inventoryId +'的调整数量不能等于库存数量')
}, 500);
continue
}
if(me.formObj.inventoryList[i].isUpdate == "true")
{
continue
}
putObj(me.formObj.inventoryList[i]).then(respData => {
hideLoading()
me.formObj.inventoryList[i].isUpdate = "true"
this.$message.success('条码'+ me.formObj.inventoryList[i].inventoryId +'提交成功')
}).catch(error => {
hideLoading()
});
this.$forceUpdate()
}
},
doClear(retainData) {
let me = this
me.formObj = retainData ? Object.assign({}, this.initData, retainData) : Object.assign({}, this.initData)
},
removeInventoryList(row, index) {
this.formObj.inventoryList.splice(index, 1)
},
doClear(){
let me = this
me.formObj.handle = ""
me.formObj.site = getStore({ name: 'tenantId' })
me.formObj.inventoryId = ""
me.formObj.inventoryList = []
},
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,715 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='productionRequisitionDialogObj'
:modal-fetch-fun='productionRequisitionDialogFetchFun'
:modal-show.sync="productionRequisitionDialogVisible"
@inputDialogSelected="productionRequisitionSelect" ref="documentDialog">
</input-select-dialog>
<input-select-dialog :modal-obj='storageLocationDialogObj' :modal-fetch-fun='storageLocationDialogFetchFun'
:modal-show.sync="storageLocationDialogVisible" @inputDialogSelected="storageLocationSelect">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item prop="documentNo">
<el-input v-model="formObj.documentNo" placeholder="单据号" autofocus
@keyup.enter.native="scanProductionRequisitionOrder">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
<el-button slot="append" icon="el-icon-search"
@click.stop="showProductionRequisitionDialog"></el-button>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-table :data="formObj.itemList" border>
<el-table-column label="物料" prop="item">
</el-table-column>
<el-table-column label="物料描述" prop="itemDescription">
</el-table-column>
<el-table-column label="来源仓" prop="sourceWarehouse">
</el-table-column>
<el-table-column label="目标仓" prop="targetWarehouse">
</el-table-column>
<el-table-column label="需求数量" prop="applicationsQuantity">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="showItemDialog(scope.$index, scope.row)">出库执行
</el-button>
</template>
</el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-tag v-if="scope.row.state === 'CLOSE'" type="warning" disable-transitions>
已执行
</el-tag>
<el-tag v-if="scope.row.state === 'SUBMIT'" disable-transitions>
待执行
</el-tag>
<el-tag v-if="scope.row.state === 'SAVING'" type="success" disable-transitions>
已保存
</el-tag>
</template>
</el-table-column>
</el-table>
</el-form>
<div style="margin-top: 10px;">
<el-button type="primary" @click="submit">提交</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
<el-dialog :visible.sync="dialogItemType1FormVisible" center fullscreen @close="backUpCodeList">
<div style="margin-top: 10px;">
<el-form :model="itemForm" label-width="auto">
<el-descriptions :column="1" border :labelStyle="lableWidth">
<el-descriptions-item label="单据号">
{{ itemForm.documentNo }}
</el-descriptions-item>
<el-descriptions-item label="物料">
{{ itemForm.item }}
</el-descriptions-item>
<el-descriptions-item label="物料描述">
{{ itemForm.itemDescription }}
</el-descriptions-item>
<el-descriptions-item label="到货批次">
{{ itemForm.batch }}
</el-descriptions-item>
<el-descriptions-item label="来源仓">
{{ itemForm.sourceWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="目标仓">
{{ itemForm.targetWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="需求数量">
{{ itemForm.applicationsQuantity }}
</el-descriptions-item>
<el-descriptions-item label="汇总数量">
{{ itemForm.sumQuantity }}
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ itemForm.unitOfMeasure }}
</el-descriptions-item>
<el-descriptions-item label="批次">
{{ itemForm.batch }}
</el-descriptions-item>
</el-descriptions>
<div style="margin-top: 10px;">
<el-form-item prop="code">
<el-input v-model="itemForm.code" placeholder="扫描条码" autofocus
@keyup.enter.native="scanCode" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
<el-table :data="itemForm.inventoryList" border>
<el-table-column label="序号" prop="seq"></el-table-column>
<el-table-column label="条码" prop="inventoryIdOrCarrier"></el-table-column>
<el-table-column label="数量" prop="inventoryQty"></el-table-column>
<el-table-column label="载具类型" prop="type" v-if="itemForm.itemType === 'FERT'"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="delRow(scope.$index, scope.row)"
:disabled="scope.row.isScan === 'N'">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveItemType1" :disabled="isUse">保存</el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="dialogItemType2FormVisible" center fullscreen>
<div style="margin-top: 10px;">
<el-form :model="itemForm" label-width="auto">
<el-descriptions :column="1" border :labelStyle="lableWidth">
<el-descriptions-item label="单据号">
{{ itemForm.documentNo }}
</el-descriptions-item>
<el-descriptions-item label="物料">
{{ itemForm.item }}
</el-descriptions-item>
<el-descriptions-item label="物料描述">
{{ itemForm.itemDescription }}
</el-descriptions-item>
<el-descriptions-item label="来源仓">
{{ itemForm.sourceWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="目标仓">
{{ itemForm.targetWarehouse }}
</el-descriptions-item>
<el-descriptions-item label="调拨数量">
<el-input type="number" v-model="itemForm.sumQuantity" :disabled="isUse"></el-input>
</el-descriptions-item>
<el-descriptions-item label="单位">
{{ itemForm.unitOfMeasure }}
</el-descriptions-item>
<el-descriptions-item label="来源存储区域">
<el-input v-model="itemForm.sourceLocation" :disabled="isUse">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showStorageLocationDialog"></i>
</el-input>
</el-descriptions-item>
</el-descriptions>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveItemType2" :disabled="isUse">保存</el-button>
</div>
</el-dialog>
</basic-container>
</div>
</template>
<script>
import {
fetchList as fetchProductionRequisitionList,
getDocumentDetail,
submit,
getInventoryQty,
getItemInventory
} from "@/api/wms/inventory-allocation";
import {fetchList as fetchStorageLocationList, getStorageLocationPageBycode} from '@/api/wms/storage-location';
import {getInventoryQtyNew} from "@/api/wms/production-out-inventory";
import {isBlank} from "@/util/string";
import {hideLoading, showLoading} from '@/const/loading';
import {getStore} from '@/util/store';
import {add} from '@/util/bigNumber';
import {listByActivityId} from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex';
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
isUse: false,
formObj: {},
documentNo: "",
itemForm: {},
submitList: [],
codeList: [],
storageLocationList: "",
verifyDefaultStorageBin: "",
dialogItemType1FormVisible: false,
dialogItemType2FormVisible: false,
productionRequisitionDialogFetchFun: fetchProductionRequisitionList,
productionRequisitionDialogVisible: false,
productionRequisitionDialogObj: {
"condition": "documentNo",
tableColumn: [
{prop: "documentNo", label: "单据"},
{
prop: "state", label: "状态", formatter: (row, column, cellValue, index) => {
if (cellValue == "SUBMIT") {
return "提交";
}
if (cellValue == "CLOSE") {
return "关闭";
}
}
}
]
},
storageLocationDialogVisible: false,
storageLocationDialogFetchFun: fetchStorageLocationList,
storageLocationDialogObj: {
"condition": "storageLocation",
tableColumn: [
{prop: "storageLocation", label: "存储位置", width: "200"},
{prop: "description", label: "描述"}
]
},
initData: {
documentNo: "",
itemList: [],
site: getStore({name: 'tenantId'})
},
};
},
created() {
this.wms_document_save = this.permissions["wms_document_save"];
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, {"inventoryList": [], "sumQuantity": 0, "code": "", "sourceLocation": ""});
this.documentNo = "";
this.codeList = [];
},
beforeRouteEnter(to, from, next) {
next(vm => {
try {
//获取作业规则
let me = vm;
let activityId = me.$route.query.ACTIVITY_ID;
listByActivityId(activityId).then(response => {
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
let data = response.data.data;
if (data && data.length > 0) {
for (let i = 0; i < data.length; i++) {
if (data[i].optionName && data[i].optionName.toUpperCase() === "IS_DOWN") {
me.verifyDefaultStorageBin = isBlank(data[i].optionValue) ? true : data[i].optionValue === "Y";
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "STORAGE_LOCATION") {
me.storageLocationList = data[i].optionValue;
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "FINISH_QTY_CONTROL") {
me.finishQtyControl = data[i].optionValue;
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "ALLOW_ONE_SUBMIT") {
me.allowOneSubmit = data[i].optionValue === "Y";
}
if (data[i].optionName && data[i].optionName.toUpperCase() === "STATUS_NOT_STUCK") {
me.statusNotStuck = data[i].optionValue;
}
}
}
}).catch(e => {
console.log(e);
});
} catch (e) {
console.log(e);
}
});
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//存储区域弹出框
showStorageLocationDialog() {
let me = this;
me.storageLocationDialogVisible = true;
if (this.storageLocationList != "") {
this.storageLocationDialogFetchFun = getStorageLocationPageBycode;
this.storageLocationDialogObj.queryParam = {"str": this.storageLocationList};
} else {
me.storageLocationDialogObj.queryParam = {"erpStorageLocation": this.itemForm.sourceWarehouse};
}
},
storageLocationSelect(row) {
let me = this;
me.itemForm.sourceLocation = row.storageLocation;
console.log(me.itemForm);
},
//单据号弹出框
showProductionRequisitionDialog() {
let me = this;
me.productionRequisitionDialogVisible = true;
me.$refs.documentDialog.clear();
me.productionRequisitionDialogObj.queryParam = {"documentType": "LOCAL_TRANSFER"};
},
productionRequisitionSelect(row) {
let me = this;
me.formObj.itemList = [];
me.submitList = [];
me.formObj.documentNo = row.documentNo;
me.documentNo = me.formObj.documentNo;
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"batch": res.data.data[i].batch,
"sourceLocation": res.data.data[i].storageLocation,
"itemType": res.data.data[i].itemType,
"batch": res.data.data[i].batch,
});
me.formObj.itemList.push(obj);
}
}
});
},
//扫描单据号
scanProductionRequisitionOrder() {
let me = this;
let code = me.formObj.documentNo;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
}
if (me.documentNo === code) {
me.$message.error("不可重复扫描");
return;
}
me.formObj.itemList = [];
me.submitList = [];
getDocumentDetail(me.formObj.documentNo).then(res => {
if (res.data.code == 0) {
if (res.data.data[0].documentType != "LOCAL_TRANSFER") {
return me.$message.error("单据类型不是库存调拨");
}
for (let i = 0; i < res.data.data.length; i++) {
let obj = Object.assign({}, {
"item": res.data.data[i].item,
"applicationsQuantity": res.data.data[i].applicationsQuantity,
"documentNo": me.formObj.documentNo,
"isPack": res.data.data[i].isPack,
"itemDescription": res.data.data[i].itemDescription,
"seq": res.data.data[i].seq,
"sourceWarehouse": res.data.data[i].sourceWarehouse,
"targetWarehouse": res.data.data[i].targetWarehouse,
"unitOfMeasure": res.data.data[i].unitOfMeasure,
"itemGroup": res.data.data[i].itemGroup,
"state": res.data.data[i].state,
"handle": res.data.data[i].handle,
"documentType": res.data.data[i].documentType,
"sourceLocation": res.data.data[i].storageLocation,
"itemType": res.data.data[i].itemType,
"batch": res.data.data[i].batch,
});
me.formObj.itemList.push(obj);
me.documentNo = me.formObj.documentNo;
}
}
});
},
showItemDialog(index, row) {
//判断是物料类型弹出不同的表单
let me = this;
//判断行项目是否已经关闭,关闭则不可扫描条码和保存
this.isUse = row.state === "CLOSE";
if (row.itemType === 'ROH' || row.itemType === 'VERP' || row.itemType === 'FERT') {
//获取汇总数量
let obj = Object.assign({
"inventoryList": [],
"code": "",
"sumQuantity": 0,
"storageLocation": ""
}, row);
if (me.submitList.length > 0) {
let saveObj = me.submitList.find(o => o.seq === row.seq);
if (saveObj) {
obj = Object.assign({}, saveObj);
obj.inventoryList = saveObj.inventoryList.slice();
}
}
me.itemForm = obj;
me.dialogItemType1FormVisible = true;
me.loadSaveData(row);
} else if (row.itemType === 'KMAT') {
//获取汇总数量
let obj = Object.assign({
"inventoryList": [],
"sumQuantity": row.applicationsQuantity,
"storageLocation": ""
}, row);
if (me.submitList.length > 0) {
let saveObj = me.submitList.find(o => o.seq === row.seq);
if (saveObj) {
obj = Object.assign({}, saveObj);
obj.inventoryList = saveObj.inventoryList.slice();
}
}
me.itemForm = obj;
me.dialogItemType2FormVisible = true;
me.loadMatSaveData(row);
}
},
loadMatSaveData(row) {
let me = this;
getItemInventory(row).then(res => {
let sumInventoryQty = 0;
if (res.data.code === 0 && res.data.data.length > 0) {
me.itemForm.inventoryList = [];
for (let i = 0; i < res.data.data.length; i++) {
sumInventoryQty = add(sumInventoryQty, res.data.data[i].inventoryQty);
}
me.$set(me.itemForm, "sumQuantity", sumInventoryQty);
}
});
},
loadSaveData(row) {
let me = this;
getItemInventory(row).then(res => {
let sumInventoryQty = 0;
if (res.data.code === 0 && res.data.data.length > 0) {
let array = [], length = res.data.data.length;
for (let data of res.data.data) {
sumInventoryQty = add(sumInventoryQty, data.inventoryQty);
array.push({
"inventoryIdOrCarrier": data.inventoryIdOrCarrier,
"inventoryQty": data.inventoryQty,
"isScan": "N",
"seq": length--
});
}
me.$set(me.itemForm, "inventoryList", array);
me.$set(me.itemForm, "sumQuantity", sumInventoryQty);
}
});
},
getInventoryList() {
let me = this;
let obj = Object.assign({}, {
"item": me.itemForm.item,
"sourceWarehouse": me.itemForm.sourceWarehouse,
"inventoryIdOrCarrier": me.itemForm.code,
"batch": me.itemForm.batch,
"verifyDefaultStorageBin": me.verifyDefaultStorageBin,
"checkStatus": isBlank(me.statusNotStuck) || me.statusNotStuck.indexOf(me.itemForm.itemType) < 0,
"documentType": me.itemForm.documentType,
});
showLoading();
getInventoryQtyNew(obj).then(res => {
hideLoading();
if (res.data.code === 0) {
//库存总数大于需求数量
let data = res.data.data;
let qty = 0, rowArray = [], codeArray = [];
let length = me.itemForm.inventoryList.length;
if (length > 0) {
data = data.filter(o => {
for (let code of me.codeList) {
if (code === o.inventoryIdOrCarrier || code === o.carrier) {
return false;
}
}
return true;
});
}
if (data.length === 0) {
me.$message.error("不可重复扫描");
} else {
for (let row of data) {
let inventoryQty = row.inventoryQty;
qty = add(qty, inventoryQty);
rowArray.push({
"inventoryIdOrCarrier": row.inventoryIdOrCarrier,
"inventoryQty": row.inventoryQty,
"group": row.group,
"carrier": row.carrier,
"isScan": "Y",
"type": row.type,
"seq": ++length,
});
codeArray.push(row.inventoryIdOrCarrier);
}
if (!isBlank(data[0].carrier) && data[0].inventoryIdOrCarrier !== data[0].carrier) {
codeArray.push(data[0].carrier);
}
if ((add(qty, me.itemForm.sumQuantity) > me.itemForm.applicationsQuantity) && me.finishQtyControl !== "2") {
me.$message.error("汇总数量大于需求数量");
} else {
rowArray.reverse();
me.itemForm.sumQuantity = add(me.itemForm.sumQuantity, qty);
me.itemForm.inventoryList = rowArray.concat(me.itemForm.inventoryList);
me.codeList = me.codeList.concat(codeArray);
me.itemForm.code = "";
}
}
}
}).catch(e => hideLoading());
},
//扫描条码
scanCode() {
let me = this;
if (isBlank(me.itemForm.code)) {
me.$message.error("不可扫描空条码");
return;
}
if (me.itemForm.inventoryList.length > 0) {
if (me.codeList.includes(me.itemForm.code)) {
me.$message.error("不可重复扫描");
return;
}
this.getInventoryList();
} else {
this.getInventoryList();
}
},
submit() {
let me = this;
if (me.submitList.length > 0) {
if (!me.allowOneSubmit) {
for (let row of me.formObj.itemList) {
if (row.state !== "SAVING") {
if (row.state === "CLOSE") {
me.$message.error("行项目" + row.seq + "已关闭,不可以提交,请修改作业规则");
} else {
me.$message.error("行项目" + row.seq + "无保存信息可以提交,请确认");
}
return;
}
}
}
for (let i = 0; i < me.submitList.length; i++) {
let list = me.submitList[i].inventoryList;
for (let j = 0; j < list.length; j++) {
if (list[j].isScan === "N") {
me.submitList[i].inventoryList.splice(j, 1);
}
}
}
showLoading();
submit(me.submitList).then(res => {
hideLoading();
if (res.data.code === 0) {
me.$message.success("提交成功");
me.doClear();
}
}).catch(() => {
hideLoading();
});
} else {
me.$message.error("无已保存的行项目可以提交,请确认");
}
},
saveItemType1() {
let me = this;
if (me.itemForm.state === "CLOSE") {
me.$message.error("此行项目已关闭");
} else if (me.itemForm.inventoryList.length === 0) {
me.$message.error("无信息可以保存,请点击返回按钮");
} else if (me.itemForm.sumQuantity !== me.itemForm.applicationsQuantity && isBlank(me.finishQtyControl)) {
me.$message.error("汇总数量不等于需求数量,请确认");
} else {
me.backUpList = [];
let fun = () => {
let obj = me.itemForm;
obj.state = "SAVING";
if (me.submitList.length > 0) {
let index = me.submitList.findIndex(o => o.seq === obj.seq);
if (index >= 0) {
me.submitList.splice(index, 1, obj);
} else {
me.submitList.push(obj);
}
} else {
me.submitList.push(obj);
}
me.$set(me.formObj.itemList.find(o => o.seq === obj.seq), "state", obj.state);
me.dialogItemType1FormVisible = false;
};
fun();
}
},
saveItemType2() {
let me = this;
if (me.itemForm.state === "CLOSE") {
me.$message.error("此行项目已关闭");
} else if (isBlank(me.itemForm.sourceLocation)) {
me.$message.error("无信息可以保存,请点击返回按钮");
} else {
me.itemForm.inventoryList = [{
"inventoryQty": me.itemForm.sumQuantity
}];
let obj = me.itemForm;
obj.state = "SAVING";
if (me.submitList.length > 0) {
let index = me.submitList.findIndex(o => o.seq === obj.seq);
if (index >= 0) {
me.submitList.splice(index, 1, obj);
} else {
me.submitList.push(obj);
}
} else {
me.submitList.push(obj);
}
me.$set(me.formObj.itemList.find(o => o.seq === obj.seq), "state", obj.state);
me.dialogItemType2FormVisible = false;
}
},
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.itemForm = Object.assign({}, {"inventoryList": [], "sumQuantity": 0, "code": ""});
this.documentNo = "";
this.codeList = [];
this.submitList = [];
},
delRow(index, row) {
let me = this;
//删除已扫描过条码中集合的信息
let inventoryList = me.itemForm.inventoryList, delList = [], delQty = 0;
let groupOrCarrier = isBlank(row.group) ? row.carrier : row.group;
if (!isBlank(groupOrCarrier)) {
let startIndex = -1, endIndex = -1;
for (let i = 0; i < inventoryList.length; i++) {
if (startIndex < 0 && (inventoryList[i].group === groupOrCarrier || inventoryList[i].carrier === groupOrCarrier)) {
startIndex = i;
}
if (startIndex >= 0 && (inventoryList[i].group === groupOrCarrier || inventoryList[i].carrier === groupOrCarrier)) {
endIndex = i + 1;
}
}
for (let delRow of me.itemForm.inventoryList.splice(startIndex, endIndex === -1 ? 1 : endIndex)) {
delQty = add(delQty, row.inventoryQty);
delList.push(delRow.inventoryIdOrCarrier);
}
if (!isBlank(row.carrier) && row.inventoryIdOrCarrier !== row.carrier) {
delList.push(groupOrCarrier);
}
} else {
delQty = row.inventoryQty;
delList = me.itemForm.inventoryList.splice(index, 1).map(o => o.inventoryIdOrCarrier);
}
for (let i = 0; i < me.itemForm.inventoryList.length; i++) {
me.itemForm.inventoryList[i].seq = me.itemForm.inventoryList.length - i;
}
me.codeList = me.codeList.filter(o => !delList.includes(o));
if (me.itemForm.state === "SAVING") {
me.backUpList = me.backUpList.concat(delList.filter(o => !me.backUpList.includes(o)));
}
me.itemForm.sumQuantity -= delQty;
},
backUpCodeList() {
let me = this;
if (me.backUpList.length > 0) {
me.codeList = me.codeList.concat(me.backUpList.filter(o => !me.codeList.includes(o)));
}
},
},
};
</script>

View File

@ -0,0 +1,430 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj="inventoryCheckDialogObj" :modal-fetch-fun='inventoryCheckDialogFetchFun'
:modal-show.sync="inventoryCheckDialogVisible"
@inputDialogSelected="inventoryCheckSelected"></input-select-dialog>
<input-select-dialog :modal-obj="erpStorageLocationDialogObj" :modal-fetch-fun='erpStorageLocationDialogFetchFun'
:modal-show.sync="erpStorageLocationDialogVisible"
@inputDialogSelected="erpStorageLocationSelected"></input-select-dialog>
<input-select-dialog :modal-obj="itemDialogObj" :modal-fetch-fun='itemDialogFetchFun'
:modal-show.sync="itemDialogVisible" @inputDialogSelected="itemSelected"></input-select-dialog>
<basic-container style="margin-top: -20px">
<c-top-bar :offset="50">
<el-button v-if="inventory_check_summary" type="text" icon="el-icon-search" @click="doRetrive('formObj')">检索
</el-button>
<el-divider v-if="inventory_check_summary" direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-circle-close" @click="doClear()">清除</el-button>
<el-divider direction="vertical"></el-divider>
<el-button type="text" icon="el-icon-document" @click="doExport">导出</el-button>
</c-top-bar>
<el-form ref="formObj" :rules="rules" :model="formObj" label-width="100px">
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="仓库:" prop="erpStorageLocation">
<el-input placeHolder="仓库" v-model="formObj.erpStorageLocation"><i slot="suffix"
class="el-input__icon el-icon-search"
@click.stop="showErpStorageLocationDialog()"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="物料:" prop="item">
<el-input placeHolder="物料" v-model="formObj.item" @blur="clickOutSide"><i slot="suffix"
class="el-input__icon el-icon-search"
@click.stop="showItemDialog()"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="物料描述:" prop="itemDesc">
<el-input placeHolder="物料描述" v-model="formObj.itemDesc" :disabled="true"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="盘点单号:" prop="checkNo">
<el-input placeHolder="盘点单号" v-model="formObj.checkNo"><i slot="suffix"
class="el-input__icon el-icon-search"
@click.stop="showCheckNoDialog()"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="差异状态:" prop="profitAndLoss">
<el-select placeHolder="请选择" v-model="formObj.profitAndLoss">
<el-option label="全部" value="全部"/>
<el-option label="盘盈" value="盘盈"/>
<el-option label="相同" value="相同"/>
<el-option label="盘亏" value="盘亏"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-tabs v-model="tabActiveName">
<el-tab-pane label="盘点信息" name="wmsInventoryCheckDetailTab">
<el-table size="mini" height="400" :data="formObj.inventoryCheckDetailList"
@selection-change="handleSelectionChange" border style="width: 100%" highlight-current-row :cell-style="cellStyle">
<el-table-column align="center" prop="sequence" label="顺序" width="50">
<template slot-scope="scope">
{{scope.row.sequence}}
</template>
</el-table-column>
<el-table-column align="center" prop="storageLocation" label="货架号">
<template slot-scope="scope">
{{scope.row.storageLocation}}
</template>
</el-table-column>
<el-table-column align="center" prop="storageLocationDesc" label="货架描述">
<template slot-scope="scope">
{{scope.row.storageLocationDesc}}
</template>
</el-table-column>
<el-table-column align="center" prop="storageBin" label="货格号">
<template slot-scope="scope">
{{scope.row.storageBin}}
</template>
</el-table-column>
<el-table-column align="center" prop="carrier1" label="托条码">
<template slot-scope="scope">
{{scope.row.carrier1}}
</template>
</el-table-column>
<el-table-column align="center" prop="carrier1New" label="调整后托条码" >
<template slot-scope="scope">
{{scope.row.carrier1New}}
</template>
</el-table-column>
<el-table-column align="center" prop="carrier2Number" label="调整前箱数" width="90" v-if="formObj.checkNoMode === '1'"></el-table-column>
<el-table-column align="center" prop="carrier2NumberNew" label="调整后箱数" width="90" v-if="formObj.checkNoMode === '1'"></el-table-column>
<el-table-column align="center" prop="carrier2" label="箱条码" v-if="formObj.checkNoMode !== '1'"></el-table-column>
<el-table-column align="center" prop="inventoryNumber" label="调整前卷数" width="90" v-if="formObj.checkNoMode === '1'"></el-table-column>
<el-table-column align="center" prop="inventoryNumberNew" label="调整后卷数" width="90" v-if="formObj.checkNoMode === '1'"></el-table-column>
<el-table-column align="center" prop="inventoryId" label="库存条码" v-if="formObj.checkNoMode === 'inventoryId'"></el-table-column>
<el-table-column align="center" prop="item" label="物料">
<template slot-scope="scope">
{{scope.row.item}}
</template>
</el-table-column>
<el-table-column align="center" prop="itemDesc" label="物料描述">
<template slot-scope="scope">
{{scope.row.itemDesc}}
</template>
</el-table-column>
<el-table-column align="center" prop="qtyOnHand" label="盘点前数量" width="90">
<template slot-scope="scope">
{{scope.row.qtyOnHand}}
</template>
</el-table-column>
<el-table-column align="center" prop="realQty" label="实际数量">
<template slot-scope="scope">
{{scope.row.realQty}}
</template>
</el-table-column>
<el-table-column align="center" prop="diffQty" label="差异数量">
<template slot-scope="scope">
{{scope.row.diffQty}}
</template>
</el-table-column>
<el-table-column align="center" prop="profitAndLoss" label="差异状态" filter-placement="bottom-end">
<template slot-scope="scope">
<el-tag v-if="scope.row.profitAndLoss === '相同'" :type="'primary'" disable-transitions>
{{scope.row.profitAndLoss}}
</el-tag>
<el-tag v-if="scope.row.profitAndLoss === '盘亏'" :type="'danger'" disable-transitions>
{{scope.row.profitAndLoss}}
</el-tag>
<el-tag v-if="scope.row.profitAndLoss === '盘盈'" :type="'success'" disable-transitions>
{{scope.row.profitAndLoss}}
</el-tag>
</template>
</el-table-column>
<el-table-column align="center" prop="unitOfMeasure" label="单位">
<template slot-scope="scope">
{{scope.row.unitOfMeasure}}
</template>
</el-table-column>
<el-table-column align="center" prop="checkNoCreator" label="盘点用户">
<template slot-scope="scope">
{{scope.row.checkNoCreator}}
</template>
</el-table-column>
<el-table-column align="center" prop="checkNoCreateTime" label="盘点时间">
<template slot-scope="scope">
{{scope.row.checkNoCreateTime}}
</template>
</el-table-column>
<el-table-column align="center" prop="snapshotCreator" label="快照创建人">
<template slot-scope="scope">
{{scope.row.snapshotCreator}}
</template>
</el-table-column>
<el-table-column align="center" prop="snapshotCreateTime" label="快照创建时间">
<template slot-scope="scope">
{{scope.row.snapshotCreateTime}}
</template>
</el-table-column>
</el-table>
<div style="width: 100%;display: flex;flex-direction: column;align-items: center;justify-content: center;">
<el-pagination @current-change="handleCurrentChange"
@size-change="handleSizeChange"
:current-page.sync="page.current"
:page-sizes="[10, 20, 50, 100, 200]"
:page-size="page.size"
layout="total, sizes, prev, pager, next, jumper" :total="page.total">
</el-pagination>
</div>
</el-tab-pane>
</el-tabs>
</el-form>
</basic-container>
</div>
</template>
<script>
import {fetchErpStorageLocationList, fetchList, selectCheckNoSummary} from '@/api/wms/wms-inventory-check';
import {fetchList as fetchItemList} from '@/api/mes/prd/item';
import {hideLoading, showLoading} from '@/const/loading';
import {isBlank} from "@/util/string";
import {mapGetters} from 'vuex';
import {getStore} from "@/util/store";
import {trimHandle} from "@/util/handle";
export default {
name: "wms-inventory-check_maintain",
data() {
return {
tabActiveName: "wmsInventoryCheckDetailTab",
formObj: {},
inventory_check_summary: false,
inventoryCheckDialogVisible: false,
erpStorageLocationDialogVisible: false,
itemDialogVisible: false,
initData: {
handle: "",
site: getStore({name: 'tenantId'}),
checkNo: "",
erpStorageLocation: "",
item: "",
itemDesc: "",
itemBo: "",
profitAndLoss: "全部",
inventoryCheckDetailList: [],
},
page: {
total: 0,
current: 1,
size: 10
},
rules: {
checkNo: [
{required: true, message: '请输入盘点单号'}
],
},
inventoryCheckDialogFetchFun: fetchList,
erpStorageLocationDialogFetchFun: fetchErpStorageLocationList,
itemDialogFetchFun: fetchItemList,
inventoryCheckDialogObj: {
condition: "searchText",
tableColumn: [
{prop: "checkNo", label: "盘点单号"},
{prop: "checkNoStatus", label: "盘点单状态"},
]
},
erpStorageLocationDialogObj: {
condition: "searchText",
tableColumn: [
{prop: "erpStorageLocation", label: "ERP仓库编号"},
]
},
itemDialogObj: {
condition: "searchText",
tableColumn: [
{prop: "item", label: "物料"},
{prop: "description", label: "描述"},
]
},
};
},
created() {
this.inventory_check_summary = this.permissions['inventory_check_summary'];
this.formObj = Object.assign({}, this.initData);
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {};
}
},
methods: {
handleSelectionChange(val) {
this.interfaceLog = val;
},
handleSizeChange(val) {
this.page.size = val;
this.page.current = 1;
this.doRetrive('formObj');
},
//页面切换
handleCurrentChange(val) {
this.page.current = val;
this.doRetrive('formObj');
},
//显示操作弹窗框
showCheckNoDialog() {
if (isBlank(this.formObj.erpStorageLocation)) {
this.$message.warning('请先选择ERP仓库');
return false;
}
this.inventoryCheckDialogObj.queryParam = {'erpStorageLocation': this.formObj.erpStorageLocation};
this.inventoryCheckDialogVisible = true;
},
showErpStorageLocationDialog() {
this.erpStorageLocationDialogVisible = true;
},
showItemDialog() {
this.itemDialogVisible = true;
},
inventoryCheckSelected(row) {
let me = this;
me.formObj.checkNo = row.checkNo;
me.formObj.checkNoStatus = row.checkNoStatus;
},
erpStorageLocationSelected(row) {
let me = this;
me.formObj.erpStorageLocation = row.erpStorageLocation;
me.formObj.checkNo = "";
},
itemSelected(row) {
let me = this;
me.formObj.item = row.item;
me.formObj.itemDesc = row.description;
},
doRetrive(formName) {
let me = this;
me.$refs[formName].validateField(['checkNo'], (errorMessage) => {
if (errorMessage) {
return false;
} else {
showLoading();
let list = {
"checkNo": me.formObj.checkNo,
"erpStorageLocation": me.formObj.erpStorageLocation,
"item": me.formObj.item,
"profitAndLoss": me.formObj.profitAndLoss
};
selectCheckNoSummary(list, me.page).then(response => {
hideLoading();
if (response.data.data.length === 0) {
return me.$message.error('检索无数据');
}
// me.formObj = Object.assign({}, response.data.data)
let seq = 1;
for (let i = 0; i < response.data.data.records.length; i++) {
if (response.data.data.records[i].itemBo != "") {
response.data.data.records[i].item = trimHandle(response.data.data.records[i].itemBo);
}
if (response.data.data.records[i].storageLocationBo != "") {
response.data.data.records[i].storageLocation = trimHandle(response.data.data.records[i].storageLocationBo);
}
if (response.data.data.records[i].storageBinBo != "") {
response.data.data.records[i].storageBin = trimHandle(response.data.data.records[i].storageBinBo);
}
if (response.data.data.records[i].carrier1Bo != "") {
response.data.data.records[i].carrier1 = trimHandle(response.data.data.records[i].carrier1Bo);
}
if (response.data.data.records[i].carrier2Bo != "") {
response.data.data.records[i].carrier2 = trimHandle(response.data.data.records[i].carrier2Bo);
}
if (response.data.data.records[i].inventoryIdBo != "") {
response.data.data.records[i].inventoryId = trimHandle(response.data.data.records[i].inventoryIdBo);
}
response.data.data.records[i].sequence = seq;
seq++;
}
me.formObj.inventoryCheckDetailList = response.data.data.records;
me.formObj.checkNoMode = me.formObj.inventoryCheckDetailList[0].checkNoMode;
me.page.total = response.data.data.total;
me.page.current = response.data.data.current;
}).catch(() => {
hideLoading();
});
}
});
},
doClear(retainData) {
let me = this;
me.formObj = retainData ? Object.assign({}, this.initData, retainData) : Object.assign({}, this.initData);
me.page.total = 0;
me.page.current = 1;
},
doExport() {
let me = this;
let search = {
"checkNo": me.formObj.checkNo,
"erpStorageLocation": me.formObj.erpStorageLocation,
"item": me.formObj.item,
"profitAndLoss": me.formObj.profitAndLoss
};
this.downBlobFile("/wms/wms-inventory-check/checkNoSummaryExport", search, "盘点汇总.xlsx");
},
clickOutSide() {
let me = this;
me.formObj.itemDesc = "";
if (me.formObj.item != "") {
let params = {
"site": getStore({name: 'tenantId'}),
"item": me.formObj.item,
"currentRevision": "Y"
};
let isExistence = false;
fetchItemList(Object.assign({}, params, this.searchForm)).then(response => {
if (!response.data.data.records || response.data.data.records.length == 0) {
return me.$message.error("此物料不存在");
}
response.data.data.records.forEach(r => {
if (me.formObj.item == r.item) {
me.formObj.itemDesc = r.description;
isExistence = true;
}
});
if (isExistence == false) {
return me.$message.error("此物料不存在");
}
});
}
},
cellStyle({row, column, rowIndex, columnIndex}){
if (column.property === "carrier2NumberNew") {
if (row.carrier2Number !== row.carrier2NumberNew) {
return {backgroundColor: "#00f916"};
}
}
if (column.property === "carrier1New") {
if (isBlank(row.carrier1New)) {
return {backgroundColor: "#fff"};
}
if (row.carrier1 !== row.carrier1New ) {
return {backgroundColor: "#00f916"};
}
}
if (column.property === "inventoryNumberNew") {
if (row.inventoryNumber !== row.inventoryNumberNew) {
return {backgroundColor: "#00f916"};
}
}
}
}
};
</script>
<style>
</style>

View File

@ -0,0 +1,438 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj="inventoryCheckDialogObj" :modal-fetch-fun='inventoryCheckDialogFetchFun'
:modal-show.sync="inventoryCheckDialogVisible"
@inputDialogSelected="inventoryCheckSelected"></input-select-dialog>
<input-select-dialog :modal-obj="erpStorageLocationDialogObj" :modal-fetch-fun='erpStorageLocationDialogFetchFun'
:modal-show.sync="erpStorageLocationDialogVisible"
@inputDialogSelected="erpStorageLocationSelected"></input-select-dialog>
<basic-container style="margin-top: -20px">
<el-form ref="formObj" :rules="rules" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="仓库:" prop="erpStorageLocation">
<el-input placeHolder="仓库" v-model="formObj.erpStorageLocation" :readonly="true">
<i slot="suffix" class="el-input__icon el-icon-search" @click.stop="showErpStorageLocationDialog()"></i>
</el-input>
</el-form-item>
<el-form-item label="盘点单号:" prop="checkNo" :readonly="true">
<el-input placeHolder="盘点单号" v-model="formObj.checkNo">
<i slot="suffix" class="el-input__icon el-icon-search" @click.stop="showCheckNoDialog()"></i>
</el-input>
</el-form-item>
<el-form-item label="盘点方式:" prop="checkNoMode">
<el-input placeHolder="盘点方式" v-model="formObj.checkNoMode" :disabled="true"></el-input>
</el-form-item>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<hr class="el-hr"/>
</el-col>
</el-col>
</el-row>
<el-tabs v-model="tabActiveName">
<el-tab-pane label="执行信息" name="inventoryCheckDetailTab">
<!-- <el-row :gutter="10">-->
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="条码:" prop="barCode">
<el-input placeHolder="手动输入或者扫码" v-model="formObj.barCode" autofocus
@keyup.enter.native="doSearch(formObj.barCode)" clearable>
</el-input>
</el-form-item>
</el-col>
<!-- </el-row>-->
<el-table size="mini" height="250" :data="formObj.inventoryCheckList" v-if="formObj.checkNoMode === '托'"
border style="width: 100%" highlight-current-row>
<el-table-column prop="carrier1" label="条码">
<template slot-scope="scope">
{{scope.row.carrier1}}
</template>
</el-table-column>
<el-table-column prop="carrier2NumberNew" label="箱数">
<template slot-scope="scope">
<el-input placeHolder="箱数" v-model="scope.row.carrier2NumberNew"
:disabled="scope.row.isUpdate === 'true'"></el-input>
</template>
</el-table-column>
<el-table-column prop="inventoryNumberNew" label="卷数">
<template slot-scope="scope">
<el-input placeHolder="卷数" v-model="scope.row.inventoryNumberNew"
:disabled="scope.row.isUpdate === 'true'"></el-input>
</template>
</el-table-column>
<el-table-column prop="qtyOnHand" label="库存数量">
<template slot-scope="scope">
{{scope.row.qtyOnHand}}
</template>
</el-table-column>
<el-table-column prop="realQty" label="盘点数量">
<template slot-scope="scope">
<el-input placeHolder="盘点数量" v-model="scope.row.realQty"
:disabled="scope.row.isUpdate === 'true' ? true : false"></el-input>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60">
<template slot-scope="scope">
<el-button type="danger" :disabled="scope.row.isUpdate === 'true' ? true : false"
@click="removeInventoryCheckDetailDetail(scope.row,scope.$index)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-table size="mini" height="250" :data="formObj.inventoryCheckList" v-if="formObj.checkNoMode === '箱'"
border style="width: 100%" highlight-current-row>
<el-table-column prop="carrier2" label="条码">
<template slot-scope="scope">
{{scope.row.carrier2}}
</template>
</el-table-column>
<el-table-column prop="carrier2NumberNew" label="箱数">
<template slot-scope="scope">
<el-input placeHolder="箱数" v-model="scope.row.carrier2NumberNew"
:disabled="scope.row.isUpdate === 'true'"></el-input>
</template>
</el-table-column>
<el-table-column prop="inventoryNumberNew" label="卷数">
<template slot-scope="scope">
<el-input placeHolder="卷数" v-model="scope.row.inventoryNumberNew"
:disabled="scope.row.isUpdate === 'true'"></el-input>
</template>
</el-table-column>
<el-table-column prop="carrier1New" label="托条码">
<template slot-scope="scope">
<el-input placeHolder="托条码" v-model="scope.row.carrier1New"
:disabled="scope.row.isUpdate === 'true'"></el-input>
</template>
</el-table-column>
<el-table-column prop="qtyOnHand" label="库存数量">
<template slot-scope="scope">
{{scope.row.qtyOnHand}}
</template>
</el-table-column>
<el-table-column prop="realQty" label="盘点数量">
<template slot-scope="scope">
<el-input placeHolder="盘点数量" v-model="scope.row.realQty"
:disabled="scope.row.isUpdate === 'true' ? true : false"></el-input>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60">
<template slot-scope="scope">
<el-button type="danger" @click="removeInventoryCheckDetailDetail(scope.row,scope.$index)"
:disabled="scope.row.isUpdate === 'true' ? true : false">删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-table size="mini" height="250" :data="formObj.inventoryCheckList" v-if="formObj.checkNoMode === '库存条码'"
border style="width: 100%" highlight-current-row>
<el-table-column prop="inventoryId" label="条码">
<template slot-scope="scope">
{{scope.row.inventoryId}}
</template>
</el-table-column>
<el-table-column prop="qtyOnHand" label="库存数量">
<template slot-scope="scope">
{{scope.row.qtyOnHand}}
</template>
</el-table-column>
<el-table-column prop="realQty" label="盘点数量">
<template slot-scope="scope">
<el-input placeHolder="盘点数量" v-model="scope.row.realQty"
:disabled="scope.row.isUpdate === 'true' ? true : false"></el-input>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60">
<template slot-scope="scope">
<el-button type="danger" @click="removeInventoryCheckDetailDetail(scope.row,scope.$index)"
:disabled="scope.row.isUpdate === 'true' ? true : false">删除
</el-button>
</template>
</el-table-column>
</el-table>
<div style="width: 100%;display: flex;flex-direction: column;align-items: center;justify-content: center;">
<el-row :gutter="20">
<el-col :span="10">
<el-button size="medium" type="primary" @click="doUpdate('formObj')">提交</el-button>
</el-col>
<el-col :span="10">
<el-button size="medium" type="primary" @click="doClear('formObj')">清除</el-button>
</el-col>
</el-row>
</div>
</el-tab-pane>
</el-tabs>
</el-form>
</basic-container>
</div>
</template>
<script>
import {fetchErpStorageLocationList, fetchList, putObj, selectIdCode} from '@/api/wms/wms-inventory-check';
import {hideLoading, showLoading} from '@/const/loading';
import {isBlank} from "@/util/string";
import {mapGetters} from 'vuex';
import {getStore} from "@/util/store";
import {trimHandle} from "@/util/handle";
export default {
name: "wms-inventory-check_maintain",
data() {
return {
tabActiveName: "inventoryCheckDetailTab",
formObj: {},
inventoryCheckDialogVisible: false,
erpStorageLocationDialogVisible: false,
barCodeDialogVisible: false,
initData: {
site: getStore({name: 'tenantId'}),
checkNo: "",
erpStorageLocation: "",
checkNoMode: "",
item: "",
itemDesc: "",
storageLocation: "",
barCode: "",
inventoryCheckList: [],
},
rules: {
checkNo: [
{required: true, message: '请输入盘点单号'}
],
erpStorageLocation: [
{required: true, message: '请输入仓库'}
],
},
inventoryCheckDialogFetchFun: fetchList,
erpStorageLocationDialogFetchFun: fetchErpStorageLocationList,
inventoryCheckDialogObj: {
condition: "searchText",
tableColumn: [
{prop: "checkNo", label: "盘点单号"},
{prop: "checkNoStatus", label: "盘点单状态"},
{prop: "checkCondition", label: "盘点条件"},
]
},
erpStorageLocationDialogObj: {
condition: "searchText",
tableColumn: [
{prop: "erpStorageLocation", label: "ERP仓库编号"},
]
},
};
},
created() {
this.formObj = Object.assign({}, this.initData);
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {};
}
},
methods: {
//显示操作弹窗框
showCheckNoDialog() {
if (isBlank(this.formObj.erpStorageLocation)) {
this.$message.warning('请先选择ERP仓库');
return false;
}
this.inventoryCheckDialogObj.queryParam = {
'erpStorageLocation': this.formObj.erpStorageLocation,
'checkNoStatus': "待执行"
};
this.inventoryCheckDialogVisible = true;
},
showErpStorageLocationDialog() {
this.erpStorageLocationDialogVisible = true;
},
inventoryCheckSelected(row) {
let me = this;
me.formObj.checkNo = row.checkNo;
me.formObj.checkNoMode = row.checkNoMode;
me.formObj.checkNoStatus = row.checkNoStatus;
if (me.formObj.checkNoStatus == "已完成") {
me.formObj.checkNo = "";
return me.$message.error("该版本已盘点完成");
}
me.formObj.barCode = "";
me.formObj.inventoryCheckList = [];
},
erpStorageLocationSelected(row) {
let me = this;
me.formObj.erpStorageLocation = row.erpStorageLocation;
me.formObj.checkNo = "";
me.formObj.barCode = "";
me.formObj.inventoryCheckList = [];
},
doSearch() {
let me = this;
let checkNo = me.formObj.checkNo;
let erpStorageLocation = me.formObj.erpStorageLocation;
let carrier1 = "";
let carrier2 = "";
let inventoryId = "";
let qtyOnHand = "";
let carrier1New = "";
let handle = "";
let carrier2Number = "";
let inventoryNumber = "";
if (me.formObj.checkNoMode == "托") {
carrier1 = me.formObj.barCode;
if (me.formObj.inventoryCheckList && me.formObj.inventoryCheckList.length > 0) {
for (let i = 0; i < me.formObj.inventoryCheckList.length; i++) {
if (me.formObj.inventoryCheckList[i].carrier1 == carrier1) {
me.formObj.barCode = "";
return me.$message.error("不可重复扫描同一条码");
}
}
}
}
if (me.formObj.checkNoMode == "箱") {
carrier2 = me.formObj.barCode;
if (me.formObj.inventoryCheckList && me.formObj.inventoryCheckList.length > 0) {
for (let i = 0; i < me.formObj.inventoryCheckList.length; i++) {
if (me.formObj.inventoryCheckList[i].carrier2 == carrier2) {
me.formObj.barCode = "";
return me.$message.error("不可重复扫描同一条码");
}
}
}
}
if (me.formObj.checkNoMode == "库存条码") {
inventoryId = me.formObj.barCode;
if (me.formObj.inventoryCheckList && me.formObj.inventoryCheckList.length > 0) {
for (let i = 0; i < me.formObj.inventoryCheckList.length; i++) {
if (me.formObj.inventoryCheckList[i].inventoryId == inventoryId) {
me.formObj.barCode = "";
return me.$message.error("不可重复扫描同一条码");
}
}
}
}
if (isBlank(this.formObj.checkNo)) {
this.$message.warning('请先选择盘点单号');
return false;
}
if (carrier1 == "" && carrier2 == "" && inventoryId == "") {
return me.$message.error("条码不可为空");
}
selectIdCode(checkNo, erpStorageLocation, carrier1, carrier2, inventoryId).then(res => {
if (!me.formObj.inventoryCheckList) {
me.formObj.inventoryCheckList = [];
}
let record = res.data.data;
if (!record.inventoryCheckDetailList || record.inventoryCheckDetailList.length === 0) {
me.formObj.barCode = "";
return me.$message.error("未检索到此条码");
}
if (record.inventoryCheckDetailList && record.inventoryCheckDetailList.length > 0) {
for (let i = 0; i < record.inventoryCheckDetailList.length; i++) {
if (record.inventoryCheckDetailList[i].realQty != null) {
me.$message.error('条码' + me.formObj.barCode + '已盘点');
me.formObj.barCode = "";
return;
}
qtyOnHand = record.inventoryCheckDetailList[i].qtyOnHand;
handle = record.inventoryCheckDetailList[i].handle;
carrier1New = trimHandle(record.inventoryCheckDetailList[i].carrier1Bo);
carrier2Number = record.inventoryCheckDetailList[i].carrier2Number;
inventoryNumber = record.inventoryCheckDetailList[i].inventoryNumber;
me.formObj.item = record.inventoryCheckDetailList[i].item;
me.formObj.itemDesc = record.inventoryCheckDetailList[i].itemDesc;
me.formObj.storageLocation = record.inventoryCheckDetailList[i].storageLocation;
}
let obj = Object.assign({}, {
"carrier1": carrier1,
"carrier2": carrier2,
"carrier1New":carrier1New,
"inventoryId": inventoryId,
"qtyOnHand": qtyOnHand,
"carrier2Number": carrier2Number,
"inventoryNumber": inventoryNumber,
"carrier2NumberNew": carrier2Number,
"inventoryNumberNew": inventoryNumber,
"handle": handle,
"realQty": qtyOnHand,
"isUpdate": "",
});
me.formObj.inventoryCheckList.unshift(obj);
me.formObj.barCode = "";
}
});
},
doUpdate(formName) {
debugger
let me = this;
let list = [];
let reg = /^\d+(?=\.{0,1}\d+$|$)/;
for (let i = 0; i < me.formObj.inventoryCheckList.length; i++) {
if (me.formObj.inventoryCheckList[i].realQty == "" || me.formObj.inventoryCheckList[i].isUpdate == "true") {
continue;
}
if (reg.test(me.formObj.inventoryCheckList[i].realQty) || me.formObj.inventoryCheckList[i].realQty == 0) {
list.push(me.formObj.inventoryCheckList[i]);
me.formObj.inventoryCheckList[i].isUpdate = "true";
} else {
if (me.formObj.checkNoMode == "托") {
setTimeout(() => {
me.$message.error("条码" + me.formObj.inventoryCheckList[i].carrier1 + "的盘点数量应为大于0的数字");
}, 500);
}
if (me.formObj.checkNoMode == "箱") {
setTimeout(() => {
me.$message.error("条码" + me.formObj.inventoryCheckList[i].carrier2 + "的盘点数量应为大于0的数字");
}, 500);
}
if (me.formObj.checkNoMode == "库存条码") {
setTimeout(() => {
me.$message.error("条码" + me.formObj.inventoryCheckList[i].inventoryId + "的盘点数量应为大于0的数字");
}, 500);
}
continue;
}
}
me.formObj.inventoryCheckDetailList = list;
if (!me.formObj.inventoryCheckDetailList || me.formObj.inventoryCheckDetailList.length === 0) {
setTimeout(() => {
return me.$message.error("没有可提交的条码");
}, 500);
}
me.$refs[formName].validate((valid) => {
if (valid) {
showLoading();
putObj(me.formObj).then(respData => {
hideLoading();
this.$message.success('提交成功');
}).catch(error => {
hideLoading();
});
} else {
return false;
}
});
},
removeInventoryCheckDetailDetail(row, index) {
this.formObj.inventoryCheckList.splice(index, 1);
},
doClear() {
let me = this;
me.formObj.site = getStore({name: 'tenantId'});
me.formObj.checkNo = "";
me.formObj.erpStorageLocation = "";
me.formObj.checkNoMode = "";
me.formObj.item = "";
me.formObj.itemDesc = "";
me.f.storageLocation = "";
me.formObj.barCode = "";
me.formObj.inventoryCheckList = [];
}
}
};
</script>
<style>
</style>

View File

@ -0,0 +1,234 @@
<template>
<div class="execution">
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row>
<el-col :span="24">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="条码扫描:" prop="code" class="inputRequired">
<el-input v-model="formObj.code" placeholder="条码扫描" autofocus
@keyup.enter.native="scanCode">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="组条码:" prop="group" class="inputRequired">
<el-input placeHolder="组条码" v-model="formObj.groupId" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="物料号:" prop="item" class="inputRequired">
<el-input placeHolder="物料号" v-model="formObj.item" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="货格号:" prop="storageBin" class="inputRequired">
<el-input placeHolder="货格号" v-model="formObj.storageBin" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已绑数量:" prop="bindQty" class="inputRequired">
<el-input placeHolder="已绑数量" v-model="formObj.bindQty" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已扫数量:" prop="scanQty" class="inputRequired">
<el-input placeHolder="已扫数量" v-model="formObj.scanQty" :disabled="true"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="inventoryList" border :row-style="tableRowClassName">
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column label="库存条码" prop="inventoryId"></el-table-column>
</el-table>
<div style="margin-top: 10px;">
<el-button type="primary" @click="bind">合组</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
</basic-container>
</div>
</template>
<script>
import {scanCode, bindGroup} from '@/api/wms/inventory-group';
import {isBlank} from "@/util/string";
import {getStore} from '@/util/store';
import {add} from '@/util/bigNumber';
import {showLoading, hideLoading} from '@/const/loading';
import {listByActivityId} from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex';
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
site: getStore({name: 'tenantId'}),
formObj: {},
initData: {
bindQty: 0,
scanQty: 0
},
inventoryList: []
};
},
created() {
this.doClear();
},
beforeRouteEnter(to, from, next) {
next(vm => {
try {
//获取作业规则
let me = vm;
let activityId = me.$route.query.ACTIVITY_ID;
listByActivityId(activityId).then(response => {
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
let data = response.data.data;
if (data && data.length > 0) {
for (let i = 0; i < data.length; i++) {
if (data[i].optionName && data[i].optionName.toUpperCase() === "PRINTER_X") {
me.printer = data[i].optionValue;
}
}
}
}).catch(e => {
console.log(e);
});
} catch (e) {
console.log(e);
}
});
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.inventoryList = [];
},
scanCode() {
let me = this;
let code = me.formObj.code;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
} else if (me.inventoryList.findIndex(o => o.inventoryId === code) >= 0) {
me.formObj.code = '';
return me.$message.error('条码已扫描');
} else {
showLoading();
scanCode({
code: code
}).then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
}
me.formObj.code = '';
let data = res.data.data;
let firstData = data[0];
if (firstData.groupId) {
if (me.formObj.groupId) {
return me.$message.error('已存在组号,请拆组后再进行合组');
} else {
me.formObj.groupId = firstData.groupId;
}
}
if (!(isBlank(me.formObj.item) || isBlank(me.formObj.storageBin)) && (me.formObj.item !== firstData.item || me.formObj.storageBin !== firstData.storageBin)) {
if (firstData.scanType === 'GROUP') {
return me.$message.error('组条码' + code + '的物料或货格与界面信息不符');
} else {
return me.$message.error('库存条码' + code + '的物料或货格与界面信息不符');
}
}
if (me.inventoryList.length > 0 && !me.inventoryList.some(o => o.status === firstData.status)) {
return me.$message.error('库存条码' + code + '状态与已有条码不同');
}
me.formObj.item = firstData.item;
me.formObj.storageBin = firstData.storageBin;
me.formObj.bindQty = data.length;
me.formObj.scanQty = add(me.formObj.scanQty, isBlank(firstData.groupId) ? 1 : 0);
me.inventoryList = me.inventoryList.concat(data);
}).catch(e => hideLoading());
}
},
bind() {
let me = this;
let bindList = me.inventoryList.filter(o => isBlank(o.groupId));
if (bindList.length <= 0) {
return me.$message.error('无需合组的信息,请确认');
} else {
showLoading();
bindGroup({
printer: me.printer,
groupId: me.formObj.groupId,
list: bindList
}).then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
}
me.doClear();
return me.$message.success("合组成功");
}).catch(e => hideLoading());
}
},
tableRowClassName({row, rowIndex}) {
if (isBlank(row.groupId)) {
return {backgroundColor: "#00f916"};
}
return '';
},
},
};
</script>
<style scoped lang="scss">
.inputRequired ::v-deep .el-form-item__label::before {
content: "*";
width: 10px;
height: 20px;
display: inline-block;
vertical-align: middle;
text-align: center;
line-height: 26px;
font-size: large;
color: #f00;
}
// 去掉hover效果
::v-deep .el-table tbody tr:hover > td {
background-color: transparent !important;
}
</style>

View File

@ -0,0 +1,209 @@
<template>
<div class="execution">
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row>
<el-col :span="24">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="条码扫描:" prop="code" class="inputRequired">
<el-input v-model="formObj.code" placeholder="条码扫描" autofocus
@keyup.enter.native="scanCode">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="组条码:" prop="group" class="inputRequired">
<el-input placeHolder="组条码" v-model="formObj.groupId" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="物料号:" prop="item" class="inputRequired">
<el-input placeHolder="物料号" v-model="formObj.item" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="货格号:" prop="storageBin" class="inputRequired">
<el-input placeHolder="货格号" v-model="formObj.storageBin" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已绑数量:" prop="bindQty" class="inputRequired">
<el-input placeHolder="已绑数量" v-model="formObj.bindQty" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已扫数量:" prop="scanQty" class="inputRequired">
<el-input placeHolder="已扫数量" v-model="formObj.scanQty" :disabled="true"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="inventoryList" border :row-style="tableRowClassName">
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column label="库存条码" prop="inventoryId"></el-table-column>
</el-table>
<div style="margin-top: 10px;">
<el-button type="primary" @click="unBind">拆组</el-button>
<el-button type="primary" @click="unBindAll" :disabled="inventoryList.length === 0">全选</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
</basic-container>
</div>
</template>
<script>
import {scanCode, unBindGroup} from '@/api/wms/inventory-group';
import {isBlank} from "@/util/string";
import {getStore} from '@/util/store';
import {showLoading, hideLoading} from '@/const/loading';
import {listByActivityId} from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex';
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
site: getStore({name: 'tenantId'}),
formObj: {},
initData: {
bindQty: 0,
scanQty: 0
},
inventoryList: []
};
},
created() {
this.doClear();
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.inventoryList = [];
},
scanCode() {
let me = this;
let code = me.formObj.code;
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
return;
} else if (me.inventoryList.findIndex(o =>o.inventoryId === code && isBlank(o.groupId)) >= 0) {
me.formObj.code = '';
return me.$message.error('条码已扫描');
} else {
showLoading();
scanCode({
code: code
}).then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
} else {
me.formObj.code = '';
let data = res.data.data;
let firstData = data[0];
if (firstData.groupId) {
if (me.formObj.groupId) {
if (firstData.scanType === 'GROUP') {
return me.$message.error('已存在待拆组的信息,请确认');
}
} else {
me.formObj.groupId = firstData.groupId;
me.formObj.bindQty = data.length;
me.formObj.item = firstData.item;
me.formObj.storageBin = firstData.storageBin;
me.inventoryList = data;
}
if (firstData.scanType !== 'GROUP') {
let row = me.inventoryList.find(o => o.inventoryId === code);
if (row) {
me.$set(row, "groupId", "");
me.formObj.scanQty += 1;
} else {
return me.$message.error('库存条码' + code + '不属于组' + me.formObj.groupId + ',不允许拆组');
}
}
} else {
return me.$message.error('库存条码' + firstData.inventoryId + '无组,不允许拆批');
}
}
}).catch(e => hideLoading());
}
},
unBind() {
let me = this;
let unBindList = me.inventoryList.filter(o => isBlank(o.groupId)).map(o => o.inventoryId);
if (unBindList.length <= 0) {
return me.$message.error('无需拆组的信息,请确认');
} else {
showLoading();
unBindGroup(unBindList).then(res => {
hideLoading();
if (res.data.code !== 0) {
return me.$message.error(res.data.msg);
}
me.doClear();
return me.$message.success("拆组成功");
}).catch(e => hideLoading());
}
},
unBindAll() {
let me = this;
me.inventoryList.forEach(o => o.groupId = '');
me.formObj.scanQty = me.inventoryList.length;
},
tableRowClassName({row, rowIndex}) {
if (isBlank(row.groupId)) {
return {backgroundColor: "#eb0030"};
}
return null;
},
},
};
</script>
<style scoped lang="scss">
.inputRequired ::v-deep .el-form-item__label::before {
content: "*";
width: 10px;
height: 20px;
display: inline-block;
vertical-align: middle;
text-align: center;
line-height: 26px;
font-size: large;
color: #f00;
}
// 去掉hover效果
::v-deep .el-table tbody tr:hover > td {
background-color: transparent !important;
}
</style>

View File

@ -0,0 +1,267 @@
<template>
<div class="execution">
<input-select-dialog :modal-obj='inventoryDialogObj' :modal-fetch-fun='inventoryDialogFetchFun'
:modal-show.sync="inventoryDialogVisible" @inputDialogSelected="inventorySelect">
</input-select-dialog>
<basic-container>
<el-form ref="formObj" :rules="rules" :model="formObj" label-width="auto">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="formObj.site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-form-item label="条码:" prop="carrier">
<el-input placeHolder="选择条码" v-model="formObj.carrier"
@keyup.enter.native="doSearch(formObj.carrier)" :clearable="true">
<i slot="suffix" class="el-input__icon el-icon-search"
@click.stop="showInventoryDialog"></i>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-table :data="formObj.itemList">
<el-table-column label="库存条码" prop="inventoryId">
</el-table-column>
<el-table-column label="物料号" prop="item">
</el-table-column>
<el-table-column label="库存数量" prop="qtyOnHand">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="danger" @click="rowDelete(scope.$index, scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<div style="margin-top: 10px;">
<el-button v-if="wms_inventory_save" type="warning" @click="lock('formObj')">冻结</el-button>
<el-button v-if="wms_inventory_save" type="primary" @click="unLock('formObj')">解冻</el-button>
<el-button type="primary" @click="doClear">清除</el-button>
</div>
</basic-container>
</div>
</template>
<script>
import {fetchList as fetchinventoryList} from "@/api/wms/inventory";
import {getInventoryList, freeze, unfreeze} from "@/api/wms/inventory-lock";
import {hideLoading, showLoading} from '@/const/loading';
import {getStore} from '@/util/store';
import {
mapGetters
} from 'vuex';
export default {
data() {
return {
formObj: {},
codeList: [],
invList: [],
wms_inventory_save: false,
rules: {
carrier: [
{required: true, message: '条码不可为空'}
],
},
initData: {
site: getStore({name: 'tenantId'}),
carrier: "",
itemList: [],
},
inventoryDialogVisible: false,
inventoryDialogFetchFun: fetchinventoryList,
inventoryDialogObj: {
"condition": "inventory",
tableColumn: [
{prop: "inventoryId", label: "库存ID"},
{prop: "qtyOnHand", label: "数量"},
{
prop: "status", label: "状态", formatter: (row, column, cellValue, index) => {
if (cellValue == "1001") {
return "可用";
}
if (cellValue == "1002") {
return "保留";
}
if (cellValue == "1003") {
return "隔离";
}
if (cellValue == "1004") {
return "待检";
}
if (cellValue == "1005") {
return "冻结";
}
}
}
]
},
};
},
created() {
this.wms_inventory_save = this.permissions['wms_inventory_save'];
this.formObj = Object.assign({}, this.initData);
this.invList = [];
this.codeList = [];
},
computed: {
...mapGetters(['permissions']),
permissionList() {
return {};
}
},
methods: {
FormatInventoryStatus(row, column, cellValue, index) {
return "test";
},
//展示库存
showInventoryDialog() {
let me = this;
me.inventoryDialogVisible = true;
},
inventorySelect(row) {
let me = this;
me.formObj.carrier = row.inventoryId;
me.getInventoryList();
},
//扫描托条码
doSearch() {
let me = this;
if (me.formObj.itemList.length > 0) {
for (let i = 0; i < me.codeList.length; i++) {
if (me.codeList[i].code === me.formObj.carrier) {
me.$message.error("不可重复扫描");
return;
}
}
me.getInventoryList();
} else {
me.getInventoryList();
}
},
//冻结
lock() {
let me = this;
if (me.formObj.itemList.length > 0) {
me.$prompt('请输入冻结原因', '冻结', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(({value}) => {
let objList = [];
for (let i = 0; i < me.formObj.itemList.length; i++) {
objList.push({
"inventoryId": me.formObj.itemList[i].inventoryId,
"comments": value
});
}
showLoading();
freeze(objList).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("冻结成功");
me.doClear();
}
}).catch(() => {
hideLoading();
});
}).catch(() => {
hideLoading();
});
} else {
me.$message.error("没有需要冻结的库存");
}
},
//解冻
unLock() {
let me = this;
if (me.formObj.itemList.length > 0) {
me.$prompt('请输入解冻原因', '解冻', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(({value}) => {
let objList = [];
for (let i = 0; i < me.formObj.itemList.length; i++) {
objList.push({
"inventoryId": me.formObj.itemList[i].inventoryId,
"comments": value
});
}
showLoading();
unfreeze(objList).then(res => {
hideLoading();
if (res.data.code == 0) {
me.$message.success("解冻成功");
me.doClear();
}
}).catch(() => {
hideLoading();
});
}).catch(() => {
hideLoading();
});
} else {
me.$message.error("没有需要解冻的库存");
}
},
getInventoryList() {
let me = this;
me.$refs['formObj'].validateField(["carrier"], (valid) => {
if (valid) {
return false;
} else {
getInventoryList(me.formObj.carrier).then(res => {
for (let i = 0; i < res.data.data.length; i++) {
for (let j = 0; j < me.formObj.itemList.length; j++) {
if (me.formObj.itemList[j].inventoryId === res.data.data[i].inventoryId) {
res.data.data.splice(res.data.data[i], 1);
}
}
let obj = Object.assign({},
{
"inventoryId": res.data.data[i].inventoryId,
"item": res.data.data[i].item,
"qtyOnHand": res.data.data[i].qtyOnHand
});
me.formObj.itemList.push(obj);
}
me.codeList.push({"code": me.formObj.carrier});
});
}
});
},
rowDelete(index, row) {
let me = this;
me.formObj.itemList.splice(index, 1);
},
doClear() {
this.formObj = Object.assign({}, this.initData);
this.formObj.itemList = [];
this.$refs['formObj'].resetFields();
}
}
};
</script>

View File

@ -0,0 +1,196 @@
<template>
<div class="execution">
<basic-container>
<el-form ref="formObj" :model="formObj" label-width="auto">
<el-row>
<el-col :span="24">
<el-form-item label="站点:" prop="site">
<el-input placeHolder="站点" v-model="site" :disabled="true"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="条码扫描:" prop="code" class="inputRequired">
<el-input v-model="formObj.code" autofocus
@keyup.enter.native="scanCode" :disabled="codeDisabled">
<i slot="suffix" class="el-input__icon el-icon-full-screen"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合批后条码:" prop="inventoryId">
<el-input v-model="formObj.inventoryId" :disabled="!codeDisabled" :readonly="codeDisabled"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="汇总数量:" prop="qty">
<el-input type="number" v-model="formObj.qty" :disabled="true"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table :data="inventoryList" border>
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column label="条码" prop="inventoryId"></el-table-column>
<el-table-column label="数量" prop="qtyOnHand"></el-table-column>
</el-table>
<div style="margin-top: 10px;">
<el-button type="primary" @click="doMerge">合批执行</el-button>
<el-button type="warning" @click="doClear">清除</el-button>
</div>
</basic-container>
</div>
</template>
<script>
import {selectForSplit, mergeInventory} from '@/api/wms/inventory';
import {isBlank} from "@/util/string";
import {add, mul} from "@/util/number";
import {getStore} from '@/util/store';
import {showLoading, hideLoading} from '@/const/loading';
import {listByActivityId} from "@/api/admin/activity-option";
import {
mapGetters
} from 'vuex';
export default {
data() {
return {
lableWidth: {
'width': '150px'
},
site: getStore({name: 'tenantId'}),
formObj: {},
initData: {
qty: 0,
},
inventoryList: [],
codeDisabled: false
};
},
created() {
this.doClear();
},
beforeRouteEnter(to, from, next) {
next(vm => {
try {
//获取作业规则
let me = vm;
let activityId = me.$route.query.ACTIVITY_ID;
listByActivityId(activityId).then(response => {
if (response.data.code != 0) {
return me.$message.error(response.data.msg);
}
let data = response.data.data;
if (data && data.length > 0) {
for (let i = 0; i < data.length; i++) {
if (data[i].optionName && data[i].optionName.toUpperCase() === "PRINTER_D") {
me.printer = data[i].optionValue;
}
}
}
}).catch(e => {
console.log(e);
});
} catch (e) {
console.log(e);
}
});
},
computed: {
...mapGetters(["permissions"]),
permissionList() {
return {};
}
},
methods: {
//清除页面信息
doClear() {
this.formObj = Object.assign({}, this.initData);
this.inventoryList = [];
this.codeDisabled = false;
},
scanCode() {
let me = this;
let code = me.formObj.code;
me.formObj.inventoryId = "";
if (isBlank(code)) {
me.$message.error("不可扫描空条码");
} else if (me.inventoryList.findIndex(o => o.inventoryId === code) >= 0) {
me.formObj.code = '';
me.$message.error('条码已扫描');
} else {
showLoading();
selectForSplit({
inventoryId: code
}).then(res => {
hideLoading();
me.formObj.code = '';
let data = res.data.data;
if (me.inventoryList.length > 0) {
let firstData = me.inventoryList[0];
if (data.item !== firstData.item) {
return me.$message.error("物料不一致,请确认");
} else if (data.batchNo !== firstData.batchNo) {
return me.$message.error("批次不一致,请确认");
} else if (data.status !== firstData.status) {
return me.$message.error("状态不一致,请确认");
} else if (data.storageBinBo !== firstData.storageBinBo) {
return me.$message.error("存储区域不一致,请确认");
} else if (data.delayTime !== firstData.delayTime) {
return me.$message.error("推迟日期不一致,请确认");
} else if (data.qmsSpecialMarking !== firstData.qmsSpecialMarking) {
return me.$message.error("检验特殊标记不一致,请确认");
}
}
me.formObj.qty = add(me.formObj.qty, data.qtyOnHand);
me.inventoryList.push(data);
}).catch(e => hideLoading());
}
},
doMerge() {
let me = this;
if (me.inventoryList.length > 1) {
showLoading();
mergeInventory({
printer: me.printer,
inventoryIdList: me.inventoryList.map(o => o.inventoryId)
}).then(res => {
hideLoading();
let data = res.data.data;
me.codeDisabled = true;
me.$set(me.formObj, "inventoryId", data);
me.$message.success("合批成功");
}).catch(e => hideLoading());
} else {
me.$message.error("合批条码个数不足");
}
}
},
};
</script>
<style scoped lang="scss">
.inputRequired ::v-deep .el-form-item__label::before {
content: "*";
width: 10px;
height: 20px;
display: inline-block;
vertical-align: middle;
text-align: center;
line-height: 26px;
font-size: large;
color: #f00;
}
</style>

Some files were not shown because too many files have changed in this diff Show More