Commit 972d4dadd9700b0b997b60fcbd09b9dfa8e29761

Authored by 陈翱
2 parents e5d626e1 22fea185

Merge remote-tracking branch 'origin/develop' into develop

Showing 19 changed files with 585 additions and 69 deletions
ant-design-vue-jeecg/src/api/api.js
... ... @@ -244,6 +244,10 @@ export const quickReceipt = (params) => postAction("/task/taskHeader/quickReceip
244 244 export const shipmentInventoryHeader = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryHeader', params);
245 245 //快速出库,批量快速出库存详情
246 246 export const shipmentInventoryDetail = (params) => postAction('/inventory/inventoryHeader/shipmentInventoryDetail', params);
  247 +//呼叫入库托盘
  248 +export const callReceiptBox = (params) => postAction('/receipt/receiptHeader/callbox', params);
  249 +//呼叫出库托盘
  250 +export const callShipmentBox = (params) => postAction('/shipment/shipmentHeader/callbox', params);
247 251 // 中转HTTP请求
248 252 export const transitRESTful = {
249 253 get: (url, parameter) => getAction(getTransitURL(url), parameter),
... ...
ant-design-vue-jeecg/src/components/jeecgbiz/JSelectMultiSomeContainer.vue
... ... @@ -47,8 +47,8 @@ export default {
47 47 // 多条件查询配置
48 48 queryConfigDefault: [
49 49 {
50   - key: 'locationCode',
51   - label: '库位编码',
  50 + key: 'materialCode',
  51 + label: '物料编码',
52 52 },
53 53 ],
54 54 }
... ...
ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue
... ... @@ -74,6 +74,7 @@
74 74 </a-upload>
75 75 <a-button v-has="'receiptContainerHeader:createTask'" @click="createBatchTask" type="primary" >批量生成任务</a-button>
76 76 <a-button v-has="'receiptContainerHeader:delete'" @click="cancelBatchTask" type="primary" >批量取消组盘</a-button>
  77 + <a-button v-has="'receiptContainerHeader:suppleReceipt'" @click="suppleReceipt" type="primary" >补充入库</a-button>
77 78 </div>
78 79  
79 80 <!-- table区域-begin -->
... ... @@ -148,6 +149,7 @@
148 149 <receiptContainerSelect-modal ref="modalForm2" @ok="modalFormOk"></receiptContainerSelect-modal>
149 150 <receiptContainerFillSelect-modal ref="modalForm3" @ok="modalFormOk"></receiptContainerFillSelect-modal>
150 151 <receiptContainerStatusSelect-modal ref="modalForm4" @ok="modalFormOk"></receiptContainerStatusSelect-modal>
  152 +
151 153 </a-card>
152 154 </template>
153 155  
... ... @@ -159,6 +161,7 @@ import {deleteAction, getAction} from &#39;@/api/manage&#39;
159 161 import ReceiptContainerDetailList from './ReceiptContainerDetailList'
160 162 import {initDictOptions, filterMultiDictText} from '@/components/dict/JDictSelectUtil'
161 163 import '@/assets/less/TableExpand.less'
  164 +import '@/assets/less/TableExpand.less'
162 165 import {createReceiptTask, createReceiptBatchTask} from '@/api/api'
163 166 import ReceiptContainerSelectModal from "./modules/ReceiptContainerSelectModal";
164 167 import ReceiptContainerFillSelectModal from "./modules/ReceiptContainerFillSelectModal";
... ... @@ -429,6 +432,10 @@ export default {
429 432 }
430 433 });
431 434 },
  435 + suppleReceipt() {
  436 + this.$refs.modalForm5.edit();
  437 + this.$refs.modalForm5.title = "补充入库";
  438 + },
432 439 loadData(arg) {
433 440 if (!this.url.list) {
434 441 this.$message.error("请设置url.list属性!")
... ...
ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue
... ... @@ -85,7 +85,9 @@
85 85 <div class="table-operator">
86 86 <a-button @click="createEmptyIn()" v-has="'taskHeader:emptyIn'" type="primary">空托入库</a-button>
87 87 <a-button @click="createManyEmptyIn()" v-has="'taskHeader:manyEmptyIn'" type="primary">空托组入库</a-button>
88   - <a-button @click="quickReceipt()" type="primary">快速入库</a-button>
  88 + <a-button v-has="'taskHeader:quickReceipt'" @click="quickReceipt()" type="primary">快速入库</a-button>
  89 + <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptBox()" type="primary" >呼叫入库有货托盘</a-button>
  90 + <a-button v-has="'taskHeader:callReceiptBox'" @click="callReceiptEmptyBox()" type="primary" >呼叫入库空托盘</a-button>
89 91 </div>
90 92  
91 93 <!-- table区域-begin -->
... ... @@ -178,6 +180,8 @@
178 180 <empty-in-task-modal ref="emptyInModal" @ok="modalFormOk"></empty-in-task-modal>
179 181 <many-empty-in-task-modal ref="manyEmptyInModal" @ok="modalFormOk"></many-empty-in-task-modal>
180 182 <MaterialTaskModal ref="materialTaskModal" @ok="modalFormOk"></MaterialTaskModal>
  183 + <call-receipt-box-modal ref="modalForm5" @ok="modalFormOk"></call-receipt-box-modal>
  184 + <call-receipt-empty-box-modal ref="modalForm6" @ok="modalFormOk"></call-receipt-empty-box-modal>
181 185 </a-card>
182 186 </template>
183 187  
... ... @@ -196,12 +200,16 @@ import EmptyInTaskModal from &#39;./modules/EmptyInTaskModal&#39;
196 200 import ManyEmptyInTaskModal from "./modules/ManyEmptyInTaskModal";
197 201 import {filterObj} from "@/utils/util";
198 202 import MaterialTaskModal from "./modules/MaterialTaskModal";
  203 +import CallReceiptBoxModal from "@views/system/task/modules/CallReceiptBoxModal";
  204 +import CallReceiptEmptyBoxModal from "@views/system/task/modules/CallReceiptEmptyBoxModal";
199 205  
200 206  
201 207 export default {
202 208 name: "TaskHeaderList",
203 209 mixins: [JeecgListMixin],
204 210 components: {
  211 + CallReceiptEmptyBoxModal,
  212 + CallReceiptBoxModal,
205 213 ManyEmptyInTaskModal,
206 214 EmptyInTaskModal,
207 215 TaskDetailList,
... ... @@ -398,6 +406,14 @@ export default {
398 406 this.selectedRowKeys = selectedRowKeys;
399 407 this.selectionRows = selectionRows;
400 408 },
  409 + callReceiptBox() {
  410 + this.$refs.modalForm5.edit();
  411 + this.$refs.modalForm5.title = "呼叫入库有货托盘";
  412 + },
  413 + callReceiptEmptyBox() {
  414 + this.$refs.modalForm6.edit();
  415 + this.$refs.modalForm6.title = "呼叫入库空托盘";
  416 + },
401 417 loadData(arg) {
402 418 if (!this.url.list) {
403 419 this.$message.error("请设置url.list属性!")
... ...
ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue
... ... @@ -85,6 +85,7 @@
85 85 <div class="table-operator">
86 86 <a-button @click="createEmptyOut()" v-has="'taskHeader:emptyOut'" type="primary">空托出库</a-button>
87 87 <a-button @click="createManyEmptyOut()" v-has="'taskHeader:manyEmptyOut'" type="primary">空托组出库</a-button>
  88 + <a-button v-has="'taskHeader:callShipmentBox'" @click="callShipmentBox()" type="primary" >呼叫出库托盘</a-button>
88 89 </div>
89 90  
90 91 <!-- table区域-begin -->
... ... @@ -176,6 +177,7 @@
176 177 <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal>
177 178 <empty-out-task-modal ref="emptyOutModal" @ok="modalFormOk"></empty-out-task-modal>
178 179 <many-empty-out-task-modal ref="manyEmptyOutModal" @ok="modalFormOk"></many-empty-out-task-modal>
  180 + <call-shipment-box-modal ref="modalForm5" @ok="modalFormOk"></call-shipment-box-modal>
179 181  
180 182 </a-card>
181 183 </template>
... ... @@ -193,11 +195,13 @@ import {execute} from &#39;@/api/api&#39;
193 195 import {getZoneList, handleEmptyOut, handlePickupError, handleDoubleIn} from '@/api/api'
194 196 import EmptyOutTaskModal from './modules/EmptyOutTaskModal'
195 197 import ManyEmptyOutTaskModal from "./modules/ManyEmptyOutTaskModal";
  198 +import CallShipmentBoxModal from "@views/system/task/modules/CallShipmentBoxModal";
196 199  
197 200 export default {
198 201 name: "TaskHeaderList",
199 202 mixins: [JeecgListMixin],
200 203 components: {
  204 + CallShipmentBoxModal,
201 205 ManyEmptyOutTaskModal,
202 206 EmptyOutTaskModal,
203 207 TaskDetailList,
... ... @@ -392,6 +396,10 @@ export default {
392 396 this.selectedRowKeys = selectedRowKeys;
393 397 this.selectionRows = selectionRows;
394 398 },
  399 + callShipmentBox() {
  400 + this.$refs.modalForm5.edit();
  401 + this.$refs.modalForm5.title = "呼叫出库托盘";
  402 + },
395 403 loadFrom() {
396 404 getZoneList().then((res) => {
397 405 if (res.success) {
... ...
ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptBoxModal.vue 0 → 100644
  1 +<template>
  2 + <j-modal
  3 + :title="title"
  4 + :width="width"
  5 + :visible="visible"
  6 + :confirmLoading="confirmLoading"
  7 + switchFullscreen
  8 + @ok="handleOk"
  9 + @cancel="handleCancel"
  10 + cancelText="关闭">
  11 + <a-spin :spinning="confirmLoading">
  12 + <a-form-model ref="form" :model="model" :rules="validatorRules">
  13 + <a-row>
  14 + <a-col :span="24">
  15 + <a-form-model-item label="容器编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode">
  16 + <j-select-multi-some-container v-model="model.containerCode" @change="getPortList" />
  17 + </a-form-model-item>
  18 + </a-col>
  19 + <a-col :span="24">
  20 + <a-form-model-item label="入库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="port">
  21 + <a-select
  22 + show-search
  23 + placeholder="请选择入库口"
  24 + option-filter-prop="children"
  25 + v-model="model.port">
  26 + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{
  27 + item.name
  28 + }}
  29 + </a-select-option>
  30 + </a-select>
  31 + </a-form-model-item>
  32 + </a-col>
  33 + </a-row>
  34 + </a-form-model>
  35 + </a-spin>
  36 + </j-modal>
  37 +</template>
  38 +
  39 +<script>
  40 +
  41 +import {httpAction} from '@/api/manage'
  42 +import {validateDuplicateValue} from '@/utils/util'
  43 +import {callReceiptBox, selectOutPort, selectPickPort} from '@/api/api'
  44 +import JSelectMultiSomeContainer from "@comp/jeecgbiz/JSelectMultiSomeContainer";
  45 +
  46 +export default {
  47 + name: "CallReceiptBoxModal",
  48 + components: {JSelectMultiSomeContainer},
  49 + data() {
  50 + return {
  51 + title: "操作",
  52 + width: 500,
  53 + portList: [],
  54 + querySource: {},
  55 + visible: false,
  56 + model: {},
  57 + labelCol: {
  58 + xs: {span: 24},
  59 + sm: {span: 5},
  60 + },
  61 + wrapperCol: {
  62 + xs: {span: 24},
  63 + sm: {span: 16},
  64 + },
  65 +
  66 + confirmLoading: false,
  67 + validatorRules: {
  68 + containerCode: [
  69 + {required: true, message: '请输入容器编码!'},
  70 + ],
  71 + toPortCode: [
  72 + {required: true, message: '请选择入库口!'},
  73 + ],
  74 + },
  75 + url: {
  76 + add: "/task/taskHeader/createEmptyOut",
  77 + }
  78 +
  79 + }
  80 + },
  81 + created() {
  82 + //备份model原始值
  83 + this.modelDefault = JSON.parse(JSON.stringify(this.model));
  84 + },
  85 + methods: {
  86 + add() {
  87 + // $("select").change(function() { alert("选项已被改变"); console.log($('select').val());});
  88 + this.edit(this.modelDefault);
  89 + },
  90 + edit() {
  91 + // this.getPortList();
  92 + // this.model = Object.assign({}, record);
  93 + this.visible = true;
  94 + },
  95 + close() {
  96 + this.$emit('close');
  97 + this.visible = false;
  98 + this.$refs.form.clearValidate();
  99 + },
  100 + getPortList() {
  101 + this.querySource.containerCode = this.model.containerCode;
  102 + selectPickPort(this.querySource).then((res) => {
  103 + if (res.success) {
  104 + this.portList = res.result;
  105 + this.visible = true;
  106 + }
  107 + });
  108 + },
  109 + handleOk() {
  110 + const that = this;
  111 + // 触发表单验证
  112 + this.$refs.form.validate(valid => {
  113 + if (valid) {
  114 + that.confirmLoading = true;
  115 + callReceiptBox(this.model).then((res) => {
  116 + if (res.success) {
  117 + that.$message.success(res.message);
  118 + that.$emit('ok');
  119 + that.model.containerCode = '';
  120 + that.model.port = '';
  121 + } else {
  122 + that.$message.warning(res.message);
  123 + }
  124 + }).finally(() => {
  125 + that.confirmLoading = false;
  126 + that.close();
  127 + })
  128 + } else {
  129 + return false
  130 + }
  131 + })
  132 + },
  133 + handleCancel() {
  134 + this.close()
  135 + },
  136 +
  137 +
  138 + }
  139 +}
  140 +</script>
0 141 \ No newline at end of file
... ...
ant-design-vue-jeecg/src/views/system/task/modules/CallReceiptEmptyBoxModal.vue 0 → 100644
  1 +<template>
  2 + <j-modal
  3 + :title="title"
  4 + :width="width"
  5 + :visible="visible"
  6 + :confirmLoading="confirmLoading"
  7 + switchFullscreen
  8 + @ok="handleOk"
  9 + @cancel="handleCancel"
  10 + cancelText="关闭">
  11 + <a-spin :spinning="confirmLoading">
  12 + <a-form-model ref="form" :model="model" :rules="validatorRules">
  13 + <a-row>
  14 + <a-col :span="24">
  15 + <a-form-model-item label="容器编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode">
  16 + <j-select-multi-empty-container v-model="model.containerCode" @change="getPortList" />
  17 + </a-form-model-item>
  18 + </a-col>
  19 + <a-col :span="24">
  20 + <a-form-model-item label="入库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="port">
  21 + <a-select
  22 + show-search
  23 + placeholder="请选择入库口"
  24 + option-filter-prop="children"
  25 + v-model="model.port">
  26 + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{
  27 + item.name
  28 + }}
  29 + </a-select-option>
  30 + </a-select>
  31 + </a-form-model-item>
  32 + </a-col>
  33 + </a-row>
  34 + </a-form-model>
  35 + </a-spin>
  36 + </j-modal>
  37 +</template>
  38 +
  39 +<script>
  40 +
  41 +import {httpAction} from '@/api/manage'
  42 +import {validateDuplicateValue} from '@/utils/util'
  43 +import {callReceiptBox, selectOutPort, selectPickPort} from '@/api/api'
  44 +import JSelectMultiEmptyContainer from "@comp/jeecgbiz/JSelectMultiEmptyContainer";
  45 +
  46 +export default {
  47 + name: "CallReceiptEmptyBoxModal",
  48 + components: {JSelectMultiEmptyContainer},
  49 + data() {
  50 + return {
  51 + title: "操作",
  52 + width: 500,
  53 + portList: [],
  54 + querySource: {},
  55 + visible: false,
  56 + model: {},
  57 + labelCol: {
  58 + xs: {span: 24},
  59 + sm: {span: 5},
  60 + },
  61 + wrapperCol: {
  62 + xs: {span: 24},
  63 + sm: {span: 16},
  64 + },
  65 +
  66 + confirmLoading: false,
  67 + validatorRules: {
  68 + containerCode: [
  69 + {required: true, message: '请输入容器编码!'},
  70 + ],
  71 + toPortCode: [
  72 + {required: true, message: '请选择入库口!'},
  73 + ],
  74 + },
  75 + url: {
  76 + add: "/task/taskHeader/createEmptyOut",
  77 + }
  78 +
  79 + }
  80 + },
  81 + created() {
  82 + //备份model原始值
  83 + this.modelDefault = JSON.parse(JSON.stringify(this.model));
  84 + },
  85 + methods: {
  86 + add() {
  87 + // $("select").change(function() { alert("选项已被改变"); console.log($('select').val());});
  88 + this.edit(this.modelDefault);
  89 + },
  90 + edit() {
  91 + // this.getPortList();
  92 + // this.model = Object.assign({}, record);
  93 + this.visible = true;
  94 + },
  95 + close() {
  96 + this.$emit('close');
  97 + this.visible = false;
  98 + this.$refs.form.clearValidate();
  99 + },
  100 + getPortList() {
  101 + this.querySource.containerCode = this.model.containerCode;
  102 + selectPickPort(this.querySource).then((res) => {
  103 + if (res.success) {
  104 + this.portList = res.result;
  105 + this.visible = true;
  106 + }
  107 + });
  108 + },
  109 + handleOk() {
  110 + const that = this;
  111 + // 触发表单验证
  112 + this.$refs.form.validate(valid => {
  113 + if (valid) {
  114 + that.confirmLoading = true;
  115 + callReceiptBox(this.model).then((res) => {
  116 + if (res.success) {
  117 + that.$message.success(res.message);
  118 + that.$emit('ok');
  119 + that.model.containerCode = '';
  120 + that.model.port = '';
  121 + } else {
  122 + that.$message.warning(res.message);
  123 + }
  124 + }).finally(() => {
  125 + that.confirmLoading = false;
  126 + that.close();
  127 + })
  128 + } else {
  129 + return false
  130 + }
  131 + })
  132 + },
  133 + handleCancel() {
  134 + this.close()
  135 + },
  136 +
  137 +
  138 + }
  139 +}
  140 +</script>
0 141 \ No newline at end of file
... ...
ant-design-vue-jeecg/src/views/system/task/modules/CallShipmentBoxModal.vue 0 → 100644
  1 +<template>
  2 + <j-modal
  3 + :title="title"
  4 + :width="width"
  5 + :visible="visible"
  6 + :confirmLoading="confirmLoading"
  7 + switchFullscreen
  8 + @ok="handleOk"
  9 + @cancel="handleCancel"
  10 + cancelText="关闭">
  11 + <a-spin :spinning="confirmLoading">
  12 + <a-form-model ref="form" :model="model" :rules="validatorRules">
  13 + <a-row>
  14 + <a-col :span="24">
  15 + <a-form-model-item label="容器编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode">
  16 + <j-select-multi-some-container v-model="model.containerCode" @change="getPortList" />
  17 + </a-form-model-item>
  18 + </a-col>
  19 + <a-col :span="24">
  20 + <a-form-model-item label="出库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="port">
  21 + <a-select
  22 + show-search
  23 + placeholder="请选择出库口"
  24 + option-filter-prop="children"
  25 + v-model="model.port">
  26 + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{
  27 + item.name
  28 + }}
  29 + </a-select-option>
  30 + </a-select>
  31 + </a-form-model-item>
  32 + </a-col>
  33 + </a-row>
  34 + </a-form-model>
  35 + </a-spin>
  36 + </j-modal>
  37 +</template>
  38 +
  39 +<script>
  40 +
  41 +import {httpAction} from '@/api/manage'
  42 +import {validateDuplicateValue} from '@/utils/util'
  43 +import {callShipmentBox, selectOutPort, selectPickPort} from '@/api/api'
  44 +import JSelectMultiSomeContainer from "@comp/jeecgbiz/JSelectMultiSomeContainer";
  45 +
  46 +export default {
  47 + name: "CallShipmentBoxModal",
  48 + components: {JSelectMultiSomeContainer},
  49 + data() {
  50 + return {
  51 + title: "操作",
  52 + width: 500,
  53 + portList: [],
  54 + querySource: {},
  55 + visible: false,
  56 + model: {},
  57 + labelCol: {
  58 + xs: {span: 24},
  59 + sm: {span: 5},
  60 + },
  61 + wrapperCol: {
  62 + xs: {span: 24},
  63 + sm: {span: 16},
  64 + },
  65 +
  66 + confirmLoading: false,
  67 + validatorRules: {
  68 + containerCode: [
  69 + {required: true, message: '请输入容器编码!'},
  70 + ],
  71 + toPortCode: [
  72 + {required: true, message: '请选择入库口!'},
  73 + ],
  74 + },
  75 + url: {
  76 + add: "/task/taskHeader/createEmptyOut",
  77 + }
  78 +
  79 + }
  80 + },
  81 + created() {
  82 + //备份model原始值
  83 + this.modelDefault = JSON.parse(JSON.stringify(this.model));
  84 + },
  85 + methods: {
  86 + add() {
  87 + // $("select").change(function() { alert("选项已被改变"); console.log($('select').val());});
  88 + this.edit(this.modelDefault);
  89 + },
  90 + edit() {
  91 + // this.getPortList();
  92 + // this.model = Object.assign({}, record);
  93 + this.visible = true;
  94 + },
  95 + close() {
  96 + this.$emit('close');
  97 + this.visible = false;
  98 + this.$refs.form.clearValidate();
  99 + },
  100 + getPortList() {
  101 + this.querySource.containerCode = this.model.containerCode;
  102 + selectPickPort(this.querySource).then((res) => {
  103 + if (res.success) {
  104 + this.portList = res.result;
  105 + this.visible = true;
  106 + }
  107 + });
  108 + },
  109 + handleOk() {
  110 + const that = this;
  111 + // 触发表单验证
  112 + this.$refs.form.validate(valid => {
  113 + if (valid) {
  114 + that.confirmLoading = true;
  115 + callShipmentBox(this.model).then((res) => {
  116 + if (res.success) {
  117 + that.$message.success(res.message);
  118 + that.$emit('ok');
  119 + that.model.containerCode = '';
  120 + that.model.port = '';
  121 + } else {
  122 + that.$message.warning(res.message);
  123 + }
  124 + }).finally(() => {
  125 + that.confirmLoading = false;
  126 + that.close();
  127 + })
  128 + } else {
  129 + return false
  130 + }
  131 + })
  132 + },
  133 + handleCancel() {
  134 + this.close()
  135 + },
  136 +
  137 +
  138 + }
  139 +}
  140 +</script>
0 141 \ No newline at end of file
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java
... ... @@ -10,7 +10,7 @@ import lombok.Data;
10 10 public class CallBoxBean {
11 11 @ApiModelProperty(value = "托盘号", required = true)
12 12 private String containerCode;
13   - @ApiModelProperty(value = "库位编码", required = true)
  13 + @ApiModelProperty(value = "库位编码")
14 14 private String locationCode;
15 15 @ApiModelProperty(value = "任务类型,200补充入, 400分拣出")
16 16 private int type;
... ...
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 {
57 57 @Transactional(rollbackFor = Exception.class)
58 58 public Result<TaskHeader> callBox(CallBoxBean bean, String warehouseCode) {
59 59 String containerCode = bean.getContainerCode();
  60 +
60 61 if (StringUtils.isEmpty(bean.getContainerCode())) {
61 62 return Result.error("呼叫料盒,托盘号containerCode不能为空");
62 63 }
63   -
64   - if (StringUtils.isEmpty(bean.getLocationCode())) {
65   - return Result.error("呼叫料盒, 库位locationCode不能为空");
66   - }
67   -
68 64 if (StringUtils.isEmpty(bean.getCompanyCode())) {
69   - return Result.error("呼叫料盒, 货主companyCode不能为空");
  65 + bean.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
70 66 }
71   -
72 67 if (StringUtils.isEmpty(bean.getPort())) {
73 68 return Result.error("呼叫料盒, 出库口不能为空");
74 69 }
... ... @@ -76,6 +71,7 @@ public class MobileService implements IMobileService {
76 71 if (container == null) {
77 72 return Result.error("呼叫料盒,容器为空");
78 73 }
  74 +
79 75 String fromLocationCode = container.getLocationCode();
80 76 String toLocationCode = QuantityConstant.EMPTY_STRING;
81 77 String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_LOCATION);
... ... @@ -102,6 +98,7 @@ public class MobileService implements IMobileService {
102 98 taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT);
103 99 taskHeader.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
104 100 }
  101 + taskHeader.setCallBox(QuantityConstant.CALL_BOX);
105 102 taskHeader.setContainerCode(containerCode);
106 103 taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
107 104 taskHeader.setFromLocationCode(fromLocationCode);
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryHeaderService.java
... ... @@ -43,4 +43,6 @@ public interface IInventoryHeaderService extends IService&lt;InventoryHeader&gt; {
43 43 Result shipmentInventoryHeader(List<InventoryHeader> inventoryHeaderList, String warehouseCode);
44 44  
45 45 Result shipmentInventoryDetail(List<InventoryDetail> inventoryDetailList, String warehouseCode);
  46 +
  47 + boolean updateInventory(Integer inventoryHeaderId, List<InventoryDetail> inventoryDetailList, String containerStatus, String zoneCode, String locationCode);
46 48 }
... ...
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&lt;InventoryHeaderMappe
335 335 return Result.OK("批量快速出库成功");
336 336 }
337 337  
  338 + @Override
  339 + public boolean updateInventory(Integer inventoryHeaderId, List<InventoryDetail> inventoryDetailList, String containerStatus, String zoneCode,
  340 + String locationCode) {
  341 + InventoryHeader inventoryHeader = inventoryHeaderService.getById(inventoryHeaderId);
  342 + if (inventoryHeader == null) {
  343 + return true;
  344 + }
  345 + boolean success = inventoryHeaderService.updateInventoryLocationAndZoneById(locationCode, zoneCode, inventoryHeaderId);
  346 + if (!success) {
  347 + return success;
  348 + }
  349 + success = inventoryHeaderService.updateContainerStatusById(containerStatus, inventoryHeaderId);
  350 + if (!success) {
  351 + return success;
  352 + }
  353 + List<InventoryDetail> updateInventoryDetailList = new ArrayList<>();
  354 + for (InventoryDetail inventoryDetail : inventoryDetailList) {
  355 + InventoryDetail inventoryDetail1 = new InventoryDetail();
  356 + inventoryDetail1.setId(inventoryDetail.getId());
  357 + inventoryDetail1.setContainerStatus(containerStatus);
  358 + inventoryDetail1.setLocationCode(locationCode);
  359 + inventoryDetail1.setZoneCode(zoneCode);
  360 + updateInventoryDetailList.add(inventoryDetail1);
  361 + }
  362 + success = inventoryDetailService.updateBatchById(updateInventoryDetailList);
  363 + return success;
  364 + }
  365 +
338 366 }
... ...
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;
33 33 import org.jeecg.utils.constant.QuantityConstant;
34 34 import org.springframework.beans.factory.annotation.Autowired;
35 35 import org.springframework.stereotype.Service;
36   -import org.springframework.transaction.annotation.Propagation;
37 36 import org.springframework.transaction.annotation.Transactional;
38 37  
39 38 import com.alibaba.fastjson.JSON;
... ... @@ -146,37 +145,54 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl&lt;ReceiptContai
146 145 if (!StringUtils.isEmpty(receiptContainerHeader.getContainerFillStatus())) {
147 146 containerFillStatus = receiptContainerHeader.getContainerFillStatus();
148 147 }
149   - // 锁定容器和库位
150   - Result result = taskHeaderService.createTaskLockContainerAndLocation(taskType, containerCode, fromLocationCode, toLocationCode, warehouseCode);
151   - if (!result.isSuccess()) {
152   - throw new JeecgBootException(result.getMessage());
153   - }
154   - TaskLockEntity taskLockEntity = (TaskLockEntity)result.getResult();
155   - String zoneCode = taskLockEntity.getZoneCode();
156   - TaskHeader taskHeader = new TaskHeader();
157   - taskHeader.setContainerCode(containerCode);
158   - taskHeader.setContainerFillStatus(containerFillStatus);
159   - taskHeader.setTaskType(receiptContainerHeader.getTaskType());
160   - taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
161   - taskHeader.setFromLocationCode(fromLocationCode);
162   - taskHeader.setToLocationCode(toLocationCode);
163   - taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
164   - taskHeader.setCompanyCode(receiptContainerHeader.getCompanyCode());
165   - taskHeader.setReceiptContainerHeaderId(receiptContainerHeader.getId());
166   - taskHeader.setWarehouseCode(warehouseCode);
167   - taskHeader.setZoneCode(zoneCode);
168   - taskHeader.setToPortCode(receiptContainerHeader.getToPort());
169   - success = taskHeaderService.save(taskHeader);
170   - if (!success) {
171   - throw new JeecgBootException("创建入库任务, 任务生成失败");
  148 + int taskHeaderId = 0;
  149 + TaskHeader taskHeader = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode);
  150 + if (taskHeader == null) {
  151 + // 锁定容器和库位
  152 + Result result = taskHeaderService.createTaskLockContainerAndLocation(taskType, containerCode, fromLocationCode, toLocationCode, warehouseCode);
  153 + if (!result.isSuccess()) {
  154 + throw new JeecgBootException(result.getMessage());
  155 + }
  156 + TaskLockEntity taskLockEntity = (TaskLockEntity)result.getResult();
  157 + String zoneCode = taskLockEntity.getZoneCode();
  158 + taskHeader = new TaskHeader();
  159 + taskHeader.setContainerCode(containerCode);
  160 + taskHeader.setContainerFillStatus(containerFillStatus);
  161 + taskHeader.setTaskType(receiptContainerHeader.getTaskType());
  162 + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
  163 + taskHeader.setFromLocationCode(fromLocationCode);
  164 + taskHeader.setToLocationCode(toLocationCode);
  165 + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
  166 + taskHeader.setCompanyCode(receiptContainerHeader.getCompanyCode());
  167 + taskHeader.setReceiptContainerHeaderId(receiptContainerHeader.getId());
  168 + taskHeader.setWarehouseCode(warehouseCode);
  169 + taskHeader.setZoneCode(zoneCode);
  170 + taskHeader.setToPortCode(receiptContainerHeader.getToPort());
  171 + success = taskHeaderService.save(taskHeader);
  172 + if (!success) {
  173 + throw new JeecgBootException("创建入库任务, 任务生成失败");
  174 + }
  175 + taskHeaderId = taskHeader.getId();
  176 + } else {
  177 + taskHeaderId = taskHeader.getId();
  178 + if (taskHeader.getCallBox() == QuantityConstant.NOT_CALL_BOX) {
  179 + throw new JeecgBootException("创建入库任务, 没有呼叫料盒标记");
  180 + }
  181 + TaskHeader taskHeader1 = new TaskHeader();
  182 + taskHeader1.setId(taskHeaderId);
  183 + taskHeader1.setReceiptContainerHeaderId(receiptContainerHeader.getId());
  184 + taskHeader1.setContainerFillStatus(containerFillStatus);
  185 + success = taskHeaderService.updateById(taskHeader1);
  186 + if (!success) {
  187 + throw new JeecgBootException("创建入库任务, 任务更新失败");
  188 + }
172 189 }
173   - int taskHeaderId = taskHeader.getId();
174 190 List<TaskDetail> taskDetailList = new ArrayList<>();
175 191 List<ReceiptDetail> receiptDetailList = new ArrayList<>();
176 192 for (ReceiptContainerDetail receiptContainerDetail : receiptContainerDetailList) {
177 193 TaskDetail taskDetail = new TaskDetail();
178 194 taskDetail.setTaskHeaderId(taskHeaderId);
179   - taskDetail.setTaskType(taskHeader.getTaskType());
  195 + taskDetail.setTaskType(receiptContainerHeader.getTaskType());
180 196 taskDetail.setWarehouseCode(receiptContainerDetail.getWarehouseCode());
181 197 taskDetail.setReceiptId(receiptContainerDetail.getReceiptId());
182 198 taskDetail.setReceiptDetailId(receiptContainerDetail.getReceiptDetailId());
... ... @@ -211,15 +227,6 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl&lt;ReceiptContai
211 227 if (!success) {
212 228 throw new JeecgBootException("创建入库任务, 任务详情生成失败");
213 229 }
214   -// if (receiptContainerHeader.getTaskType() == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) {
215   -// // 如果是空托盘,那么不需要更新库存
216   -// if (!containerFillStatus.equals(QuantityConstant.STATUS_CONTAINER_FILL_EMPTY)) {
217   -// success = inventoryHeaderService.updateInventoryContainerStatusByContainerCode(containerCode, warehouseCode);
218   -// if (!success) {
219   -// throw new JeecgBootException("创建入库任务, 更新库存头失败");
220   -// }
221   -// }
222   -// }
223 230 success = receiptContainerHeaderService.updateToPortAndStatus(receiptContainerHeader.getToPort(), QuantityConstant.RECEIPT_CONTAINER_TASK,
224 231 receiptContainerHeader.getId());
225 232 if (!success) {
... ...
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;
30 30 import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerHeader;
31 31 import org.jeecg.modules.wms.shipment.shipmentContainerHeader.service.IShipmentContainerHeaderService;
32 32 import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
  33 +import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
33 34 import org.jeecg.utils.StringUtils;
34 35 import org.jeecg.utils.constant.QuantityConstant;
35 36 import org.springframework.stereotype.Service;
... ... @@ -79,6 +80,8 @@ public class ReceiveServiceImpl extends ServiceImpl&lt;ReceiveMapper, Receive&gt; impl
79 80 private IReceiveService receiveService;
80 81 @Resource
81 82 private IShipmentContainerHeaderService shipmentContainerHeaderService;
  83 + @Resource
  84 + private ITaskHeaderService taskHeaderService;
82 85  
83 86 /**
84 87 * 组盘后自动生成任务,返回任务实体
... ... @@ -124,13 +127,21 @@ public class ReceiveServiceImpl extends ServiceImpl&lt;ReceiveMapper, Receive&gt; impl
124 127 if (container == null) {
125 128 return Result.error("入库组盘,根据容器编码 " + containerCode + ", 没有找到容器");
126 129 }
127   - String containerStatus = container.getStatus();
128   - if (containerStatus.equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
129   - return Result.error("入库组盘,容器被锁定不能用于收货" + containerCode);
  130 + int callBox = QuantityConstant.NOT_CALL_BOX;
  131 + TaskHeader callBoxTask = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode);
  132 + if (callBoxTask != null) {
  133 + callBox = callBoxTask.getCallBox();
130 134 }
131   - String containerFillStatus = container.getFillStatus();
132   - if (!StringUtils.isEmpty(containerFillStatus) && containerFillStatus.equals(QuantityConstant.STATUS_CONTAINER_FILL_FULL)) {
133   - return Result.error("入库组盘,容器已经是满盘不能用于收货" + containerCode);
  135 + // 如果不是呼叫料盒,那么要判断容器状态
  136 + if (callBox == QuantityConstant.NOT_CALL_BOX) {
  137 + String containerStatus = container.getStatus();
  138 + if (containerStatus.equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
  139 + return Result.error("入库组盘,容器被锁定不能用于收货" + containerCode);
  140 + }
  141 + String containerFillStatus = container.getFillStatus();
  142 + if (!StringUtils.isEmpty(containerFillStatus) && containerFillStatus.equals(QuantityConstant.STATUS_CONTAINER_FILL_FULL)) {
  143 + return Result.error("入库组盘,容器已经是满盘不能用于收货" + containerCode);
  144 + }
134 145 }
135 146 String containerTypeCode = container.getContainerTypeCode();
136 147 if (StringUtils.isEmpty(containerTypeCode)) {
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java
... ... @@ -393,7 +393,7 @@ public class ShipmentHeaderController extends JeecgController&lt;ShipmentHeader, IS
393 393 @ApiLogger(apiName = "PDA出库-呼叫料盒", from = "PDA")
394 394 public Result<TaskHeader> callBox(@RequestBody CallBoxBean bean, HttpServletRequest req) {
395 395 String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req);
396   - // 补充入库类型
  396 + // 分拣出库类型
397 397 bean.setType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
398 398 Result result = huahengMultiHandlerService.callBox(bean, warehouseCode);
399 399 return result;
... ...
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&lt;ShipmentHeaderMapper,
360 360 }
361 361 Port port = portService.getPortByCode(toPort, warehouseCode);
362 362 if (port == null) {
363   - return Result.error("自动出库, 出库口为空");
  363 + return Result.error("自动出库, 没有找到出库口");
364 364 }
365 365 int type = Integer.parseInt(port.getType());
366 366 if (type == QuantityConstant.PORT_TYPE_IN) {
... ...
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java
... ... @@ -144,6 +144,8 @@ public class TaskHeader implements Serializable {
144 144 private Integer exceptionState;
145 145 @ApiModelProperty(value = "巷道")
146 146 private Integer roadWay;
  147 + @ApiModelProperty(value = "呼叫料盒")
  148 + private Integer callBox;
147 149 /** 备用字段1 */
148 150 @Excel(name = "备用字段1", width = 15)
149 151 @ApiModelProperty(value = "备用字段1")
... ...
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&lt;TaskHeaderMapper, TaskHea
1077 1077 inventoryHeader.setContainerStatus(QuantityConstant.STATUS_CONTAINER_EMPTY);
1078 1078 inventoryHeader.setEnable(QuantityConstant.STATUS_ENABLE);
1079 1079 if (!inventoryHeaderService.save(inventoryHeader)) {
1080   - throw new JeecgBootException("添加库存头失败");
  1080 + throw new JeecgBootException("完成入库任务时, 添加库存头失败");
1081 1081 }
1082 1082 }
1083 1083  
... ... @@ -1410,6 +1410,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
1410 1410 if (!result.isSuccess()) {
1411 1411 throw new JeecgBootException(result.getMessage());
1412 1412 }
  1413 + success =
  1414 + inventoryHeaderService.updateInventory(inventoryHeader.getId(), inventoryDetailList, QuantityConstant.STATUS_CONTAINER_EMPTY, zoneCode, toLocationCode);
  1415 + if (!success) {
  1416 + throw new JeecgBootException("完成出库任务,更新库存状态失败");
  1417 + }
1413 1418 success = taskHeaderService.updateStatusById(QuantityConstant.TASK_STATUS_COMPLETED, taskHeader.getId());
1414 1419 if (!success) {
1415 1420 throw new JeecgBootException("完成出库任务,保存任务头失败");
... ... @@ -2603,9 +2608,12 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
2603 2608 @Transactional(rollbackFor = Exception.class)
2604 2609 public Result cancelReceiptTask(TaskHeader taskHeader) {
2605 2610 log.info("开始取消入库任务");
2606   - boolean success = receiptContainerHeaderService.cancelReceiptTask(taskHeader);
2607   - if (!success) {
2608   - throw new JeecgBootException("取消入库任务时, 更新组盘头状态失败");
  2611 + int callBox = taskHeader.getCallBox();
  2612 + if (callBox == QuantityConstant.NOT_CALL_BOX) {
  2613 + boolean success = receiptContainerHeaderService.cancelReceiptTask(taskHeader);
  2614 + if (!success) {
  2615 + throw new JeecgBootException("取消入库任务时, 更新组盘头状态失败");
  2616 + }
2609 2617 }
2610 2618 log.info("完成取消入库任务");
2611 2619 return Result.ok("取消入库任务成功");
... ... @@ -2619,10 +2627,15 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
2619 2627 @Override
2620 2628 @Transactional(rollbackFor = Exception.class)
2621 2629 public Result cancelShipmentTask(TaskHeader taskHeader) {
2622   - boolean success = shipmentContainerHeaderService.cancelShipmentTask(taskHeader);
2623   - if (!success) {
2624   - throw new JeecgBootException("取消出库任务时, 更新组盘头状态失败");
  2630 + log.info("开始取消出库任务");
  2631 + int callBox = taskHeader.getCallBox();
  2632 + if (callBox == QuantityConstant.NOT_CALL_BOX) {
  2633 + boolean success = shipmentContainerHeaderService.cancelShipmentTask(taskHeader);
  2634 + if (!success) {
  2635 + throw new JeecgBootException("取消出库任务时, 更新组盘头状态失败");
  2636 + }
2625 2637 }
  2638 + log.info("完成取消出库任务");
2626 2639 return Result.ok("取消出库任务成功");
2627 2640 }
2628 2641  
... ...
huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
... ... @@ -29,7 +29,7 @@ public class QuantityConstant {
29 29 // 等待审核
30 30 public static final Integer RECEIPT_HEADER_VERIFYING = 10;
31 31  
32   - //审核完成
  32 + // 审核完成
33 33 public static final Integer RECEIPT_HEADER_FINSH = 15;
34 34  
35 35 // 驳回
... ... @@ -79,7 +79,7 @@ public class QuantityConstant {
79 79 // 等待审核
80 80 public static final Integer SHIPMENT_HEADER_VERIFYING = 10;
81 81  
82   - //审核完成
  82 + // 审核完成
83 83 public static final Integer SHIPMENT_HEADER_FINSH = 15;
84 84  
85 85 // 驳回
... ... @@ -108,7 +108,7 @@ public class QuantityConstant {
108 108  
109 109 // 过账
110 110 public static final Integer SHIPMENT_HEADER_COMPLETED = 800;
111   -
  111 +
112 112 // 已合并
113 113 public static final Integer SHIPMENT_HEADER_MERGED = 810;
114 114  
... ... @@ -391,13 +391,11 @@ public class QuantityConstant {
391 391 // 出库单审核流程
392 392 public static final Integer SHIPMENT_AUDIT = 2;
393 393  
394   - //审核通过
  394 + // 审核通过
395 395 public static final Integer AUDIT_YES_STATUS = 1;
396   - //审核驳回
  396 + // 审核驳回
397 397 public static final Integer AUDIT_NO_STATUS = 2;
398 398  
399   -
400   -
401 399 // WCS库位信息查询
402 400 public static final String ADDRESS_WCS_LOCATION_INFO = "WCS_LOCATION_INFO";
403 401  
... ... @@ -619,7 +617,10 @@ public class QuantityConstant {
619 617 * 受控,受控的库存详情不能出库
620 618 */
621 619 public static final int CONTROLLER_ENABLE = 1;
622   -
  620 +
  621 + public static final int NOT_CALL_BOX = 0;
  622 + public static final int CALL_BOX = 1;
  623 +
623 624 /** 默认库区编码 */
624 625 public static final String DEFAULT_ZONE_CODE = "Default";
625 626 }
... ...