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";
 }