diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js b/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js
index 4e63655..b450fc9 100644
--- a/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js
+++ b/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js
@@ -106,6 +106,7 @@ export const getReceiptTypeList = (params)=>getAction('/config/receiptType/getRe
 export const getShipmentTypeList = (params)=>getAction('/config/shipmentType/getShipmentTypeList', params);
 export const searchMaterialByCode = (params)=>postAction('/config/material/searchMaterialByCode', params);
 export const listReceiveByReceiptId = (params)=>postAction('/receipt/receiveHeader/listReceiveByReceiptId', params);
+export const createTask = (params)=>postAction('/receipt/receiptContainerHeader/createTask', params);
 
 
 // 中转HTTP请求
diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue
index 69a0eca..63cc739 100644
--- a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue
+++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue
@@ -113,7 +113,8 @@
 
         <span slot="action" slot-scope="text, record">
           <a @click="handleEdit(record)">编辑</a>
-
+          <a-divider type="vertical" />
+          <a @click="createTask(record)">生成任务</a>
           <a-divider type="vertical" />
           <a-dropdown>
             <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
@@ -148,6 +149,7 @@
   import ReceiptContaienrDetailList from './ReceiptContaienrDetailList'
   import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil'
   import '@/assets/less/TableExpand.less'
+  import {createTask} from '@/api/api'
 
   export default {
     name: "ReceiptContainerHeaderList",
@@ -159,6 +161,7 @@
     data () {
       return {
         description: '入库组盘管理页面',
+        querySource:{},
         // 表头
         columns: [
           {
@@ -277,6 +280,16 @@
         this.selectedRowKeys = selectedRowKeys;
         this.selectionRows = selectionRows;
       },
+      createTask(record){
+        this.loading = true;
+        const that = this;
+        this.model = Object.assign({}, record);
+        that.querySource.id = record.id;
+        createTask(that.querySource).then((res) => {
+          this.loading = false;
+          this.search();
+        });
+      },
       loadData(arg) {
         if(!this.url.list){
           this.$message.error("请设置url.list属性!")
diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue
index 73b60ba..82b1495 100644
--- a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue
+++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue
@@ -100,8 +100,8 @@
            ],
         },
         url: {
-          add: "/config/receiptHeader/add",
-          edit: "/config/receiptHeader/edit",
+          add: "/receipt/receiptHeader/add",
+          edit: "/receipt/receiptHeader/edit",
         }
 
       }
diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue
new file mode 100644
index 0000000..b2a85b1
--- /dev/null
+++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue
@@ -0,0 +1,227 @@
+<template>
+  <a-card :bordered="false" :class="'cust-erp-sub-tab'">
+    <!-- 操作按钮区域 -->
+    <div class="table-operator" v-if="mainId">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('任务详情')">导出</a-button>
+      <a-upload
+        name="file"
+        :showUploadList="false"
+        :multiple="false"
+        :headers="tokenHeader"
+        :action="importExcelUrl"
+        @change="handleImportExcel">
+          <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+
+      </a-table>
+    </div>
+
+    <taskDetail-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></taskDetail-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import TaskDetailModal from './modules/TaskDetailModal'
+
+  export default {
+    name: "TaskDetailList",
+    mixins:[JeecgListMixin],
+    components: { TaskDetailModal },
+    props:{
+      mainId:{
+        type:String,
+        default:'',
+        required:false
+      }
+    },
+    watch:{
+      mainId:{
+        immediate: true,
+        handler(val) {
+          if(!this.mainId){
+            this.clearList()
+          }else{
+            this.queryParam['taskHeaderId'] = val
+            this.loadData(1);
+          }
+        }
+      }
+    },
+    data () {
+      return {
+        description: '任务表管理页面',
+        disableMixinCreated:true,
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'货主',
+            align:"center",
+            dataIndex: 'companyCode'
+          },
+          {
+            title:'物料编码',
+            align:"center",
+            dataIndex: 'materialCode'
+          },
+          {
+            title:'物料名称',
+            align:"center",
+            dataIndex: 'materialName'
+          },
+          {
+            title:'物料规格',
+            align:"center",
+            dataIndex: 'materialSpec'
+          },
+          {
+            title:'物料单位',
+            align:"center",
+            dataIndex: 'materialUnit'
+          },
+          {
+            title:'数量',
+            align:"center",
+            dataIndex: 'qty'
+          },
+          {
+            title:'批次',
+            align:"center",
+            dataIndex: 'batch'
+          },
+          {
+            title:'库存状态',
+            align:"center",
+            dataIndex: 'inventoryStatus_dictText',
+          },
+          {
+            title:'创建人',
+            align:"center",
+            dataIndex: 'createBy'
+          },
+          {
+            title:'创建日期',
+            align:"center",
+            dataIndex: 'createTime'
+          },
+          {
+            title:'更新人',
+            align:"center",
+            dataIndex: 'updateBy'
+          },
+          {
+            title:'更新日期',
+            align:"center",
+            dataIndex: 'updateTime'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/task/taskHeader/listTaskDetailByMainId",
+          delete: "/task/taskHeader/deleteTaskDetail",
+          deleteBatch: "/task/taskHeader/deleteBatchTaskDetail",
+          exportXlsUrl: "/task/taskHeader/exportTaskDetail",
+          importUrl: "/task/taskHeader/importTaskDetail",
+        },
+        dictOptions:{
+         taskType:[],
+         isEmptyOut:[],
+         isDoubleIn:[],
+         status:[],
+        }
+      }
+    },
+    created() {
+    },
+    computed: {
+      importExcelUrl(){
+        return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`;
+      }
+    },
+    methods: {
+      clearList(){
+        this.dataSource=[]
+        this.selectedRowKeys=[]
+        this.ipagination.current = 1
+      }
+
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>
diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskHeaderList.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskHeaderList.vue
new file mode 100644
index 0000000..41d05ed
--- /dev/null
+++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskHeaderList.vue
@@ -0,0 +1,368 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="任务类型">
+              <j-dict-select-tag placeholder="请选择任务类型" v-model="queryParam.taskType" dictCode="task_type"/>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="容器号">
+              <a-input placeholder="请输入容器号" v-model="queryParam.containerCode"></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="起始库位">
+                <a-input placeholder="请输入起始库位" v-model="queryParam.fromLocationCode"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="目标库位">
+                <a-input placeholder="请输入目标库位" v-model="queryParam.toLocationCode"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="是否空出">
+                <j-dict-select-tag placeholder="请选择是否空出" v-model="queryParam.isEmptyOut" dictCode="is_or_not"/>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="是否重入">
+                <j-dict-select-tag placeholder="请选择是否重入" v-model="queryParam.isDoubleIn" dictCode="is_or_not"/>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="重入库位号">
+                <a-input placeholder="请输入重入库位号" v-model="queryParam.originLocationCode"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="任务状态">
+                <j-dict-select-tag placeholder="请选择任务状态" v-model="queryParam.status" dictCode="task_header_status"/>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="起始出入口">
+                <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPort"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="目标出入口">
+                <a-input placeholder="请输入目标出入口" v-model="queryParam.toPort"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="10" :lg="11" :md="12" :sm="24">
+              <a-form-item label="创建日期">
+                <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开始时间" class="query-group-cust" v-model="queryParam.createTime_begin"></j-date>
+                <span class="query-group-split-cust"></span>
+                <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择结束时间" class="query-group-cust" v-model="queryParam.createTime_end"></j-date>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+    
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('任务表')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        class="j-table-force-nowrap"
+        :scroll="{x:true}"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}"
+        :customRow="clickThenSelect"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <a-tabs defaultActiveKey="1">
+      <a-tab-pane tab="任务详情" key="1" >
+        <TaskDetailList :mainId="selectedMainId" />
+      </a-tab-pane>
+    </a-tabs>
+
+    <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import TaskHeaderModal from './modules/TaskHeaderModal'
+  import { getAction } from '@/api/manage'
+  import TaskDetailList from './TaskDetailList'
+  import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil'
+  import '@/assets/less/TableExpand.less'
+
+  export default {
+    name: "TaskHeaderList",
+    mixins:[JeecgListMixin],
+    components: {
+      TaskDetailList,
+      TaskHeaderModal
+    },
+    data () {
+      return {
+        description: '任务表管理页面',
+        // 表头
+        columns: [
+          {
+            title:'任务类型',
+            align:"center",
+            dataIndex: 'taskType_dictText',
+          },
+          {
+            title:'容器号',
+            align:"center",
+            dataIndex: 'containerCode'
+          },
+          {
+            title:'起始库位',
+            align:"center",
+            dataIndex: 'fromLocationCode'
+          },
+          {
+            title:'目标库位',
+            align:"center",
+            dataIndex: 'toLocationCode'
+          },
+          {
+            title:'是否空出',
+            align:"center",
+            dataIndex: 'isEmptyOut_dictText',
+          },
+          {
+            title:'是否重入',
+            align:"center",
+            dataIndex: 'isDoubleIn_dictText',
+          },
+          {
+            title:'重入库位号',
+            align:"center",
+            dataIndex: 'originLocationCode'
+          },
+          {
+            title:'任务状态',
+            align:"center",
+            dataIndex: 'status_dictText',
+          },
+          {
+            title:'起始出入口',
+            align:"center",
+            dataIndex: 'fromPort'
+          },
+          {
+            title:'目标出入口',
+            align:"center",
+            dataIndex: 'toPort'
+          },
+          {
+            title:'创建人',
+            align:"center",
+            dataIndex: 'createBy'
+          },
+          {
+            title:'创建日期',
+            align:"center",
+            dataIndex: 'createTime'
+          },
+          {
+            title:'更新人',
+            align:"center",
+            dataIndex: 'updateBy'
+          },
+          {
+            title:'更新日期',
+            align:"center",
+            dataIndex: 'updateTime'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/task/taskHeader/list",
+          delete: "/task/taskHeader/delete",
+          deleteBatch: "/task/taskHeader/deleteBatch",
+          exportXlsUrl: "/task/taskHeader/exportXls",
+          importExcelUrl: "task/taskHeader/importExcel",
+        },
+        dictOptions:{
+         taskType:[],
+         isEmptyOut:[],
+         isDoubleIn:[],
+         status:[],
+        },
+        /* 分页参数 */
+        ipagination:{
+          current: 1,
+          pageSize: 5,
+          pageSizeOptions: ['5', '10', '50'],
+          showTotal: (total, range) => {
+            return range[0] + "-" + range[1] + " 共" + total + "条"
+          },
+          showQuickJumper: true,
+          showSizeChanger: true,
+          total: 0
+        },
+        selectedMainId:'',
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      },
+      clickThenSelect(record) {
+        return {
+          on: {
+            click: () => {
+              this.onSelectChange(record.id.split(","), [record]);
+            }
+          }
+        }
+      },
+      onClearSelected() {
+        this.selectedRowKeys = [];
+        this.selectionRows = [];
+        this.selectedMainId=''
+      },
+      onSelectChange(selectedRowKeys, selectionRows) {
+        this.selectedMainId=selectedRowKeys[0]
+        this.selectedRowKeys = selectedRowKeys;
+        this.selectionRows = selectionRows;
+      },
+      loadData(arg) {
+        if(!this.url.list){
+          this.$message.error("请设置url.list属性!")
+          return
+        }
+        //加载数据 若传入参数1则加载第一页的内容
+        if (arg === 1) {
+          this.ipagination.current = 1;
+        }
+        this.onClearSelected()
+        var params = this.getQueryParams();//查询条件
+        this.loading = true;
+        getAction(this.url.list, params).then((res) => {
+          if (res.success) {
+            this.dataSource = res.result.records;
+            this.ipagination.total = res.result.total;
+          }
+          if(res.code===510){
+            this.$message.warning(res.message)
+          }
+          this.loading = false;
+        })
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'int',value:'taskType',text:'任务类型',dictCode:'task_type'})
+        fieldList.push({type:'string',value:'containerCode',text:'容器号',dictCode:''})
+        fieldList.push({type:'string',value:'fromLocationCode',text:'起始库位',dictCode:''})
+        fieldList.push({type:'string',value:'toLocationCode',text:'目标库位',dictCode:''})
+        fieldList.push({type:'string',value:'isEmptyOut',text:'是否空出',dictCode:'is_or_not'})
+        fieldList.push({type:'int',value:'isDoubleIn',text:'是否重入',dictCode:'is_or_not'})
+        fieldList.push({type:'string',value:'originLocationCode',text:'重入库位号',dictCode:''})
+        fieldList.push({type:'int',value:'status',text:'任务状态',dictCode:'task_header_status'})
+        fieldList.push({type:'string',value:'fromPort',text:'起始出入口',dictCode:''})
+        fieldList.push({type:'string',value:'toPort',text:'目标出入口',dictCode:''})
+        fieldList.push({type:'string',value:'createBy',text:'创建人',dictCode:''})
+        fieldList.push({type:'datetime',value:'createTime',text:'创建日期'})
+        fieldList.push({type:'string',value:'updateBy',text:'更新人',dictCode:''})
+        fieldList.push({type:'datetime',value:'updateTime',text:'更新日期'})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>
\ No newline at end of file
diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskDetailModal.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskDetailModal.vue
new file mode 100644
index 0000000..3b0e63f
--- /dev/null
+++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskDetailModal.vue
@@ -0,0 +1,158 @@
+<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="companyCode">
+              <a-input v-model="model.companyCode"placeholder="请输入货主" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="物料编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialCode">
+              <a-input v-model="model.materialCode"placeholder="请输入物料编码" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName">
+              <a-input v-model="model.materialName"placeholder="请输入物料名称" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="物料规格" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialSpec">
+              <a-input v-model="model.materialSpec"placeholder="请输入物料规格" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="物料单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialUnit">
+              <a-input v-model="model.materialUnit"placeholder="请输入物料单位" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qty">
+              <a-input-number v-model="model.qty"placeholder="请输入数量" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="批次" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="batch">
+              <a-input v-model="model.batch"placeholder="请输入批次" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="库存状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="inventoryStatus">
+              <j-dict-select-tag type="list" v-model="model.inventoryStatus" dictCode="inventory_status" placeholder="请选择库存状态" />
+            </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'
+
+  export default {
+    name: "TaskDetailModal",
+    components: {
+    },
+    props:{
+      mainId:{
+        type:String,
+        required:false,
+        default:''
+      }
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        model:{
+        },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        validatorRules: {
+        },
+        url: {
+          add: "/task/taskHeader/addTaskDetail",
+          edit: "/task/taskHeader/editTaskDetail",
+        }
+
+      }
+    },
+    created () {
+    //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+        this.$refs.form.clearValidate();
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            this.model['taskHeaderId'] = this.mainId
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+          }else{
+             return false
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskHeaderModal.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskHeaderModal.vue
new file mode 100644
index 0000000..5acf568
--- /dev/null
+++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskHeaderModal.vue
@@ -0,0 +1,160 @@
+<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="taskType">
+              <j-dict-select-tag type="list" v-model="model.taskType" dictCode="task_type" placeholder="请选择任务类型" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="容器号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode">
+              <a-input v-model="model.containerCode" placeholder="请输入容器号" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="起始库位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fromLocationCode">
+              <a-input v-model="model.fromLocationCode" placeholder="请输入起始库位" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="目标库位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toLocationCode">
+              <a-input v-model="model.toLocationCode" placeholder="请输入目标库位" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="是否空出" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="isEmptyOut">
+              <j-dict-select-tag type="list" v-model="model.isEmptyOut" dictCode="is_or_not" placeholder="请选择是否空出" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="是否重入" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="isDoubleIn">
+              <j-dict-select-tag type="list" v-model="model.isDoubleIn" dictCode="is_or_not" placeholder="请选择是否重入" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="重入库位号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="originLocationCode">
+              <a-input v-model="model.originLocationCode" placeholder="请输入重入库位号" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="任务状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="status">
+              <j-dict-select-tag type="list" v-model="model.status" dictCode="task_header_status" placeholder="请选择任务状态" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="起始出入口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fromPort">
+              <a-input v-model="model.fromPort" placeholder="请输入起始出入口" ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="目标出入口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toPort">
+              <a-input v-model="model.toPort" placeholder="请输入目标出入口" ></a-input>
+            </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'
+
+  export default {
+    name: "TaskHeaderModal",
+    components: { 
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        model:{
+        },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        validatorRules: {
+        },
+        url: {
+          add: "/task/taskHeader/add",
+          edit: "/task/taskHeader/edit",
+        }
+     
+      }
+    },
+    created () {
+    //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+        this.$refs.form.clearValidate();
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }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/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java
index 497ea08..3bd5b8d 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java
@@ -15,4 +15,6 @@ public interface IContainerService extends IService<Container> {
     Result batchAddContainers(Container container, int number);
 
     Container getContainerByCode(String containCode, String warehouseCode);
+
+    boolean updateStatus(String containerCode, String status, String wareohuseCode);
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java
index a254623..41f8838 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java
@@ -27,8 +27,6 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container
 
     @Resource
     IContainerTypeService containerTypeService;
-    @Resource
-    IContainerService containerService;
 
     @Override
     public Result batchAddContainers(Container container, int number) {
@@ -47,7 +45,7 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container
             container1.setWarehouseCode(warehouseCode);
             containerList.add(container1);
         }
-        boolean result = containerService.saveBatch(containerList);
+        boolean result = this.saveBatch(containerList);
         if(result) {
             Result.OK("添加成功!");
         }
@@ -59,17 +57,28 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container
         LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery();
         containerLambdaQueryWrapper.eq(Container::getCode, containCode)
                                     .eq(Container::getWarehouseCode, warehouseCode);
-        Container container = containerService.getOne(containerLambdaQueryWrapper);
+        Container container = this.getOne(containerLambdaQueryWrapper);
         return container;
     }
 
+    @Override
+    public boolean updateStatus(String containerCode, String status, String wareohuseCode) {
+        Container container = this.getContainerByCode(containerCode, wareohuseCode);
+        if(container == null) {
+            return false;
+        }
+        container.setStatus(status);
+        boolean result = this.updateById(container);
+        return result;
+    }
+
 
     private int getStartNumber(String containerTypeCode, String warehouseCode) {
         LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery();
         containerLambdaQueryWrapper.eq(Container::getContainerTypeCode, containerTypeCode)
                 .eq(Container::getWarehouseCode, warehouseCode)
                 .orderByDesc(Container::getId).last("Limit 1");
-        Container container = containerService.getOne(containerLambdaQueryWrapper);
+        Container container = this.getOne(containerLambdaQueryWrapper);
         //如果指定类型的最后的code存在,那么 code = 容器类型 + (排序号 + 1)
         if (container != null && container.getCode() != null) {
             Integer number = Integer.valueOf(container.getCode().substring(container.getCode().length() - 5, container.getCode().length()));
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java
index 77a17cc..c306b5e 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java
@@ -11,4 +11,14 @@ import org.jeecg.modules.wms.config.location.entity.Location;
  */
 public interface ILocationService extends IService<Location> {
 
+    Location getLocationByCode(String locationCode, String wareohuseCode);
+
+    boolean updateStatus(String locationCode, String status, String wareohuseCode);
+
+    Location getNear(Location location);
+
+    Location getInsideNear(Location location);
+
+    Location getOutSideNear(Location location);
+
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java
index 6316c03..8332dce 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java
@@ -1,12 +1,18 @@
 package org.jeecg.modules.wms.config.location.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.modules.wms.config.location.entity.Location;
 import org.jeecg.modules.wms.config.location.mapper.LocationMapper;
 import org.jeecg.modules.wms.config.location.service.ILocationService;
+import org.jeecg.utils.constant.QuantityConstant;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * @Description: 库位管理
  * @Author: jeecg-boot
@@ -16,4 +22,76 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> implements ILocationService {
 
+
+    @Override
+    public Location getLocationByCode(String locationCode, String wareohuseCode) {
+        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
+        locationLambdaQueryWrapper.eq(Location::getCode, locationCode)
+                                .eq(Location::getWarehouseCode, wareohuseCode);
+        Location location = this.getOne(locationLambdaQueryWrapper);
+        return location;
+    }
+
+    @Override
+    public boolean updateStatus(String locationCode, String status, String wareohuseCode) {
+        Location location = getLocationByCode(locationCode, wareohuseCode);
+        if(location == null) {
+            return false;
+        }
+        location.setStatus(QuantityConstant.STATUS_LOCATION_LOCK);
+        boolean result = updateById(location);
+        return result;
+    }
+
+    @Override
+    public Location getNear(Location location) {
+        int rowFlag = location.getRowFlag();
+        Location locaiton1 = null;
+        if (rowFlag == 1) {
+            locaiton1 = getInsideNear(location);
+        } else {
+            locaiton1 = getOutSideNear(location);
+        }
+        return locaiton1;
+    }
+
+    @Override
+    public Location getInsideNear(Location location) {
+        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
+        locationLambdaQueryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode())
+                                .eq(Location::getZoneCode, location.getZoneCode())
+                                .eq(Location::getRoadWay, location.getRoadWay())
+                                .eq(Location::getIcolumn, location.getIcolumn())
+                                .eq(Location::getLayer, location.getLayer())
+                                .eq(Location::getLocationTypeCode, location.getLocationTypeCode())
+                                .eq(Location::getRowFlag, QuantityConstant.ROW_IN);
+        List<Location> locationList = list(locationLambdaQueryWrapper);
+        for (Location location1 : locationList) {
+            int diff = Math.abs(location1.getRow().intValue() - location.getRow().intValue());
+            if (diff == 1) {
+                return location1;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Location getOutSideNear(Location location) {
+        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
+        locationLambdaQueryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode())
+                                .eq(Location::getZoneCode, location.getZoneCode())
+                                .eq(Location::getRoadWay, location.getRoadWay())
+                                .eq(Location::getIcolumn, location.getIcolumn())
+                                .eq(Location::getLayer, location.getLayer())
+                                .eq(Location::getLocationTypeCode, location.getLocationTypeCode())
+                                .eq(Location::getRowFlag, QuantityConstant.ROW_OUT);
+        List<Location> locationList = list(locationLambdaQueryWrapper);
+        for (Location location1 : locationList) {
+            int diff = Math.abs(location1.getRow().intValue() - location.getRow().intValue());
+            if (diff == 1) {
+                return location1;
+            }
+        }
+        return null;
+    }
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java
index cb0845a..5e651e4 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java
@@ -7,10 +7,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContaienrDetail;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContaienrDetailService;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService;
+import org.jeecg.modules.wms.receipt.receiving.domain.Receive;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
@@ -290,7 +292,17 @@ public class ReceiptContainerHeaderController extends JeecgController<ReceiptCon
 
     /*--------------------------------子表处理-入库组盘详情-end----------------------------------------------*/
 
-
+	 /**
+	  * 创建任务
+	  * @return
+	  */
+	 @ApiOperation(value="入库组盘-创建任务", notes="入库组盘-创建任务")
+	 @PostMapping("/createTask")
+	 @ResponseBody
+	 public Result createTask(@RequestBody ReceiptContainerHeader receiptContainerHeader, HttpServletRequest req) {
+		 String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
+		 return receiptContainerHeaderService.createTask(receiptContainerHeader, warehouseCode);
+	 }
 
 
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java
index 3f9d51d..78f226e 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java
@@ -1,6 +1,7 @@
 package org.jeecg.modules.wms.receipt.receiptContainerHeader.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.wms.config.container.entity.Container;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,4 +28,6 @@ public interface IReceiptContainerHeaderService extends IService<ReceiptContaine
 	public void delBatchMain (Collection<? extends Serializable> idList);
 
 	ReceiptContainerHeader getUnCompleteReceiptContainerByCode(String containerCode, String warehouseCode);
+
+	public Result createTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode);
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
index 2b44a74..aec94a2 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
@@ -1,19 +1,39 @@
 package org.jeecg.modules.wms.receipt.receiptContainerHeader.service.impl;
 
+import com.aliyun.oss.ServiceException;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.wms.config.container.entity.Container;
+import org.jeecg.modules.wms.config.container.service.IContainerService;
+import org.jeecg.modules.wms.config.location.entity.Location;
+import org.jeecg.modules.wms.config.location.service.ILocationService;
+import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContaienrDetail;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.mapper.ReceiptContaienrDetailMapper;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.mapper.ReceiptContainerHeaderMapper;
+import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContaienrDetailService;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService;
+import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
+import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService;
+import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
+import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService;
+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;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Collection;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 入库组盘
@@ -28,6 +48,22 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
 	private ReceiptContainerHeaderMapper receiptContainerHeaderMapper;
 	@Autowired
 	private ReceiptContaienrDetailMapper receiptContaienrDetailMapper;
+	@Resource
+	private IContainerService containerService;
+	@Resource
+	private IReceiptContaienrDetailService receiptContaienrDetailService;
+	@Resource
+	private ILocationService locationService;
+	@Resource
+	private IReceiptContainerHeaderService receiptContainerHeaderService;
+	@Resource
+	private ITaskHeaderService taskHeaderService;
+	@Resource
+	private ITaskDetailService taskDetailService;
+	@Resource
+	private IReceiptDetailService receiptDetailService;
+	@Resource
+	private IReceiptHeaderService receiptHeaderService;
 
 	@Override
 	@Transactional
@@ -55,4 +91,135 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
 		return receiptContainerHeader;
 	}
 
+	@Override
+	@Transactional
+	public Result createTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) {
+		int id = receiptContainerHeader.getId();
+		receiptContainerHeader = this.getById(id);
+		if (receiptContainerHeader == null) {
+			return Result.error("id:" + id + "的入库组盘不存在!");
+		}
+		if (!receiptContainerHeader.getWarehouseCode().equals(warehouseCode)) {
+			return Result.error("id:" + id + "的入库组盘不能在" + warehouseCode + "仓库操作");
+		}
+		String containerCode = receiptContainerHeader.getContainerCode();
+		Container container = containerService.getContainerByCode(containerCode, warehouseCode);
+		if(container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
+			return Result.error("托盘已经锁定,不能生成任务");
+		}
+		LambdaQueryWrapper<ReceiptContaienrDetail> receiptContaienrDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
+		receiptContaienrDetailLambdaQueryWrapper.eq(ReceiptContaienrDetail::getReceiptContainerId, receiptContainerHeader.getId());
+		List<ReceiptContaienrDetail> receiptContaienrDetailList =
+				receiptContaienrDetailService.list(receiptContaienrDetailLambdaQueryWrapper);
+		if(receiptContaienrDetailList.isEmpty()) {
+			return Result.error("id:" + id + "的入库组盘,没有组盘明细,请先组盘!");
+		}
+		boolean result = containerService.updateStatus(containerCode,
+				QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode);
+		if(!result) {
+			throw new ServiceException("更新容器状态失败");
+		}
+		String fromLocationCode = receiptContainerHeader.getFromLocationCode();
+		String toLocaitonCode = receiptContainerHeader.getToLocationCode();
+		if(StringUtils.isNotEmpty(fromLocationCode)) {
+			result = locationService.updateStatus(fromLocationCode,
+					QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode);
+			if(!result) {
+				throw new ServiceException("更新起始库位状态失败");
+			}
+		}
+		String zoneCode = null;
+		if(StringUtils.isNotEmpty(toLocaitonCode)) {
+			result = locationService.updateStatus(toLocaitonCode,
+					QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode);
+			if(!result) {
+				throw new ServiceException("更新目标库位状态失败");
+			}
+			Location toLocation = locationService.getLocationByCode(toLocaitonCode, warehouseCode);
+			if(!toLocation.getWarehouseCode().equals(warehouseCode)) {
+				throw new ServiceException("库位对应的仓库不匹配");
+			}
+			zoneCode = toLocation.getZoneCode();
+			//旁边库位有任务
+			if (taskHeaderService.haveUncompleteTaskInNear(toLocation)) {
+				throw new ServiceException("旁边库位任务数大于0");
+			}
+		}
+		int receiptContainerStatus = receiptContainerHeader.getStatus();
+		if(receiptContainerStatus != QuantityConstant.RECEIPT_CONTAINER_BUILD) {
+			throw new ServiceException("入库组盘状态不是创建状态");
+		}
+		receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
+		result = receiptContainerHeaderService.updateById(receiptContainerHeader);
+		if(!result) {
+			throw new ServiceException("更新入库组盘头状态失败");
+		}
+		TaskHeader taskHeader = new TaskHeader();
+		taskHeader.setContainerCode(containerCode);
+		taskHeader.setTaskType(receiptContainerHeader.getTaskType());
+		taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
+		taskHeader.setFromLocationCode(fromLocationCode);
+		taskHeader.setToLocationCode(toLocaitonCode);
+		taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
+		taskHeader.setCompanyCode(receiptContainerHeader.getCompanyCode());
+		taskHeader.setReceiptContaienrHeaderId(receiptContainerHeader.getId());
+		taskHeader.setWarehouseCode(warehouseCode);
+		taskHeader.setZoneCode(zoneCode);
+		taskHeader.setToPort(receiptContainerHeader.getToPort());
+		result = taskHeaderService.save(taskHeader);
+		if(!result) {
+			throw new ServiceException("任务生成失败");
+		}
+		List<TaskDetail> taskDetailList = new ArrayList<>();
+		List<ReceiptDetail> receiptDetailList = new ArrayList<>();
+		for(ReceiptContaienrDetail receiptContaienrDetail : receiptContaienrDetailList) {
+			TaskDetail taskDetail = new TaskDetail();
+			taskDetail.setTaskHeaderId(taskHeader.getId());
+			taskDetail.setTaskType(taskHeader.getTaskType());
+			taskDetail.setWarehouseCode(receiptContaienrDetail.getWarehouseCode());
+			taskDetail.setReceiptId(receiptContaienrDetail.getReceiptId());
+			taskDetail.setReceiptDetailId(receiptContaienrDetail.getReceiptDetailId());
+			taskDetail.setReceiptContainerDetailId(receiptContaienrDetail.getId());
+			taskDetail.setCompanyCode(receiptContaienrDetail.getCompanyCode());
+			taskDetail.setMaterialCode(receiptContaienrDetail.getMaterialCode());
+			taskDetail.setMaterialName(receiptContaienrDetail.getMaterialName());
+			taskDetail.setMaterialSpec(receiptContaienrDetail.getMaterialSpec());
+			taskDetail.setMaterialUnit(receiptContaienrDetail.getMaterialUnit());
+			taskDetail.setInventoryStatus(receiptContaienrDetail.getInventoryStatus());
+			taskDetail.setQty(receiptContaienrDetail.getQty());
+			taskDetail.setBatch(receiptContaienrDetail.getBatch());
+			taskDetail.setLot(receiptContaienrDetail.getLot());
+			taskDetail.setProject(receiptContaienrDetail.getProject());
+			taskDetailList.add(taskDetail);
+			ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContaienrDetail.getReceiptDetailId());
+			if(receiptDetail == null) {
+				throw new ServiceException("根据id:" + receiptContaienrDetail.getReceiptDetailId() + ",没有找到入库单详情");
+			}
+			receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_WAIT_SHELF);
+			receiptDetailList.add(receiptDetail);
+		}
+		result = taskDetailService.saveBatch(taskDetailList);
+		if(!result) {
+			throw new ServiceException("任务详情生成失败");
+		}
+		receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
+		result = this.updateById(receiptContainerHeader);
+		if(!result) {
+			throw new ServiceException("生成任务时,更新入库组盘头失败");
+		}
+		result = receiptDetailService.updateBatchById(receiptDetailList);
+		if(!result) {
+			throw new ServiceException("更新入库单明细失败");
+		}
+		List<Integer> receiptIdList =receiptDetailList.stream()
+				.map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList());
+		for(Integer receiptId : receiptIdList) {
+			result = receiptHeaderService.updateReceiptHeaderStatus(receiptId);
+			if (!result) {
+				throw new ServiceException("更新入库单明细失败");
+			}
+		}
+		return Result.OK("生成入库任务成功");
+	}
+
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java
index 28158f5..4622705 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java
@@ -29,4 +29,6 @@ public interface IReceiptHeaderService extends IService<ReceiptHeader> {
 	public Result saveReceiptHeader(ReceiptHeader receiptHeader);
 
 	public String createCode(String receiptType);
+
+	public boolean updateReceiptHeaderStatus(Integer id);
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java
index 45c5129..b832a82 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java
@@ -8,9 +8,11 @@ import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.wms.config.receiptType.entity.ReceiptType;
 import org.jeecg.modules.wms.config.receiptType.service.IReceiptTypeService;
 import org.jeecg.modules.wms.config.receiptType.service.impl.ReceiptTypeServiceImpl;
+import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
 import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader;
 import org.jeecg.modules.wms.receipt.receiptHeader.mapper.ReceiptDetailMapper;
 import org.jeecg.modules.wms.receipt.receiptHeader.mapper.ReceiptHeaderMapper;
+import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService;
 import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService;
 import org.jeecg.utils.StringUtils;
 import org.jeecg.utils.constant.QuantityConstant;
@@ -41,6 +43,10 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R
 	private ReceiptDetailMapper receiptDetailMapper;
 	@Resource
 	private IReceiptTypeService receiptTypeService;
+	@Resource
+	private IReceiptDetailService receiptDetailService;
+	@Resource
+	private IReceiptHeaderService receiptHeaderService;
 
 	@Override
 	@Transactional
@@ -112,4 +118,45 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R
 		}
 		return code;
 	}
+
+	/**
+	 * 更新入库单 头状态和尾状态
+	 * 头状态是单据详情中最大的状态
+	 * 尾状态是单据详情中最小的状态
+	 * @param id
+	 * @return
+	 */
+	@Override
+	public boolean updateReceiptHeaderStatus(Integer id) {
+		LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
+		receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getId, id);
+		List<ReceiptDetail> receiptDetailList = receiptDetailService.list(receiptDetailLambdaQueryWrapper);
+		ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
+		if(receiptHeader == null) {
+			return false;
+		}
+		int minStatus;
+		int maxStatus;
+		if(receiptDetailList.size() == 0) {
+			minStatus = QuantityConstant.RECEIPT_HEADER_BUILD;
+			maxStatus = QuantityConstant.RECEIPT_HEADER_BUILD;
+		} else {
+			minStatus = QuantityConstant.RECEIPT_HEADER_BUILD;
+			maxStatus = QuantityConstant.RECEIPT_HEADER_BUILD;
+			for(ReceiptDetail receiptDetail : receiptDetailList) {
+				int status = receiptDetail.getStatus();
+				if (minStatus > status) {
+					minStatus = status;
+				}
+				if (maxStatus < status) {
+					maxStatus = status;
+				}
+			}
+		}
+
+		receiptHeader.setFirstStatus(maxStatus);
+		receiptHeader.setLastStatus(minStatus);
+		boolean result = receiptHeaderService.updateById(receiptHeader);
+		return result;
+	}
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java
index 7b631ee..9089802 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java
@@ -52,6 +52,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive>  imp
     private IContainerTypeService containerTypeService;
     @Resource
     private IReceiptContaienrDetailService receiptContaienrDetailService;
+    @Resource
+    private IReceiptHeaderService receiptHeaderService;
 
     /**
     *  1.判断容器是否存在,并且不能被锁定
@@ -140,6 +142,13 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive>  imp
             if(receiptDetail == null) {
                 throw new ServiceException("没有找到入库单详情,id:" + receive.getId());
             }
+            ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
+            if(receiptHeader == null) {
+                throw new ServiceException("没有找到入库单,id:" + receiptDetail.getReceiptId());
+            }
+            if(receiptHeader.getWarehouseCode().equals(warehouseCode)) {
+                throw new ServiceException("仓库编码不一致,不能操作");
+            }
             String materialCode = receiptDetail.getMaterialCode();
             if(StringUtils.isEmpty(materialCode)) {
                 throw new ServiceException("物料编码为空");
@@ -198,7 +207,7 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive>  imp
                 throw new ServiceException("保存入库组盘详情失败");
             }
         }
-        
+
         return Result.OK("收货成功");
     }
 }
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
new file mode 100644
index 0000000..0eb47e1
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
@@ -0,0 +1,296 @@
+package org.jeecg.modules.wms.task.taskHeader.controller;
+
+import org.jeecg.common.system.query.QueryGenerator;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
+import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService;
+import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.web.servlet.ModelAndView;
+import java.util.Arrays;
+import org.jeecg.common.util.oConvertUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+ /**
+ * @Description: 任务表
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+@Api(tags="任务表")
+@RestController
+@RequestMapping("/task/taskHeader")
+@Slf4j
+public class TaskHeaderController extends JeecgController<TaskHeader, ITaskHeaderService> {
+
+	@Autowired
+	private ITaskHeaderService taskHeaderService;
+
+	@Autowired
+	private ITaskDetailService taskDetailService;
+
+
+	/*---------------------------------主表处理-begin-------------------------------------*/
+
+	/**
+	 * 分页列表查询
+	 * @param taskHeader
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "任务表-分页列表查询")
+	@ApiOperation(value="任务表-分页列表查询", notes="任务表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<TaskHeader>> queryPageList(TaskHeader taskHeader,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<TaskHeader> queryWrapper = QueryGenerator.initQueryWrapper(taskHeader, req.getParameterMap());
+		Page<TaskHeader> page = new Page<TaskHeader>(pageNo, pageSize);
+		IPage<TaskHeader> pageList = taskHeaderService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+
+	/**
+     *   添加
+     * @param taskHeader
+     * @return
+     */
+    @AutoLog(value = "任务表-添加")
+    @ApiOperation(value="任务表-添加", notes="任务表-添加")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody TaskHeader taskHeader) {
+        taskHeaderService.save(taskHeader);
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     *  编辑
+     * @param taskHeader
+     * @return
+     */
+    @AutoLog(value = "任务表-编辑")
+    @ApiOperation(value="任务表-编辑", notes="任务表-编辑")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<String> edit(@RequestBody TaskHeader taskHeader) {
+        taskHeaderService.updateById(taskHeader);
+        return Result.OK("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "任务表-通过id删除")
+    @ApiOperation(value="任务表-通过id删除", notes="任务表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+        taskHeaderService.delMain(id);
+        return Result.OK("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "任务表-批量删除")
+    @ApiOperation(value="任务表-批量删除", notes="任务表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+        this.taskHeaderService.delBatchMain(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 导出
+     * @return
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, TaskHeader taskHeader) {
+        return super.exportXls(request, taskHeader, TaskHeader.class, "任务表");
+    }
+
+    /**
+     * 导入
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, TaskHeader.class);
+    }
+	/*---------------------------------主表处理-end-------------------------------------*/
+
+
+    /*--------------------------------子表处理-任务详情-begin----------------------------------------------*/
+	/**
+	 * 通过主表ID查询
+	 * @return
+	 */
+	//@AutoLog(value = "任务详情-通过主表ID查询")
+	@ApiOperation(value="任务详情-通过主表ID查询", notes="任务详情-通过主表ID查询")
+	@GetMapping(value = "/listTaskDetailByMainId")
+    public Result<IPage<TaskDetail>> listTaskDetailByMainId(TaskDetail taskDetail,
+															@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+															@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+															HttpServletRequest req) {
+        QueryWrapper<TaskDetail> queryWrapper = QueryGenerator.initQueryWrapper(taskDetail, req.getParameterMap());
+        Page<TaskDetail> page = new Page<TaskDetail>(pageNo, pageSize);
+        IPage<TaskDetail> pageList = taskDetailService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+	/**
+	 * 添加
+	 * @param taskDetail
+	 * @return
+	 */
+	@AutoLog(value = "任务详情-添加")
+	@ApiOperation(value="任务详情-添加", notes="任务详情-添加")
+	@PostMapping(value = "/addTaskDetail")
+	public Result<String> addTaskDetail(@RequestBody TaskDetail taskDetail) {
+		taskDetailService.save(taskDetail);
+		return Result.OK("添加成功!");
+	}
+
+    /**
+	 * 编辑
+	 * @param taskDetail
+	 * @return
+	 */
+	@AutoLog(value = "任务详情-编辑")
+	@ApiOperation(value="任务详情-编辑", notes="任务详情-编辑")
+	@RequestMapping(value = "/editTaskDetail", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> editTaskDetail(@RequestBody TaskDetail taskDetail) {
+		taskDetailService.updateById(taskDetail);
+		return Result.OK("编辑成功!");
+	}
+
+	/**
+	 * 通过id删除
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "任务详情-通过id删除")
+	@ApiOperation(value="任务详情-通过id删除", notes="任务详情-通过id删除")
+	@DeleteMapping(value = "/deleteTaskDetail")
+	public Result<String> deleteTaskDetail(@RequestParam(name="id",required=true) String id) {
+		taskDetailService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+
+	/**
+	 * 批量删除
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "任务详情-批量删除")
+	@ApiOperation(value="任务详情-批量删除", notes="任务详情-批量删除")
+	@DeleteMapping(value = "/deleteBatchTaskDetail")
+	public Result<String> deleteBatchTaskDetail(@RequestParam(name="ids",required=true) String ids) {
+	    this.taskDetailService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+
+    /**
+     * 导出
+     * @return
+     */
+    @RequestMapping(value = "/exportTaskDetail")
+    public ModelAndView exportTaskDetail(HttpServletRequest request, TaskDetail taskDetail) {
+		 // Step.1 组装查询条件
+		 QueryWrapper<TaskDetail> queryWrapper = QueryGenerator.initQueryWrapper(taskDetail, request.getParameterMap());
+		 LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+		 // Step.2 获取导出数据
+		 List<TaskDetail> pageList = taskDetailService.list(queryWrapper);
+		 List<TaskDetail> exportList = null;
+
+		 // 过滤选中数据
+		 String selections = request.getParameter("selections");
+		 if (oConvertUtils.isNotEmpty(selections)) {
+			 List<String> selectionList = Arrays.asList(selections.split(","));
+			 exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
+		 } else {
+			 exportList = pageList;
+		 }
+
+		 // Step.3 AutoPoi 导出Excel
+		 ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+		 mv.addObject(NormalExcelConstants.FILE_NAME, "任务详情"); //此处设置的filename无效 ,前端会重更新设置一下
+		 mv.addObject(NormalExcelConstants.CLASS, TaskDetail.class);
+		 mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务详情报表", "导出人:" + sysUser.getRealname(), "任务详情"));
+		 mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+		 return mv;
+    }
+
+    /**
+     * 导入
+     * @return
+     */
+    @RequestMapping(value = "/importTaskDetail/{mainId}")
+    public Result<?> importTaskDetail(HttpServletRequest request, HttpServletResponse response, @PathVariable("mainId") Integer mainId) {
+		 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+		 Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+		 for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+			 MultipartFile file = entity.getValue();// 获取上传文件对象
+			 ImportParams params = new ImportParams();
+			 params.setTitleRows(2);
+			 params.setHeadRows(1);
+			 params.setNeedSave(true);
+			 try {
+				 List<TaskDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), TaskDetail.class, params);
+				 for (TaskDetail temp : list) {
+                    temp.setTaskHeaderId(mainId);
+				 }
+				 long start = System.currentTimeMillis();
+				 taskDetailService.saveBatch(list);
+				 log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
+				 return Result.OK("文件导入成功!数据行数:" + list.size());
+			 } catch (Exception e) {
+				 log.error(e.getMessage(), e);
+				 return Result.error("文件导入失败:" + e.getMessage());
+			 } finally {
+				 try {
+					 file.getInputStream().close();
+				 } catch (IOException e) {
+					 e.printStackTrace();
+				 }
+			 }
+		 }
+		 return Result.error("文件导入失败!");
+    }
+
+    /*--------------------------------子表处理-任务详情-end----------------------------------------------*/
+
+
+
+
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskDetail.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskDetail.java
new file mode 100644
index 0000000..0b7e1c4
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskDetail.java
@@ -0,0 +1,143 @@
+package org.jeecg.modules.wms.task.taskHeader.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import org.jeecg.common.aspect.annotation.Dict;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @Description: 任务详情
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("task_detail")
+@ApiModel(value="task_detail对象", description="任务详情")
+public class TaskDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+	/**任务头ID*/
+    @ApiModelProperty(value = "任务头ID")
+    private Integer taskHeaderId;
+	/**任务类型*/
+	@Excel(name = "任务类型", width = 15)
+    @ApiModelProperty(value = "任务类型")
+    private Integer taskType;
+	/**仓库编码*/
+	@Excel(name = "仓库编码", width = 15)
+    @ApiModelProperty(value = "仓库编码")
+    private String warehouseCode;
+	/**货主*/
+	@Excel(name = "货主", width = 15)
+    @ApiModelProperty(value = "货主")
+    private String companyCode;
+	/**出库单id*/
+	@Excel(name = "出库单id", width = 15)
+    @ApiModelProperty(value = "出库单id")
+    private Integer shipmentId;
+	/**出库详情id*/
+	@Excel(name = "出库详情id", width = 15)
+    @ApiModelProperty(value = "出库详情id")
+    private Integer shipmentDetailId;
+	/**出库组盘详情id*/
+	@Excel(name = "出库组盘详情id", width = 15)
+    @ApiModelProperty(value = "出库组盘详情id")
+    private Integer shipmentContainerDetailId;
+	/**入库单id*/
+	@Excel(name = "入库单id", width = 15)
+    @ApiModelProperty(value = "入库单id")
+    private Integer receiptId;
+	/**入库单详情id*/
+	@Excel(name = "入库单详情id", width = 15)
+    @ApiModelProperty(value = "入库单详情id")
+    private Integer receiptDetailId;
+	/**入库组盘详情Id*/
+	@Excel(name = "入库组盘详情Id", width = 15)
+    @ApiModelProperty(value = "入库组盘详情Id")
+    private Integer receiptContainerDetailId;
+	/**物料编码*/
+	@Excel(name = "物料编码", width = 15)
+    @ApiModelProperty(value = "物料编码")
+    private String materialCode;
+	/**物料名称*/
+	@Excel(name = "物料名称", width = 15)
+    @ApiModelProperty(value = "物料名称")
+    private String materialName;
+	/**物料规格*/
+	@Excel(name = "物料规格", width = 15)
+    @ApiModelProperty(value = "物料规格")
+    private String materialSpec;
+	/**物料单位*/
+	@Excel(name = "物料单位", width = 15)
+    @ApiModelProperty(value = "物料单位")
+    private String materialUnit;
+	/**数量*/
+	@Excel(name = "数量", width = 15)
+    @ApiModelProperty(value = "数量")
+    private BigDecimal qty;
+	/**批次*/
+	@Excel(name = "批次", width = 15)
+    @ApiModelProperty(value = "批次")
+    private String batch;
+	/**批号*/
+	@Excel(name = "批号", width = 15)
+    @ApiModelProperty(value = "批号")
+    private String lot;
+	/**项目号*/
+	@Excel(name = "项目号", width = 15)
+    @ApiModelProperty(value = "项目号")
+    private String project;
+	/**库存状态*/
+	@Excel(name = "库存状态", width = 15)
+    @Dict(dicCode = "inventory_status")
+    @ApiModelProperty(value = "库存状态")
+    private String inventoryStatus;
+	/**出库的库存详情id*/
+	@Excel(name = "出库的库存详情id", width = 15)
+    @ApiModelProperty(value = "出库的库存详情id")
+    private Integer fromInventoryDetailId;
+	/**入库的库存详情id*/
+	@Excel(name = "入库的库存详情id", width = 15)
+    @ApiModelProperty(value = "入库的库存详情id")
+    private Integer toInventoryDetailId;
+	/**备用字段1*/
+	@Excel(name = "备用字段1", width = 15)
+    @ApiModelProperty(value = "备用字段1")
+    private String userdef1;
+	/**备用字段2*/
+	@Excel(name = "备用字段2", width = 15)
+    @ApiModelProperty(value = "备用字段2")
+    private String userdef2;
+	/**备用字段3*/
+	@Excel(name = "备用字段3", width = 15)
+    @ApiModelProperty(value = "备用字段3")
+    private String userdef3;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建日期*/
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新日期*/
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java
new file mode 100644
index 0000000..0d69e0d
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java
@@ -0,0 +1,125 @@
+package org.jeecg.modules.wms.task.taskHeader.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 任务表
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("task_header")
+@ApiModel(value="task_header对象", description="任务表")
+public class TaskHeader implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+	/**前置任务号*/
+    @Excel(name = "前置任务号", width = 15)
+    @ApiModelProperty(value = "前置任务号")
+    private Integer preTaskNo;
+    /**前置任务号*/
+    @Excel(name = "入库组盘ID", width = 15)
+    @ApiModelProperty(value = "入库组盘ID")
+    private Integer receiptContaienrHeaderId;
+	/**仓库*/
+    @Excel(name = "仓库", width = 15)
+    @ApiModelProperty(value = "仓库")
+    private String warehouseCode;
+	/**货主*/
+    @Excel(name = "货主", width = 15)
+    @ApiModelProperty(value = "货主")
+    private String companyCode;
+	/**库区*/
+    @Excel(name = "库区", width = 15)
+    @ApiModelProperty(value = "库区")
+    private String zoneCode;
+	/**任务类型*/
+    @Excel(name = "任务类型", width = 15, dicCode = "task_type")
+    @Dict(dicCode = "task_type")
+    @ApiModelProperty(value = "任务类型")
+    private Integer taskType;
+	/**内部任务类型*/
+    @Excel(name = "内部任务类型", width = 15)
+    @ApiModelProperty(value = "内部任务类型")
+    private Integer innernalTaskType;
+	/**容器号*/
+    @Excel(name = "容器号", width = 15)
+    @ApiModelProperty(value = "容器号")
+    private String containerCode;
+	/**起始库位*/
+    @Excel(name = "起始库位", width = 15)
+    @ApiModelProperty(value = "起始库位")
+    private String fromLocationCode;
+	/**目标库位*/
+    @Excel(name = "目标库位", width = 15)
+    @ApiModelProperty(value = "目标库位")
+    private String toLocationCode;
+	/**是否空出*/
+    @Excel(name = "是否空出", width = 15, dicCode = "is_or_not")
+    @Dict(dicCode = "is_or_not")
+    @ApiModelProperty(value = "是否空出")
+    private String isEmptyOut;
+	/**是否重入*/
+    @Excel(name = "是否重入", width = 15, dicCode = "is_or_not")
+    @Dict(dicCode = "is_or_not")
+    @ApiModelProperty(value = "是否重入")
+    private Integer isDoubleIn;
+	/**重入库位号*/
+    @Excel(name = "重入库位号", width = 15)
+    @ApiModelProperty(value = "重入库位号")
+    private String originLocationCode;
+	/**任务状态*/
+    @Excel(name = "任务状态", width = 15, dicCode = "task_header_status")
+    @Dict(dicCode = "task_header_status")
+    @ApiModelProperty(value = "任务状态")
+    private Integer status;
+	/**起始出入口*/
+    @Excel(name = "起始出入口", width = 15)
+    @ApiModelProperty(value = "起始出入口")
+    private String fromPort;
+	/**目标出入口*/
+    @Excel(name = "目标出入口", width = 15)
+    @ApiModelProperty(value = "目标出入口")
+    private String toPort;
+	/**备用字段1*/
+    @Excel(name = "备用字段1", width = 15)
+    @ApiModelProperty(value = "备用字段1")
+    private String userdef1;
+	/**备用字段2*/
+    @Excel(name = "备用字段2", width = 15)
+    @ApiModelProperty(value = "备用字段2")
+    private String userdef2;
+	/**备用字段3*/
+    @Excel(name = "备用字段3", width = 15)
+    @ApiModelProperty(value = "备用字段3")
+    private String userdef3;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建日期*/
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新日期*/
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskDetailMapper.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskDetailMapper.java
new file mode 100644
index 0000000..1870b1b
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskDetailMapper.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.wms.task.taskHeader.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
+
+/**
+ * @Description: 任务详情
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+public interface TaskDetailMapper extends BaseMapper<TaskDetail> {
+
+	public boolean deleteByMainId(@Param("mainId") String mainId);
+
+	public List<TaskDetail> selectByMainId(@Param("mainId") String mainId);
+
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskHeaderMapper.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskHeaderMapper.java
new file mode 100644
index 0000000..40d5b19
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskHeaderMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.wms.task.taskHeader.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
+
+/**
+ * @Description: 任务表
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+public interface TaskHeaderMapper extends BaseMapper<TaskHeader> {
+
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskDetailMapper.xml b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskDetailMapper.xml
new file mode 100644
index 0000000..5972449
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskDetailMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE
+		FROM  task_detail
+		WHERE
+			 task_header_id = #{mainId}
+	</delete>
+
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail">
+		SELECT *
+		FROM  task_detail
+		WHERE
+			 task_header_id = #{mainId}
+	</select>
+</mapper>
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskHeaderMapper.xml b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskHeaderMapper.xml
new file mode 100644
index 0000000..d8179cd
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskHeaderMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.wms.task.taskHeader.mapper.TaskHeaderMapper">
+
+</mapper>
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java
new file mode 100644
index 0000000..ca05daa
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.wms.task.taskHeader.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.wms.config.location.entity.Location;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
+
+import java.util.List;
+
+/**
+ * @Description: 任务详情
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+public interface ITaskDetailService extends IService<TaskDetail> {
+
+	public List<TaskDetail> selectByMainId(String mainId);
+
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java
new file mode 100644
index 0000000..e2e5218
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java
@@ -0,0 +1,30 @@
+package org.jeecg.modules.wms.task.taskHeader.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.wms.config.location.entity.Location;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
+import org.springframework.beans.factory.annotation.Autowired;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: 任务表
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+public interface ITaskHeaderService extends IService<TaskHeader> {
+
+	/**
+	 * 删除一对多
+	 */
+	public void delMain (String id);
+
+	/**
+	 * 批量删除一对多
+	 */
+	public void delBatchMain (Collection<? extends Serializable> idList);
+
+	public boolean haveUncompleteTaskInNear(Location location);
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java
new file mode 100644
index 0000000..190f77e
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java
@@ -0,0 +1,43 @@
+package org.jeecg.modules.wms.task.taskHeader.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.jeecg.modules.wms.config.location.entity.Location;
+import org.jeecg.modules.wms.config.location.service.ILocationService;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
+import org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper;
+import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService;
+import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
+import org.jeecg.utils.constant.QuantityConstant;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 任务详情
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+@Service
+public class TaskDetailServiceImpl extends ServiceImpl<TaskDetailMapper, TaskDetail> implements ITaskDetailService {
+
+	@Autowired
+	private TaskDetailMapper taskDetailMapper;
+	@Resource
+	private ILocationService locationService;
+	@Resource
+	private ITaskHeaderService taskHeaderService;
+
+	@Override
+	public List<TaskDetail> selectByMainId(String mainId) {
+		return taskDetailMapper.selectByMainId(mainId);
+	}
+
+
+
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
new file mode 100644
index 0000000..77e7c03
--- /dev/null
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
@@ -0,0 +1,70 @@
+package org.jeecg.modules.wms.task.taskHeader.service.impl;
+
+import org.jeecg.modules.wms.config.location.entity.Location;
+import org.jeecg.modules.wms.config.location.service.ILocationService;
+import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
+import org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper;
+import org.jeecg.modules.wms.task.taskHeader.mapper.TaskHeaderMapper;
+import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
+import org.jeecg.utils.constant.QuantityConstant;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * @Description: 任务表
+ * @Author: jeecg-boot
+ * @Date:   2022-11-10
+ * @Version: V1.0
+ */
+@Service
+public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHeader> implements ITaskHeaderService {
+
+	@Autowired
+	private TaskHeaderMapper taskHeaderMapper;
+	@Autowired
+	private TaskDetailMapper taskDetailMapper;
+	@Resource
+	private ILocationService locationService;
+
+	@Override
+	@Transactional
+	public void delMain(String id) {
+		taskDetailMapper.deleteByMainId(id);
+		taskHeaderMapper.deleteById(id);
+	}
+
+	@Override
+	@Transactional
+	public void delBatchMain(Collection<? extends Serializable> idList) {
+		for(Serializable id:idList) {
+			taskDetailMapper.deleteByMainId(id.toString());
+			taskHeaderMapper.deleteById(id);
+		}
+	}
+
+	/**
+	 * 如果库位是锁定的,那么这个库位一定是被某个任务占用。
+	 * @param location
+	 * @return
+	 */
+	@Override
+	public boolean haveUncompleteTaskInNear(Location location) {
+		Location location1 = locationService.getNear(location);
+		if (location1 == null) {
+			return false;
+		}
+		String status = location1.getStatus();
+		if(QuantityConstant.STATUS_LOCATION_LOCK.equals(status)) {
+			return true;
+		}
+		return false;
+	}
+
+}
diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
index 9df14a7..ab460f1 100644
--- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
+++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
@@ -58,7 +58,7 @@ public class QuantityConstant {
     public static final Integer RECEIPT_HEADER_POSITION = 240;
 
     //等待上架
-    public static final Integer RECEIPT_HEADER_WAIT = 280;
+    public static final Integer RECEIPT_HEADER_WAIT_SHELF = 280;
 
     //上架
     public static final Integer RECEIPT_HEADER_SHELF = 300;