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 a88114b..9f421af 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
@@ -349,4 +349,10 @@ public interface ITaskHeaderService extends IService<TaskHeader> {
      */
     Result createOverStationTaskLockContainer(String containerCode, String warehouseCode);
 
+    /**
+     * 完成任务 解锁容器和库位
+     * @param
+     */
+    Result completeTaskUnLockContainerAndLocation(String containerFillStatus, int taskType, String containerCode, String fromLocationCode, String toLocationCode,
+        String warehouseCode);
 }
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 0253246..5aa5ae7 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
@@ -1649,6 +1649,73 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     }
 
     /**
+     * 完成任务时,统一解锁容器和库位
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result completeTaskUnLockContainerAndLocation(String containerFillStatus, int taskType, String containerCode, String fromLocationCode,
+        String toLocationCode, String warehouseCode) {
+        Result result = null;
+        boolean success = false;
+        if (StringUtils.isEmpty(toLocationCode) && taskType == QuantityConstant.TASK_TYPE_OVER_STATION) {
+            return Result.error("完成任务时, 目标库位号为空");
+        }
+        switch (taskType) {
+            case QuantityConstant.TASK_TYPE_WHOLERECEIPT:
+            case QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT:
+                success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, QuantityConstant.STATUS_CONTAINER_EMPTY, containerFillStatus,
+                    warehouseCode);
+                break;
+            case QuantityConstant.TASK_TYPE_EMPTYRECEIPT:
+                success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, QuantityConstant.STATUS_CONTAINER_EMPTY,
+                    QuantityConstant.STATUS_CONTAINER_FILL_EMPTY, warehouseCode);
+                break;
+            case QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT:
+                success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, QuantityConstant.STATUS_CONTAINER_EMPTY,
+                    QuantityConstant.STATUS_CONTAINER_FILL_MANY, warehouseCode);
+                break;
+            case QuantityConstant.TASK_TYPE_WHOLESHIPMENT:
+            case QuantityConstant.TASK_TYPE_EMPTYSHIPMENT:
+            case QuantityConstant.TASK_TYPE_MANY_EMPTYSHIPMENT:
+                success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, QuantityConstant.STATUS_CONTAINER_EMPTY,
+                    QuantityConstant.STATUS_CONTAINER_FILL_EMPTY, warehouseCode);
+                break;
+            case QuantityConstant.TASK_TYPE_SORTINGSHIPMENT:
+            case QuantityConstant.TASK_TYPE_CYCLECOUNT:
+            case QuantityConstant.TASK_TYPE_TRANSFER:
+            case QuantityConstant.TASK_TYPE_CHECK_OUT:
+                InventoryHeader inventoryHeader = inventoryHeaderService.getInventoryHeaderByContainerCode(containerCode, warehouseCode);
+                if (inventoryHeader != null) {
+                    success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, QuantityConstant.STATUS_CONTAINER_EMPTY,
+                        QuantityConstant.STATUS_CONTAINER_FILL_SOME, warehouseCode);
+                } else {
+                    success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, QuantityConstant.STATUS_CONTAINER_EMPTY,
+                        QuantityConstant.STATUS_CONTAINER_FILL_EMPTY, warehouseCode);
+                }
+                break;
+            case QuantityConstant.TASK_TYPE_OVER_STATION:
+                success = containerService.updateLocationCodeAndStatus(containerCode, QuantityConstant.EMPTY_STRING, QuantityConstant.STATUS_CONTAINER_EMPTY,
+                    warehouseCode);
+                break;
+        }
+        if (!success) {
+            throw new JeecgBootException("完成任务时,更新容器失败");
+        }
+        if (StringUtils.isNotEmpty(fromLocationCode) && !fromLocationCode.equals(toLocationCode)) {
+            success =
+                locationService.updateContainerCodeAndStatus(fromLocationCode, QuantityConstant.EMPTY_STRING, QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode);
+            if (!success) {
+                throw new JeecgBootException("完成任务时,更新源库位失败");
+            }
+        }
+        success = locationService.updateContainerCodeAndStatus(toLocationCode, containerCode, QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode);
+        if (!success) {
+            throw new JeecgBootException("完成任务时,更新库位失败");
+        }
+        return Result.OK("完成任务成功");
+    }
+
+    /**
      * 完成空托盘入库任务
      * @param  taskHeader 任务
      * @return            Result 完成入库任务结果