diff --git a/ant-design-vue-jeecg/src/api/api.js b/ant-design-vue-jeecg/src/api/api.js index 6a776c2..0ef7d5d 100644 --- a/ant-design-vue-jeecg/src/api/api.js +++ b/ant-design-vue-jeecg/src/api/api.js @@ -221,6 +221,8 @@ export const getAllWarehouseList = (params) => getAction("/config/warehouse/getA export const getAllZoneList = (params) => getAction("/config/zone/getAllZoneList", params); //批量快速出整托 export const shipmentInventoryHeader = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryHeader', params); +//批量快速出库存详情 +export const shipmentInventoryDetail = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryDetail', params); // 中转HTTP请求 export const transitRESTful = { get: (url, parameter) => getAction(getTransitURL(url), parameter), diff --git a/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue b/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue index b2773b1..a2ca599 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue @@ -299,9 +299,14 @@ export default { scopedSlots: {customRender: 'inventoryStatus_dictText'} }, { - title: '数量', + title: '入库数量', align: "center", - dataIndex: 'qty' + dataIndex: 'receiptQty' + }, + { + title: '出库数量', + align: "center", + dataIndex: 'shipmentQty' }, { title: '库存数量', diff --git a/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue b/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue index e1859f6..02b50ec 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue @@ -138,6 +138,7 @@ </a-upload> <a-button v-has="'inventoryDetail:controller'" @click='controller()' type='primary'>冻结</a-button> <a-button v-has="'inventoryDetail:releaseController'" @click='releaseController()' type='primary'>释放冻结</a-button> + <a-button v-has="'inventoryHeader:quickShipmentInventoryHeader'" @click='quickShipment()' type='primary'>快速出库</a-button> <!-- 高级查询区域 --> <j-super-query :fieldList="superFieldList" @@ -225,6 +226,7 @@ </div> <simple-inventory-detail-modal ref="modalForm" @ok="modalFormOk"></simple-inventory-detail-modal> + <QuickShipmentDetailModel ref='quickShipmentModel' @ok='quickShipmentModalFormOk'></QuickShipmentDetailModel> </a-card> </template> @@ -236,11 +238,13 @@ import SimpleInventoryDetailModal from './modules/SimpleInventoryDetailModal' import {filterMultiDictText} from '@/components/dict/JDictSelectUtil' import {getCompanyList, getZoneList, } from "@api/api"; import {postAction} from '@/api/manage' +import QuickShipmentDetailModel from "@views/system/shipment/modules/QuickShipmentDetailModal"; export default { name: 'InventoryDetailList', mixins: [JeecgListMixin, mixinDevice], components: { + QuickShipmentDetailModel, SimpleInventoryDetailModal }, data() { @@ -392,7 +396,8 @@ export default { releaseController: 'inventory/inventoryHeader/releaseController', }, dictOptions: {}, - superFieldList: [] + superFieldList: [], + selectRecord:[], } }, created() { @@ -491,22 +496,22 @@ export default { }) } }, + onSelectChange(selectedRowKeys, selectionRows) { + this.selectedMainId = selectedRowKeys[0].toString(); + this.selectedRowKeys = selectedRowKeys; + this.selectRecord = selectionRows; + }, quickShipment() { if (this.selectedRowKeys.length <= 0) { this.$message.warning('请选择一条记录!'); } else { - let zoneCodes = this.selectRecord.map(row => row.zoneCode) + let zoneCodes = this.selectRecord.map(row => row.zoneCode); if (new Set(zoneCodes).size !== 1) { this.$message.warning('所选数据非同库区'); return; } - if ('D' !== this.selectRecord[0].zoneCode){ - this.$refs.quickShipmentModel.model.containerCode = this.selectRecord[0].containerCode; - this.$refs.quickShipmentModel.edit(); - this.$refs.quickShipmentModel.title = '选择出库口'; - }else { - this.quickShipmentModalFormOk(null) - } + this.$refs.quickShipmentModel.edit(this.selectRecord); + this.$refs.quickShipmentModel.title = '选择出库口'; } }, solutionCompany(value) { diff --git a/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue b/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue index 4daced1..c9efb9e 100644 --- a/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue @@ -72,7 +72,7 @@ <a-upload v-has="'receiptContainerHeader:import'" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel"> <a-button type="primary" icon="import">导入</a-button> </a-upload> - <a-button v-has="'receiptContainerHeader:add'" @click="createBatchTask" type="primary" >批量生成任务</a-button> + <a-button v-has="'receiptContainerHeader:createTask'" @click="createBatchTask" type="primary" >批量生成任务</a-button> <a-button v-has="'receiptContainerHeader:delete'" @click="cancelBatchTask" type="primary" >批量取消组盘</a-button> </div> @@ -117,12 +117,12 @@ size="small" @click="downloadFile(text)">下载 </a-button> - </template> + </template>selectPort <span slot="action" slot-scope="text, record"> - <a v-if="record.status == 0 && record.taskType == 200" @click="selectPort(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button><a-divider type="vertical"/></a> - <a v-else-if="record.status == 0" @click="selectContainerStatus(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button><a-divider type="vertical"/></a> -<!-- <a v-if="record.status == 0 && record.taskType == 200" @click="selectPort(record)" v-has="'receiptContainerHeader:createTask'">生成任务<a-divider type="vertical"/></a>--> -<!-- <a v-else-if="record.status == 0" @click="createTask(record)" v-has="'receiptContainerHeader:createTask'">生成任务<a-divider type="vertical"/></a>--> +<!-- <a v-if="record.status == 0 && record.taskType == 200" @click="selectFillPort(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button><a-divider type="vertical"/></a>--> +<!-- <a v-else-if="record.status == 0" @click="selectContainerStatus(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button><a-divider type="vertical"/></a>--> + <a v-if="record.status == 0 && record.taskType == 200" @click="selectPort(record)" v-has="'receiptContainerHeader:createTask'">生成任务<a-divider type="vertical"/></a> + <a v-else-if="record.status == 0" @click="createTask(record)" v-has="'receiptContainerHeader:createTask'">生成任务<a-divider type="vertical"/></a> <a-popconfirm v-if="record.status == 0" v-has="'receiptContainerHeader:delete'" title="确定取消配盘吗?" @confirm="() => handleDelete(record.id)"> <a><a-button type="danger">取消配盘</a-button> <a-divider type="vertical"/></a> </a-popconfirm> diff --git a/ant-design-vue-jeecg/src/views/system/shipment/modules/QuickShipmentDetailModal.vue b/ant-design-vue-jeecg/src/views/system/shipment/modules/QuickShipmentDetailModal.vue new file mode 100644 index 0000000..410dcce --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/shipment/modules/QuickShipmentDetailModal.vue @@ -0,0 +1,111 @@ +<template> + <j-modal + :title="title" + :width="width" + :visible="visible" + :confirmLoading="confirmLoading" + switchFullscreen + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭" + > + <a-spin :spinning="confirmLoading"> + <a-form-model ref="form" :model="model" :rules="validatorRules"> + <a-row> + <a-col :span="24"> + <a-form-model-item label="出库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="outPortCode"> + <a-select show-search placeholder="请选择出库口" option-filter-prop="children" v-model="model.outPortCode"> + <a-select-option v-for="item in portList" :key="item.name" :value="item.code"> + {{ item.name }} + </a-select-option> + </a-select> + </a-form-model-item> + </a-col> + </a-row> + </a-form-model> + </a-spin> + </j-modal> +</template> + +<script> +import {getZoneList, selectOutPort, shipmentInventoryDetail} from '@/api/api' + +export default { + name: 'QuickShipmentDetailModel', + components: { }, + data() { + return { + title: '操作', + width: 400, + portList: [], + inventoryDetailList: [], + querySource: {}, + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 } + }, + // 选择用户查询条件配置 + selectUserQueryConfig: [], + confirmLoading: false, + validatorRules: { + outPortCode: [{ required: true, message: '请选择出库口!' }] + } + } + }, + created() { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + }, + methods: { + add() { + this.edit(this.modelDefault) + }, + edit(record) { + this.visible = true; + this.model.containerCode = record[0].containerCode; + this.inventoryDetailList = record; + this.getPortList(); + }, + close() { + this.$emit('close') + this.visible = false + this.$refs.form.clearValidate() + }, + getPortList() { + this.querySource.containerCode = this.model.containerCode + selectOutPort(this.querySource).then(res => { + if (res.success) { + this.portList = res.result; + this.visible = true; + } + }) + }, + handleOk() { + if (this.model.outPortCode === ''){ + this.$message.warning('请选择出库口'); + } + this.inventoryDetailList.forEach(x=>{ + x["toPortCode"]=this.model.outPortCode; + }) + shipmentInventoryDetail(this.inventoryDetailList).then((res) => { + if (res.success) { + this.$message.success(res.message); + } else { + this.$message.error(res.message); + } + }); + this.$emit("ok", this.model.outPortCode); + this.close() + }, + handleCancel() { + this.close() + } + } +} +</script> \ No newline at end of file diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java index e401ec9..e851d8b 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java @@ -27,7 +27,10 @@ public interface IInventoryDetailService extends IService<InventoryDetail> { List<InventoryDetail> getInventoryDetailListByContainerCode(String containerCode, String warehouseCode); - // 求一种物料的库存之和 + // 求一种物料的库存之和(总数) + BigDecimal getInventorySumQty(InventoryDetail inventoryDetail); + + // 求一种物料的库存之和(扣除了配盘数量) BigDecimal getSumQty(InventoryDetail inventoryDetail); // 求一种物料的可出库存之和 diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java index 50669d0..e183b14 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java @@ -89,6 +89,23 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe } @Override + public BigDecimal getInventorySumQty(InventoryDetail inventoryDetail) { + LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); + inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getInventoryStatus, inventoryDetail.getInventoryStatus()) + .eq(InventoryDetail::getMaterialCode, inventoryDetail.getMaterialCode()).eq(InventoryDetail::getWarehouseCode, inventoryDetail.getWarehouseCode()) + .eq(StringUtils.isNotEmpty(inventoryDetail.getBatch()), InventoryDetail::getBatch, inventoryDetail.getBatch()) + .eq(StringUtils.isNotEmpty(inventoryDetail.getLot()), InventoryDetail::getLot, inventoryDetail.getLot()) + .eq(StringUtils.isNotEmpty(inventoryDetail.getProject()), InventoryDetail::getProject, inventoryDetail.getLot()) + .eq(InventoryDetail::getCompanyCode, inventoryDetail.getCompanyCode()); + List<InventoryDetail> inventoryDetailList = list(inventoryDetailLambdaQueryWrapper); + if (inventoryDetailList.size() == 0) { + return BigDecimal.ZERO; + } + BigDecimal totalQty = inventoryDetailList.stream().map(InventoryDetail::getQty).reduce(BigDecimal.ZERO, BigDecimal::add); + return totalQty; + } + + @Override public BigDecimal getSumQty(InventoryDetail inventoryDetail) { LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getInventoryStatus, inventoryDetail.getInventoryStatus()) diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryHeaderServiceImpl.java index 8312005..bd117a6 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryHeaderServiceImpl.java @@ -168,6 +168,7 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe if (StringUtils.isEmpty(toPortCode)) { return Result.error("批量快速出库,出库站台编码为空"); } + String companyCode = inventoryHeaderList.get(0).getCompanyCode(); List<InventoryHeader> shipmentInventoryHeaderList = inventoryHeaderList.stream().filter((item) -> item.getContainerStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)).collect(Collectors.toList()); if (StringUtils.isEmpty(shipmentInventoryHeaderList)) { @@ -178,9 +179,9 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe if (StringUtils.isEmpty(inventoryDetails)) { return Result.error("批量快速出库, 排除锁定库存后没有可出库存详情"); } - ShipmentHeader shipmentHeader = new ShipmentHeader(); shipmentHeader.setWarehouseCode(warehouseCode); + shipmentHeader.setCompanyCode(companyCode); shipmentHeader.setType(QuantityConstant.SHIPMENT_BILL_TYPE_QTC); shipmentHeader.setRemark("快速出库"); Result result = shipmentHeaderService.saveShipmentHeader(shipmentHeader); @@ -263,9 +264,10 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe if (StringUtils.isEmpty(inventoryDetailList)) { return Result.error("批量快速出库, 排除锁定库存后没有可出库存详情"); } - + String companyCode = inventoryDetailList.get(0).getCompanyCode(); ShipmentHeader shipmentHeader = new ShipmentHeader(); shipmentHeader.setWarehouseCode(warehouseCode); + shipmentHeader.setCompanyCode(companyCode); shipmentHeader.setType(QuantityConstant.SHIPMENT_BILL_TYPE_QTC); shipmentHeader.setRemark("快速出库"); Result result = shipmentHeaderService.saveShipmentHeader(shipmentHeader); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java index 013f8cc..ae015b9 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java @@ -1142,7 +1142,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea inventoryTransaction.setQty(receiptQty); inventoryTransaction.setReceiptQty(receiptQty); // 获得库存数量 - BigDecimal inventoryQty = inventoryDetailService.getSumQty(inventoryDetail); + BigDecimal inventoryQty = inventoryDetailService.getInventorySumQty(inventoryDetail); inventoryQty = inventoryQty.add(receiptQty); inventoryTransaction.setInventoryQty(inventoryQty); inventoryTransactionList.add(inventoryTransaction); @@ -1317,6 +1317,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea inventoryTransaction.setContainerCode(containerCode); inventoryTransaction.setZoneCode(zoneCode); inventoryTransaction.setFromLocationCode(fromLocationCode); + inventoryTransaction.setToLocationCode(toLocationCode); inventoryTransaction.setMaterialCode(inventoryDetail.getMaterialCode()); inventoryTransaction.setMaterialName(inventoryDetail.getMaterialName()); inventoryTransaction.setMaterialSpec(inventoryDetail.getMaterialSpec()); @@ -1332,7 +1333,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea inventoryTransaction.setProject(inventoryDetail.getProject()); inventoryTransaction.setQty(taskDetail.getQty()); inventoryTransaction.setShipmentQty(taskDetail.getQty()); - BigDecimal inventoryQty = inventoryDetailService.getSumQty(inventoryDetail); + BigDecimal inventoryQty = inventoryDetailService.getInventorySumQty(inventoryDetail); inventoryTransaction.setInventoryQty(inventoryQty); inventoryTransactionList.add(inventoryTransaction); shipmentIdList.add(taskDetail.getShipmentId()); @@ -1353,6 +1354,17 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (!success) { throw new JeecgBootException("完成出库任务,更新库存头失败"); } + List<InventoryDetail> updateInventoryDetailList = new ArrayList<>(); + for (InventoryDetail inventoryDetail : inventoryDetailList) { + InventoryDetail inventoryDetail1 = new InventoryDetail(); + inventoryDetail1.setId(inventoryDetail.getId()); + inventoryDetail1.setLocationCode(toLocationCode); + updateInventoryDetailList.add(inventoryDetail1); + } + success = inventoryDetailService.updateBatchLocationCodeById(updateInventoryDetailList); + if (!success) { + throw new JeecgBootException("完成出库任务,更新库存详情失败"); + } } success = inventoryTransactionService.saveBatch(inventoryTransactionList); if (!success) {