diff --git a/ant-design-vue-jeecg/src/api/api.js b/ant-design-vue-jeecg/src/api/api.js index c9965dc..048c6a7 100644 --- a/ant-design-vue-jeecg/src/api/api.js +++ b/ant-design-vue-jeecg/src/api/api.js @@ -277,6 +277,10 @@ export const getDocumentAduitFlow = (params) => getAction('/config/parameterConf export const flatQuickReceipt = (params) => postAction('/receipt/receiveHeader/flatQuickReceipt', params) //快速入库 export const quickReceipt = (params) => postAction('/task/taskHeader/quickReceipt', params) +//悬臂库入库 +export const cantaleverReceipt = (params) => postAction('/task/taskHeader/cantaleverReceipt', params) +//快速入库 +export const stageingReceipt = (params) => postAction('/task/taskHeader/stageingReceipt', params) //快速出库,批量快速出整托 export const shipmentInventoryHeader = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryHeader', params) //快速出库,批量快速出库存详情 diff --git a/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue b/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue index 8e99b6e..e6794af 100644 --- a/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/AllTaskHeaderList.vue @@ -91,9 +91,12 @@ <a-button v-has="'taskHeader:emptyIn'" @click="createEmptyIn()" type="primary">空托入库</a-button> <a-button v-has="'taskHeader:manyEmptyIn'" @click="createManyEmptyIn()" type="primary">空托组入库</a-button> <a-button v-has="'taskHeader:quickReceipt'" @click="quickReceipt()" type="primary">快速入库</a-button> + <a-button v-has="'taskHeader:quickReceipt'" @click="stageingReceipt()" type="primary">暂存区入库</a-button> + <a-button v-has="'taskHeader:quickReceipt'" @click="cantaleverReceipt()" type="primary">悬臂库入库</a-button> <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptBox()" type="primary" >呼叫入库有货托盘</a-button> <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptEmptyBox()" type="primary" >呼叫入库空托盘</a-button> <a-button v-has="'taskHeader:emptyOut'" @click="createEmptyOut()" type="primary">空托出库</a-button> + <a-button v-has="'taskHeader:quickShipment'" @click="quickShipment()" type="primary">快速出库</a-button> <a-button v-has="'taskHeader:manyEmptyOut'" @click="batchCreateEmptyOut()" type="primary">批量空托出库</a-button> <a-button v-has="'taskHeader:manyEmptyOut'" @click="createManyEmptyOut()" type="primary">空托组出库</a-button> <a-button v-has="'taskHeader:callShipmentBox'" @click="callShipmentBox()" type="primary" >呼叫出库托盘</a-button> @@ -193,6 +196,8 @@ <empty-in-task-modal ref="emptyInModal" @ok="modalFormOk"></empty-in-task-modal> <many-empty-in-task-modal ref="manyEmptyInModal" @ok="modalFormOk"></many-empty-in-task-modal> <MaterialTaskModal ref="materialTaskModal" @ok="modalFormOk"></MaterialTaskModal> + <CantaleverTaskModal ref="cantaleverTaskModal" @ok="modalFormOk"></CantaleverTaskModal> + <call-receipt-box-modal ref="modalForm5" @ok="modalFormOk"></call-receipt-box-modal> <call-receipt-empty-box-modal ref="modalForm6" @ok="modalFormOk"></call-receipt-empty-box-modal> @@ -203,6 +208,8 @@ <check-out-task-modal ref="checkOutModal" @ok="modalFormOk"></check-out-task-modal> <transfer-task-modal ref="transferModal" @ok="modalFormOk"></transfer-task-modal> <over-station-task-modal ref="overStationModal" @ok="modalFormOk"></over-station-task-modal> + <StageingReceiptModal ref="stageingReceiptModal" @ok="modalFormOk"></StageingReceiptModal> + <shipment-material-modal ref="shipmentMaterialModal" @ok="modalFormOk"></shipment-material-modal> </a-card> </template> @@ -231,11 +238,17 @@ import ManyEmptyOutTaskModal from "@views/system/task/modules/ManyEmptyOutTaskMo import CheckOutTaskModal from "@views/system/task/modules/CheckOutTaskModal.vue"; import TransferTaskModal from "@views/system/task/modules/TransferTaskModal.vue"; import OverStationTaskModal from "@views/system/task/modules/OverStationTaskModal.vue"; +import StageingReceiptModal from "@views/system/task/modules/StageingReceiptModal.vue"; +import ShipmentMaterialModal from "@views/system/task/modules/ShipmentMaterialModal.vue"; +import CantaleverTaskModal from "@views/system/task/modules/CantaleverTaskModal.vue"; export default { name: "AllTaskHeaderList", mixins: [JeecgListMixin], components: { + CantaleverTaskModal, + ShipmentMaterialModal, + StageingReceiptModal, OverStationTaskModal, TransferTaskModal, CheckOutTaskModal, ManyEmptyOutTaskModal, EmptyOutTaskModal, CallShipmentBoxModal, BatchEmptyOutTaskModal, @@ -512,6 +525,14 @@ export default { this.selectedRowKeys = selectedRowKeys; this.selectionRows = selectionRows; }, + quickShipment(){ + this.$refs.shipmentMaterialModal.edit(); + this.$refs.shipmentMaterialModal.title = "快速出库"; + }, + stageingReceipt(){ + this.$refs.stageingReceiptModal.edit(); + this.$refs.stageingReceiptModal.title = "暂存区入库"; + }, loadData(arg) { if (!this.url.list) { this.$message.error("请设置url.list属性!") @@ -561,6 +582,11 @@ export default { }, quickReceipt(){ this.$refs.materialTaskModal.edit(); + this.$refs.materialTaskModal.title = "快速入库"; + }, + cantaleverReceipt(){ + this.$refs.cantaleverTaskModal.edit(); + this.$refs.cantaleverTaskModal.title = "悬臂库入库"; }, callReceiptBox() { this.$refs.modalForm5.edit(); diff --git a/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue b/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue index 1f8c7b7..69e4124 100644 --- a/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue @@ -91,6 +91,7 @@ <a-button v-has="'taskHeader:emptyIn'" @click="createEmptyIn()" type="primary">空托入库</a-button> <a-button v-has="'taskHeader:manyEmptyIn'" @click="createManyEmptyIn()" type="primary">空托组入库</a-button> <a-button v-has="'taskHeader:quickReceipt'" @click="quickReceipt()" type="primary">快速入库</a-button> + <a-button v-has="'taskHeader:quickReceipt'" @click="stageingReceipt()" type="primary">暂存区入库</a-button> <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptBox()" type="primary" >呼叫入库有货托盘</a-button> <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptEmptyBox()" type="primary" >呼叫入库空托盘</a-button> <j-super-query :fieldList="superFieldList" v-has="'taskHeader:superQuery'" @handleSuperQuery="handleSuperQuery"/> @@ -200,6 +201,7 @@ <many-empty-in-task-modal ref="manyEmptyInModal" @ok="modalFormOk"></many-empty-in-task-modal> <update-priority ref="updatePriority" @ok="modalFormOk"></update-priority> <MaterialTaskModal ref="materialTaskModal" @ok="modalFormOk"></MaterialTaskModal> + <StageingReceiptModal ref="stageingReceiptModal" @ok="modalFormOk"></StageingReceiptModal> <call-receipt-box-modal ref="modalForm5" @ok="modalFormOk"></call-receipt-box-modal> <call-receipt-empty-box-modal ref="modalForm6" @ok="modalFormOk"></call-receipt-empty-box-modal> @@ -225,12 +227,14 @@ import MaterialTaskModal from "./modules/MaterialTaskModal"; import CallReceiptBoxModal from "@views/system/task/modules/CallReceiptBoxModal"; import CallReceiptEmptyBoxModal from "@views/system/task/modules/CallReceiptEmptyBoxModal"; import VideoModal from "@views/system/task/VideoModal.vue"; +import StageingReceiptModal from "@views/system/task/modules/StageingReceiptModal.vue"; export default { name: "ReceiptTaskHeaderList", mixins: [JeecgListMixin], components: { + StageingReceiptModal, VideoModal, CallReceiptEmptyBoxModal, CallReceiptBoxModal, @@ -574,6 +578,10 @@ export default { this.$refs.materialTaskModal.edit(); this.$refs.materialTaskModal.title = "快速入库"; }, + stageingReceipt(){ + this.$refs.stageingReceiptModal.edit(); + this.$refs.stageingReceiptModal.title = "暂存区入库"; + }, handlePriority(record){ this.$refs.updatePriority.edit(record); this.$refs.updatePriority.title = "修改优先级"; diff --git a/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue b/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue index 13a1417..c61272e 100644 --- a/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue @@ -183,6 +183,11 @@ export default { dataIndex: 'qty' }, { + title: '位置', + align: 'center', + dataIndex: 'position' + }, + { title: '批次', align: 'center', dataIndex: 'batch' diff --git a/ant-design-vue-jeecg/src/views/system/task/modules/CantaleverTaskModal.vue b/ant-design-vue-jeecg/src/views/system/task/modules/CantaleverTaskModal.vue new file mode 100644 index 0000000..27219bf --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/task/modules/CantaleverTaskModal.vue @@ -0,0 +1,160 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :maskClosable="false" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel"> + + <a-spin :spinning="confirmLoading"> + <a-form-model ref="form" :label-col="labelCol" :wrapper-col="wrapperCol" :model="model"> + + <!-- 子表单区域 --> + <a-tabs defaultActiveKey="1"> + <a-tab-pane tab="物料信息" key="1"> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="24"> + <a-col :span="12">物料编码</a-col> + <a-col :span="8">数量</a-col> + <a-col :span="4">操作</a-col> + </a-row> + <a-row type="flex" style="margin-bottom:-20px" :gutter="24" v-for="(item, index) in quickMainModel.receiptEntityList" :key="index"> + <a-col style="display: none"> + <a-form-model-item> + <a-input placeholder="id" v-model="item.id"/> + </a-form-model-item> + </a-col> + <a-col :span="12"> + <a-form-model-item> + <j-search-select-tag + placeholder="请选择" + v-model="item.materialCode" + :dict="'material,name,code'" + :pageSize="5" + :async="true"> + </j-search-select-tag> + </a-form-model-item> + </a-col> + <a-col :span="8"> + <a-form-model-item> + <a-input placeholder="数量" v-model="item.qty"/> + </a-form-model-item> + </a-col> + <a-col :span="4"> + <a-form-model-item> + <a-icon type="minus-circle" @click="delRowCustom(index)" style="fontSize :20px"/> + </a-form-model-item> + </a-col> + </a-row> + <a-button type="dashed" style="width: 100%;margin-top: 10px" @click="addRowCustom"><a-icon type="plus"/>添加物料信息</a-button> + </div> + </a-tab-pane> + </a-tabs> + </a-form-model> + </a-spin> + </a-modal> +</template> + +<script> + +import JEditableTable from '@/components/jeecg/JEditableTable' +import {cantaleverReceipt, execute, quickReceipt} from '@/api/api' +import JDate from '@/components/jeecg/JDate' +import JSelectMultiCanUseContainer from "../../../../components/jeecgbiz/JSelectMultiCanUseContainer"; + +export default { + name: 'CantaleverTaskModal', + components: { + JDate, JEditableTable,JSelectMultiCanUseContainer + }, + data() { + return { + title: '悬臂库入库', + visible: false, + confirmLoading: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 4} + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 24} + }, + activeKey: '1', + quickMainModel: { + receiptEntityList: [{}], + }, + // 客户信息 + url: { + add: '/test/jeecgOrderMain/add', + edit: '/test/jeecgOrderMain/edit', + } + } + }, + created() { + }, + methods: { + handleOk() { + this.validateFields() + }, + handleCancel() { + this.visible = false + }, + + addRowCustom() { + this.quickMainModel.receiptEntityList.push({}); + this.$forceUpdate(); + }, + delRowCustom(index) { + console.log(index) + this.quickMainModel.receiptEntityList.splice(index, 1); + this.$forceUpdate(); + }, + addRowTicket() { + this.quickMainModel.jeecgOrderTicketList.push({}); + console.log(this.quickMainModel.jeecgOrderTicketList) + this.$forceUpdate(); + }, + delRowTicket(index) { + console.log(index) + this.quickMainModel.jeecgOrderTicketList.splice(index, 1); + this.$forceUpdate(); + }, + + edit(record) { + this.visible = true + this.activeKey = '1' + this.quickMainModel = Object.assign({ + receiptEntityList: [{}] + }, record); + }, + /** 触发表单验证 */ + validateFields() { + // 触发表单验证 + this.$refs.form.validate(valid => { + //alert(JSON.stringify(this.quickMainModel)); + this.receipt(this.quickMainModel); + }) + }, + + receipt(record) { + this.confirmLoading = true + this.model = Object.assign({}, record); + cantaleverReceipt(this.model).then((res) => { + this.loading = false; + if (res.success) { + this.$message.success(res.message); + this.$emit('ok'); + this.visible = false + } else { + this.$message.error(res.message); + } + this.confirmLoading = false + }); + }, + } +} +</script> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/task/modules/StageingReceiptModal.vue b/ant-design-vue-jeecg/src/views/system/task/modules/StageingReceiptModal.vue new file mode 100644 index 0000000..2923f81 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/task/modules/StageingReceiptModal.vue @@ -0,0 +1,172 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :maskClosable="false" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel"> + + <a-spin :spinning="confirmLoading"> + <a-form-model ref="form" :label-col="labelCol" :wrapper-col="wrapperCol" :model="model"> + <!-- 主表单区域 --> + <a-row class="form-row" :gutter="24"> + <a-col :lg="12"> + <a-form-model-item label="托盘号" :rules="[{ required: true, message: '请输入托盘号!' }]"> + <a-input placeholder="请输入托盘号" v-model="quickMainModel.containerCode"/> + </a-form-model-item> + </a-col> + <a-col :lg="12"> + <a-form-model-item label="暂存区" :rules="[{ required: true, message: '请输入暂存区位置!' }]"> + <a-input placeholder="请输入暂存区位置" v-model="quickMainModel.fromPort"/> + </a-form-model-item> + </a-col> + </a-row> + <!-- 子表单区域 --> + <a-tabs defaultActiveKey="1"> + <a-tab-pane tab="物料信息" key="1"> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="24"> + <a-col :span="12">物料编码</a-col> + <a-col :span="8">数量</a-col> + <a-col :span="4">操作</a-col> + </a-row> + <a-row type="flex" style="margin-bottom:-20px" :gutter="24" v-for="(item, index) in quickMainModel.receiptEntityList" :key="index"> + <a-col style="display: none"> + <a-form-model-item> + <a-input placeholder="id" v-model="item.id"/> + </a-form-model-item> + </a-col> + <a-col :span="12"> + <a-form-model-item> + <j-search-select-tag + placeholder="请选择" + v-model="item.materialCode" + :dict="'material,name,code'" + :pageSize="5" + :async="true"> + </j-search-select-tag> + </a-form-model-item> + </a-col> + <a-col :span="8"> + <a-form-model-item> + <a-input placeholder="数量" v-model="item.qty"/> + </a-form-model-item> + </a-col> + <a-col :span="4"> + <a-form-model-item> + <a-icon type="minus-circle" @click="delRowCustom(index)" style="fontSize :20px"/> + </a-form-model-item> + </a-col> + </a-row> + <a-button type="dashed" style="width: 100%;margin-top: 10px" @click="addRowCustom"><a-icon type="plus"/>添加物料信息</a-button> + </div> + </a-tab-pane> + </a-tabs> + </a-form-model> + </a-spin> + </a-modal> +</template> + +<script> + +import JEditableTable from '@/components/jeecg/JEditableTable' +import {execute, quickReceipt, stageingReceipt} from '@/api/api' +import JDate from '@/components/jeecg/JDate' +import JSelectMultiCanUseContainer from "../../../../components/jeecgbiz/JSelectMultiCanUseContainer"; + +export default { + name: 'StageingReceiptModal', + components: { + JDate, JEditableTable,JSelectMultiCanUseContainer + }, + data() { + return { + title: '暂存区入库', + visible: false, + confirmLoading: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 4} + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 24} + }, + activeKey: '1', + quickMainModel: { + receiptEntityList: [{}], + }, + // 客户信息 + url: { + add: '/test/jeecgOrderMain/add', + edit: '/test/jeecgOrderMain/edit', + } + } + }, + created() { + }, + methods: { + handleOk() { + this.validateFields() + }, + handleCancel() { + this.visible = false + }, + + addRowCustom() { + this.quickMainModel.receiptEntityList.push({}); + this.$forceUpdate(); + }, + delRowCustom(index) { + console.log(index) + this.quickMainModel.receiptEntityList.splice(index, 1); + this.$forceUpdate(); + }, + addRowTicket() { + this.quickMainModel.jeecgOrderTicketList.push({}); + console.log(this.quickMainModel.jeecgOrderTicketList) + this.$forceUpdate(); + }, + delRowTicket(index) { + console.log(index) + this.quickMainModel.jeecgOrderTicketList.splice(index, 1); + this.$forceUpdate(); + }, + + edit(record) { + this.visible = true + this.activeKey = '1' + this.quickMainModel = Object.assign({ + receiptEntityList: [{}] + }, record); + }, + /** 触发表单验证 */ + validateFields() { + // 触发表单验证 + this.$refs.form.validate(valid => { + //alert(JSON.stringify(this.quickMainModel)); + this.receipt(this.quickMainModel); + }) + }, + + receipt(record) { + this.confirmLoading = true + this.model = Object.assign({}, record); + stageingReceipt(this.model).then((res) => { + this.loading = false; + if (res.success) { + this.$message.success(res.message); + this.$emit('ok'); + this.visible = false + } else { + this.$message.error(res.message); + } + this.confirmLoading = false + }); + }, + } +} +</script> \ No newline at end of file diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java index 0cd2dab..e2555d3 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java @@ -539,7 +539,10 @@ public class WcsServiceImpl implements WcsService { Integer minTaskPosition = Collections.min(positionList); List<InventoryDetail> inventoryDetailList = inventoryDetailService.getInventoryDetailListByLocationCodeAndNotPosition(fromLocationCode, positionList, warehouseCode); List<Integer> inventoryPositionList = inventoryDetailList.stream().map(InventoryDetail::getPosition).collect(Collectors.toList()); - Integer minInventoryPosition = Collections.min(inventoryPositionList); + Integer minInventoryPosition = 0; + if (CollectionUtils.isNotEmpty(inventoryPositionList)) { + minInventoryPosition = Collections.min(inventoryPositionList); + } if (minTaskPosition < minInventoryPosition) { TaskHeader unCompleteTaskHeader = taskHeaderService.getUnCompleteTransferTaskByFromLocationCode(fromLocationCode, warehouseCode); if (unCompleteTaskHeader != null) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java index edee32a..11da996 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java @@ -45,4 +45,6 @@ public interface IContainerService extends IService<Container> { List<Container> getContainerListByCodeList(List<String> containerCodeList, String warehouseCode); List<Container> getCanUseListContainer(Container container, String warehouseCode); + + List<Container> getCanDeleteListLSContainer(String warehouseCode); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java index e6667c9..d8b4411 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java @@ -248,6 +248,18 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container } } + @Override + public List<Container> getCanDeleteListLSContainer(String warehouseCode) { + LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); + containerLambdaQueryWrapper.eq(Container::getContainerTypeCode, QuantityConstant.CONTAINER_TYPE_LS) + .eq(Container::getWarehouseCode, warehouseCode) + .eq(Container::getLocationCode, QuantityConstant.EMPTY_STRING) + .eq(Container::getStatus, QuantityConstant.STATUS_CONTAINER_EMPTY) + .eq(Container::getFillStatus, QuantityConstant.STATUS_CONTAINER_FILL_EMPTY); + List<Container> containerList = containerService.list(containerLambdaQueryWrapper); + return containerList; + } + private int getStartNumber(String containerTypeCode, String warehouseCode) { LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); containerLambdaQueryWrapper.eq(Container::getContainerTypeCode, containerTypeCode).eq(Container::getWarehouseCode, warehouseCode) diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoDeleteTask.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoDeleteTask.java index f9d2704..b30b7fd 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoDeleteTask.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoDeleteTask.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.util.DateUtils; import org.jeecg.modules.wms.api.erp.service.IErpService; +import org.jeecg.modules.wms.config.container.entity.Container; +import org.jeecg.modules.wms.config.container.service.IContainerService; import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; import org.jeecg.modules.wms.framework.service.IHuahengMultiHandlerService; import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction; @@ -18,12 +20,14 @@ import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; +import org.jeecg.utils.support.ApiAuthentication; import org.quartz.*; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * 删除完成的单据 @@ -44,15 +48,28 @@ public class AutoDeleteTask implements Job { @Resource private IErpService erpService; + @Resource private IHuahengMultiHandlerService huahengMultiHandlerService; + @Resource private IParameterConfigurationService parameterConfigurationService; + @Resource private ITaskHeaderService taskHeaderService; + @Resource private IInventoryTransactionService inventoryTransactionService; + @Resource + private IContainerService containerService; + + private String parameter; + + public void setParameter(String parameter) { + this.parameter = parameter; + } + @Override public void execute(JobExecutionContext context) throws JobExecutionException { String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_DELETE_RECEIPT); @@ -63,38 +80,66 @@ public class AutoDeleteTask implements Job { if (DELETE_RECEIPT == QuantityConstant.NOT_DELETE_RECEIPT) { return; } + // 入库单:按照 id 升序排序,先删除 id 小的记录,只保留最新的 100 条记录 LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); - receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED).isNull(ReceiptHeader::getReferCode) - .le(ReceiptHeader::getCreateTime, DateUtil.offsetDay(new Date(), -30)); + receiptHeaderLambdaQueryWrapper + .eq(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED) + .isNull(ReceiptHeader::getReferCode) + .orderByAsc(ReceiptHeader::getId); List<ReceiptHeader> receiptHeaderList = receiptHeaderService.list(receiptHeaderLambdaQueryWrapper); - log.info(String.format(" AutoDeleteTask 执行任务! receiptHeaderList :" + receiptHeaderList + "时间" + DateUtils.getTimestamp())); - for (ReceiptHeader receiptHeader : receiptHeaderList) { - receiptHeaderService.delMain(String.valueOf(receiptHeader.getId()), QuantityConstant.WMS_COMPLETE_DELETE_RECEIPT); + log.info(String.format("AutoDeleteTask receiptHeaderList: %s, 时间: %s", receiptHeaderList, DateUtils.getTimestamp())); + if (receiptHeaderList.size() > 10) { + int countToDelete = receiptHeaderList.size() - 10; + for (int i = 0; i < countToDelete; i++) { + ReceiptHeader receiptHeader = receiptHeaderList.get(i); + receiptHeaderService.delMain(String.valueOf(receiptHeader.getId()), QuantityConstant.WMS_COMPLETE_DELETE_RECEIPT); + } } + + // 出库单:按照 id 升序排序,先删除 id 小的记录,只保留最新的 100 条记录 LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); - shipmentHeaderLambdaQueryWrapper.eq(ShipmentHeader::getLastStatus, QuantityConstant.SHIPMENT_HEADER_COMPLETED).isNull(ShipmentHeader::getReferCode) - .le(ShipmentHeader::getCreateTime, DateUtil.offsetDay(new Date(), -30)); + shipmentHeaderLambdaQueryWrapper + .eq(ShipmentHeader::getLastStatus, QuantityConstant.SHIPMENT_HEADER_COMPLETED) + .isNull(ShipmentHeader::getReferCode) + .orderByAsc(ShipmentHeader::getId); List<ShipmentHeader> shipmentHeaderList = shipmentHeaderService.list(shipmentHeaderLambdaQueryWrapper); - log.info(String.format(" AutoDeleteTask 执行任务! shipmentHeaderList :" + shipmentHeaderList + "时间" + DateUtils.getTimestamp())); - for (ShipmentHeader shipmentHeader : shipmentHeaderList) { - shipmentHeaderService.delMain(String.valueOf(shipmentHeader.getId()), QuantityConstant.WMS_COMPLETE_DELETE_RECEIPT); + log.info(String.format("AutoDeleteTask shipmentHeaderList: %s, 时间: %s", shipmentHeaderList, DateUtils.getTimestamp())); + if (shipmentHeaderList.size() > 10) { + int countToDelete = shipmentHeaderList.size() - 10; + for (int i = 0; i < countToDelete; i++) { + ShipmentHeader shipmentHeader = shipmentHeaderList.get(i); + shipmentHeaderService.delMain(String.valueOf(shipmentHeader.getId()), QuantityConstant.WMS_COMPLETE_DELETE_RECEIPT); + } } + + // 任务:按照 id 升序排序,先删除 id 小的记录,只保留最新的 100 条记录 LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); - taskHeaderLambdaQueryWrapper.eq(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED).ne(TaskHeader::getExceptionState, - QuantityConstant.EXCEPTION_TASK_ERROR).le(TaskHeader::getCreateTime, DateUtil.offsetDay(new Date(), -30)); + taskHeaderLambdaQueryWrapper + .eq(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED) + .ne(TaskHeader::getExceptionState, QuantityConstant.EXCEPTION_TASK_ERROR) + .orderByAsc(TaskHeader::getId); List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper); - log.info(String.format(" AutoDeleteTask 执行任务! taskHeaderList :" + taskHeaderList + "时间" + DateUtils.getTimestamp())); - for (TaskHeader taskHeader : taskHeaderList) { - taskHeaderService.delMain(taskHeader.getId()); + log.info(String.format("AutoDeleteTask taskHeaderList: %s, 时间: %s", taskHeaderList, DateUtils.getTimestamp())); + if (taskHeaderList.size() > 10) { + int countToDelete = taskHeaderList.size() - 10; + for (int i = 0; i < countToDelete; i++) { + TaskHeader taskHeader = taskHeaderList.get(i); + taskHeaderService.delMain(taskHeader.getId()); + } } + LambdaQueryWrapper<InventoryTransaction> inventoryTransactionLambdaQueryWrapper = Wrappers.lambdaQuery(); inventoryTransactionLambdaQueryWrapper.le(InventoryTransaction::getCreateTime, DateUtil.offsetDay(new Date(), -360)); List<InventoryTransaction> inventoryTransactionList = inventoryTransactionService.list(inventoryTransactionLambdaQueryWrapper); - log.info(String.format(" AutoDeleteTask 执行任务! inventoryTransactionList :" + inventoryTransactionList + "时间" + DateUtils.getTimestamp())); if (!CollectionUtils.isEmpty(inventoryTransactionList)) { inventoryTransactionService.batchDelete(inventoryTransactionList); } + List<Container> containerList = containerService.getCanDeleteListLSContainer(QuantityConstant.DEFAULT_WAREHOUSE); + if (!CollectionUtils.isEmpty(containerList)) { + List<Integer> containerIdList = containerList.stream().map(Container::getId).collect(Collectors.toList()); + containerService.removeByIds(containerIdList); + } } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java index 6d1c974..189cdff 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/service/impl/ShipmentHeaderServiceImpl.java @@ -504,6 +504,9 @@ public class ShipmentHeaderServiceImpl extends ServiceImpl<ShipmentHeaderMapper, if (taskType == QuantityConstant.TASK_TYPE_WHOLESHIPMENT) { type = QuantityConstant.PORT_TYPE_OUT; } + if (zoneCode.equals(QuantityConstant.ZONE_B)) { + type = QuantityConstant.PORT_TYPE_OUT; + } String fromLocationCode = shipmentContainerHeader.getFromLocationCode(); if (StringUtils.isEmpty(fromLocationCode)) { throw new JeecgBootException("自动出库, 没有起始库位编码"); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/IAgvTaskService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/IAgvTaskService.java index 173da6f..99d0582 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/IAgvTaskService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/IAgvTaskService.java @@ -35,7 +35,7 @@ public interface IAgvTaskService extends IService<AgvTask> { AgvTask getAgvTaskByPort(String portCode, String warehouseCode); - AgvTask getAgvTaskBuContainerCode(String containerCode, String warehouseCode); + AgvTask getAgvTaskByContainerCode(String containerCode, String warehouseCode); AgvTask getAgvTaskBuFromPort(String fromPortCode, String warehouseCode); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/impl/AgvTaskServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/impl/AgvTaskServiceImpl.java index 6e4fb9f..ce22c6e 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/impl/AgvTaskServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/agvTask/service/impl/AgvTaskServiceImpl.java @@ -61,7 +61,7 @@ public class AgvTaskServiceImpl extends ServiceImpl<AgvTaskMapper, AgvTask> impl // throw new JeecgBootException("生成AGV任务,锁定容器失败:" + containerCode); // } // } - if (agvTaskService.getAgvTaskBuContainerCode(containerCode, warehouseCode) != null) { + if (agvTaskService.getAgvTaskByContainerCode(containerCode, warehouseCode) != null) { return Result.error("生成AGV任务失败,已经生成AGV任务"); } agvTask.setWarehouseCode(warehouseCode); @@ -208,7 +208,7 @@ public class AgvTaskServiceImpl extends ServiceImpl<AgvTaskMapper, AgvTask> impl } @Override - public AgvTask getAgvTaskBuContainerCode(String containerCode, String warehouseCode) { + public AgvTask getAgvTaskByContainerCode(String containerCode, String warehouseCode) { LambdaQueryWrapper<AgvTask> agvTaskLambdaQueryWrapper = Wrappers.lambdaQuery(); agvTaskLambdaQueryWrapper.eq(AgvTask::getContainerCode, containerCode).eq(AgvTask::getWarehouseCode, warehouseCode).lt(AgvTask::getStatus, QuantityConstant.AGV_TASK_STATUS_COMPLETED); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java index be3c7b6..82c25b2 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java @@ -30,10 +30,7 @@ import org.jeecg.modules.wms.framework.controller.HuahengBaseController; import org.jeecg.modules.wms.framework.service.IHuahengMultiHandlerService; import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; -import org.jeecg.modules.wms.task.taskHeader.entity.CantaleverTransfer; -import org.jeecg.modules.wms.task.taskHeader.entity.QucikReceiptEntity; -import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; -import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.modules.wms.task.taskHeader.entity.*; import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.jeecg.utils.ConvertUtils; @@ -911,6 +908,46 @@ public class TaskHeaderController extends HuahengBaseController { } /** + * 快速入库 + * @return + */ + @AutoLog(value = "悬臂库入库", operateType = 2) + @PostMapping("cantaleverReceipt") + @ApiOperation("悬臂库入库") + public Result cantaleverReceipt(@RequestBody QucikReceiptEntity qucikReceiptEntity, HttpServletRequest req) { + String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); + qucikReceiptEntity.setWarehouseCode(warehouseCode); + Result result = handleMultiProcess("cantaleverReceipt", new MultiProcessListener() { + @Override + public Result<?> doProcess() { + Result result = taskHeaderService.cantaleverReceipt(qucikReceiptEntity); + return result; + } + }); + return result; + } + + /** + * 暂存区入库 + * @return + */ + @AutoLog(value = "暂存区入库", operateType = 2) + @PostMapping("stageingReceipt") + @ApiOperation("暂存区入库") + public Result stageingReceipt(@RequestBody StageingReceiptEntity stageingReceiptEntity, HttpServletRequest req) { + String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); + stageingReceiptEntity.setWarehouseCode(warehouseCode); + Result result = handleMultiProcess("stageingReceipt", new MultiProcessListener() { + @Override + public Result<?> doProcess() { + Result result = taskHeaderService.stageingReceipt(stageingReceiptEntity); + return result; + } + }); + return result; + } + + /** * 快速出库 * @return */ diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/StageingReceiptEntity.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/StageingReceiptEntity.java new file mode 100644 index 0000000..9f8b83a --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/StageingReceiptEntity.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.wms.task.taskHeader.entity; + +import lombok.Data; + +import java.util.List; + +@Data +public class StageingReceiptEntity { + + private String containerCode; + private String fromPort; + private String toPort; + private String warehouseCode; + private List<ReceiptEntity> receiptEntityList; +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java index fa40d40..03b91c0 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java @@ -10,6 +10,7 @@ import org.jeecg.modules.wms.config.location.entity.Location; import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; import org.jeecg.modules.wms.task.taskHeader.entity.QucikReceiptEntity; +import org.jeecg.modules.wms.task.taskHeader.entity.StageingReceiptEntity; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; import com.baomidou.mybatisplus.extension.service.IService; @@ -501,6 +502,19 @@ public interface ITaskHeaderService extends IService<TaskHeader> { Result quickReceipt(QucikReceiptEntity qucikReceiptEntity); /** + * add + * @return + */ + Result cantaleverReceipt(QucikReceiptEntity qucikReceiptEntity); + + + /** + * add + * @return + */ + Result stageingReceipt(StageingReceiptEntity stageingReceiptEntity); + + /** * 切换任务 * @param id * @return 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 4d6088e..b965ef9 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 @@ -63,6 +63,8 @@ import org.jeecg.modules.wms.stocktaking.cycleCountDetail.entity.CycleCountDetai import org.jeecg.modules.wms.stocktaking.cycleCountDetail.service.impl.CycleCountDetailChildServiceImpl; import org.jeecg.modules.wms.stocktaking.cycleCountDetail.service.impl.CycleCountDetailServiceImpl; import org.jeecg.modules.wms.stocktaking.cycleCountHeader.service.impl.CycleCountHeaderServiceImpl; +import org.jeecg.modules.wms.task.agvTask.entity.AgvTask; +import org.jeecg.modules.wms.task.agvTask.service.IAgvTaskService; import org.jeecg.modules.wms.task.taskHeader.entity.*; import org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper; import org.jeecg.modules.wms.task.taskHeader.mapper.TaskHeaderMapper; @@ -204,6 +206,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea @Resource private IAddressService addressService; + @Resource + private IAgvTaskService agvTaskService; @Override @Transactional @@ -1580,11 +1584,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea return Result.error("创建移库任务失败,起始库位:" + fromLocationCode + "和目标库位:" + toLocationCode + "是同一个"); } String containerCode = fromLocation.getContainerCode(); - TaskHeader unComleteTask = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); - if (unComleteTask != null) { - Container container = containerService.createLSContainer(warehouseCode); - containerCode = container.getCode(); - } +// TaskHeader unComleteTask = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); +// if (unComleteTask != null) { +// Container container = containerService.createLSContainer(warehouseCode); +// containerCode = container.getCode(); +// } List<InventoryDetail> toInventoryDetailList = inventoryDetailService.getInventoryDetailListByLocationCode(toLocationCode, warehouseCode); List<InventoryDetail> totalInventoryDetailList = new ArrayList<>(); if (CollectionUtils.isNotEmpty(toInventoryDetailList)) { @@ -1671,9 +1675,9 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (!success) { throw new JeecgBootException("创建移库任务时,创建任务失败"); } - if (!taskHeaderService.updateTaskRoadWay(containerCode, fromLocationCode, warehouseCode)) { - throw new JeecgBootException("创建任务时,更新巷道值失败"); - } +// if (!taskHeaderService.updateTaskRoadWay(containerCode, fromLocationCode, warehouseCode)) { +// throw new JeecgBootException("创建任务时,更新巷道值失败"); +// } List<TaskDetail> taskDetailList = new ArrayList<>(); fromInventoryDetailList = fromInventoryDetailList.stream().sorted(new Comparator<InventoryDetail>() { @Override @@ -3177,6 +3181,259 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea return Result.OK("快速入库成功"); } + @Override + @Transactional(rollbackFor = Exception.class) + public Result cantaleverReceipt(QucikReceiptEntity qucikReceiptEntity) { + boolean success = false; + String containerCode = qucikReceiptEntity.getContainerCode(); + List<ReceiptEntity> receiptEntityList = qucikReceiptEntity.getReceiptEntityList(); + String toPort = qucikReceiptEntity.getToPort(); + String warehouseCode = qucikReceiptEntity.getWarehouseCode(); + List<Receive> receiveList = new ArrayList<>(); +// if (StringUtils.isEmpty(containerCode)) { +// return Result.error("快速入库,容器编码为空"); +// } + if (StringUtils.isEmpty(warehouseCode)) { + return Result.error("悬臂库入库,仓库编码为空"); + } + if (StringUtils.isEmpty(receiptEntityList)) { + return Result.error("悬臂库入库,入库信息为空"); + } + Container container = containerService.createLSContainer(warehouseCode); + if (container == null) { + return Result.error("悬臂库入库,没有找到容器" + containerCode); + } + containerCode = container.getCode(); +// Port port = portService.getPortByCode(toPort, warehouseCode); +// if (port != null) { +// int portType = Integer.parseInt(port.getType()); +// if (portType == QuantityConstant.PORT_TYPE_OUT) { +// return Result.error("快速入库,不能选择出库口" + toPort); +// } +// } + for (ReceiptEntity receiptEntity : receiptEntityList) { + if(receiptEntity.getQty().compareTo(BigDecimal.ZERO) == 0) { + continue; + } + if(receiptEntity.getQty().compareTo(BigDecimal.ONE) != 0) { + throw new JeecgBootException("悬臂库入库,入库数量只能是1"); + } + } + if (receiptEntityList.size() > 1) { + throw new JeecgBootException("悬臂库入库,每次只能入1个"); + } + String receiptType = QuantityConstant.RECEIPT_BILL_TYPE_QTR; + String remark = "快速入库"; + ReceiptHeader receiptHeader = new ReceiptHeader(); + receiptHeader.setWarehouseCode(warehouseCode); + receiptHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + receiptHeader.setType(receiptType); + receiptHeader.setRemark(remark); + Result result = receiptHeaderService.saveReceiptHeader(receiptHeader); + if (!result.isSuccess()) { + throw new JeecgBootException("快速入库, 创建入库单头失败" + result.getMessage()); + } + for (ReceiptEntity receiptEntity : receiptEntityList) { + BigDecimal qty = receiptEntity.getQty(); + String materialCode = receiptEntity.getMaterialCode(); + if (StringUtils.isEmpty(materialCode)) { + throw new JeecgBootException("快速入库, 物料编码为空"); + } + if (qty == null) { + throw new JeecgBootException("快速入库, 数量必须填写"); + } + if (qty.compareTo(BigDecimal.ZERO) <= 0) { + throw new JeecgBootException("快速入库, 数量必须大于0"); + } + ReceiptDetail receiptDetail = new ReceiptDetail(); + receiptDetail.setWarehouseCode(warehouseCode); + receiptDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + receiptDetail.setReceiptCode(receiptHeader.getCode()); + receiptDetail.setReceiptId(receiptHeader.getId()); + receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_BUILD); + receiptDetail.setQty(qty); + Material material = materialService.getMaterialByCode(materialCode); + if (material == null) { + throw new JeecgBootException("快速入库, 获取物料:" + materialCode + " 信息失败"); + } + receiptDetail.setInventoryStatus(QuantityConstant.QUALITY_GOOD); + receiptDetail.setMaterialCode(materialCode); + receiptDetail.setMaterialName(material.getName()); + receiptDetail.setMaterialSpec(material.getSpec()); + receiptDetail.setMaterialUnit(material.getUnit()); + success = receiptDetailService.save(receiptDetail); + if (!success) { + throw new JeecgBootException("快速入库, 保存入库单详情失败"); + } + + Receive receive = new Receive(); + receive.setId(receiptDetail.getId()); + receive.setContainerCode(containerCode); + receive.setMaterialCode(materialCode); + receive.setMaterialName(receiptDetail.getMaterialName()); + receive.setMaterialSpec(receiptDetail.getMaterialSpec()); + receive.setMaterialUnit(receiptDetail.getMaterialUnit()); + receive.setInventoryStatus(receiptDetail.getInventoryStatus()); + receive.setQty(receiptDetail.getQty()); + receive.setTaskQty(receiptDetail.getQty()); + receiveList.add(receive); + } + result = receiveService.receiving(receiveList, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getUnCompleteReceiptContainerByCode(containerCode, warehouseCode); + if (receiptContainerHeader == null) { + throw new JeecgBootException(result.getMessage()); + } + receiptContainerHeader.setToPort(toPort); + success = receiptContainerHeaderService.updateById(receiptContainerHeader); + if (!success) { + throw new JeecgBootException("快速入库,更新入库组盘头失败"); + } + result = receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } +// TaskHeader taskHeader = (TaskHeader)result.getResult(); +// if (taskHeader.getTaskType() == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) { +// if (port == null) { +// throw new JeecgBootException("快速入库, 生成补充任务时必须有入库口"); +// } +// } + if (!receiptHeaderService.updateReceiptHeader(receiptHeader.getId())) { + throw new JeecgBootException("快速入库, 更新入库表单头失败"); + } + return Result.OK("快速入库成功"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result stageingReceipt(StageingReceiptEntity stageingReceiptEntity) { + boolean success = false; + String containerCode = stageingReceiptEntity.getContainerCode(); + List<ReceiptEntity> receiptEntityList = stageingReceiptEntity.getReceiptEntityList(); + String fromPort = stageingReceiptEntity.getFromPort(); + String toPort = stageingReceiptEntity.getToPort(); + toPort = "P1001"; + String warehouseCode = stageingReceiptEntity.getWarehouseCode(); + List<Receive> receiveList = new ArrayList<>(); + if (StringUtils.isEmpty(containerCode)) { + return Result.error("快速入库,容器编码为空"); + } + if (StringUtils.isEmpty(warehouseCode)) { + return Result.error("快速入库,仓库编码为空"); + } + if (StringUtils.isEmpty(receiptEntityList)) { + return Result.error("快速入库,入库信息为空"); + } + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("快速入库,没有找到容器" + containerCode); + } + Port port = portService.getPortByCode(toPort, warehouseCode); + if (port != null) { + int portType = Integer.parseInt(port.getType()); + if (portType == QuantityConstant.PORT_TYPE_OUT) { + return Result.error("快速入库,不能选择出库口" + toPort); + } + } + String receiptType = QuantityConstant.RECEIPT_BILL_TYPE_QTR; + String remark = "快速入库"; + ReceiptHeader receiptHeader = new ReceiptHeader(); + receiptHeader.setWarehouseCode(warehouseCode); + receiptHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + receiptHeader.setType(receiptType); + receiptHeader.setRemark(remark); + Result result = receiptHeaderService.saveReceiptHeader(receiptHeader); + if (!result.isSuccess()) { + throw new JeecgBootException("快速入库, 创建入库单头失败" + result.getMessage()); + } + for (ReceiptEntity receiptEntity : receiptEntityList) { + BigDecimal qty = receiptEntity.getQty(); + String materialCode = receiptEntity.getMaterialCode(); + if (StringUtils.isEmpty(materialCode)) { + throw new JeecgBootException("快速入库, 物料编码为空"); + } + if (qty == null) { + throw new JeecgBootException("快速入库, 数量必须填写"); + } + if (qty.compareTo(BigDecimal.ZERO) <= 0) { + throw new JeecgBootException("快速入库, 数量必须大于0"); + } + ReceiptDetail receiptDetail = new ReceiptDetail(); + receiptDetail.setWarehouseCode(warehouseCode); + receiptDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); + receiptDetail.setReceiptCode(receiptHeader.getCode()); + receiptDetail.setReceiptId(receiptHeader.getId()); + receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_BUILD); + receiptDetail.setQty(qty); + Material material = materialService.getMaterialByCode(materialCode); + if (material == null) { + throw new JeecgBootException("快速入库, 获取物料:" + materialCode + " 信息失败"); + } + receiptDetail.setInventoryStatus(QuantityConstant.QUALITY_GOOD); + receiptDetail.setMaterialCode(materialCode); + receiptDetail.setMaterialName(material.getName()); + receiptDetail.setMaterialSpec(material.getSpec()); + receiptDetail.setMaterialUnit(material.getUnit()); + success = receiptDetailService.save(receiptDetail); + if (!success) { + throw new JeecgBootException("快速入库, 保存入库单详情失败"); + } + + Receive receive = new Receive(); + receive.setId(receiptDetail.getId()); + receive.setContainerCode(containerCode); + receive.setMaterialCode(materialCode); + receive.setMaterialName(receiptDetail.getMaterialName()); + receive.setMaterialSpec(receiptDetail.getMaterialSpec()); + receive.setMaterialUnit(receiptDetail.getMaterialUnit()); + receive.setInventoryStatus(receiptDetail.getInventoryStatus()); + receive.setQty(receiptDetail.getQty()); + receive.setTaskQty(receiptDetail.getQty()); + receiveList.add(receive); + } + result = receiveService.receiving(receiveList, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getUnCompleteReceiptContainerByCode(containerCode, warehouseCode); + if (receiptContainerHeader == null) { + throw new JeecgBootException(result.getMessage()); + } + receiptContainerHeader.setToPort(toPort); + success = receiptContainerHeaderService.updateById(receiptContainerHeader); + if (!success) { + throw new JeecgBootException("快速入库,更新入库组盘头失败"); + } + result = receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + TaskHeader taskHeader = (TaskHeader)result.getResult(); + if (taskHeader.getTaskType() == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) { + if (port == null) { + throw new JeecgBootException("快速入库, 生成补充任务时必须有入库口"); + } + } + if (!receiptHeaderService.updateReceiptHeader(receiptHeader.getId())) { + throw new JeecgBootException("快速入库, 更新入库表单头失败"); + } + + AgvTask agvTask = new AgvTask(); + agvTask.setWarehouseCode(warehouseCode); + agvTask.setTaskType(QuantityConstant.AGV_TYPE_TAKE_AND_RELEASE); + agvTask.setStatus(QuantityConstant.AGV_TASK_STATUS_BUILD); + agvTask.setContainerCode(containerCode); + agvTask.setFromPort(fromPort); + agvTask.setToPort(toPort); + agvTask.setPriority(10); + result = agvTaskService.addAgvTask(agvTask, warehouseCode); + log.info(String.format("AutoCreateAgvTask 生成AGV任务执行:" + result.getMessage())); + return Result.OK("快速入库成功"); + } + /** * 切换任务 * 1. 判断满足切换任务的条件 @@ -4587,7 +4844,16 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea } String receiptType = QuantityConstant.SHIPMENT_BILL_TYPE_QTC; String remark = "快速出库"; - String zoneCode = "L"; + String zoneCode = "A"; + for (ReceiptEntity receiptEntity : receiptEntityList) { + BigDecimal qty = receiptEntity.getQty(); + String materialCode = receiptEntity.getMaterialCode(); + List<InventoryDetail> inventoryDetailList = inventoryDetailService.getInventoryDetailListByMaterialCode(materialCode, warehouseCode); + if (CollectionUtils.isNotEmpty(inventoryDetailList)) { + InventoryDetail inventoryDetail = inventoryDetailList.get(0); + zoneCode = inventoryDetail.getZoneCode(); + } + } ShipmentHeader shipmentHeader = new ShipmentHeader(); shipmentHeader.setWarehouseCode(warehouseCode); shipmentHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);