diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/erp/controller/ErpController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/erp/controller/ErpController.java
index 2fb2d0f..8eb7832 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/erp/controller/ErpController.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/erp/controller/ErpController.java
@@ -4,19 +4,11 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.modules.wms.api.erp.entity.ErpCancel;
-import org.jeecg.modules.wms.api.erp.entity.ErpMaterial;
-import org.jeecg.modules.wms.api.erp.entity.ErpReceipt;
-import org.jeecg.modules.wms.api.erp.entity.ErpShipment;
-import org.jeecg.modules.wms.api.erp.entity.InventoryQueryParam;
+import org.jeecg.modules.wms.api.erp.entity.*;
 import org.jeecg.modules.wms.api.erp.service.IErpService;
 import org.jeecg.modules.wms.framework.controller.HuahengBaseController;
 import org.jeecg.utils.support.ApiLogger;
-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 org.springframework.web.bind.annotation.*;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -32,6 +24,14 @@ public class ErpController extends HuahengBaseController {
     @Resource
     private IErpService erpService;
 
+    @PostMapping("/addMaterial")
+    @ResponseBody
+    @ApiOperation("增加物料")
+    @ApiLogger(apiName = "增加物料", from = "ERP")
+    public Result addMaterial(@RequestBody ErpMaterial erpMaterial) {
+        return erpService.addMaterial(erpMaterial);
+    }
+
     @PostMapping("/receipt")
     @ResponseBody
     @ApiOperation("入库单下发")
@@ -77,12 +77,4 @@ public class ErpController extends HuahengBaseController {
         return result;
     }
 
-    @PostMapping("/addMaterial")
-    @ResponseBody
-    @ApiOperation("增加物料")
-    @ApiLogger(apiName = "增加物料", from = "ERP")
-    public Result addMaterial(@RequestBody ErpMaterial erpMaterial) {
-        return erpService.addMaterial(erpMaterial);
-    }
-
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java
index 007a945..dea50ff 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/entity/CallBoxBean.java
@@ -3,6 +3,9 @@ package org.jeecg.modules.wms.api.mobile.entity;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+/**
+ * @author 游杰
+ */
 @Data
 public class CallBoxBean {
     @ApiModelProperty(value = "托盘号", required = true)
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 d8e886e..bdc8737 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
@@ -171,7 +171,13 @@ public class WcsController extends HuahengBaseController {
     @ApiOperation("设置物料信息")
     @ApiLogger(apiName = "WCS设置物料信息", from = "WCS")
     public Result setMaterialInfo(@RequestBody MaterialInfoEntity materialInfoEntity) {
-        Result result = wcsService.setMaterialInfo(materialInfoEntity);
+        Result result = handleMultiProcess("setMaterialInfo", new MultiProcessListener() {
+            @Override
+            public Result<?> doProcess() {
+                Result result = wcsService.setMaterialInfo(materialInfoEntity);
+                return result;
+            }
+        });
         return result;
     }
 
@@ -184,7 +190,13 @@ public class WcsController extends HuahengBaseController {
     public Result arrivedNotice(@RequestBody ArriveEntity arriveEntity) {
         String taskNo = arriveEntity.getTaskNo();
         String port = arriveEntity.getPort();
-        Result result = wcsService.arrivedNotice(taskNo, port);
+        Result result = handleMultiProcess("arrivedNotice", new MultiProcessListener() {
+            @Override
+            public Result<?> doProcess() {
+                Result result = wcsService.arrivedNotice(taskNo, port);
+                return result;
+            }
+        });
         return result;
     }
 
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java
index 5b36c0f..44ccd7b 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java
@@ -2,6 +2,7 @@ package org.jeecg.modules.wms.api.wcs.service;
 
 import java.net.SocketException;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -257,6 +258,7 @@ public class WcsServiceImpl implements WcsService {
         taskHeader.setZoneCode(location.getZoneCode());
         taskHeader.setRoadWay(location.getRoadWay());
         taskHeader.setPreTaskNo(preTaskNo);
+        taskHeader.setAllocationTime(new Date());
         taskHeader.setWeight(Integer.parseInt(warecellDomain.getWeight()));
         taskHeader.setToLocationCode(locationCode);
         if (!taskHeaderService.updateById(taskHeader)) {
@@ -703,6 +705,10 @@ public class WcsServiceImpl implements WcsService {
         if (status == QuantityConstant.TASK_STATUS_COMPLETED) {
             return Result.error("任务已经完成taskNo:" + taskNo);
         }
+        int taskId = taskHeader.getId();
+        taskHeader = new TaskHeader();
+        taskHeader.setId(taskId);
+        taskHeader.setArrivalTime(new Date());
         taskHeader.setStatus(QuantityConstant.TASK_STATUS_ARRIVED_STATION);
         taskHeader.setToPortCode(port);
         boolean result = taskHeaderService.updateById(taskHeader);
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java
index 3dfb3ef..2eb6867 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/IInventoryDetailService.java
@@ -50,4 +50,5 @@ public interface IInventoryDetailService extends IService<InventoryDetail> {
 
     boolean updateQtyAndTaskQtyAndLocationCode(BigDecimal qty, BigDecimal taskQty, String locationCode, int id);
 
+    boolean updateBatchLocationCodeById(List<InventoryDetail> inventoryDetailList);
 }
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java
index ae53e93..36216db 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryHeader/service/impl/InventoryDetailServiceImpl.java
@@ -2,6 +2,7 @@ package org.jeecg.modules.wms.inventory.inventoryHeader.service.impl;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -131,6 +132,19 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe
         return success;
     }
 
+    @Override
+    public boolean updateBatchLocationCodeById(List<InventoryDetail> inventoryDetailList) {
+        List<InventoryDetail> inventoryDetailList1 = new ArrayList<>();
+        for (InventoryDetail inventoryDetail : inventoryDetailList) {
+            InventoryDetail inventoryDetail1 = new InventoryDetail();
+            inventoryDetail1.setId(inventoryDetail.getId());
+            inventoryDetail1.setLocationCode(inventoryDetail.getLocationCode());
+            inventoryDetailList1.add(inventoryDetail1);
+        }
+        boolean success = this.updateBatchById(inventoryDetailList1);
+        return success;
+    }
+
     /**
      * 计算库存明细托盘填充度
      * @author                         TanYibin
diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java
index 29a5aec..61a4622 100644
--- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java
+++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java
@@ -168,4 +168,16 @@ public class TaskHeader implements Serializable {
     /** 更新日期 */
     @ApiModelProperty(value = "更新日期")
     private Date updateTime;
+    /** 执行时间(下发任务时间) */
+    @ApiModelProperty(value = "执行时间")
+    private Date executeTime;
+    /** 分配时间 */
+    @ApiModelProperty(value = "分配时间")
+    private Date allocationTime;
+    /** 到达时间(到达拣选台时间) */
+    @ApiModelProperty(value = "到达时间")
+    private Date arrivalTime;
+    /** 完成时间(完成任务时间) */
+    @ApiModelProperty(value = "完成时间")
+    private Date completeTime;
 }
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 e9efdb0..1c9704b 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
@@ -62,6 +62,7 @@ import org.jeecg.utils.StringUtils;
 import org.jeecg.utils.constant.QuantityConstant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSON;
@@ -867,7 +868,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
     public Result sendTaskToWcs(Integer taskId) {
         TaskHeader taskHeader = taskHeaderService.getById(taskId);
         if (taskHeader == null) {
@@ -1010,9 +1011,9 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         if (taskHeader.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) {
             return Result.ok("入库任务(" + taskHeader.getId() + ")已经是完成的!");
         }
-        if (taskDetailList.isEmpty()) {
-            throw new JeecgBootException("完成入库任务时, 入库任务明细为空");
-        }
+//        if (taskDetailList.isEmpty()) {
+//            throw new JeecgBootException("完成入库任务时, 入库任务明细为空");
+//        }
         Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode);
         if (toLocation == null) {
             throw new JeecgBootException("完成入库任务时,没有找到目的库位");
@@ -1117,17 +1118,33 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             inventoryTransaction.setQty(receiptQty);
             inventoryTransactionList.add(inventoryTransaction);
         }
-        success = receiptContainerHeaderService.updateStatusById(QuantityConstant.RECEIPT_CONTAINER_FINISHED, taskHeader.getReceiptContainerHeaderId());
-        if (!success) {
-            throw new JeecgBootException("完成入库任务时,更新入库组盘头表状态失败");
-        }
-        success = inventoryDetailService.saveBatch(inventoryDetailList);
-        if (!success) {
-            throw new JeecgBootException("完成入库任务时,保存库存详情失败");
-        }
-        success = inventoryTransactionService.saveBatch(inventoryTransactionList);
-        if (!success) {
-            throw new JeecgBootException("完成入库任务时,保存库存交易失败");
+
+        if (!taskDetailList.isEmpty()) {
+            success = receiptContainerHeaderService.updateStatusById(QuantityConstant.RECEIPT_CONTAINER_FINISHED, taskHeader.getReceiptContainerHeaderId());
+            if (!success) {
+                throw new JeecgBootException("完成入库任务时,更新入库组盘头表状态失败");
+            }
+            success = inventoryDetailService.saveBatch(inventoryDetailList);
+            if (!success) {
+                throw new JeecgBootException("完成入库任务时,保存库存详情失败");
+            }
+            success = inventoryTransactionService.saveBatch(inventoryTransactionList);
+            if (!success) {
+                throw new JeecgBootException("完成入库任务时,保存库存交易失败");
+            }
+            if (!taskHeaderService.combineInventoryDetail(taskHeader)) {
+                throw new JeecgBootException("合并入库库存失败");
+            }
+            if (!receiptDetailService.updateBatchById(receiptDetaiList)) {
+                throw new JeecgBootException("完成入库任务时,更新入库单详情失败");
+            }
+            List<Integer> receiptIdList = receiptDetaiList.stream().map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList());
+            for (Integer receiptId : receiptIdList) {
+                success = receiptHeaderService.updateReceiptHeaderStatus(receiptId);
+                if (!success) {
+                    throw new JeecgBootException("完成入库任务时,更新入库单头失败");
+                }
+            }
         }
 
         Result result = taskHeaderService.completeTaskUnLockContainerAndLocation(taskHeader.getContainerFillStatus(), taskType, containerCode, fromLocationCode,
@@ -1135,25 +1152,12 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         if (!result.isSuccess()) {
             throw new JeecgBootException(result.getMessage());
         }
-        if (!taskHeaderService.combineInventoryDetail(taskHeader)) {
-            throw new JeecgBootException("合并入库库存失败");
-        }
-        if (!receiptDetailService.updateBatchById(receiptDetaiList)) {
-            throw new JeecgBootException("完成入库任务时,更新入库单详情失败");
-        }
-        List<Integer> receiptIdList = receiptDetaiList.stream().map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList());
-        for (Integer receiptId : receiptIdList) {
-            success = receiptHeaderService.updateReceiptHeaderStatus(receiptId);
-            if (!success) {
-                throw new JeecgBootException("完成入库任务时,更新入库单头失败");
-            }
-        }
         if (!inventoryHeaderService.updateInventoryContainerStatusByContainerCode(containerCode, warehouseCode)) {
             throw new JeecgBootException("完成入库任务时,更新托盘状态失败");
         }
         success = taskHeaderService.updateStatusById(QuantityConstant.TASK_STATUS_COMPLETED, taskHeader.getId());
         if (!success) {
-            throw new JeecgBootException("完成出库任务,保存任务头失败");
+            throw new JeecgBootException("完成入库任务时,保存任务头失败");
         }
         receiptDetaiList = receiptDetaiList.stream().filter(t -> t.getStatus().equals(QuantityConstant.RECEIPT_HEADER_COMPLETED)).collect(Collectors.toList());
         LogRecordContext.putVariable("taskHeader", taskHeader);
@@ -1194,9 +1198,9 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         if (taskHeader.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) {
             return Result.ok("完成出库任务,(" + taskHeader.getId() + ")任务已经是完成的!");
         }
-        if (taskDetailList.isEmpty()) {
-            return Result.error("完成出库任务,任务明细为空");
-        }
+//        if (taskDetailList.isEmpty()) {
+//            return Result.error("完成出库任务,任务明细为空");
+//        }
         if (StringUtils.isEmpty(fromLocationCode)) {
             return Result.error("完成出库任务" + taskHeader.getId() + "没有起始库位,执行中止");
         }
@@ -2143,14 +2147,13 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             .eq(InventoryHeader::getLocationCode, fromLocationCode);
         InventoryHeader inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaUpdateWrapper);
         if (inventoryHeader != null) {
-            inventoryHeader.setLocationCode(toLocationCode);
-            success = inventoryHeaderService.updateById(inventoryHeader);
+            success = inventoryHeaderService.updateLocationCodeById(toLocationCode, inventoryHeader.getId());
             if (!success) {
                 throw new JeecgBootException("完成移库任务时, 更新库存头失败");
             }
         }
         if (inventoryDetailList.size() != 0) {
-            success = inventoryDetailService.updateBatchById(inventoryDetailList);
+            success = inventoryDetailService.updateBatchLocationCodeById(inventoryDetailList);
             if (!success) {
                 throw new JeecgBootException("完成移库任务时, 更新库存详情失败");
             }
@@ -2431,6 +2434,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         TaskHeader taskHeader = new TaskHeader();
         taskHeader.setId(id);
         taskHeader.setStatus(status);
+        if (status == QuantityConstant.TASK_STATUS_COMPLETED) {
+            taskHeader.setCompleteTime(new Date());
+        } else if (status == QuantityConstant.TASK_STATUS_RELEASE) {
+            taskHeader.setExecuteTime(new Date());
+        }
         boolean success = taskHeaderService.updateById(taskHeader);
         return success;
     }