diff --git a/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue b/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue
index bef7d74..485f698 100644
--- a/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue
+++ b/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue
@@ -6,7 +6,7 @@
     :arrowPointAtCenter="true"
     overlayClassName="header-notice-wrapper"
     @visibleChange="handleHoverChange"
-    :overlayStyle="{ width: '350px', top: '50px' }">
+    :overlayStyle="{ width: '300px', top: '50px' }">
     <template slot="content">
       <a-spin :spinning="loadding">
         <a-tabs>
diff --git a/ant-design-vue-jeecg/src/views/system/UserList.vue b/ant-design-vue-jeecg/src/views/system/UserList.vue
index af2c1a2..cecb056 100644
--- a/ant-design-vue-jeecg/src/views/system/UserList.vue
+++ b/ant-design-vue-jeecg/src/views/system/UserList.vue
@@ -94,11 +94,11 @@
       </div>
 
       <a-table
-        :scroll="{x: 1200}"
         ref="table"
-        bordered
         size="middle"
+        bordered
         rowKey="id"
+        :scroll="{x:true}"
         :columns="columns"
         :dataSource="dataSource"
         :pagination="ipagination"
@@ -261,8 +261,7 @@ export default {
           align: "center",
           dataIndex: 'selectedRoleList',
           key: 'selectedRoleList',
-          scopedSlots: {customRender: 'selectedRoleList'},
-          width: 200
+          scopedSlots: {customRender: 'selectedRoleList'}
         },
         // {
         //   title: '生日',
@@ -285,16 +284,14 @@ export default {
           align: "center",
           dataIndex: 'selectedWarehouses',
           key: 'selectedWarehouses',
-          scopedSlots: {customRender: 'selectedWarehouses'},
-          width: 200
+          scopedSlots: {customRender: 'selectedWarehouses'}
         },
         {
           title: '所属库区',
           align: "center",
           dataIndex: 'zoneCodes',
           key: 'zoneCodes',
-          scopedSlots: {customRender: 'zoneCodes'},
-          width: 200
+          scopedSlots: {customRender: 'zoneCodes'}
         },
         // {
         //   title: '部门',
diff --git a/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue b/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue
index abc41f8..cbffa90 100644
--- a/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue
+++ b/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue
@@ -96,7 +96,6 @@
         :pagination="ipagination"
         :loading="loading"
         :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        class="j-table-force-nowrap"
         @change="handleTableChange">
 
         <span slot="zoneCode" slot-scope="zoneCode">
@@ -202,12 +201,14 @@ export default {
         {
           title: '参数键值',
           align: "center",
-          dataIndex: 'value'
+          dataIndex: 'value',
+          width: 200,
         },
         {
           title: '备注',
           align: "center",
-          dataIndex: 'remark'
+          dataIndex: 'remark',
+          width: 300
         },
         {
           title: '创建人',
diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/LockStationList.vue b/ant-design-vue-jeecg/src/views/system/lockStation/LockStationList.vue
new file mode 100644
index 0000000..30d1a81
--- /dev/null
+++ b/ant-design-vue-jeecg/src/views/system/lockStation/LockStationList.vue
@@ -0,0 +1,212 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-row :gutter="24">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="站台">
+                <j-input placeholder="请输入站台" v-model="queryParam.code"></j-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.taskId"></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="port_lock_status"/>
+              </a-form-item>
+            </a-col>
+            <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>
+            </span>
+            </a-col>
+          </a-row>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <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"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @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 @click="handleDetail(record)">详情</a>
+              </a-menu-item>
+              <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>
+
+    <lock-station-modal ref="modalForm" @ok="modalFormOk"></lock-station-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import LockStationModal from './modules/LockStationModal'
+
+  export default {
+    name: 'LockStationList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      LockStationModal
+    },
+    data () {
+      return {
+        description: '锁定站台管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'仓库',
+            align:"center",
+            dataIndex: 'warehouseCode'
+          },
+          {
+            title:'站台',
+            align:"center",
+            dataIndex: 'code'
+          },
+          {
+            title:'任务ID',
+            align:"center",
+            dataIndex: 'taskId'
+          },
+          {
+            title:'状态',
+            align:"center",
+            dataIndex: 'status_dictText'
+          },
+          {
+            title:'库区',
+            align:"center",
+            dataIndex: 'zoneCode'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/lock/lockStation/list",
+          delete: "/lock/lockStation/delete",
+          deleteBatch: "/lock/lockStation/deleteBatch",
+          exportXlsUrl: "/lock/lockStation/exportXls",
+          importExcelUrl: "lock/lockStation/importExcel",
+
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'warehouseCode',text:'仓库',dictCode:''})
+        fieldList.push({type:'string',value:'code',text:'站台',dictCode:''})
+        fieldList.push({type:'string',value:'taskId',text:'任务ID',dictCode:''})
+        fieldList.push({type:'int',value:'status',text:'状态',dictCode:''})
+        fieldList.push({type:'string',value:'zoneCode',text:'库区',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
\ No newline at end of file
diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationForm.vue b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationForm.vue
new file mode 100644
index 0000000..60066ef
--- /dev/null
+++ b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationForm.vue
@@ -0,0 +1,150 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="仓库" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="warehouseCode">
+              <a-input v-model="model.warehouseCode" placeholder="请输入仓库"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="站台" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="code">
+              <j-search-select-tag
+                placeholder="请选择入库口"
+                v-model="model.code"
+                dict="port,name,code,type !='2'"
+                :pageSize="5"
+                :async="true">
+              </j-search-select-tag>
+            </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 v-model="model.status" title="状态" dictCode="port_lock_status" placeholder="请选择状态"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="库区" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zoneCode">
+              <a-select
+                show-search
+                placeholder="请选择库区"
+                option-filter-prop="children"
+                v-model="model.zoneCode">
+                <a-select-option v-for="item in zoneList" :key="item.name" :value="item.code">{{
+                    item.name
+                  }}
+                </a-select-option>
+              </a-select>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+  import {getZoneList} from '@/api/api'
+
+  export default {
+    name: 'LockStationForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          code: [
+            {required: true, message: '请选择站台!'},
+          ],
+          status: [
+            {required: true, message: '请选择状态!'},
+          ],
+        },
+        url: {
+          add: "/lock/lockStation/add",
+          edit: "/lock/lockStation/edit",
+          queryById: "/lock/lockStation/queryById"
+        },
+        zoneList: []
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+      this.loadFrom();
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      loadFrom() {
+        getZoneList().then((res) => {
+          if (res.success) {
+            this.zoneList = res.result
+          }
+        });
+      },
+      submitForm () {
+        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;
+            })
+          }
+
+        })
+      },
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.Style#Drawer.vue b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.Style#Drawer.vue
new file mode 100644
index 0000000..4f0ca46
--- /dev/null
+++ b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.Style#Drawer.vue
@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <lock-station-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></lock-station-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import LockStationForm from './LockStationForm'
+
+  export default {
+    name: 'LockStationModal',
+    components: {
+      LockStationForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>
\ No newline at end of file
diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.vue b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.vue
new file mode 100644
index 0000000..668c74f
--- /dev/null
+++ b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.vue
@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <lock-station-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></lock-station-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import LockStationForm from './LockStationForm'
+  export default {
+    name: 'LockStationModal',
+    components: {
+      LockStationForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue b/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue
index f8547f2..7bc63ca 100644
--- a/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue
+++ b/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue
@@ -24,6 +24,18 @@
                 />
               </a-form-model-item>
             </a-col>
+            <a-col :lg="15">
+              <a-form-model-item label="入库口">
+                <!--              <a-input placeholder="请输入入库口" v-model="quickMainModel.toPort"/>-->
+                <j-search-select-tag
+                  placeholder="请选择入库口"
+                  v-model="model.fromPort"
+                  dict="port,name,code,type !='2'"
+                  :pageSize="5"
+                  :async="true">
+                </j-search-select-tag>
+              </a-form-model-item>
+            </a-col>
           </a-row>
         </a-form-model>
       </a-spin>
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
index 4070a46..a8494d0 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
@@ -165,15 +165,15 @@ public class WebSocket {
      * @param userId
      * @param sysAnnouncement
      */
-    public void sendMessage(int userId, SysAnnouncement sysAnnouncement){
+    public void sendMessage(int userId, SysAnnouncement sysAnnouncement) {
         sendMessage(String.valueOf(userId), createJson(sysAnnouncement));
     }
 
-    public void sendMessage(List<SysUser> userList, SysAnnouncement announcement){
+    public void sendMessage(List<SysUser> userList, SysAnnouncement announcement) {
         userList.forEach(user -> sendMessage(user.getId(), announcement));
     }
 
-    private String createJson(SysAnnouncement announcement){
+    private String createJson(SysAnnouncement announcement) {
         JSONObject obj = new JSONObject();
         obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC);
         obj.put(WebsocketConst.MSG_ID, announcement.getId());
@@ -185,7 +185,7 @@ public class WebSocket {
      * 广播系统消息
      * @param sysAnnouncement
      */
-    public void sendMessage(SysAnnouncement sysAnnouncement){
+    public void sendMessage(SysAnnouncement sysAnnouncement) {
         sendMessage(createJson(sysAnnouncement));
     }
 
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java
index f6d4fc5..54fc256 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -197,8 +197,7 @@ public class LoginController {
         loginUser.setId(sysUser.getId() + "");
         baseCommonService.addLog("用户名:" + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser);
         // update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员
-
-        systemSync.sendSysAnnouncement(sysUser);
+//        systemSync.sendSysAnnouncement(sysUser);
         return result;
     }
 
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java
index ce3a28e..afcdc71 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java
@@ -98,6 +98,7 @@ public class MobileService implements IMobileService {
             taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT);
             taskHeader.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
         }
+        taskHeader.setZoneCode(container.getZoneCode());
         taskHeader.setCallBox(QuantityConstant.CALL_BOX);
         taskHeader.setContainerCode(containerCode);
         taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java
index 8123345..0715b1d 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java
@@ -8,6 +8,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.modules.wms.api.wcs.entity.*;
 import org.jeecg.modules.wms.api.wcs.service.WcsService;
 import org.jeecg.modules.wms.framework.controller.HuahengBaseController;
+import org.jeecg.modules.wms.lockStation.service.ILockStationService;
 import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
 import org.jeecg.utils.StringUtils;
 import org.jeecg.utils.interceptor.AccessLimit;
@@ -30,6 +31,8 @@ public class WcsController extends HuahengBaseController {
     private WcsService wcsService;
     @Resource
     private ITaskHeaderService taskHeaderService;
+    @Resource
+    private ILockStationService lockStationService;
 
     /**
      ** WCS给的长,宽,高,重在有不同规格库位才有用,destination是区域, locationType库位类型
@@ -258,4 +261,34 @@ public class WcsController extends HuahengBaseController {
         });
         return result;
     }
+
+    /**
+     ** 解锁站台
+     */
+    @AutoLog(value = "解锁站台")
+    @PostMapping("/removeLockStation")
+    @ApiOperation("解锁站台")
+    @ApiLogger(apiName = "解锁站台", from = "WCS")
+    public Result removeLockStation(@RequestBody WcsTaskLock wcsTaskLock, HttpServletRequest req) {
+        String warehouseCode = wcsTaskLock.getWarehouseCode();
+        String fromPort = wcsTaskLock.getFromPort();
+        if (StringUtils.isEmpty(warehouseCode)) {
+            return Result.error("解锁站台, 仓库号为空");
+        }
+        if (StringUtils.isEmpty(fromPort)) {
+            return Result.error("解锁站台, 站台为空");
+        }
+        String lockKey = warehouseCode;
+        Result result = handleMultiProcess("removeLockStation", lockKey, new MultiProcessListener() {
+
+            @Override
+            public Result<?> doProcess() {
+                if (!lockStationService.unlockStation(fromPort, warehouseCode)) {
+                    return Result.error("解锁失败");
+                }
+                return Result.ok("解锁成功");
+            }
+        });
+        return result;
+    }
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTaskLock.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTaskLock.java
new file mode 100644
index 0000000..c9834d1
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTaskLock.java
@@ -0,0 +1,10 @@
+package org.jeecg.modules.wms.api.wcs.entity;
+
+import lombok.Data;
+
+@Data
+public class WcsTaskLock {
+
+    private String fromPort;
+    private String warehouseCode;
+}
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java
index 3bc53e9..9f117ae 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java
@@ -13,11 +13,15 @@ import org.jeecg.modules.wms.api.erp.entity.*;
 import org.jeecg.modules.wms.api.erp.service.IErpService;
 import org.jeecg.modules.wms.api.wms.entity.WmsEntity;
 import org.jeecg.modules.wms.api.wms.entity.WmsInventory;
+import org.jeecg.modules.wms.config.container.entity.Container;
+import org.jeecg.modules.wms.config.container.service.IContainerService;
+import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService;
 import org.jeecg.modules.wms.framework.service.IHuahengMultiHandlerService;
 import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail;
 import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader;
 import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailService;
 import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService;
+import org.jeecg.modules.wms.lockStation.service.ILockStationService;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService;
 import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
@@ -56,35 +60,58 @@ public class WmsServiceImpl implements WmsService {
 
     @Resource
     private ITaskHeaderService taskHeaderService;
+
     @Resource
     private IReceiptContainerHeaderService receiptContainerHeaderService;
+
     @Resource
     private WmsService wmsService;
+
     @Resource
     private IErpService erpService;
+
     @Resource
     private IReceiveService receiveService;
+
     @Resource
     private IReceiptHeaderService receiptHeaderService;
+
     @Resource
     private IReceiptDetailService receiptDetailService;
+
     @Resource
     private IHuahengMultiHandlerService huahengMultiHandlerService;
+
     @Resource
     private IShipmentHeaderService shipmentHeaderService;
+
     @Resource
     private IShipmentDetailService shipmentDetailService;
+
     @Resource
     private IShipmentCombinationService shipmentCombinationService;
+
     @Resource
     private IShipmentContainerHeaderService shipmentContainerHeaderService;
+
     @Resource
     private IShipmentContainerDetailService shipmentContainerDetailService;
+
     @Resource
     private IInventoryDetailService inventoryDetailService;
+
     @Resource
     private IInventoryHeaderService inventoryHeaderService;
 
+    @Resource
+    private IContainerService containerService;
+
+    @Resource
+    private IParameterConfigurationService parameterConfigurationService;
+
+    @Resource
+    private ILockStationService lockStationService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Result sendWmsTask(WmsEntity wmsEntity) {
@@ -123,6 +150,14 @@ public class WmsServiceImpl implements WmsService {
         String toPort = wmsEntity.getToPort();
         String containerCode = wmsEntity.getContainerCode();
         String referCode = wmsEntity.getTaskNo();
+        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
+        if (container == null) {
+            return Result.error("托盘:" + containerCode + " 信息为空");
+        }
+        String zoneCode = container.getZoneCode();
+        if (StringUtils.isEmpty(zoneCode)) {
+            return Result.error("容器没有配置库区,请配置!");
+        }
         List<WmsInventory> wmsInventoryList = wmsEntity.getWmsInventoryList();
         List<Receive> receiveList = new ArrayList<>();
         if (wmsInventoryList == null) {
@@ -194,6 +229,17 @@ public class WmsServiceImpl implements WmsService {
                 throw new JeecgBootException("WMS下发入库信息,更新入库任务失败");
             }
         }
+        if (wmsEntity.getTaskType() == QuantityConstant.TASK_TYPE_WHOLERECEIPT) {
+            String value = parameterConfigurationService.getValueByCode(QuantityConstant.START_LOCKING_STATION, zoneCode);
+            if (StringUtils.isNotEmpty(value)) {
+                int lockStation = Integer.parseInt(value);
+                if (lockStation == QuantityConstant.START_LOCK_STATION) {
+                    if (!lockStationService.lockStation(toPort, warehouseCode)) {
+                        throw new JeecgBootException("生成入库任务时,站台已经锁定:" + toPort);
+                    }
+                }
+            }
+        }
         return result;
     }
 
@@ -292,7 +338,6 @@ public class WmsServiceImpl implements WmsService {
         if (StringUtils.isEmpty(toPort)) {
             return Result.error("WMS下发出库任务失败,没有找到出库口" + toPort);
         }
-
         InventoryHeader inventoryHeader = inventoryHeaderService.getInventoryHeaderByContainerCode(containerCode, warehouseCode);
         if (inventoryHeader == null) {
             return Result.error("WMS下发出库任务失败, 没有找到托盘库存" + containerCode);
@@ -330,7 +375,6 @@ public class WmsServiceImpl implements WmsService {
         if (StringUtils.isEmpty(toPort)) {
             return Result.error("WMS下发出库任务失败,没有找到出库口" + toPort);
         }
-
         List<InventoryDetail> inventoryDetailList = new ArrayList<>();
         for (WmsInventory wmsInventory : wmsInventoryList) {
             String materialCode = wmsInventory.getMaterialCode();
@@ -365,8 +409,8 @@ public class WmsServiceImpl implements WmsService {
     public Result createEmptyIn(WmsEntity wmsEntity) {
         String warehouseCode = wmsEntity.getWarehouseCode();
         String contaienrCode = wmsEntity.getContainerCode();
-
-        Result result = taskHeaderService.createEmptyIn(contaienrCode, QuantityConstant.EMPTY_STRING, warehouseCode);
+        String toPort = wmsEntity.getToPort();
+        Result result = taskHeaderService.createEmptyIn(contaienrCode, QuantityConstant.EMPTY_STRING, warehouseCode, toPort);
         return result;
     }
 
@@ -376,7 +420,6 @@ public class WmsServiceImpl implements WmsService {
         String warehouseCode = wmsEntity.getWarehouseCode();
         String toPort = wmsEntity.getToPort();
         String contaienrCode = wmsEntity.getContainerCode();
-
         Result result = taskHeaderService.createEmptyOut(contaienrCode, toPort, warehouseCode);
         return result;
     }
@@ -385,5 +428,4 @@ public class WmsServiceImpl implements WmsService {
     public Result cancelTaskByUpstreamTaskNo(String taskNo) {
         return taskHeaderService.cancelTaskByUpstreamTaskNo(taskNo);
     }
-
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java
index d354203..b48f773 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java
@@ -32,6 +32,7 @@ import org.jeecgframework.poi.excel.entity.ImportParams;
 import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
@@ -98,6 +99,7 @@ public class ParameterConfigurationController extends JeecgController<ParameterC
     @ApiOperation(value = "参数配置-编辑", notes = "参数配置-编辑")
     @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
     @RequiresPermissions("parameterConfiguration:edit")
+    @CacheEvict(value = "parameterConfigurationService", allEntries = true)
     public Result<String> edit(@RequestBody ParameterConfiguration parameterConfiguration) {
         parameterConfigurationService.updateById(parameterConfiguration);
         return Result.OK("编辑成功!");
@@ -112,6 +114,7 @@ public class ParameterConfigurationController extends JeecgController<ParameterC
     @ApiOperation(value = "参数配置-通过id删除", notes = "参数配置-通过id删除")
     @DeleteMapping(value = "/delete")
     @RequiresPermissions("parameterConfiguration:delete")
+    @CacheEvict(value = "parameterConfigurationService", allEntries = true)
     public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
         parameterConfigurationService.removeById(id);
         return Result.OK("删除成功!");
@@ -126,6 +129,7 @@ public class ParameterConfigurationController extends JeecgController<ParameterC
     @ApiOperation(value = "参数配置-批量删除", notes = "参数配置-批量删除")
     @DeleteMapping(value = "/deleteBatch")
     @RequiresPermissions("parameterConfiguration:deleteBatch")
+    @CacheEvict(value = "parameterConfigurationService", allEntries = true)
     public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
         this.parameterConfigurationService.removeByIds(Arrays.asList(ids.split(",")));
         return Result.OK("批量删除成功!");
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java
index a8ee222..e8ed1e5 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java
@@ -6,6 +6,7 @@ import org.jeecg.modules.wms.config.parameterConfiguration.entity.ParameterConfi
 import org.jeecg.modules.wms.config.parameterConfiguration.mapper.ParameterConfigurationMapper;
 import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService;
 import org.jeecg.utils.constant.QuantityConstant;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -19,15 +20,18 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  * @Version:     V1.0
  */
 @Service
-public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConfigurationMapper, ParameterConfiguration> implements IParameterConfigurationService {
+public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConfigurationMapper, ParameterConfiguration>
+    implements IParameterConfigurationService {
 
     @Resource
     IParameterConfigurationService parameterConfigurationService;
 
     @Override
+    @Cacheable(value = "parameterConfigurationService#3600", key = "#root.methodName + '_' + #code", unless = "#result == null")
     public String getValueByCode(String code) {
         LambdaQueryWrapper<ParameterConfiguration> parameterConfigurationLambdaQueryWrapper = Wrappers.lambdaQuery();
-        parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code).eq(ParameterConfiguration::getZoneCode, QuantityConstant.EMPTY_STRING);
+        parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code).eq(ParameterConfiguration::getZoneCode,
+            QuantityConstant.EMPTY_STRING);
         ParameterConfiguration parameterConfiguration = getOne(parameterConfigurationLambdaQueryWrapper);
         if (parameterConfiguration == null) {
             return null;
@@ -37,6 +41,7 @@ public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConf
     }
 
     @Override
+    @Cacheable(value = "parameterConfigurationService#3600", key = "#root.methodName + '_' + #code + '_' + #zoneCode", unless = "#result == null")
     public String getValueByCode(String code, String zoneCode) {
         LambdaQueryWrapper<ParameterConfiguration> parameterConfigurationLambdaQueryWrapper = Wrappers.lambdaQuery();
         parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code).eq(ParameterConfiguration::getZoneCode, zoneCode);
@@ -49,6 +54,7 @@ public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConf
     }
 
     @Override
+    @Cacheable(value = "parameterConfigurationService#3600", key = "#root.methodName + '_' + #code + '_int'", unless = "#result == null")
     public int getValueIntByCode(String code) {
         LambdaQueryWrapper<ParameterConfiguration> parameterConfigurationLambdaQueryWrapper = Wrappers.lambdaQuery();
         parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java
index bdea89d..b295e75 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java
@@ -88,9 +88,9 @@ public class HuahengBaseController {
         try {
             log.info("[{}] 开始分布式事务 lockKey = {},获取锁耗时: {}ms", taskName, fullLockKey, endTime - startTime);
             result = multiProcessListener.doProcess();
-        } catch (Exception e) {
+        } catch (Throwable e) {
             log.error("[{}] 执行分布式事务失败 lockKey = {},errorMessage = {}", taskName, fullLockKey, ExceptionUtil.getMessage(e), e);
-            return Result.error(ExceptionUtil.getMessage(e));
+            return Result.error(ExceptionUtil.getSimpleMessage(e));
         } finally {
             redissonDistributedLocker.unlock(fullLockKey);
             final long finishTime = SystemClock.now();
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/controller/LockStationController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/controller/LockStationController.java
new file mode 100644
index 0000000..6df34d1
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/controller/LockStationController.java
@@ -0,0 +1,156 @@
+package org.jeecg.modules.wms.lockStation.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.wms.lockStation.entity.LockStation;
+import org.jeecg.modules.wms.lockStation.service.ILockStationService;
+
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+ /**
+ * @Description: 锁定站台
+ * @Author: jeecg-boot
+ * @Date:   2023-10-23
+ * @Version: V1.0
+ */
+@Api(tags="锁定站台")
+@RestController
+@RequestMapping("/lock/lockStation")
+@Slf4j
+public class LockStationController extends JeecgController<LockStation, ILockStationService> {
+	@Autowired
+	private ILockStationService lockStationService;
+
+	/**
+	 * 分页列表查询
+	 *
+	 * @param lockStation
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "锁定站台-分页列表查询")
+	@ApiOperation(value="锁定站台-分页列表查询", notes="锁定站台-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<LockStation>> queryPageList(LockStation lockStation,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<LockStation> queryWrapper = QueryGenerator.initQueryWrapper(lockStation, req.getParameterMap());
+		Page<LockStation> page = new Page<LockStation>(pageNo, pageSize);
+		IPage<LockStation> pageList = lockStationService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+
+	/**
+	 *   添加
+	 *
+	 * @param lockStation
+	 * @return
+	 */
+	@AutoLog(value = "锁定站台-添加")
+	@ApiOperation(value="锁定站台-添加", notes="锁定站台-添加")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody LockStation lockStation) {
+		lockStationService.save(lockStation);
+		return Result.OK("添加成功!");
+	}
+
+	/**
+	 *  编辑
+	 *
+	 * @param lockStation
+	 * @return
+	 */
+	@AutoLog(value = "锁定站台-编辑")
+	@ApiOperation(value="锁定站台-编辑", notes="锁定站台-编辑")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody LockStation lockStation) {
+		lockStationService.updateById(lockStation);
+		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) {
+		lockStationService.removeById(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.lockStationService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "锁定站台-通过id查询")
+	@ApiOperation(value="锁定站台-通过id查询", notes="锁定站台-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<LockStation> queryById(@RequestParam(name="id",required=true) String id) {
+		LockStation lockStation = lockStationService.getById(id);
+		if(lockStation==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(lockStation);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param lockStation
+    */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, LockStation lockStation) {
+        return super.exportXls(request, lockStation, LockStation.class, "锁定站台");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, LockStation.class);
+    }
+
+}
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/entity/LockStation.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/entity/LockStation.java
new file mode 100644
index 0000000..43f117d
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/entity/LockStation.java
@@ -0,0 +1,67 @@
+package org.jeecg.modules.wms.lockStation.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 锁定站台
+ * @Author: jeecg-boot
+ * @Date:   2023-10-23
+ * @Version: V1.0
+ */
+@Data
+@TableName("lock_station")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="lock_station对象", description="锁定站台")
+public class LockStation implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+	/**仓库*/
+	@Excel(name = "仓库", width = 15)
+    @ApiModelProperty(value = "仓库")
+    private String warehouseCode;
+	/**站台*/
+	@Excel(name = "站台", width = 15)
+    @ApiModelProperty(value = "站台")
+    private String code;
+	/**任务ID*/
+	@Excel(name = "任务ID", width = 15)
+    @ApiModelProperty(value = "任务ID")
+    private String taskId;
+	/**状态*/
+	@Excel(name = "状态", width = 15, dicCode = "port_lock_status")
+    @Dict(dicCode = "port_lock_status")
+    @ApiModelProperty(value = "状态")
+    private Integer status;
+	/**库区*/
+	@Excel(name = "库区", width = 15)
+    @ApiModelProperty(value = "库区")
+    private String zoneCode;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建日期*/
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新日期*/
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+}
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/LockStationMapper.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/LockStationMapper.java
new file mode 100644
index 0000000..9ab56f1
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/LockStationMapper.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.wms.lockStation.mapper;
+
+import org.jeecg.modules.wms.lockStation.entity.LockStation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 锁定站台
+ * @Author: jeecg-boot
+ * @Date:   2023-10-23
+ * @Version: V1.0
+ */
+public interface LockStationMapper extends BaseMapper<LockStation> {
+
+}
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/xml/LockStationMapper.xml b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/xml/LockStationMapper.xml
new file mode 100644
index 0000000..9947183
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/xml/LockStationMapper.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.lockStation.mapper.LockStationMapper">
+
+</mapper>
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/ILockStationService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/ILockStationService.java
new file mode 100644
index 0000000..10ddc49
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/ILockStationService.java
@@ -0,0 +1,34 @@
+package org.jeecg.modules.wms.lockStation.service;
+
+import org.jeecg.modules.wms.lockStation.entity.LockStation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 锁定站台
+ * @Author: jeecg-boot
+ * @Date:   2023-10-23
+ * @Version: V1.0
+ */
+public interface ILockStationService extends IService<LockStation> {
+
+    /**
+     * 锁定站台,需判断当前站台是否是非锁定状态
+     * @author                   zengxiangping
+     * @createDate               2023年10月23日
+     * @param      port
+     * @param      warehouseCode
+     * @return
+     */
+    boolean lockStation(String port, String warehouseCode);
+
+    /**
+     * 解锁站台
+     * @author                   zengxiangping
+     * @createDate               2023年10月23日
+     * @param      port
+     * @param      warehouseCode
+     * @return
+     */
+    boolean unlockStation(String port, String warehouseCode);
+
+}
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/impl/LockStationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/impl/LockStationServiceImpl.java
new file mode 100644
index 0000000..01c9be9
--- /dev/null
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/impl/LockStationServiceImpl.java
@@ -0,0 +1,59 @@
+package org.jeecg.modules.wms.lockStation.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.modules.wms.lockStation.entity.LockStation;
+import org.jeecg.modules.wms.lockStation.mapper.LockStationMapper;
+import org.jeecg.modules.wms.lockStation.service.ILockStationService;
+import org.jeecg.utils.constant.QuantityConstant;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @Description: 锁定站台
+ * @Author: jeecg-boot
+ * @Date:   2023-10-23
+ * @Version: V1.0
+ */
+@Service
+public class LockStationServiceImpl extends ServiceImpl<LockStationMapper, LockStation> implements ILockStationService {
+
+    /**
+     * 锁定站台,需判断当前站台是否是非锁定状态
+     * @author                   zengxiangping
+     * @createDate               2023年10月23日
+     * @param      port
+     * @param      warehouseCode
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean lockStation(String port, String warehouseCode) {
+        if (port == null) {
+            throw new JeecgBootException("锁定站台,传入站台号为空");
+        }
+        LambdaUpdateWrapper<LockStation> lockStationLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        lockStationLambdaUpdateWrapper.eq(LockStation::getCode, port).eq(LockStation::getWarehouseCode, warehouseCode)
+                .eq(LockStation::getStatus, QuantityConstant.UNLOCK).set(LockStation::getStatus, QuantityConstant.LOCK);
+        return update(lockStationLambdaUpdateWrapper);
+    }
+
+    /**
+     * 解锁站台
+     * @author                   zengxiangping
+     * @createDate               2023年10月23日
+     * @param      port
+     * @param      warehouseCode
+     * @return
+     */
+    @Override
+    public boolean unlockStation(String port, String warehouseCode) {
+        LambdaUpdateWrapper<LockStation> lockStationLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        lockStationLambdaUpdateWrapper.eq(LockStation::getCode, port).eq(LockStation::getWarehouseCode, warehouseCode).set(LockStation::getStatus,
+                QuantityConstant.UNLOCK);
+        return update(lockStationLambdaUpdateWrapper);
+    }
+}
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java
index 93df7ef..0e424b9 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java
@@ -63,13 +63,12 @@ public class AutoCheckoutTask implements Job {
         for (Container container : containerList) {
             String zoneCode = container.getZoneCode();
             String warehouseCode = container.getWarehouseCode();
-            String toPort = null;
-            if (StringUtils.isEmpty(zoneCode)) {
-                toPort = autoCheckOutDtoList.get(0).getToPort();
-            } else {
+            String toPort = autoCheckOutDtoList.get(0).getToPort();
+            if (!StringUtils.isEmpty(zoneCode)) {
                 for (AutoCheckOutDto autoCheckOutDto : autoCheckOutDtoList) {
                     if (zoneCode.equals(autoCheckOutDto.getZoneCode())) {
                         toPort = autoCheckOutDto.getToPort();
+                        break;
                     }
                 }
             }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java
index f615a95..4604414 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java
@@ -65,6 +65,10 @@ public class ReceiptContainerHeader implements Serializable {
     @Excel(name = "目标库位", width = 15)
     @ApiModelProperty(value = "目标库位")
     private String toLocationCode;
+    /** 起始入库口 */
+    @Excel(name = "起始入库口", width = 15)
+    @ApiModelProperty(value = "起始入库口")
+    private String fromPort;
     /** 目标出入口 */
     @Excel(name = "目标出入口", width = 15)
     @ApiModelProperty(value = "目标出入口")
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
index eb70b13..151c60a 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
@@ -16,6 +16,7 @@ import org.jeecg.modules.wms.config.container.service.IContainerService;
 import org.jeecg.modules.wms.config.location.service.ILocationService;
 import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService;
 import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService;
+import org.jeecg.modules.wms.lockStation.service.ILockStationService;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerDetail;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.mapper.ReceiptContainerDetailMapper;
@@ -91,6 +92,9 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
     @Resource
     private IParameterConfigurationService parameterConfigurationService;
 
+    @Resource
+    private ILockStationService lockStationService;
+
     @Override
     @Transactional
     public void delMain(String id) {
@@ -132,6 +136,15 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
         String fromLocationCode = receiptContainerHeader.getFromLocationCode();
         String toLocationCode = receiptContainerHeader.getToLocationCode();
         int taskType = receiptContainerHeader.getTaskType();
+        String fromPort = receiptContainerHeader.getFromPort();
+        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
+        if (container == null) {
+            return Result.error("托盘:" + containerCode + " 信息为空");
+        }
+        String zoneCode = container.getZoneCode();
+        if (StringUtils.isEmpty(zoneCode)) {
+            return Result.error("容器没有配置库区,请配置!");
+        }
         boolean success = false;
         List<ReceiptContainerDetail> receiptContainerDetailList =
             receiptContainerDetailService.getReceiptContainerDetailListByHeaderId(receiptContainerHeader.getId());
@@ -155,7 +168,9 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
                 throw new JeecgBootException(result.getMessage());
             }
             TaskLockEntity taskLockEntity = (TaskLockEntity)result.getResult();
-            String zoneCode = taskLockEntity.getZoneCode();
+            if (taskLockEntity.getZoneCode() != null) {
+                zoneCode = taskLockEntity.getZoneCode();
+            }
             taskHeader = new TaskHeader();
             taskHeader.setContainerCode(containerCode);
             taskHeader.setContainerFillStatus(containerFillStatus);
@@ -244,6 +259,15 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
                 throw new JeecgBootException("创建入库任务, 更新入库单明细失败");
             }
         }
+        String value = parameterConfigurationService.getValueByCode(QuantityConstant.START_LOCKING_STATION,zoneCode);
+        if (StringUtils.isNotEmpty(value)) {
+            int lockStation = Integer.parseInt(value);
+            if (lockStation == QuantityConstant.START_LOCK_STATION) {
+                if (!lockStationService.lockStation(fromPort, warehouseCode)) {
+                    throw new JeecgBootException("生成入库任务时,站台已经锁定:" + fromPort);
+                }
+            }
+        }
         LogRecordContext.putVariable("taskHeader", taskHeader);// 操作日志收集
         LogRecordContext.putVariable("receiptContainerDetailList", receiptContainerDetailList);// 操作日志收集
         LogRecordContext.putVariable("extraJsonString1", JSON.toJSONString(receiptContainerDetailList));// 操作日志收集
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
index c5a8ea5..26c1a02 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
@@ -425,11 +425,12 @@ public class TaskHeaderController extends HuahengBaseController {
     public Result createEmptyIn(@RequestBody TaskHeader taskHeader, HttpServletRequest req) {
         String contaienrCode = taskHeader.getContainerCode();
         String toLocationCode = taskHeader.getToLocationCode();
+        String toPortCode = taskHeader.getToPortCode();
         String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req);
         Result result = handleMultiProcess("createEmptyIn", new MultiProcessListener() {
             @Override
             public Result<?> doProcess() {
-                Result result = taskHeaderService.createEmptyIn(contaienrCode, toLocationCode, warehouseCode);
+                Result result = taskHeaderService.createEmptyIn(contaienrCode, toLocationCode, warehouseCode,toPortCode);
                 return result;
             }
         });
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java
index 67b1d04..73952ea 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java
@@ -131,7 +131,7 @@ public interface ITaskHeaderService extends IService<TaskHeader> {
      * @param  warehouseCode
      * @return
      */
-    Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode);
+    Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode, String toPortCode);
 
     /**
      * 创建空托盘出库任务
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
index 5482c16..4f383c9 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
@@ -32,6 +32,7 @@ import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailS
 import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService;
 import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction;
 import org.jeecg.modules.wms.inventory.inventoryTransaction.service.IInventoryTransactionService;
+import org.jeecg.modules.wms.lockStation.service.ILockStationService;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader;
 import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService;
 import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
@@ -150,6 +151,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     private ITaskHeaderHistoryService taskHeaderHistoryService;
     @Resource
     private IShipmentCombinationService shipmentCombinationService;
+    @Resource
+    private ILockStationService lockStationService;
 
     @Override
     @Transactional
@@ -974,7 +977,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode) {
+    public Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode, String toPortCode) {
         log.info("开始创建空托入库任务" + containerCode);
         if (StringUtils.isEmpty(containerCode)) {
             return Result.error("创建空托盘入库时, 托盘号为空");
@@ -982,6 +985,17 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         if (StringUtils.isEmpty(warehouseCode)) {
             return Result.error("创建空托盘入库时, 仓库编码为空");
         }
+//        if (StringUtils.isEmpty(toPortCode)) {
+//            return Result.error("创建空托盘入库时, 站台编码为空");
+//        }
+//        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
+//        if (container == null) {
+//            return Result.error("托盘:" + containerCode + " 信息为空");
+//        }
+//        String zoneCode = container.getZoneCode();
+//        if (StringUtils.isEmpty(zoneCode)) {
+//            return Result.error("容器没有配置库区,请配置!");
+//        }
 
         Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_EMPTYRECEIPT, containerCode, QuantityConstant.EMPTY_STRING,
             toLocationCode, warehouseCode);
@@ -995,7 +1009,17 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
         taskHeader.setToLocationCode(toLocationCode);
         taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
+//        taskHeader.setZoneCode(zoneCode);
         boolean success = taskHeaderService.save(taskHeader);
+//        String value = parameterConfigurationService.getValueByCode(QuantityConstant.START_LOCKING_STATION, zoneCode);
+//        if (StringUtils.isNotEmpty(value)) {
+//            int lockStation = Integer.parseInt(value);
+//            if (lockStation == QuantityConstant.START_LOCK_STATION) {
+//                if (!lockStationService.lockStation(toPortCode, warehouseCode)) {
+//                    throw new JeecgBootException("生成入库任务时,站台已经锁定:" + toPortCode);
+//                }
+//            }
+//        }
         log.info("完成创建空托入库任务");
         if (!success) {
             throw new JeecgBootException("创建空托盘入库时,保存任务失败");
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java
index 209a7f7..e26b8ce 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java
@@ -84,7 +84,7 @@ public class OkHttpUtils {
      * OkHTTP线程池空闲线程存活时间(秒)
      */
     public final static long KEEP_ALIVE_DURATION = 60;
-    
+
     /**
      * 最大读取时间(秒)
      */
@@ -100,7 +100,6 @@ public class OkHttpUtils {
      */
     public final static int MAX_RENTRY_COUNT_FAST = 0;
 
-
     private static final String CONTENT_TYPE = "Content-Type";
 
     /** 访问接口参数配置 */
@@ -249,7 +248,7 @@ public class OkHttpUtils {
         }
         return result;
     }
-    
+
     /**
      * JSONString形式发送POST请求
      * @throws Exception
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java
index cf92c41..a9dd3dd 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java
@@ -1,14 +1,35 @@
 package org.jeecg.utils.aspect;
 
+import java.lang.reflect.Method;
+import java.util.Date;
+import java.util.List;
+
+import javax.annotation.Resource;
+
 import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.jeecg.modules.system.service.ISysAnnouncementService;
+import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService;
 import org.jeecg.utils.HuahengJwtUtil;
+import org.jeecg.utils.constant.QuantityConstant;
 import org.jeecg.utils.support.ApiAuthentication;
+import org.jeecg.utils.support.SystemSync;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.stereotype.Component;
 
+import com.aliyuncs.utils.StringUtils;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.text.StrSpliter;
+import cn.hutool.extra.spring.SpringUtil;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -22,6 +43,15 @@ import lombok.extern.slf4j.Slf4j;
 @EnableAsync
 public class TaskBuildAudienceAspect {
 
+    @Resource
+    IParameterConfigurationService parameterConfigurationService;
+
+    @Resource
+    ISysAnnouncementService sysAnnouncementService;
+    
+    @Resource
+    SystemSync systemSync;
+
     @Pointcut("execution(* org.jeecg.modules.wms.monitor.job.*Task.execute(..))")
     public void executeTask() {}
 
@@ -29,4 +59,48 @@ public class TaskBuildAudienceAspect {
     public void doBefore(JoinPoint joinPoint) throws NoSuchMethodException, Throwable {
         new ApiAuthentication.ApiAuthenticationBuild().audience(HuahengJwtUtil.TASK_AUDIENCE_NAME).bulid();
     }
+
+    @Around("executeTask()")
+    public Object doAround(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
+        String className = getClassAndMethodName(joinPoint);
+        long t1 = System.currentTimeMillis();
+        try {
+            // 执行下一个切面方法,若无则执行目标方法
+            Object object = joinPoint.proceed();
+            // 执行被拦截的方法
+            long t2 = System.currentTimeMillis();
+            String taskRunNoticeClassNames = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_RUN_NOTICE_CLASS_NAME);
+            String noticeName = className + " 定时任务执行完成";
+            String costTimeString = "耗时:" + (t2 - t1) + "ms";
+            if (!StringUtils.isEmpty(taskRunNoticeClassNames)) {
+                List<String> taskRunNoticeClassNameList = StrSpliter.split(taskRunNoticeClassNames, ",", true, true);
+                String userOrRoleString = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_JOB_EXCEPTION_NOTICE_ROLE_OR_NAME);
+                List<String> userOrRoleList = StrSpliter.split(userOrRoleString, ",", true, true);
+                for (String taskRunNoticeClassName : taskRunNoticeClassNameList) {
+                    if (className.contains(taskRunNoticeClassName)) {
+                        sysAnnouncementService.quickAnnouncementToUserOrRole(userOrRoleList, noticeName, costTimeString, DateUtil.offsetMinute(new Date(), 1), "L");
+                        break;
+                    }
+                }
+            }
+            log.info(noticeName + " " + costTimeString);
+            return object;
+        } catch (Throwable e) {
+            long t2 = System.currentTimeMillis();
+            String userOrRoleString = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_JOB_EXCEPTION_NOTICE_ROLE_OR_NAME);
+            List<String> userOrRoleList = StrSpliter.split(userOrRoleString, ",", true, true);
+            String noticeName = className + " 定时任务执行异常";
+            String errorString = "异常信息:" + ExceptionUtil.getMessage(e) + " 耗时:" + (t2 - t1) + "ms";
+            systemSync.sumCountAnnouncementToUserOrRole(userOrRoleList, noticeName, errorString, DateUtil.offsetDay(new Date(), 1), "H", 10);
+            log.error(noticeName, e);
+        }
+        return null;
+    }
+
+    // 获取方法类名
+    private String getClassAndMethodName(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
+        // 获取目标类对象
+        Class<?> aClass = joinPoint.getTarget().getClass();
+        return aClass.getSimpleName();
+    }
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
index cb0641c..c24f4ab 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
@@ -307,9 +307,6 @@ public class QuantityConstant {
     /** 移库 */
     public static final Integer INVENTORY_TRANSACTION_TRANSFER = 50;
 
-    /** 收货 */
-    public static final Integer INVENTORY_TRANSACTION_RECEIVE = 60;
-
     // 12、调整单状态
 
     // 未批准
@@ -340,12 +337,20 @@ public class QuantityConstant {
 
     // 13、质检单类型
 
-    /** 来料质检 */
-    public static final String QUALITY_TYPE_INCOMING = "QI";
-    /** 库内全检 */
-    public static final String QUALITY_TYPE_INHOUSE_FULL = "QIF";
-    /** 库内抽检 */
-    public static final String QUALITY_TYPE_INHOUSE_PART = "QIP";
+    // 入库质检
+    public static final Integer CHECK_TYPE_RECEIPT = 100;
+
+    // 在库全检
+    public static final Integer CHECK_TYPE_FULL = 200;
+
+    // 在库抽检
+    public static final Integer CHECK_TYPE_SELECT = 300;
+
+    // 空货架
+    public static final Integer POINTS_EMPTY = 0;
+
+    // 非空货架
+    public static final Integer POINTS_SOME = 1;
 
     // 14、AGV任务
     /** AGV取放货任务 */
@@ -397,15 +402,7 @@ public class QuantityConstant {
     public static final Integer RECEIVE_HEADER_HALF = 100;
     // 收货单完成收货状态
     public static final Integer RECEIVE_HEADER_COMPLETE = 200;
-    // 生成质检单
-    public static final Integer RECEIVE_HEADER_QUALITY = 300;
-
-    // 新建
-    public static final Integer QUALITY_HEADER_BUILD = 0;
-    // 部分质检
-    public static final Integer QUALITY_HEADER_HALF = 100;
-    // 质检完成
-    public static final Integer QUALITY_HEADER_COMPLETE = 200;
+    
 
     /** 对接WCS可用巷道API */
     public static final String ADDRESS_WCS_AVAILABLE_ROWDWAY = "WCS_AVAILABLE_ROWDWAY";
@@ -454,14 +451,8 @@ public class QuantityConstant {
     public static final String PLATFORM_CODING = "赋码系统";
     public static final String PLATFORM_ERP = "ERP";
     public static final String PLATFORM_WMS = "WMS";
-    // 良品
+    // good
     public static final String QUALITY_GOOD = "good";
-    // 次品
-    public static final String QUALITY_DEFECTIVE = "defective";
-    // 报废品
-    public static final String QUALITY_SCRAP = "scrap";
-    // 待确认
-    public static final String QUALITY_DISUSSED = "discussed";
 
     // 发送AGV任务成功
     public static final int AGV_NEED_SEND = 0;
@@ -524,18 +515,26 @@ public class QuantityConstant {
      * 出库依赖库区
      */
     public static final int SHIPMENT_BY_ZONE = 1;
-
-    /** 对接WCS可用巷道API:关闭 */
+    
+    /** 对接WCS可用巷道API:关闭  */
     public static final String AVAILABLE_ROWDWAY_CLOSE = "0";
-
+    
     /** 对接WCS可用巷道API:开启 */
     public static final String AVAILABLE_ROWDWAY_OPEN = "1";
-
+    
     /** 启用获取可用巷道API */
     public static final String RULE_AVAILABLE_ROWDWAY_STATUS = "availableRowdwayStatus";
-
-    /** 接口异常响应通知配置 */
+    
+    /** 接口异常响应通知配置  */
+    
+    /** 定时任务异常响应通知配置  */
+    public static final String RULE_JOB_EXCEPTION_NOTICE_ROLE_OR_NAME = "jobExceptionNoticeRoleOrName";
+    
+    /** 接口异常响应通知配置  */
     public static final String RULE_API_EXCEPTION_NOTICE_ROLE_OR_NAME = "apiExceptionNoticeRoleOrName";
+    
+    /** 定时任务执行消息通知配置  */
+    public static final String RULE_TASK_RUN_NOTICE_CLASS_NAME = "taskRunNoticeClassName";
 
     public static final int RULE_TASK_NOT_CLEAR = 0;
     public static final int RULE_TASK_AllOW_CLEAR = 1;
@@ -703,4 +702,17 @@ public class QuantityConstant {
     public static final String ZONE_TYPE_TILL = "Q";
     /** 库区类型,虚拟区 */
     public static final String ZONE_TYPE_UNREAL = "X";
+
+    public static final String START_LOCKING_STATION = "StartLockingStation";
+
+    public static int LOCK = 1; // 锁定
+
+    public static int UNLOCK = 0; // 解锁
+
+//   开启站台锁定
+    public static int START_LOCK_STATION = 1;
+
+//    关闭站台锁定
+    public static int START_UNLOCK_STATION = 0;
+
 }