diff --git a/ant-design-vue-jeecg/src/views/system/DictList.vue b/ant-design-vue-jeecg/src/views/system/DictList.vue
index 65cb5d0..b8572f1 100644
--- a/ant-design-vue-jeecg/src/views/system/DictList.vue
+++ b/ant-design-vue-jeecg/src/views/system/DictList.vue
@@ -7,7 +7,7 @@
         <a-row :gutter="12">
           <a-col :md="7" :sm="8">
             <a-form-item label="字典名称" :labelCol="{span: 6}" :wrapperCol="{span: 14, offset: 1}">
-              <a-input placeholder="请输入字典名称" v-model="queryParam.dictName"></a-input>
+              <j-input placeholder="请输入字典名称" v-model="queryParam.dictName"></j-input>
             </a-form-item>
           </a-col>
           <a-col :md="7" :sm="8">
diff --git a/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue b/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue
index 73e81df..48e040f 100644
--- a/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue
+++ b/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue
@@ -11,18 +11,30 @@
           </a-col>
           <a-col :xl="6" :lg="7" :md="8" :sm="24">
             <a-form-item label="业务类型">
-              <a-input placeholder="请输入业务类型" v-model="queryParam.bizType"></a-input>
+              <j-dict-select-tag placeholder="请选择业务类型" v-model="queryParam.bizType" dictCode="operation_log_type"/>
             </a-form-item>
           </a-col>
           <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="业务标签">
+              <j-multi-select-tag placeholder="请选择业务标签" v-model="queryParam.bizTag" dictCode="operation_log_tag"/>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
             <a-form-item label="操作内容">
               <j-input placeholder="请输入操作内容" v-model="queryParam.operationMsg"></j-input>
             </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="handleExportXls('操作记录')" icon="download" style="margin-left: 8px">导出</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>
@@ -30,14 +42,6 @@
     </div>
     <!-- 查询区域-END -->
 
-    <!-- 操作按钮区域 -->
-    <div class="table-operator">
-      <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>
-    </div>
-
     <!-- table区域-begin -->
     <div>
       <a-table
@@ -113,6 +117,11 @@
             dataIndex: 'bizType'
           },
           {
+            title:'业务标签',
+            align:"center",
+            dataIndex: 'bizTag'
+          },
+          {
             title:'操作内容',
             align:"center",
             dataIndex: 'operationMsg'
@@ -133,21 +142,6 @@
             dataIndex: 'operationCostTime'
           },
           {
-            title:'方法返回内容',
-            align:"center",
-            dataIndex: 'contentReturn'
-          },
-          {
-            title:'方法异常内容',
-            align:"center",
-            dataIndex: 'contentException'
-          },
-          {
-            title:'操作人ID',
-            align:"center",
-            dataIndex: 'operatorId'
-          },
-          {
             title:'操作人姓名',
             align:"center",
             dataIndex: 'operatorName'
@@ -207,7 +201,6 @@
         fieldList.push({type:'int',value:'operationCostTime',text:'操作耗时',dictCode:''})
         fieldList.push({type:'string',value:'contentReturn',text:'方法返回内容',dictCode:''})
         fieldList.push({type:'string',value:'contentException',text:'方法异常内容',dictCode:''})
-        fieldList.push({type:'string',value:'operatorId',text:'操作人ID',dictCode:''})
         fieldList.push({type:'string',value:'operatorName',text:'操作人姓名',dictCode:''})
         this.superFieldList = fieldList
       }
diff --git a/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue b/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue
index 9f4fabc..4fc51e3 100644
--- a/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue
+++ b/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue
@@ -14,6 +14,11 @@
             </a-form-model-item>
           </a-col>
           <a-col :span="24">
+            <a-form-model-item label="业务标签" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="bizTag">
+              <a-input v-model="model.bizTag" placeholder="请输入业务标签"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
             <a-form-model-item label="操作内容" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="operationMsg">
               <a-input v-model="model.operationMsg" placeholder="请输入操作内容"  ></a-input>
             </a-form-model-item>
@@ -44,11 +49,6 @@
             </a-form-model-item>
           </a-col>
           <a-col :span="24">
-            <a-form-model-item label="操作人ID" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="operatorId">
-              <a-input v-model="model.operatorId" placeholder="请输入操作人ID"  ></a-input>
-            </a-form-model-item>
-          </a-col>
-          <a-col :span="24">
             <a-form-model-item label="操作人姓名" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="operatorName">
               <a-input v-model="model.operatorName" placeholder="请输入操作人姓名"  ></a-input>
             </a-form-model-item>
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
index 1f2bdbb..6323d0d 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java
@@ -6,6 +6,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import cn.hutool.crypto.SecureUtil;
+import cn.monitor4all.logRecord.annotation.OperationLog;
+
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CacheConstant;
@@ -71,7 +73,7 @@ public class CasClientController {
             if (StringUtils.isEmpty(principal)) {
                 throw new Exception("No principal was found in the response from the CAS server.");
             }
-            log.info("-------token----username---" + principal);
+            log.info("---token---username---" + principal);
             // 1. 校验用户是否有效
             SysUser sysUser = sysUserService.getUserByName(principal);
             result = sysUserService.checkUserIsEffective(sysUser);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java
index a02b72c..c0d88b2 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java
@@ -9,24 +9,21 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.wms.api.acs.entity.AcsStatus;
 import org.jeecg.modules.wms.api.acs.service.IAcsService;
 import org.jeecg.modules.wms.config.address.service.IAddressService;
-import org.jeecg.modules.wms.framework.aspectj.dto.ApiAuthentication;
-import org.jeecg.modules.wms.framework.aspectj.dto.ApiAuthentication.ApiAuthenticationBuild;
 import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger;
 import org.jeecg.modules.wms.framework.controller.HuahengBaseController;
 import org.jeecg.modules.wms.task.agvTask.service.IAgvTaskService;
-import org.jeecg.utils.OkHttpUtils;
+import org.jeecg.utils.HuahengJwtUtil;
 import org.jeecg.utils.StringUtils;
 import org.jeecg.utils.constant.QuantityConstant;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.alibaba.fastjson.JSON;
-
+import cn.monitor4all.logRecord.annotation.OperationLog;
+import cn.monitor4all.logRecord.context.LogRecordContext;
 import io.swagger.annotations.ApiOperation;
 
 @RestController
@@ -46,12 +43,15 @@ public class AcsController extends HuahengBaseController {
 //    @ApiLogger(apiName = "API接口第三方Token校验测试", from = "TEST")
     @ResponseBody
     @PostMapping(value = "/testTokenCheck")
+    @OperationLog(bizType = "'物料追踪'", tag = "'入库完成'", bizId = "#paramMap.get('bizId')",extra = "#jsonString", msg = "'测试操作日志'",
+    operatorId = "#username", recordReturnValue = true)
     public Result<?> testTokenCheck(@RequestBody Map<String, String> paramMap, HttpServletRequest request) {
-        String audience = ApiAuthentication.getInstance().getAudience();
-        String url = "http://127.0.0.1:8080/wms/api/wms/acs/testTokenCheck";
-        String body = OkHttpUtils.sendPostByJsonStr(url, JSON.toJSONString(paramMap));
+//        String audience = ApiAuthentication.getInstance().getAudience();
+//        String url = "http://localhost:8080/wms/api/wms/acs/testTokenCheck";
+//        String body = OkHttpUtils.sendPostByJsonStr(url, JSON.toJSONString(paramMap));
 //        String url = addressService.getUrlByParam(QuantityConstant.ADDRESS_AGV_TASK_ASSIGN);
-        return Result.ok(body);
+        LogRecordContext.putVariable("username", HuahengJwtUtil.getCurrentOperator());
+        return Result.ok();
     }
     
 
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java
index 9b007f0..5aa6397 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java
@@ -22,7 +22,7 @@ public class ApiAuthentication {
     private String operator;
 
     /** Token使用方 */
-    private String audience; // 观众,相当于接受者
+    private String audience = "Unknown"; // 观众,相当于接受者
 
     /** Token签发方(WMS) */
     private String issuer = HuahengJwtUtil.HUAHENG_SYSTEM_ID;
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java
index 945c84e..47240b7 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java
@@ -2,29 +2,27 @@ package org.jeecg.modules.wms.framework.controller;
 
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
-import java.util.Date;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.servlet.http.HttpServletRequest;
 
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.jeecg.modules.system.entity.SysDataLog;
 import org.jeecg.modules.system.service.ISysDataLogService;
-import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger;
+import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader;
+import org.jeecg.utils.HuahengJwtUtil;
 import org.jeecg.utils.HuahengRedisUtil;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.alibaba.fastjson.TypeReference;
 
+import cn.monitor4all.logRecord.annotation.OperationLog;
+import cn.monitor4all.logRecord.context.LogRecordContext;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -41,8 +39,7 @@ public class TestController extends HuahengBaseController {
 
     @Autowired
     private ISysDataLogService sysDataLogService;
-    
-    
+
 //    @ApiLogger(apiName = "API接口第三方Token校验测试", from = "TEST")
 //    @ResponseBody
 //    @PostMapping(value = "/api/wms/testTokenCheck")
@@ -51,42 +48,54 @@ public class TestController extends HuahengBaseController {
 //        
 //        return new Result<>();
 //    }
-    
 
-    @AutoLog(value = "TestController-testRedis")
+//    @AutoLog(value = "TestController-testRedis")
     @ResponseBody
     @PostMapping(value = "/test/testRedis")
-    public Result<?> testRedis(@RequestBody Map<String, String> paramMap, HttpServletRequest request) {
-
-//        log.info("testRedis in paramMap:{}", JSON.toJSONString(paramMap));
-//        String key = "testKey";
-//        Map<String, ReceiptHeader> receiptHeaderMap = new ConcurrentHashMap<String, ReceiptHeader>();
-//        ReceiptHeader receiptHeader = new ReceiptHeader();
-//        receiptHeader.setCode("001");
-//        receiptHeaderMap.put("receiptHeaderKey", receiptHeader);
-//        Map<String, ReceiptHeader> value = redisUtil.getAndSet(key, receiptHeaderMap, new TypeReference<Map<String, ReceiptHeader>>() {}, 10);
-//        Long rxpireTime = redisUtil.getExpire(key);
-//        log.info("redisUtil.getAndSet {} -> {} rxpireTime -> {}", key, JSON.toJSONString(value), rxpireTime);
-//
-//        Thread.sleep(2000l);
+    @OperationLog(bizType = "'物料追踪'", tag = "'分配库位'", bizId = "#paramMap.get('bizId')",extra = "#jsonString", msg = "'测试操作日志'",
+        operatorId = "#username", recordReturnValue = true)
+    public Result<?> testRedis(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws InterruptedException {
+        Result result = new Result<>();
+        String testString = "我是testString1";
+        LogRecordContext.putVariable("testString1", testString);
+        testString = "我是testString2";
+        LogRecordContext.putVariable("testString2", testString);
+        result.setMessage(testString);
+        log.info("testRedis in paramMap:{}", JSON.toJSONString(paramMap));
+        String key = "testKey";
+        Map<String, ReceiptHeader> receiptHeaderMap = new ConcurrentHashMap<String, ReceiptHeader>();
+        ReceiptHeader receiptHeader = new ReceiptHeader();
+        receiptHeader.setCode(paramMap.get("bizId"));
+        receiptHeaderMap.put("receiptHeaderKey", receiptHeader);
+        LogRecordContext.putVariable("jsonString", JSON.toJSONString(receiptHeaderMap));
+        Map<String, ReceiptHeader> value = redisUtil.getAndSet(key, receiptHeaderMap, new TypeReference<Map<String, ReceiptHeader>>() {}, 10);
+        Long rxpireTime = redisUtil.getExpire(key);
+        log.info("redisUtil.getAndSet {} -> {} rxpireTime -> {}", key, JSON.toJSONString(value), rxpireTime);
+        LogRecordContext.putVariable("username", HuahengJwtUtil.getCurrentOperator());
+//        result.setSuccess(false);
+//        LogRecordContext.putVariable("isSuccess", result.isSuccess());
+
+        Thread.sleep(2000l);
+//        throw new RuntimeException("自定义失败");
+        return result;
 //        receiptHeaderMap = redisUtil.get(key, new TypeReference<Map<String, ReceiptHeader>>() {});
 //        rxpireTime = redisUtil.getExpire(key);
 //        log.info("redisUtil.get {} sleep 2s -> {} rxpireTime -> {}", key, JSON.toJSONString(value), rxpireTime);
 
-        Result result = handleMultiProcess("testRedis", paramMap.get("username"), new MultiProcessListener() {
-
-            @Override
-            @Transactional(timeout = 10)
-            public Result<?> doProcess() throws Exception {
-                LambdaUpdateWrapper<SysDataLog> updateWrapper = new UpdateWrapper().lambda();
-                updateWrapper.set(SysDataLog::getUpdateTime, new Date());
-                updateWrapper.eq(SysDataLog::getId, 10);
-                Thread.sleep(1000);
-                sysDataLogService.update(updateWrapper);
-                return new Result<>();
-            }
-
-        });
+//        Result result = handleMultiProcess("testRedis", paramMap.get("username"), new MultiProcessListener() {
+//
+//            @Override
+//            @Transactional(timeout = 10)
+//            public Result<?> doProcess() throws Exception {
+//                LambdaUpdateWrapper<SysDataLog> updateWrapper = new UpdateWrapper().lambda();
+//                updateWrapper.set(SysDataLog::getUpdateTime, new Date());
+//                updateWrapper.eq(SysDataLog::getId, 10);
+//                Thread.sleep(1000);
+//                sysDataLogService.update(updateWrapper);
+//                return new Result<>();
+//            }
+//
+//        });
 
 //        Long count = redisUtil.decr("countKey", 10);
 //        rxpireTime = redisUtil.getExpire("countKey");
@@ -119,8 +128,8 @@ public class TestController extends HuahengBaseController {
 //        rxpireTime = redisUtil.getExpire("countKey");
 //        log.info("countKey sleep 10s get -> {} rxpireTime -> {}", count, rxpireTime);
 //        log.info("countKey hasKey -> {}",redisUtil.hasKey("countKey"));
-
-        return result;
+//        LogRecordContext.putVariable("result", result);
+//        return result;
     }
 
     private int generateInt(int min, int max) throws NoSuchAlgorithmException {
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java
index 246fa50..6b57557 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java
@@ -58,6 +58,7 @@ public class OperationLogController extends JeecgController<OperationLog, IOpera
     public Result<IPage<OperationLog>> queryPageList(OperationLog operationLog, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
         QueryWrapper<OperationLog> queryWrapper = QueryGenerator.initQueryWrapper(operationLog, req.getParameterMap());
+        queryWrapper.orderByAsc("operation_time");
         Page<OperationLog> page = new Page<OperationLog>(pageNo, pageSize);
         IPage<OperationLog> pageList = operationLogService.page(page, queryWrapper);
         return Result.OK(pageList);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java
index 4830014..5f24fd3 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java
@@ -43,6 +43,10 @@ public class OperationLog implements Serializable {
 	@Excel(name = "业务类型", width = 15)
     @ApiModelProperty(value = "业务类型")
     private java.lang.String bizType;
+	/**业务标签*/
+    @Excel(name = "业务标签", width = 15)
+    @ApiModelProperty(value = "业务标签")
+    private java.lang.String bizTag;
 	/**操作内容*/
 	@Excel(name = "操作内容", width = 15)
     @ApiModelProperty(value = "操作内容")
@@ -67,10 +71,6 @@ public class OperationLog implements Serializable {
 	@Excel(name = "方法异常内容", width = 15)
     @ApiModelProperty(value = "方法异常内容")
     private java.lang.String contentException;
-	/**操作人ID*/
-	@Excel(name = "操作人ID", width = 15)
-    @ApiModelProperty(value = "操作人ID")
-    private java.lang.String operatorId;
 	/**操作人姓名*/
 	@Excel(name = "操作人姓名", width = 15)
     @ApiModelProperty(value = "操作人姓名")
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java
index 49e9753..829c965 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java
@@ -1,13 +1,20 @@
 package org.jeecg.modules.wms.monitor.operation.service.impl;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.jeecg.modules.wms.monitor.operation.entity.OperationLog;
 import org.jeecg.modules.wms.monitor.operation.mapper.OperationLogMapper;
 import org.jeecg.modules.wms.monitor.operation.service.IOperationLogService;
+import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerDetail;
+import org.jeecg.utils.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import cn.hutool.core.util.StrUtil;
 import cn.monitor4all.logRecord.bean.LogDTO;
 import cn.monitor4all.logRecord.service.IOperationLogGetService;
 import lombok.extern.slf4j.Slf4j;
@@ -25,26 +32,54 @@ public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, Ope
     @Override
     public boolean createLog(LogDTO logDTO) throws Exception {
         try {
-            log.debug(">>>>>> create OperationLog: [{}]", JSON.toJSONString(logDTO));
-            if (null == logDTO.getBizId()) {
-                log.error(">>>>>> create OperationLog bizId is null");
-                return false;
+            log.debug(">>>>>> create OperationLog:{} <<<<<<", JSON.toJSONString(logDTO));
+            List<OperationLog> operationLogList = new ArrayList<OperationLog>();
+            if (!StringUtils.isEmpty(logDTO.getExtra())) {
+                if (logDTO.getBizType().equals("物料追踪") && logDTO.getTag().equals("入库组盘")) {
+                    List<ReceiptContainerDetail> receiptContainerDetailList = JSON.parseArray(logDTO.getExtra(), ReceiptContainerDetail.class);
+                    if (CollectionUtils.isEmpty(receiptContainerDetailList)) {
+                        return true;
+                    }
+                    for (ReceiptContainerDetail receiptContainerDetail : receiptContainerDetailList) {
+                        if (receiptContainerDetail == null || receiptContainerDetail.getUniqueCode() == null) {
+                            continue;
+                        }
+                        String msg = StrUtil.format("上游单号:{},入库单据号:{},仓库编码:{},托盘编码:{},物料编码:{},入库数量:{}", receiptContainerDetail.getReferCode(),
+                            receiptContainerDetail.getReceiptCode(), receiptContainerDetail.getWarehouseCode(), receiptContainerDetail.getContainerCode(),
+                            receiptContainerDetail.getMaterialCode(), receiptContainerDetail.getQty());
+                        OperationLog operationLog = new OperationLog();
+                        operationLog.setBizId(receiptContainerDetail.getUniqueCode());
+                        operationLog.setBizType(logDTO.getBizType());
+                        operationLog.setBizTag(logDTO.getTag());
+                        operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000));
+                        operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000));
+                        operationLog.setOperationCostTime(logDTO.getExecutionTime());
+                        operationLog.setOperationMsg(StringUtils.substring(msg, 0, 1000));
+                        operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0);
+                        operationLog.setOperationTime(logDTO.getOperateDate());
+                        operationLog.setOperatorName(logDTO.getOperatorId());
+                        operationLogList.add(operationLog);
+                    }
+                }
+            }
+            if (!StringUtils.isEmpty(logDTO.getBizId())) {
+                OperationLog operationLog = new OperationLog();
+                operationLog.setBizId(logDTO.getBizId());
+                operationLog.setBizType(logDTO.getBizType());
+                operationLog.setBizTag(logDTO.getTag());
+                operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000));
+                operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000));
+                operationLog.setOperationCostTime(logDTO.getExecutionTime());
+                operationLog.setOperationMsg(StringUtils.substring(logDTO.getMsg(), 0, 1000));
+                operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0);
+                operationLog.setOperationTime(logDTO.getOperateDate());
+                operationLog.setOperatorName(logDTO.getOperatorId());
+                operationLogList.add(operationLog);
             }
-            OperationLog operationLog = new OperationLog();
-            operationLog.setBizId(logDTO.getBizId());
-            operationLog.setBizType(logDTO.getBizType());
-            operationLog.setContentException(logDTO.getException());
-            operationLog.setContentReturn(logDTO.getReturnStr());
-            operationLog.setOperationCostTime(logDTO.getExecutionTime());
-            operationLog.setOperationMsg(logDTO.getMsg());
-            operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0);
-            operationLog.setOperationTime(logDTO.getOperateDate());
-            operationLog.setOperatorId(logDTO.getOperatorId());
-            operationLog.setOperatorName(logDTO.getOperatorId());
-            this.save(operationLog);
+            this.saveBatch(operationLogList);
             return true;
         } catch (Exception e) {
-            log.error(">>>>>> create OperationLog error:{}", e.getMessage(), e);
+            log.error(">>>>>> create OperationLog error:{} <<<<<<", e.getMessage(), e);
             return false;
         }
     }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java
index 51696a2..67aecf9 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java
@@ -39,6 +39,10 @@ public class ReceiptContainerDetail implements Serializable {
     /** 入库单详情ID */
     @ApiModelProperty(value = "入库单详情ID")
     private Integer receiptDetailId;
+    /** 容器号 */
+    @Excel(name = "容器号", width = 15)
+    @ApiModelProperty(value = "容器号")
+    private String containerCode;
     /** 入库单编码 */
     @ApiModelProperty(value = "入库单编码")
     private String receiptCode;
@@ -50,6 +54,10 @@ public class ReceiptContainerDetail implements Serializable {
     @Excel(name = "货主编码", width = 15)
     @ApiModelProperty(value = "货主编码")
     private String companyCode;
+    /** 上游单号 */
+    @Excel(name = "上游单号", width = 15)
+    @ApiModelProperty(value = "上游单号")
+    private String referCode;
     /** 物料编码 */
     @Excel(name = "物料编码", width = 15)
     @ApiModelProperty(value = "物料编码")
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
index 7ebebac..d30c139 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
@@ -1,6 +1,8 @@
 package org.jeecg.modules.wms.receipt.receiptHeader.controller;
 
 import com.aliyun.oss.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.jeecg.common.system.query.QueryGenerator;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -195,6 +197,25 @@ public class ReceiptHeaderController extends JeecgController<ReceiptHeader, IRec
         return Result.OK(pageList);
     }
 
+    @ApiOperation(value = "入库单详情-通过多个明细id查询", notes = "入库单详情-通过多个明细id查询")
+    @PostMapping(value = "/listReceiptDetailByIds")
+    public Result<List<ReceiptDetail>> listReceiptDetailByIds(@RequestBody List<Integer> ids ) {
+        return Result.ok(receiptDetailService.listByIds(ids));
+    }
+
+    @ApiOperation(value = "入库单详情-查询未收完的明细", notes = "入库单详情-查询未收完的明细")
+    @GetMapping(value = "/listReceiptDetailByCode")
+    public Result<IPage<ReceiptDetail>> listReceiptDetailByCode(String code,  @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        LambdaQueryWrapper<ReceiptDetail> query = Wrappers.lambdaQuery();
+        query.eq(StringUtils.isNotEmpty(code), ReceiptDetail::getReceiptCode, code)
+                .lt(ReceiptDetail::getStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED)
+                .last(" and qty-task_qty>0");
+        Page<ReceiptDetail> page = new Page<ReceiptDetail>(pageNo, pageSize);
+        IPage<ReceiptDetail> pageList = receiptDetailService.page(page, query);
+        return Result.ok(pageList);
+    }
+
     /**
      * 添加
      * @param  receiptDetail
@@ -287,7 +308,7 @@ public class ReceiptHeaderController extends JeecgController<ReceiptHeader, IRec
         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());
+            exportList = pageList.stream().filter(item -> selectionList.contains(item.getId().toString())).collect(Collectors.toList());
         } else {
             exportList = pageList;
         }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java
index 9265923..3a11474 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java
@@ -7,8 +7,9 @@ import java.math.BigDecimal;
 @Data
 public class Receive {
 
-    private Integer id;
-    private String containerCode;
+    private Integer id;// 入库详情ID
+    private String containerCode; // 托盘号
+    private String uniqueCode;// 唯一号
     private String materialCode;
     private String materialName;
     private String mateiralSpec;
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java
index 8b3718a..4ebb68d 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java
@@ -1,9 +1,14 @@
 package org.jeecg.modules.wms.receipt.receiving.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.aliyun.oss.ServiceException;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import cn.monitor4all.logRecord.annotation.OperationLog;
+import cn.monitor4all.logRecord.context.LogRecordContext;
+
 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;
@@ -23,6 +28,7 @@ import org.jeecg.modules.wms.receipt.receiving.domain.Receive;
 import org.jeecg.modules.wms.receipt.receiving.mapper.ReceiveMapper;
 import org.jeecg.modules.wms.receipt.receiving.service.IReceiveService;
 import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
+import org.jeecg.utils.HuahengJwtUtil;
 import org.jeecg.utils.StringUtils;
 import org.jeecg.utils.constant.QuantityConstant;
 import org.springframework.stereotype.Service;
@@ -82,6 +88,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl
      */
     @Override
     @Transactional(rollbackFor = ServiceException.class)
+    @OperationLog(bizId = "''", bizType = "'物料追踪'", tag = "'入库组盘'", extra = "#extraJsonString", msg = "''",
+        operatorId = "#username", recordReturnValue = true)
     public Result<ReceiptContainerHeader> receiving(List<Receive> receiveList, String warehouseCode) {
         boolean result = false;
         if (receiveList == null || receiveList.size() == 0) {
@@ -144,12 +152,15 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl
         List<ReceiptDetail> receiptDetailList = new ArrayList<>();
         List<ReceiptContainerDetail> receiptContainerDetailList = new ArrayList<>();
         for (Receive receive : receiveList) {
-            // 待收数量
+            // 可收数量
             BigDecimal qty = receive.getQty();
             // 收货数量
             BigDecimal taskQty = receive.getTaskQty();
+            if (qty == null || taskQty == null) {
+                throw new ServiceException("收货数量或可收数量为空");
+            }
             if (taskQty.compareTo(qty) > 0) {
-                throw new ServiceException("收货数量不能可收数量,收货数量:" + taskQty + "   可收数量:" + qty);
+                throw new ServiceException("收货数量不能大于可收数量,收货数量:" + taskQty + "可收数量:" + qty);
             }
             if (taskQty.compareTo(BigDecimal.ZERO) <= 0) {
                 continue;
@@ -194,6 +205,9 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl
             } else {
                 receiptContainerDetail = new ReceiptContainerDetail();
                 receiptContainerDetail.setCompanyCode(receiptDetail.getCompanyCode());
+                receiptContainerDetail.setReferCode(receiptDetail.getReferCode());
+                receiptContainerDetail.setUniqueCode(receive.getUniqueCode());
+                receiptContainerDetail.setContainerCode(receive.getContainerCode());
                 receiptContainerDetail.setReceiptDetailId(receiptDetail.getId());
                 receiptContainerDetail.setReceiptId(receiptDetail.getReceiptId());
                 receiptContainerDetail.setReceiptCode(receiptDetail.getReceiptCode());
@@ -210,8 +224,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl
                 receiptContainerDetail.setInventoryStatus(receiptDetail.getInventoryStatus());
                 receiptContainerDetailList.add(receiptContainerDetail);
             }
-
         }
+
         result = receiptDetailService.updateBatchById(receiptDetailList);
         if (!result) {
             throw new ServiceException("批量更新入库单详情失败");
@@ -223,7 +237,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl
                 throw new ServiceException("保存入库组盘详情失败");
             }
         }
-
+        LogRecordContext.putVariable("username", HuahengJwtUtil.getCurrentOperator());
+        LogRecordContext.putVariable("extraJsonString", JSON.toJSONString(receiptContainerDetailList));
         return Result.OK("收货成功", receiptContainerHeader);
     }
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java
index d16825f..59bcf98 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java
@@ -6,7 +6,9 @@ import java.util.UUID;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.wms.framework.aspectj.dto.ApiAuthentication;
 import org.jeecg.modules.wms.framework.aspectj.dto.RSA256Key;
@@ -141,6 +143,20 @@ public class HuahengJwtUtil {
     }
 
     /**
+     * 获取当前操作人
+     * @author     TanYibin
+     * @createDate 2023年2月22日
+     * @return
+     */
+    public static String getCurrentOperator() {
+        LoginUser loginUser = SecurityUtils.getSubject().getPrincipal() != null ? (LoginUser)SecurityUtils.getSubject().getPrincipal() : null;
+        if (loginUser != null) {
+            return loginUser.getRealname();
+        }
+        return ApiAuthentication.getInstance().getAudience();
+    }
+
+    /**
      * 获得token中的信息无需secret解密也能获得
      * @return token中包含的用户名
      */
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java
index b63efdf..282297e 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java
@@ -24,7 +24,7 @@ public class HuahengBatisInterceptor implements Interceptor {
     @Override
     public Object intercept(Invocation invocation) throws Throwable {
         MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0];
-        String sqlId = mappedStatement.getId();
+//        String sqlId = mappedStatement.getId();
 //        log.debug("------sqlId------" + sqlId);
         SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
         Object parameter = invocation.getArgs()[1];