diff --git a/ant-design-vue-jeecg/src/api/api.js b/ant-design-vue-jeecg/src/api/api.js index a78b413..f18c2a3 100644 --- a/ant-design-vue-jeecg/src/api/api.js +++ b/ant-design-vue-jeecg/src/api/api.js @@ -244,6 +244,10 @@ export const quickReceipt = (params) => postAction("/task/taskHeader/quickReceip export const shipmentInventoryHeader = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryHeader', params); //快速出库,批量快速出库存详情 export const shipmentInventoryDetail = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryDetail', params); +//呼叫入库托盘 +export const callReceiptBox = (params) => postAction('/receipt/receiptHeader/callbox', params); +//呼叫出库托盘 +export const callShipmentBox = (params) => postAction('/shipment/shipmentHeader/callbox', params); // 中转HTTP请求 export const transitRESTful = { get: (url, parameter) => getAction(getTransitURL(url), parameter), diff --git a/ant-design-vue-jeecg/src/components/jeecgbiz/JSelectMultiSomeContainer.vue b/ant-design-vue-jeecg/src/components/jeecgbiz/JSelectMultiSomeContainer.vue index 68e69e7..f528257 100644 --- a/ant-design-vue-jeecg/src/components/jeecgbiz/JSelectMultiSomeContainer.vue +++ b/ant-design-vue-jeecg/src/components/jeecgbiz/JSelectMultiSomeContainer.vue @@ -47,8 +47,8 @@ export default { // 多条件查询配置 queryConfigDefault: [ { - key: 'locationCode', - label: '库位编码', + key: 'materialCode', + label: '物料编码', }, ], } 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 3027318..d496181 100644 --- a/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue @@ -74,6 +74,7 @@ </a-upload> <a-button v-has="'receiptContainerHeader:createTask'" @click="createBatchTask" type="primary" >批量生成任务</a-button> <a-button v-has="'receiptContainerHeader:delete'" @click="cancelBatchTask" type="primary" >批量取消组盘</a-button> + <a-button v-has="'receiptContainerHeader:suppleReceipt'" @click="suppleReceipt" type="primary" >补充入库</a-button> </div> <!-- table区域-begin --> @@ -148,6 +149,7 @@ <receiptContainerSelect-modal ref="modalForm2" @ok="modalFormOk"></receiptContainerSelect-modal> <receiptContainerFillSelect-modal ref="modalForm3" @ok="modalFormOk"></receiptContainerFillSelect-modal> <receiptContainerStatusSelect-modal ref="modalForm4" @ok="modalFormOk"></receiptContainerStatusSelect-modal> + </a-card> </template> @@ -159,6 +161,7 @@ import {deleteAction, getAction} from '@/api/manage' import ReceiptContainerDetailList from './ReceiptContainerDetailList' import {initDictOptions, filterMultiDictText} from '@/components/dict/JDictSelectUtil' import '@/assets/less/TableExpand.less' +import '@/assets/less/TableExpand.less' import {createReceiptTask, createReceiptBatchTask} from '@/api/api' import ReceiptContainerSelectModal from "./modules/ReceiptContainerSelectModal"; import ReceiptContainerFillSelectModal from "./modules/ReceiptContainerFillSelectModal"; @@ -429,6 +432,10 @@ export default { } }); }, + suppleReceipt() { + this.$refs.modalForm5.edit(); + this.$refs.modalForm5.title = "补充入库"; + }, loadData(arg) { if (!this.url.list) { this.$message.error("请设置url.list属性!") 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 1063fca..1258d62 100644 --- a/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue @@ -85,7 +85,9 @@ <div class="table-operator"> <a-button @click="createEmptyIn()" v-has="'taskHeader:emptyIn'" type="primary">空托入库</a-button> <a-button @click="createManyEmptyIn()" v-has="'taskHeader:manyEmptyIn'" type="primary">空托组入库</a-button> - <a-button @click="quickReceipt()" type="primary">快速入库</a-button> + <a-button v-has="'taskHeader:quickReceipt'" @click="quickReceipt()" 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> </div> <!-- table区域-begin --> @@ -178,6 +180,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> + <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> </a-card> </template> @@ -196,12 +200,16 @@ import EmptyInTaskModal from './modules/EmptyInTaskModal' import ManyEmptyInTaskModal from "./modules/ManyEmptyInTaskModal"; import {filterObj} from "@/utils/util"; import MaterialTaskModal from "./modules/MaterialTaskModal"; +import CallReceiptBoxModal from "@views/system/task/modules/CallReceiptBoxModal"; +import CallReceiptEmptyBoxModal from "@views/system/task/modules/CallReceiptEmptyBoxModal"; export default { name: "TaskHeaderList", mixins: [JeecgListMixin], components: { + CallReceiptEmptyBoxModal, + CallReceiptBoxModal, ManyEmptyInTaskModal, EmptyInTaskModal, TaskDetailList, @@ -398,6 +406,14 @@ export default { this.selectedRowKeys = selectedRowKeys; this.selectionRows = selectionRows; }, + callReceiptBox() { + this.$refs.modalForm5.edit(); + this.$refs.modalForm5.title = "呼叫入库有货托盘"; + }, + callReceiptEmptyBox() { + this.$refs.modalForm6.edit(); + this.$refs.modalForm6.title = "呼叫入库空托盘"; + }, loadData(arg) { if (!this.url.list) { this.$message.error("请设置url.list属性!") diff --git a/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue b/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue index a97442f..4778d6c 100644 --- a/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue @@ -85,6 +85,7 @@ <div class="table-operator"> <a-button @click="createEmptyOut()" v-has="'taskHeader:emptyOut'" type="primary">空托出库</a-button> <a-button @click="createManyEmptyOut()" v-has="'taskHeader:manyEmptyOut'" type="primary">空托组出库</a-button> + <a-button v-has="'taskHeader:callShipmentBox'" @click="callShipmentBox()" type="primary" >呼叫出库托盘</a-button> </div> <!-- table区域-begin --> @@ -176,6 +177,7 @@ <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal> <empty-out-task-modal ref="emptyOutModal" @ok="modalFormOk"></empty-out-task-modal> <many-empty-out-task-modal ref="manyEmptyOutModal" @ok="modalFormOk"></many-empty-out-task-modal> + <call-shipment-box-modal ref="modalForm5" @ok="modalFormOk"></call-shipment-box-modal> </a-card> </template> @@ -193,11 +195,13 @@ import {execute} from '@/api/api' import {getZoneList, handleEmptyOut, handlePickupError, handleDoubleIn} from '@/api/api' import EmptyOutTaskModal from './modules/EmptyOutTaskModal' import ManyEmptyOutTaskModal from "./modules/ManyEmptyOutTaskModal"; +import CallShipmentBoxModal from "@views/system/task/modules/CallShipmentBoxModal"; export default { name: "TaskHeaderList", mixins: [JeecgListMixin], components: { + CallShipmentBoxModal, ManyEmptyOutTaskModal, EmptyOutTaskModal, TaskDetailList, @@ -392,6 +396,10 @@ export default { this.selectedRowKeys = selectedRowKeys; this.selectionRows = selectionRows; }, + callShipmentBox() { + this.$refs.modalForm5.edit(); + this.$refs.modalForm5.title = "呼叫出库托盘"; + }, loadFrom() { getZoneList().then((res) => { if (res.success) { diff --git a/ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptBoxModal.vue b/ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptBoxModal.vue new file mode 100644 index 0000000..6e6dab6 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptBoxModal.vue @@ -0,0 +1,140 @@ +<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="containerCode"> + <j-select-multi-some-container v-model="model.containerCode" @change="getPortList" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="入库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="port"> + <a-select + show-search + placeholder="请选择入库口" + option-filter-prop="children" + v-model="model.port"> + <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 {httpAction} from '@/api/manage' +import {validateDuplicateValue} from '@/utils/util' +import {callReceiptBox, selectOutPort, selectPickPort} from '@/api/api' +import JSelectMultiSomeContainer from "@comp/jeecgbiz/JSelectMultiSomeContainer"; + +export default { + name: "CallReceiptBoxModal", + components: {JSelectMultiSomeContainer}, + data() { + return { + title: "操作", + width: 500, + portList: [], + querySource: {}, + visible: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 16}, + }, + + confirmLoading: false, + validatorRules: { + containerCode: [ + {required: true, message: '请输入容器编码!'}, + ], + toPortCode: [ + {required: true, message: '请选择入库口!'}, + ], + }, + url: { + add: "/task/taskHeader/createEmptyOut", + } + + } + }, + created() { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + }, + methods: { + add() { + // $("select").change(function() { alert("选项已被改变"); console.log($('select').val());}); + this.edit(this.modelDefault); + }, + edit() { + // this.getPortList(); + // this.model = Object.assign({}, record); + this.visible = true; + }, + close() { + this.$emit('close'); + this.visible = false; + this.$refs.form.clearValidate(); + }, + getPortList() { + this.querySource.containerCode = this.model.containerCode; + selectPickPort(this.querySource).then((res) => { + if (res.success) { + this.portList = res.result; + this.visible = true; + } + }); + }, + handleOk() { + const that = this; + // 触发表单验证 + this.$refs.form.validate(valid => { + if (valid) { + that.confirmLoading = true; + callReceiptBox(this.model).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.$emit('ok'); + that.model.containerCode = ''; + that.model.port = ''; + } else { + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } else { + return false + } + }) + }, + handleCancel() { + this.close() + }, + + + } +} +</script> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptEmptyBoxModal.vue b/ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptEmptyBoxModal.vue new file mode 100644 index 0000000..59255a4 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptEmptyBoxModal.vue @@ -0,0 +1,140 @@ +<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="containerCode"> + <j-select-multi-empty-container v-model="model.containerCode" @change="getPortList" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="入库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="port"> + <a-select + show-search + placeholder="请选择入库口" + option-filter-prop="children" + v-model="model.port"> + <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 {httpAction} from '@/api/manage' +import {validateDuplicateValue} from '@/utils/util' +import {callReceiptBox, selectOutPort, selectPickPort} from '@/api/api' +import JSelectMultiEmptyContainer from "@comp/jeecgbiz/JSelectMultiEmptyContainer"; + +export default { + name: "CallReceiptEmptyBoxModal", + components: {JSelectMultiEmptyContainer}, + data() { + return { + title: "操作", + width: 500, + portList: [], + querySource: {}, + visible: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 16}, + }, + + confirmLoading: false, + validatorRules: { + containerCode: [ + {required: true, message: '请输入容器编码!'}, + ], + toPortCode: [ + {required: true, message: '请选择入库口!'}, + ], + }, + url: { + add: "/task/taskHeader/createEmptyOut", + } + + } + }, + created() { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + }, + methods: { + add() { + // $("select").change(function() { alert("选项已被改变"); console.log($('select').val());}); + this.edit(this.modelDefault); + }, + edit() { + // this.getPortList(); + // this.model = Object.assign({}, record); + this.visible = true; + }, + close() { + this.$emit('close'); + this.visible = false; + this.$refs.form.clearValidate(); + }, + getPortList() { + this.querySource.containerCode = this.model.containerCode; + selectPickPort(this.querySource).then((res) => { + if (res.success) { + this.portList = res.result; + this.visible = true; + } + }); + }, + handleOk() { + const that = this; + // 触发表单验证 + this.$refs.form.validate(valid => { + if (valid) { + that.confirmLoading = true; + callReceiptBox(this.model).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.$emit('ok'); + that.model.containerCode = ''; + that.model.port = ''; + } else { + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } else { + return false + } + }) + }, + handleCancel() { + this.close() + }, + + + } +} +</script> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/task/modules/CallShipmentBoxModal.vue b/ant-design-vue-jeecg/src/views/system/task/modules/CallShipmentBoxModal.vue new file mode 100644 index 0000000..f6c861f --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/task/modules/CallShipmentBoxModal.vue @@ -0,0 +1,140 @@ +<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="containerCode"> + <j-select-multi-some-container v-model="model.containerCode" @change="getPortList" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="出库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="port"> + <a-select + show-search + placeholder="请选择出库口" + option-filter-prop="children" + v-model="model.port"> + <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 {httpAction} from '@/api/manage' +import {validateDuplicateValue} from '@/utils/util' +import {callShipmentBox, selectOutPort, selectPickPort} from '@/api/api' +import JSelectMultiSomeContainer from "@comp/jeecgbiz/JSelectMultiSomeContainer"; + +export default { + name: "CallShipmentBoxModal", + components: {JSelectMultiSomeContainer}, + data() { + return { + title: "操作", + width: 500, + portList: [], + querySource: {}, + visible: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 16}, + }, + + confirmLoading: false, + validatorRules: { + containerCode: [ + {required: true, message: '请输入容器编码!'}, + ], + toPortCode: [ + {required: true, message: '请选择入库口!'}, + ], + }, + url: { + add: "/task/taskHeader/createEmptyOut", + } + + } + }, + created() { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + }, + methods: { + add() { + // $("select").change(function() { alert("选项已被改变"); console.log($('select').val());}); + this.edit(this.modelDefault); + }, + edit() { + // this.getPortList(); + // this.model = Object.assign({}, record); + this.visible = true; + }, + close() { + this.$emit('close'); + this.visible = false; + this.$refs.form.clearValidate(); + }, + getPortList() { + this.querySource.containerCode = this.model.containerCode; + selectPickPort(this.querySource).then((res) => { + if (res.success) { + this.portList = res.result; + this.visible = true; + } + }); + }, + handleOk() { + const that = this; + // 触发表单验证 + this.$refs.form.validate(valid => { + if (valid) { + that.confirmLoading = true; + callShipmentBox(this.model).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.$emit('ok'); + that.model.containerCode = ''; + that.model.port = ''; + } else { + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } else { + return false + } + }) + }, + handleCancel() { + this.close() + }, + + + } +} +</script> \ No newline at end of file diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java index 4e88245..c7febe3 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java @@ -10,7 +10,7 @@ import lombok.Data; public class CallBoxBean { @ApiModelProperty(value = "托盘号", required = true) private String containerCode; - @ApiModelProperty(value = "库位编码", required = true) + @ApiModelProperty(value = "库位编码") private String locationCode; @ApiModelProperty(value = "任务类型,200补充入, 400分拣出") private int type; diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java index f596674..38f52a7 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java @@ -57,18 +57,13 @@ public class MobileService implements IMobileService { @Transactional(rollbackFor = Exception.class) public Result<TaskHeader> callBox(CallBoxBean bean, String warehouseCode) { String containerCode = bean.getContainerCode(); + if (StringUtils.isEmpty(bean.getContainerCode())) { return Result.error("呼叫料盒,托盘号containerCode不能为空"); } - - if (StringUtils.isEmpty(bean.getLocationCode())) { - return Result.error("呼叫料盒, 库位locationCode不能为空"); - } - if (StringUtils.isEmpty(bean.getCompanyCode())) { - return Result.error("呼叫料盒, 货主companyCode不能为空"); + bean.setCompanyCode(QuantityConstant.DEFAULT_COMPANY); } - if (StringUtils.isEmpty(bean.getPort())) { return Result.error("呼叫料盒, 出库口不能为空"); } @@ -76,6 +71,7 @@ public class MobileService implements IMobileService { if (container == null) { return Result.error("呼叫料盒,容器为空"); } + String fromLocationCode = container.getLocationCode(); String toLocationCode = QuantityConstant.EMPTY_STRING; String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_LOCATION); @@ -102,6 +98,7 @@ public class MobileService implements IMobileService { taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT); taskHeader.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT); } + taskHeader.setCallBox(QuantityConstant.CALL_BOX); taskHeader.setContainerCode(containerCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); taskHeader.setFromLocationCode(fromLocationCode); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryHeaderService.java index ccd31f7..4a822f3 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryHeaderService.java @@ -43,4 +43,6 @@ public interface IInventoryHeaderService extends IService<InventoryHeader> { Result shipmentInventoryHeader(List<InventoryHeader> inventoryHeaderList, String warehouseCode); Result shipmentInventoryDetail(List<InventoryDetail> inventoryDetailList, String warehouseCode); + + boolean updateInventory(Integer inventoryHeaderId, List<InventoryDetail> inventoryDetailList, String containerStatus, String zoneCode, String locationCode); } 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 bd117a6..4baf64e 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 @@ -335,4 +335,32 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe return Result.OK("批量快速出库成功"); } + @Override + public boolean updateInventory(Integer inventoryHeaderId, List<InventoryDetail> inventoryDetailList, String containerStatus, String zoneCode, + String locationCode) { + InventoryHeader inventoryHeader = inventoryHeaderService.getById(inventoryHeaderId); + if (inventoryHeader == null) { + return true; + } + boolean success = inventoryHeaderService.updateInventoryLocationAndZoneById(locationCode, zoneCode, inventoryHeaderId); + if (!success) { + return success; + } + success = inventoryHeaderService.updateContainerStatusById(containerStatus, inventoryHeaderId); + if (!success) { + return success; + } + List<InventoryDetail> updateInventoryDetailList = new ArrayList<>(); + for (InventoryDetail inventoryDetail : inventoryDetailList) { + InventoryDetail inventoryDetail1 = new InventoryDetail(); + inventoryDetail1.setId(inventoryDetail.getId()); + inventoryDetail1.setContainerStatus(containerStatus); + inventoryDetail1.setLocationCode(locationCode); + inventoryDetail1.setZoneCode(zoneCode); + updateInventoryDetailList.add(inventoryDetail1); + } + success = inventoryDetailService.updateBatchById(updateInventoryDetailList); + return success; + } + } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java index 1ae2079..c107910 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java @@ -33,7 +33,6 @@ import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson.JSON; @@ -146,37 +145,54 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai if (!StringUtils.isEmpty(receiptContainerHeader.getContainerFillStatus())) { containerFillStatus = receiptContainerHeader.getContainerFillStatus(); } - // 锁定容器和库位 - Result result = taskHeaderService.createTaskLockContainerAndLocation(taskType, containerCode, fromLocationCode, toLocationCode, warehouseCode); - if (!result.isSuccess()) { - throw new JeecgBootException(result.getMessage()); - } - TaskLockEntity taskLockEntity = (TaskLockEntity)result.getResult(); - String zoneCode = taskLockEntity.getZoneCode(); - TaskHeader taskHeader = new TaskHeader(); - taskHeader.setContainerCode(containerCode); - taskHeader.setContainerFillStatus(containerFillStatus); - taskHeader.setTaskType(receiptContainerHeader.getTaskType()); - taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); - taskHeader.setFromLocationCode(fromLocationCode); - taskHeader.setToLocationCode(toLocationCode); - taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); - taskHeader.setCompanyCode(receiptContainerHeader.getCompanyCode()); - taskHeader.setReceiptContainerHeaderId(receiptContainerHeader.getId()); - taskHeader.setWarehouseCode(warehouseCode); - taskHeader.setZoneCode(zoneCode); - taskHeader.setToPortCode(receiptContainerHeader.getToPort()); - success = taskHeaderService.save(taskHeader); - if (!success) { - throw new JeecgBootException("创建入库任务, 任务生成失败"); + int taskHeaderId = 0; + TaskHeader taskHeader = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); + if (taskHeader == null) { + // 锁定容器和库位 + Result result = taskHeaderService.createTaskLockContainerAndLocation(taskType, containerCode, fromLocationCode, toLocationCode, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + TaskLockEntity taskLockEntity = (TaskLockEntity)result.getResult(); + String zoneCode = taskLockEntity.getZoneCode(); + taskHeader = new TaskHeader(); + taskHeader.setContainerCode(containerCode); + taskHeader.setContainerFillStatus(containerFillStatus); + taskHeader.setTaskType(receiptContainerHeader.getTaskType()); + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); + taskHeader.setFromLocationCode(fromLocationCode); + taskHeader.setToLocationCode(toLocationCode); + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); + taskHeader.setCompanyCode(receiptContainerHeader.getCompanyCode()); + taskHeader.setReceiptContainerHeaderId(receiptContainerHeader.getId()); + taskHeader.setWarehouseCode(warehouseCode); + taskHeader.setZoneCode(zoneCode); + taskHeader.setToPortCode(receiptContainerHeader.getToPort()); + success = taskHeaderService.save(taskHeader); + if (!success) { + throw new JeecgBootException("创建入库任务, 任务生成失败"); + } + taskHeaderId = taskHeader.getId(); + } else { + taskHeaderId = taskHeader.getId(); + if (taskHeader.getCallBox() == QuantityConstant.NOT_CALL_BOX) { + throw new JeecgBootException("创建入库任务, 没有呼叫料盒标记"); + } + TaskHeader taskHeader1 = new TaskHeader(); + taskHeader1.setId(taskHeaderId); + taskHeader1.setReceiptContainerHeaderId(receiptContainerHeader.getId()); + taskHeader1.setContainerFillStatus(containerFillStatus); + success = taskHeaderService.updateById(taskHeader1); + if (!success) { + throw new JeecgBootException("创建入库任务, 任务更新失败"); + } } - int taskHeaderId = taskHeader.getId(); List<TaskDetail> taskDetailList = new ArrayList<>(); List<ReceiptDetail> receiptDetailList = new ArrayList<>(); for (ReceiptContainerDetail receiptContainerDetail : receiptContainerDetailList) { TaskDetail taskDetail = new TaskDetail(); taskDetail.setTaskHeaderId(taskHeaderId); - taskDetail.setTaskType(taskHeader.getTaskType()); + taskDetail.setTaskType(receiptContainerHeader.getTaskType()); taskDetail.setWarehouseCode(receiptContainerDetail.getWarehouseCode()); taskDetail.setReceiptId(receiptContainerDetail.getReceiptId()); taskDetail.setReceiptDetailId(receiptContainerDetail.getReceiptDetailId()); @@ -211,15 +227,6 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai if (!success) { throw new JeecgBootException("创建入库任务, 任务详情生成失败"); } -// if (receiptContainerHeader.getTaskType() == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) { -// // 如果是空托盘,那么不需要更新库存 -// if (!containerFillStatus.equals(QuantityConstant.STATUS_CONTAINER_FILL_EMPTY)) { -// success = inventoryHeaderService.updateInventoryContainerStatusByContainerCode(containerCode, warehouseCode); -// if (!success) { -// throw new JeecgBootException("创建入库任务, 更新库存头失败"); -// } -// } -// } success = receiptContainerHeaderService.updateToPortAndStatus(receiptContainerHeader.getToPort(), QuantityConstant.RECEIPT_CONTAINER_TASK, receiptContainerHeader.getId()); if (!success) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java index 39ed670..38f6c03 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java @@ -30,6 +30,7 @@ import org.jeecg.modules.wms.receipt.receiving.service.IReceiveService; import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerHeader; import org.jeecg.modules.wms.shipment.shipmentContainerHeader.service.IShipmentContainerHeaderService; 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.springframework.stereotype.Service; @@ -79,6 +80,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl private IReceiveService receiveService; @Resource private IShipmentContainerHeaderService shipmentContainerHeaderService; + @Resource + private ITaskHeaderService taskHeaderService; /** * 组盘后自动生成任务,返回任务实体 @@ -124,13 +127,21 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl if (container == null) { return Result.error("入库组盘,根据容器编码 " + containerCode + ", 没有找到容器"); } - String containerStatus = container.getStatus(); - if (containerStatus.equals(QuantityConstant.STATUS_CONTAINER_LOCK)) { - return Result.error("入库组盘,容器被锁定不能用于收货" + containerCode); + int callBox = QuantityConstant.NOT_CALL_BOX; + TaskHeader callBoxTask = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); + if (callBoxTask != null) { + callBox = callBoxTask.getCallBox(); } - String containerFillStatus = container.getFillStatus(); - if (!StringUtils.isEmpty(containerFillStatus) && containerFillStatus.equals(QuantityConstant.STATUS_CONTAINER_FILL_FULL)) { - return Result.error("入库组盘,容器已经是满盘不能用于收货" + containerCode); + // 如果不是呼叫料盒,那么要判断容器状态 + if (callBox == QuantityConstant.NOT_CALL_BOX) { + String containerStatus = container.getStatus(); + if (containerStatus.equals(QuantityConstant.STATUS_CONTAINER_LOCK)) { + return Result.error("入库组盘,容器被锁定不能用于收货" + containerCode); + } + String containerFillStatus = container.getFillStatus(); + if (!StringUtils.isEmpty(containerFillStatus) && containerFillStatus.equals(QuantityConstant.STATUS_CONTAINER_FILL_FULL)) { + return Result.error("入库组盘,容器已经是满盘不能用于收货" + containerCode); + } } String containerTypeCode = container.getContainerTypeCode(); if (StringUtils.isEmpty(containerTypeCode)) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java index 0dfd7c5..cf24871 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java @@ -393,7 +393,7 @@ public class ShipmentHeaderController extends JeecgController<ShipmentHeader, IS @ApiLogger(apiName = "PDA出库-呼叫料盒", from = "PDA") public Result<TaskHeader> callBox(@RequestBody CallBoxBean bean, HttpServletRequest req) { String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); - // 补充入库类型 + // 分拣出库类型 bean.setType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT); Result result = huahengMultiHandlerService.callBox(bean, warehouseCode); return result; 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 e65b56a..502e6f2 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 @@ -360,7 +360,7 @@ public class ShipmentHeaderServiceImpl extends ServiceImpl<ShipmentHeaderMapper, } Port port = portService.getPortByCode(toPort, warehouseCode); if (port == null) { - return Result.error("自动出库, 出库口为空"); + return Result.error("自动出库, 没有找到出库口"); } int type = Integer.parseInt(port.getType()); if (type == QuantityConstant.PORT_TYPE_IN) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java index 007dd64..fe401de 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java @@ -144,6 +144,8 @@ public class TaskHeader implements Serializable { private Integer exceptionState; @ApiModelProperty(value = "巷道") private Integer roadWay; + @ApiModelProperty(value = "呼叫料盒") + private Integer callBox; /** 备用字段1 */ @Excel(name = "备用字段1", width = 15) @ApiModelProperty(value = "备用字段1") 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 d3483f1..af93cc1 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 @@ -1077,7 +1077,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea inventoryHeader.setContainerStatus(QuantityConstant.STATUS_CONTAINER_EMPTY); inventoryHeader.setEnable(QuantityConstant.STATUS_ENABLE); if (!inventoryHeaderService.save(inventoryHeader)) { - throw new JeecgBootException("添加库存头失败"); + throw new JeecgBootException("完成入库任务时, 添加库存头失败"); } } @@ -1410,6 +1410,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (!result.isSuccess()) { throw new JeecgBootException(result.getMessage()); } + success = + inventoryHeaderService.updateInventory(inventoryHeader.getId(), inventoryDetailList, QuantityConstant.STATUS_CONTAINER_EMPTY, zoneCode, toLocationCode); + if (!success) { + throw new JeecgBootException("完成出库任务,更新库存状态失败"); + } success = taskHeaderService.updateStatusById(QuantityConstant.TASK_STATUS_COMPLETED, taskHeader.getId()); if (!success) { throw new JeecgBootException("完成出库任务,保存任务头失败"); @@ -2603,9 +2608,12 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea @Transactional(rollbackFor = Exception.class) public Result cancelReceiptTask(TaskHeader taskHeader) { log.info("开始取消入库任务"); - boolean success = receiptContainerHeaderService.cancelReceiptTask(taskHeader); - if (!success) { - throw new JeecgBootException("取消入库任务时, 更新组盘头状态失败"); + int callBox = taskHeader.getCallBox(); + if (callBox == QuantityConstant.NOT_CALL_BOX) { + boolean success = receiptContainerHeaderService.cancelReceiptTask(taskHeader); + if (!success) { + throw new JeecgBootException("取消入库任务时, 更新组盘头状态失败"); + } } log.info("完成取消入库任务"); return Result.ok("取消入库任务成功"); @@ -2619,10 +2627,15 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea @Override @Transactional(rollbackFor = Exception.class) public Result cancelShipmentTask(TaskHeader taskHeader) { - boolean success = shipmentContainerHeaderService.cancelShipmentTask(taskHeader); - if (!success) { - throw new JeecgBootException("取消出库任务时, 更新组盘头状态失败"); + log.info("开始取消出库任务"); + int callBox = taskHeader.getCallBox(); + if (callBox == QuantityConstant.NOT_CALL_BOX) { + boolean success = shipmentContainerHeaderService.cancelShipmentTask(taskHeader); + if (!success) { + throw new JeecgBootException("取消出库任务时, 更新组盘头状态失败"); + } } + log.info("完成取消出库任务"); return Result.ok("取消出库任务成功"); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java index ed86acf..a06a598 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java @@ -29,7 +29,7 @@ public class QuantityConstant { // 等待审核 public static final Integer RECEIPT_HEADER_VERIFYING = 10; - //审核完成 + // 审核完成 public static final Integer RECEIPT_HEADER_FINSH = 15; // 驳回 @@ -79,7 +79,7 @@ public class QuantityConstant { // 等待审核 public static final Integer SHIPMENT_HEADER_VERIFYING = 10; - //审核完成 + // 审核完成 public static final Integer SHIPMENT_HEADER_FINSH = 15; // 驳回 @@ -108,7 +108,7 @@ public class QuantityConstant { // 过账 public static final Integer SHIPMENT_HEADER_COMPLETED = 800; - + // 已合并 public static final Integer SHIPMENT_HEADER_MERGED = 810; @@ -391,13 +391,11 @@ public class QuantityConstant { // 出库单审核流程 public static final Integer SHIPMENT_AUDIT = 2; - //审核通过 + // 审核通过 public static final Integer AUDIT_YES_STATUS = 1; - //审核驳回 + // 审核驳回 public static final Integer AUDIT_NO_STATUS = 2; - - // WCS库位信息查询 public static final String ADDRESS_WCS_LOCATION_INFO = "WCS_LOCATION_INFO"; @@ -619,7 +617,10 @@ public class QuantityConstant { * 受控,受控的库存详情不能出库 */ public static final int CONTROLLER_ENABLE = 1; - + + public static final int NOT_CALL_BOX = 0; + public static final int CALL_BOX = 1; + /** 默认库区编码 */ public static final String DEFAULT_ZONE_CODE = "Default"; }