From cc6dae7468506691bfb23ca81be5e14045771bce Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期三, 15 一月 2025 20:43:59 +0800
Subject: [PATCH] #  拍灯容器流动流程修改  发货确认功能开发 部分功能优化

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/ShippingOrderDetlDto.java          |   42 +++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java              |   28 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java                    |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java           |  103 ++++++++
 zy-asrs-wms/src/main/resources/mapper/asrs/WaveSeedMapper.xml                                |   24 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/WaveManagentController.java    |   11 -
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheSiteServiceImpl.java        |   12 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java      |  288 ++++++++++++++++++-------
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java             |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/OutStockController.java        |   57 +++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/request/SlapLightControlParam.java |   47 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java                          |    2 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java                      |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/SystemProperties.java       |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/WcsApiService.java               |    7 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/WaveSeedMapper.java                    |    2 
 16 files changed, 527 insertions(+), 114 deletions(-)

diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/OutStockController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/OutStockController.java
index a97164a..022198e 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/OutStockController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/OutStockController.java
@@ -2,7 +2,9 @@
 
 
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.apis.wcs.entity.request.ContainerArrivedParam;
+import com.zy.asrs.wms.apis.wcs.entity.request.RfidSingalRequest;
 import com.zy.asrs.wms.apis.wcs.entity.request.TasksStatusCallbackParam;
 import com.zy.asrs.wms.apis.wcs.services.WcsApiService;
 import com.zy.asrs.wms.system.controller.BaseController;
@@ -10,6 +12,9 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+import java.util.Objects;
 
 @Slf4j
 @RestController
@@ -61,7 +66,10 @@
     }
 
     /**
-     * 瀹瑰櫒娴佸姩閫氱煡
+     * 瀹瑰櫒娴佸姩閫氱煡锛堝綋鍓嶇墿鏂欐挱绉嶅畬鎴愶級
+     * //fixme 姝ゆ帴鍙e皢涓嶅啀鍗曠嫭璋冪敤
+     * 1. 鏇存柊褰撳墠浠诲姟鐗╂枡淇℃伅
+     * 2.
      * @param code 瀹瑰櫒缂栫爜
      * @return
      */
@@ -70,9 +78,54 @@
         if (StringUtil.isNullOrEmpty(code)) {
             return R.error("瀹瑰櫒缂栫爜涓嶈兘涓虹┖锛侊紒锛�");
         }
-
         return wcsApiService.containerConveryor(code);
     }
 
 
+    /**
+     * 鍙戦�佸懡浠ょ粰鐢靛瓙鏍囩锛屽彲浠ユ帶鍒剁數瀛愭爣绛句寒鐏鑹插強鐏伅绛夈��
+     *
+     * 1. 鍒ゆ柇褰撳墠瀹瑰櫒鏄惁杩樻湁鐗╂枡鏈嫞锛屾湭鎷e畬闂伅锛屾嫞瀹岄�氱煡瀹瑰櫒娴佸姩锛屽苟鐏伅
+     * 2. 瀹瑰櫒娴佸姩鍒ゆ柇锛屽鏋滄枡绠辨病鏈夌墿鏂� code浼�200锛� 鏈夌墿鏂欎紶100 鎵ц鍥炲簱浠诲姟, IOTYP = 4
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/slap/light")
+    public R slapLightLogic(@RequestBody Map<String, Object> request) {
+        if (Objects.isNull(request)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(request.get("taskNo"))) {
+            throw new CoolException("浠诲姟鍙蜂笉鑳戒负绌猴紒锛�");
+        }
+        if (Objects.isNull(request.get("orderNO"))){
+            throw new CoolException("褰撳墠浠诲姟璁㈠崟鍙蜂笉鑳戒负绌猴紒锛�");
+        }
+
+         wcsApiService.slapLightLogic(request);
+
+        return R.ok();
+    }
+
+
+
+    /**
+     * 淇″彿鍥炰紶鎺ュ彛锛屽洖浼犵數瀛愭爣绛剧姸鎬佸彉鍖栧唴瀹圭粰涓婃父绯荤粺銆�
+     * 褰撲汉涓烘搷浣滐紙姣斿鎷嶇伅锛屾洿鏀规暟瀛楋紝鏀剧绛夛級瀵艰嚧鐢靛瓙鏍囩鐨勭姸鎬佸拰淇″彿绛夊彂鐢熷彉鍖栥�佹垨璁惧鏈韩鍙戠敓寮傚父鏃讹紝ESS鎺ユ敹鍒颁俊鍙峰悗锛岄�氳繃璇ユ帴鍙e皢淇″彿鍥炰紶缁欎笂娓哥郴缁熴��
+     *
+     * RFID鍥炶皟鎺ュ彛
+     *
+     * @param request
+     * @return
+     */
+    public R rfidCallback(@RequestBody RfidSingalRequest request) {
+        if (Objects.isNull(request)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return wcsApiService.rfidCallback(request);
+    }
+
+
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/WaveManagentController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/WaveManagentController.java
index 8afbd6b..2e98334 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/WaveManagentController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/controller/WaveManagentController.java
@@ -135,17 +135,6 @@
     }
 
 
-    /**
-     * 淇″彿鍥炰紶鎺ュ彛锛屽洖浼犵數瀛愭爣绛剧姸鎬佸彉鍖栧唴瀹圭粰涓婃父绯荤粺銆�
-     * 褰撲汉涓烘搷浣滐紙姣斿鎷嶇伅锛屾洿鏀规暟瀛楋紝鏀剧绛夛級瀵艰嚧鐢靛瓙鏍囩鐨勭姸鎬佸拰淇″彿绛夊彂鐢熷彉鍖栥�佹垨璁惧鏈韩鍙戠敓寮傚父鏃讹紝ESS鎺ユ敹鍒颁俊鍙峰悗锛岄�氳繃璇ユ帴鍙e皢淇″彿鍥炰紶缁欎笂娓哥郴缁熴��
-     * @param request
-     * @return
-     */
-    @PostMapping("/")
-    public R rfidCallback(@RequestBody RfidSingalRequest request) {
-
-        return R.ok();
-    }
 
 
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/SystemProperties.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/SystemProperties.java
index 17db6da..54dbdf0 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/SystemProperties.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/domain/SystemProperties.java
@@ -1,6 +1,7 @@
 package com.zy.asrs.wms.apis.wcs.entity.domain;
 
 
+import com.zy.asrs.wms.system.entity.Host;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -21,5 +22,7 @@
 
     public static String CONVEYOR_START = HOST + "/conveyor/moveContainer";
 
+    public static String SLAP_LIGHT = HOST + "/expand/api/equipment/ptl/sendCommand";
+
 
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/request/SlapLightControlParam.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/request/SlapLightControlParam.java
new file mode 100644
index 0000000..575f2d5
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/entity/request/SlapLightControlParam.java
@@ -0,0 +1,47 @@
+package com.zy.asrs.wms.apis.wcs.entity.request;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+public class SlapLightControlParam implements Serializable {
+
+    /**
+     * 鎺у埗鍣╟ode锛岄渶瑕佷笌鎺у埗鍣ㄩ厤缃畃tlController閲岀殑code瀵瑰簲銆�
+     */
+    private String controllerCode;
+
+    /**
+     * 鐢靛瓙鏍囩搴忓彿锛岄渶瑕佷笌鐢靛瓙鏍囩ptlTag閲岀殑index瀵瑰簲銆�
+     */
+    private String index;
+
+    /**
+     * 鐢靛瓙鏍囩缂栧彿锛岄渶瑕佷笌鐢靛瓙鏍囩ptlTag閲岀殑code瀵瑰簲
+     */
+    private String tagCode;
+
+    /**
+     * 棰滆壊锛�
+     * 飦琑ED
+     * 飦珿REEN
+     * BLUE
+     */
+    private String color;
+
+    /**
+     * 宸ヤ綔妯″紡锛�
+     * 飦琇IGHT锛氫寒鐏�
+     * 飦珼ARK锛氱伃鐏�
+     * FLASH锛氶棯鐏�
+     */
+    private String mode;
+
+    /**
+     * 甯哥敤浜庢樉绀烘暟瀛楋紝鏀寔3浣嶆暟銆�
+     */
+    private String display;
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java
index 7c4be6f..b3f6d2a 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/Impl/WcsApiServiceImpl.java
@@ -1,25 +1,37 @@
 package com.zy.asrs.wms.apis.wcs.services.Impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wms.apis.wcs.entity.domain.SystemProperties;
 import com.zy.asrs.wms.apis.wcs.entity.enums.EssTaskStatus;
 import com.zy.asrs.wms.apis.wcs.entity.request.*;
+import com.zy.asrs.wms.apis.wcs.entity.response.CommonReponse;
 import com.zy.asrs.wms.apis.wcs.services.WcsApiService;
 import com.zy.asrs.wms.asrs.entity.Task;
+import com.zy.asrs.wms.asrs.entity.TaskDetl;
+import com.zy.asrs.wms.asrs.entity.WaveSeed;
 import com.zy.asrs.wms.asrs.entity.enums.TaskStsType;
-import com.zy.asrs.wms.asrs.service.TaskService;
-import com.zy.asrs.wms.asrs.service.WaitPakinService;
-import com.zy.asrs.wms.asrs.service.WorkService;
+import com.zy.asrs.wms.asrs.service.*;
 import io.jsonwebtoken.lang.Collections;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
 
-import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -31,7 +43,14 @@
     private WorkService workService;
     @Autowired
     private TaskService taskService;
+    @Autowired
+    private TaskDetlService taskDetlService;
 
+    @Autowired
+    private WaveSeedService waveSeedService;
+
+    @Autowired
+    private RestTemplate restTemplate;
 
 
     /**
@@ -78,6 +97,13 @@
         return R.success("success");
     }
 
+    /**
+     * 瀹瑰櫒鎵ц鐘舵�佷笂鎶�
+     *
+     * @param callbackParam
+     * @param stockType
+     * @param hostId
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void receiveTaskStatus(TasksStatusCallbackParam callbackParam, String stockType, Long hostId) {
@@ -86,87 +112,89 @@
                 .eq(Task::getTaskNo, callbackParam.getTaskCode()));
         if (!Collections.isEmpty(list)) {
             list.forEach(task -> {
-                    TaskStsType taskStsType = null;
-                    if (stockType.equals("inStock")) { //鍏ュ簱浠诲姟
-                        if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_LOAD.event)) { //涓婃姤鍙栫鐘舵��
-                            if (task.getTaskSts() == TaskStsType.WCS_CONVEYOR_START.id) {
-                                taskStsType = TaskStsType.WCS_TOTE_LOAD;
-                            } else {
-                                String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() +  "鐘舵�佷负涓嶅尮閰嶏紝"  + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_TOTE_LOAD.desc + "浠诲姟";
-                                log.error(errMsg);
-                                throw new CoolException(errMsg);
-                            }
-                        } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_UNLOAD.event)) { //涓婃姤鏀剧鐘舵��
-                            if (task.getTaskSts() == TaskStsType.WCS_TOTE_LOAD.id) {
-                                taskStsType = TaskStsType.WCS_TOTE_UNLOAD;
-                            } else {
-                                String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() +  "鐘舵�佷负涓嶅尮閰嶏紝"  + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_TOTE_UNLOAD.desc + "浠诲姟";
-                                log.error(errMsg);
-                                throw new CoolException(errMsg);
-                            }
-                        } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_STATUS.event)) { //TODO 闇�纭涓婃姤浠诲姟涓紝浠诲姟瀹屾垚鏄摢涓簨浠讹紝鐩墠鏆傚畾task浜嬩欢
-                            if (task.getTaskSts() == TaskStsType.WCS_TOTE_UNLOAD.id) {
-                                taskStsType = TaskStsType.WCS_PUTAWAY_SUCESS;
-                            } else {
-                                String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() +  "鐘舵�佷负涓嶅尮閰嶏紝"  + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_PUTAWAY_SUCESS.desc + "浠诲姟";
-                                log.error(errMsg);
-                                throw new CoolException(errMsg);
-                            }
+                TaskStsType taskStsType = null;
+                if (stockType.equals("inStock")) { //鍏ュ簱浠诲姟
+                    if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_LOAD.event)) { //涓婃姤鍙栫鐘舵��
+                        if (task.getTaskSts() == TaskStsType.WCS_CONVEYOR_START.id) {
+                            taskStsType = TaskStsType.WCS_TOTE_LOAD;
+                        } else {
+                            String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() + "鐘舵�佷负涓嶅尮閰嶏紝" + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_TOTE_LOAD.desc + "浠诲姟";
+                            log.error(errMsg);
+                            throw new CoolException(errMsg);
                         }
-                        boolean result = taskService.update(new LambdaUpdateWrapper<Task>()
-                                .set(Task::getRobotCode, callbackParam.getRobotCode())
-                                .set(Task::getSysTaskCode, callbackParam.getSysTaskCode())
-                                .set(Task::getTaskSts, taskStsType.id)
-                                .set(Task::getExcudeStatus, callbackParam.getStatus())
-                                .set(Task::getTaskDesc, callbackParam.getMessage())
-                                .eq(Task::getBarcode, callbackParam.getContainerCode())
-                                .eq(Task::getTaskNo, callbackParam.getTaskCode()));
-
-                        if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_STATUS.event) && result) {
-                            workService.completeTask(task.getId());
+                    } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_UNLOAD.event)) { //涓婃姤鏀剧鐘舵��
+                        if (task.getTaskSts() == TaskStsType.WCS_TOTE_LOAD.id) {
+                            taskStsType = TaskStsType.WCS_TOTE_UNLOAD;
+                        } else {
+                            String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() + "鐘舵�佷负涓嶅尮閰嶏紝" + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_TOTE_UNLOAD.desc + "浠诲姟";
+                            log.error(errMsg);
+                            throw new CoolException(errMsg);
                         }
-                    } else { //鍑哄簱浠诲姟
-                        if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_LOAD.event)) { //涓婃姤鍙栫鐘舵��
-                            //TODO 瀹氭椂鍣ㄥ紑鍚悗锛岃鍒犻櫎 || task.getTaskType() == TaskStsType.GENERATE_OUT.id
-                            if (task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT.id || task.getTaskSts() == TaskStsType.GENERATE_OUT.id) {
-                                taskStsType = TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD;
-                            } else {
-                                String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() +  "鐘舵�佷负涓嶅尮閰嶏紝"  + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD.desc + "浠诲姟";
-                                log.error(errMsg);
-                                throw new CoolException(errMsg);
-                            }
-                        } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_UNLOAD.event)) { //涓婃姤鏀剧鐘舵��
-                            if (task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD.id) {
-                                taskStsType = TaskStsType.WCS_EXECUTE_OUT_TOTE_UNLOAD;
-                            } else {
-                                String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() +  "鐘舵�佷负涓嶅尮閰嶏紝"  + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_EXECUTE_OUT_TOTE_UNLOAD.desc + "浠诲姟";
-                                log.error(errMsg);
-                                throw new CoolException(errMsg);
-                            }
-                        } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_STATUS.event)) { //涓婃姤瀹屾垚鐘舵��
-                            if (task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TOTE_UNLOAD.id || task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.id) {
-                                //鍑哄簱浠诲姟瀹屾垚锛屼慨鏀圭姸鎬佷负瀹瑰櫒鍒拌揪锛屽畾鏃朵换鍔$敓鎴愭挱绉嶆尝娆�
-                                taskStsType = TaskStsType.WCS_EXECUTE_OUT_TASK_DONE;
-                            } else {
-                                String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() +  "鐘舵�佷负涓嶅尮閰嶏紝"  + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.desc + "浠诲姟";
-                                log.error(errMsg);
-                                throw new CoolException(errMsg);
-                            }
+                    } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_STATUS.event)) { //TODO 闇�纭涓婃姤浠诲姟涓紝浠诲姟瀹屾垚鏄摢涓簨浠讹紝鐩墠鏆傚畾task浜嬩欢
+                        if (task.getTaskSts() == TaskStsType.WCS_TOTE_UNLOAD.id) {
+                            taskStsType = TaskStsType.WCS_PUTAWAY_SUCESS;
+                        } else {
+                            String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() + "鐘舵�佷负涓嶅尮閰嶏紝" + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_PUTAWAY_SUCESS.desc + "浠诲姟";
+                            log.error(errMsg);
+                            throw new CoolException(errMsg);
                         }
+                    }
+                    boolean result = taskService.update(new LambdaUpdateWrapper<Task>()
+                            .set(Task::getRobotCode, callbackParam.getRobotCode())
+                            .set(Task::getSysTaskCode, callbackParam.getSysTaskCode())
+                            .set(Task::getTaskSts, taskStsType.id)
+                            .set(Task::getExcudeStatus, callbackParam.getStatus())
+                            .set(Task::getTaskDesc, callbackParam.getMessage())
+                            .eq(Task::getBarcode, callbackParam.getContainerCode())
+                            .eq(Task::getTaskNo, callbackParam.getTaskCode()));
 
-                        //鏇存柊鍑哄簱鐘舵�佸強鐩稿叧瀛楁
-                         taskService.update(new LambdaUpdateWrapper<Task>()
-                                .set(Task::getRobotCode, callbackParam.getRobotCode())
-                                .set(Task::getSysTaskCode, callbackParam.getSysTaskCode())
-                                .set(Task::getTaskSts, taskStsType.id)
-                                .set(Task::getExcudeStatus, callbackParam.getStatus())
-                                .set(Task::getTaskDesc, callbackParam.getMessage())
-                                .eq(Task::getBarcode, callbackParam.getContainerCode())
-                                .eq(Task::getTaskNo, callbackParam.getTaskCode()));
-
+                    //event浜嬩欢涓簍ask锛岃〃鏄庝换鍔′笂鎶ュ畬鎴愮姸鎬�
+                    if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_STATUS.event) && result) {
+                        //浠诲姟鐘舵�佷慨鏀逛负 99 鍏ュ簱瀹屾垚
+                        workService.completeTask(task.getId());
+                    }
+                } else { //鍑哄簱浠诲姟
+                    if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_LOAD.event)) { //涓婃姤鍙栫鐘舵��
+                        //TODO 瀹氭椂鍣ㄥ紑鍚悗锛岃鍒犻櫎 || task.getTaskType() == TaskStsType.GENERATE_OUT.id
+                        if (task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT.id || task.getTaskSts() == TaskStsType.GENERATE_OUT.id) {
+                            taskStsType = TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD;
+                        } else {
+                            String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() + "鐘舵�佷负涓嶅尮閰嶏紝" + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD.desc + "浠诲姟";
+                            log.error(errMsg);
+                            throw new CoolException(errMsg);
+                        }
+                    } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_TOTE_UNLOAD.event)) { //涓婃姤鏀剧鐘舵��
+                        if (task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TOTE_LOAD.id) {
+                            taskStsType = TaskStsType.WCS_EXECUTE_OUT_TOTE_UNLOAD;
+                        } else {
+                            String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() + "鐘舵�佷负涓嶅尮閰嶏紝" + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_EXECUTE_OUT_TOTE_UNLOAD.desc + "浠诲姟";
+                            log.error(errMsg);
+                            throw new CoolException(errMsg);
+                        }
+                    } else if (callbackParam.getEventType().equals(EssTaskStatus.TASK_EVENT_STATUS.event)) { //涓婃姤瀹屾垚鐘舵��
+                        if (task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TOTE_UNLOAD.id || task.getTaskSts() == TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.id) {
+                            //鍑哄簱浠诲姟瀹屾垚锛屼慨鏀圭姸鎬佷负瀹瑰櫒鍒拌揪锛屽畾鏃朵换鍔$敓鎴愭挱绉嶆尝娆�
+                            taskStsType = TaskStsType.WCS_EXECUTE_OUT_TASK_DONE;
+                        } else {
+                            String errMsg = "浠诲姟缂栧彿锛�" + task.getTaskNo() + "鐘舵�佷负涓嶅尮閰嶏紝" + "涓嶈兘鎵ц锛�" + TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.desc + "浠诲姟";
+                            log.error(errMsg);
+                            throw new CoolException(errMsg);
+                        }
                     }
 
-                });
+                    //鏇存柊鍑哄簱鐘舵�佸強鐩稿叧瀛楁
+                    taskService.update(new LambdaUpdateWrapper<Task>()
+                            .set(Task::getRobotCode, callbackParam.getRobotCode())
+                            .set(Task::getSysTaskCode, callbackParam.getSysTaskCode())
+                            .set(Task::getTaskSts, taskStsType.id)
+                            .set(Task::getExcudeStatus, callbackParam.getStatus())
+                            .set(Task::getTaskDesc, callbackParam.getMessage())
+                            .eq(Task::getBarcode, callbackParam.getContainerCode())
+                            .eq(Task::getTaskNo, callbackParam.getTaskCode()));
+
+                }
+
+            });
         } else {
             throw new CoolException("鏇存柊鍐呭涓嶅瓨鍦紒锛�");
         }
@@ -174,15 +202,16 @@
 
     /**
      * 瀹瑰櫒娴佸姩閫氱煡
+     *
      * @param code
      * @return
      */
     @Override
-    public R containerConveryor(String code) {
+    public synchronized R containerConveryor(String code) {
         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, code));
         if (tasks.isEmpty()) {
             return R.error("瀹瑰櫒鐮佷换鍔′笉瀛樺湪锛侊紒");
-        } else if (tasks.size() > 1){
+        } else if (tasks.size() > 1) {
             return R.error("瀹瑰櫒鐮佷换鍔¢敊璇紒锛�");
         }
         tasks.forEach(task -> {
@@ -214,6 +243,8 @@
             //娴佸姩閫氱煡涓嬪彂瀹屾垚鍚庯紝淇敼浠诲姟鐘舵�佷负杈撻�佺嚎娴佸姩涓�傘��
             //TODO 鍒ゆ柇浠诲姟鏄惁涓�103鎷f枡鍑哄簱锛�103鎷f枡娴佸姩鍚庝慨鏀逛负4锛圧CS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙戯級
             if (task.getTaskType() == 103) {
+                //TODO 闇�鎵炬捣鏌旂‘璁ゆ槸鍚﹂渶瑕侀噸鏂拌皟鐢ㄥ叆搴撴帴鍙�
+                //鏇存柊搴撳瓨淇℃伅,淇敼浠诲姟鐘舵�佷负4 锛圧CS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙戯級
                 workService.pickTask(task.getId());
 //                taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getId, task.getId()).set(Task::getTaskSts, TaskStsType.WCS_CONVEYOR_START))
             } else {
@@ -238,4 +269,99 @@
         return R.ok();
     }
 
+
+    @Override
+    public R rfidCallback(RfidSingalRequest request) {
+
+
+        return null;
+    }
+
+    /**
+     * 鎷嶇伅鎷f枡閫昏緫锛岃缁嗚鏄庤鎺ュ彛璋冪敤璇存槑
+     *
+     * @param request
+     */
+    @Override
+    public void slapLightLogic(Map<String, Object> request) {
+        String taskNo = request.get("taskNo").toString();
+        String orderNo = request.get("orderNo").toString();
+
+        //* 1. 鍒ゆ柇褰撳墠瀹瑰櫒鏄惁杩樻湁鐗╂枡鏈嫞锛屾湭鎷e畬闂伅锛屾嫞瀹岄�氱煡瀹瑰櫒娴佸姩锛屽苟鐏伅
+        SlapLightControlParam slapParam = new SlapLightControlParam();
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        //榛樿娴佸姩
+        boolean converyor = false;
+        //鍒ゆ柇鏄惁杩樻湁鐗╂枡鏈嫞
+
+        if (!checked(orderNo, taskNo)) {
+            //璋冪敤涓夋柟鎺ュ彛,闂伅涓嶅仛鎿嶄綔
+
+            // 璁剧疆璇锋眰鍙傛暟
+            params.add("params", JSONObject.toJSONString(slapParam));
+            log.info("璇锋眰鍦板潃锛歿}锛岃姹傚弬鏁帮細{}", SystemProperties.SLAP_LIGHT, JSONObject.toJSONString(slapParam));
+
+        } else {
+            //璋冪敤涓夋柟鎺ュ彛,鏉ョ伅閫氱煡瀹瑰櫒娴佸姩锛� 浼犵伃鐏弬鏁�
+
+            params.add("params", JSONObject.toJSONString(slapParam));
+            log.info("璇锋眰鍦板潃锛歿}锛岃姹傚弬鏁帮細{}", SystemProperties.SLAP_LIGHT, JSONObject.toJSONString(slapParam));
+        }
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type", "application/json");
+        HttpEntity httpEntity = new HttpEntity<>(params, headers);
+        // 璇锋眰
+        ResponseEntity<CommonReponse> exchange = restTemplate.exchange(SystemProperties.CONVEYOR_START, HttpMethod.POST, httpEntity, CommonReponse.class);
+        log.info("涓嬪彂娴佸姩閫氱煡 杩斿洖缁撴灉锛歿}", exchange);
+        if (exchange.getBody() == null) {
+            throw new CoolException("涓嬪彂娴佸姩閫氱煡澶辫触锛侊紒");
+        } else {
+            CommonReponse response = exchange.getBody();
+            if (response.getCode() == 0) {
+                if (!converyor) {
+                    //* 2. 瀹瑰櫒娴佸姩鍒ゆ柇锛屽鏋滄枡绠辨病鏈夌墿鏂� code浼�200锛� 鏈夌墿鏂欎紶100 鎵ц鍥炲簱浠诲姟,淇敼浠诲姟鐘舵�佷负  璋冪敤containerConveryor锛坱askNo锛夋柟娉�
+                    containerConveryor(request.get("taskNo").toString());
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍒ゆ柇褰撳墠浠诲姟涓嬶紝璁㈠崟鏄惁宸插畬鎴愭嫞璐�
+     *
+     * @param orderNo
+     * @param taskNo
+     * @return
+     */
+    public synchronized boolean checked(String orderNo, String taskNo) {
+        if (Objects.isNull(orderNo)) {
+            throw new CoolException("璁㈠崟缂栫爜涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(taskNo)) {
+            throw new CoolException("浠诲姟缂栫爜涓嶈兘涓虹┖锛侊紒");
+        }
+
+        List<TaskDetl> taskDetls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskNo, taskNo));
+        if (taskDetls.isEmpty()) {
+            throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+
+        List<Long> detlIds = taskDetls.stream().map(TaskDetl::getId).collect(Collectors.toList());
+
+        double taskNum = taskDetls.stream().mapToDouble(TaskDetl::getAnfme).sum();
+
+        List<WaveSeed> seeds = waveSeedService.list(new LambdaQueryWrapper<WaveSeed>().in(WaveSeed::getTaskDetlId, detlIds));
+        if (seeds.isEmpty()) {
+            throw new CoolException("鎾淇℃伅涓嶅瓨鍦紒锛侊紒");
+        }
+        double seedNum = seeds.stream().mapToDouble(WaveSeed::getWorkQty).sum();
+        //鍒ゆ柇浠诲姟闇�姹傛�婚噺鏄惁绛夋挱绉嶆�绘暟閲�
+        if (taskNum == seedNum) {
+            return true;
+        } else  {
+            return false;
+        }
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/WcsApiService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/WcsApiService.java
index 6c3b42c..d1a4215 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/WcsApiService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/services/WcsApiService.java
@@ -2,7 +2,10 @@
 
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.apis.wcs.entity.request.ContainerArrivedParam;
+import com.zy.asrs.wms.apis.wcs.entity.request.RfidSingalRequest;
 import com.zy.asrs.wms.apis.wcs.entity.request.TasksStatusCallbackParam;
+
+import java.util.Map;
 
 public interface WcsApiService {
 
@@ -11,4 +14,8 @@
     void receiveTaskStatus(TasksStatusCallbackParam callbackParam, String stockType, Long hostId);
 
     R containerConveryor(String code);
+
+    void slapLightLogic(Map<String, Object> request);
+
+    R rfidCallback(RfidSingalRequest request);
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java
index d17bb24..8401402 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java
@@ -16,6 +16,7 @@
 import com.zy.asrs.wms.asrs.entity.WaitPakin;
 import com.zy.asrs.wms.asrs.entity.dto.OrderInfoDto;
 import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto;
+import com.zy.asrs.wms.asrs.entity.dto.ShippingOrderDetlDto;
 import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
 import com.zy.asrs.wms.asrs.entity.param.PageRequest;
 import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams;
@@ -258,4 +259,31 @@
         }
     }
 
+
+    /**
+     * 鑾峰彇鍙戣揣璁㈠崟鏄庣粏
+     * @return
+     */
+    @PostMapping("/shipping/order/detl")
+    public R  getOrderDetl(@RequestBody Map<String, Object> params) {
+        if (Objects.isNull(params)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return mobileService.selectShippingDetl(params);
+    }
+
+    /**
+     * 纭鍙戣揣鍗曟槑缁�
+     * @return
+     */
+    @PostMapping("/shipping/confirm")
+    public R confirmShipping(@RequestBody List<ShippingOrderDetlDto> params) {
+        if (params.isEmpty()) {
+            throw new CoolException("鍙戣揣鍗曟槑缁嗕笉鑳戒负绌猴紒锛�");
+        }
+        return mobileService.confirmShippingDetl(params);
+    }
+
+
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/ShippingOrderDetlDto.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/ShippingOrderDetlDto.java
new file mode 100644
index 0000000..c6645c5
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/ShippingOrderDetlDto.java
@@ -0,0 +1,42 @@
+package com.zy.asrs.wms.asrs.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ShippingOrderDetlDto implements Serializable {
+    /**
+     * 璁㈠崟缂栫爜
+     */
+    private String orderNo;
+    /**
+     * 璁㈠崟鏄庣粏鏍囪瘑
+     */
+    private String id;
+    /**
+     * 娉㈡鍙�
+     */
+    private String waveNo;
+    /**
+     * 璁㈠崟闇�姹傞噺
+     */
+    private Double anfme;
+    /**
+     * 鎵规
+     */
+    private String batch;
+    /**
+     * 绔欑偣
+     */
+    private String siteNo;
+    /**
+     * 瀹為檯鎷h揣閲�
+     */
+    private Double workQty;
+    /**
+     * 澶囨敞
+     */
+    private String memo;
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/WaveSeedMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/WaveSeedMapper.java
index 3e69f66..f38dedf 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/WaveSeedMapper.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/WaveSeedMapper.java
@@ -6,6 +6,7 @@
 import com.zy.asrs.wms.apis.wcs.entity.response.SowSeeds;
 import com.zy.asrs.wms.asrs.entity.WaveSeed;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.asrs.wms.asrs.entity.dto.ShippingOrderDetlDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
@@ -18,4 +19,5 @@
 
     List<SowSeeds> getSeedsList(@Param(Constants.WRAPPER) LambdaQueryWrapper<WaveSeed> ew);
 
+    List<ShippingOrderDetlDto> selectShippingOrderDtel(@Param("orderNo") String orderNo);
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java
index be44752..4f04467 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java
@@ -1,7 +1,9 @@
 package com.zy.asrs.wms.asrs.service;
 
+import com.zy.asrs.framework.common.R;
 import com.zy.asrs.wms.asrs.entity.CacheSite;
 import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto;
+import com.zy.asrs.wms.asrs.entity.dto.ShippingOrderDetlDto;
 import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
 import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams;
 import com.zy.asrs.wms.system.entity.Host;
@@ -25,4 +27,8 @@
     List<CacheSite> getSeedLocs();
 
     boolean bindOrderBySite(Map<String, Object> param);
+
+    R selectShippingDetl(Map<String, Object> params);
+
+    R confirmShippingDetl(List<ShippingOrderDetlDto> params);
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheSiteServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheSiteServiceImpl.java
index 07014d1..f4c9ce1 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheSiteServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheSiteServiceImpl.java
@@ -71,15 +71,7 @@
         List<WaveSeed> waveSeeds = waveSeedService.list(new LambdaQueryWrapper<WaveSeed>().eq(WaveSeed::getOrderId, orderId));
        //fixme 鏍¢獙褰撳墠璁㈠崟鏄惁瀹屾垚鎾锛岄渶瑕佽幏鍙栧綋鍓嶆尝娆℃墍鏈変换鍔′腑A鐗╂枡鐨勬墽琛屾暟閲忔槸鍚︾瓑浜庤鍗曠殑鎬婚噺-宸插畬鎴愭暟閲�(anfme - qty) 鎴栬�� 浠诲姟涓凡鎵ц鏁伴噺鏄惁绛夎鍗曚腑鐨勬墽琛屾暟閲�  workQty = workQty
         List<OrderDetl> orderDetls = orderDetlService.getOrderDetlByOrderId(orderId);
-        //鑾峰彇璁㈠崟A鎵�鏈夋槑缁嗙墿鏂�
-//        if (orderDetls.isEmpty()) {
-//            throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦紒锛�");
-//        }
-//        List<Long> matnrs = orderDetls.stream().map(OrderDetl::getMatId).collect(Collectors.toList());
-//        orderDetls.forEach(orderDetl -> {
-//
-//        });
-//        List<WaveSeed> waveSeeds = waveSeedService.list(new LambdaQueryWrapper<WaveSeed>().eq(WaveSeed::getWaveId, order.getWaveId()));
+
         for (WaveSeed waveSeed : waveSeeds) {
             Double anfme = stockMap.get(waveSeed.getOrderDetlId());
             if (anfme == null) {
@@ -89,7 +81,6 @@
             stockMap.put(waveSeed.getOrderDetlId(), anfme);
         }
 
-//        List<OrderDetl> orderDetls = orderDetlService.getOrderDetlByOrderId(orderId);
         boolean check = true;
         for (OrderDetl orderDetl : orderDetls) {
             Double anfme = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
@@ -135,6 +126,7 @@
         Long waveId = order.getWaveId();
 
         boolean check = this.seedCompletePreview(param);
+
         if (!check) {//璁㈠崟鏈鐞嗗畬鎴�
             List<Long> taskIds = new ArrayList<>();
             List<TaskDetl> taskDetls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getWaveId, waveId));
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
index 965c041..134d238 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
@@ -2,18 +2,17 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto;
+import com.zy.asrs.wms.asrs.entity.dto.ShippingOrderDetlDto;
 import com.zy.asrs.wms.asrs.entity.enums.*;
 import com.zy.asrs.wms.asrs.entity.enums.OrderType;
 import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
 import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams;
-import com.zy.asrs.wms.asrs.mapper.CacheSiteMapper;
-import com.zy.asrs.wms.asrs.mapper.OrderDetlLogMapper;
-import com.zy.asrs.wms.asrs.mapper.OrderDetlMapper;
-import com.zy.asrs.wms.asrs.mapper.SeedSitesMapper;
+import com.zy.asrs.wms.asrs.mapper.*;
 import com.zy.asrs.wms.asrs.service.*;
 import com.zy.asrs.wms.system.entity.Host;
 import com.zy.asrs.wms.system.service.HostService;
@@ -69,9 +68,13 @@
     private SeedSitesMapper seedSitesMapper;
     @Autowired
     private OrderDetlMapper orderDetlMapper;
-
+    @Autowired
+    private WaveSeedMapper waveSeedMapper;
+    @Autowired
+    private WaveSeedLogService waveSeedLogService;
     @Autowired
     private OrderDetlLogService orderDetlLogService;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -389,4 +392,94 @@
         return true;
     }
 
+    @Override
+    public R selectShippingDetl(Map<String, Object> params) {
+        //鍒ゆ柇璁㈠崟鏄惁涓虹┖
+        if (StringUtil.isNullOrEmpty((String) params.get("orderNo"))) {
+            throw new CoolException("璁㈠崟缂栫爜鍙蜂笉鑳戒负绌猴紒锛�");
+        }
+        String orderId = params.get("orderNo").toString();
+        List<ShippingOrderDetlDto> waveSeeds = waveSeedMapper.selectShippingOrderDtel(orderId);
+
+        return R.ok(waveSeeds);
+    }
+
+    /**
+     * 鍙戣揣鍗曟槑缁嗙‘璁�
+     * 1. 鍑哄簱淇敼璁㈠崟瀹屾垚鐘舵�侊紝鍒ゆ柇璁㈠崟鏄惁瀹屾垚锛屽畬鎴愬姞鍏ュ巻鍙叉。锛屾湭瀹屾垚淇敼璁㈠崟宸插畬鎴愭暟閲�
+     * 2. 鍒犻櫎璁㈠崟宸插畬鎴愭挱绉嶆槑缁嗕俊鎭�
+     * 3. 娓呴櫎闆嗚揣鍖虹粦瀹氭暟鎹�
+     * @param params
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R confirmShippingDetl(List<ShippingOrderDetlDto> params) {
+        if (params.isEmpty()) {
+            throw new CoolException("鍙戣揣鍗曟嵁鏄庣粏涓虹┖锛屼笉鍙墽琛屽彂璐ф搷浣滐紒锛�");
+        }
+        params.forEach(order -> {
+            //鍒犻櫎鍑哄簱璁㈠崟鍙婃槑缁嗭紝鍔犲叆璁㈠崟鍘嗗彶妗�
+            if (order.getAnfme() == order.getWorkQty()) { //瀹屽叏鎷h揣
+                OrderDetl byId = orderDetlService.getById(order.getId());
+                OrderDetlLog orderDetlLog = new OrderDetlLog();
+                BeanUtils.copyProperties(orderDetlLog, byId);
+                orderDetlLog.setQty(order.getWorkQty());
+                orderDetlLog.setWorkQty(0.0);
+                if (!orderDetlLogService.save(orderDetlLog)) {
+                    throw new CoolException("璁㈠崟鏄庣粏杞巻鍙叉。澶辫触锛侊紒");
+                }
+
+                if (!orderDetlService.removeById(byId)) {
+                    throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦紒锛�");
+                }
+
+                //鏌ヨ褰撳墠璁㈠崟涓嬪惁杩樻湁鏄庣粏瀛樺湪
+                List<OrderDetl> orders = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().eq(OrderDetl::getOrderNo, order.getOrderNo()));
+
+                if (orders.isEmpty()) {
+                    Order one = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, order.getOrderNo()));
+                    if (Objects.isNull(one)) {
+                        throw new CoolException("璁㈠崟涓嶅瓨鍦紒锛�");
+                    }
+                    OrderLog orderLog = new OrderLog();
+
+                    BeanUtils.copyProperties(one, orderLog);
+
+                    if (!orderLogService.save(orderLog)) {
+                        throw new CoolException("鍘熷璁㈠崟杞巻鍙叉。澶辫触锛侊紒");
+                    }
+
+                    if (!orderService.remove(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, order.getOrderNo()))) {
+                        throw new CoolException("鍘熷璁㈠崟鍒犻櫎澶辫触锛侊紒");
+                    }
+                }
+            } else {
+                //todo 鍒犻櫎宸插畬鎴愭槑缁嗭紝淇濈暀鍘熷涓诲崟鍙婃湭瀹屾垚鏄庣粏
+            }
+
+            List<WaveSeed> waveSeeds = waveSeedMapper.selectList(new LambdaQueryWrapper<WaveSeed>().eq(WaveSeed::getOrderDetlId, order.getId()));
+            //fixme 璁㈠崟鏄庣粏鏈挱绉嶏紝榛樿鍙彂璐�
+            if (!waveSeeds.isEmpty()) {
+                ArrayList<WaveSeedLog> waveSeedLogs = new ArrayList<>();
+                waveSeeds.forEach(seed -> {
+                   WaveSeedLog waveSeedLog = new WaveSeedLog();
+                   BeanUtils.copyProperties(waveSeedLog, seed);
+                   waveSeedLog.setId(null);
+                    waveSeedLogs.add(waveSeedLog);
+               });
+                if (waveSeedLogService.saveBatch(waveSeedLogs)) {
+                    throw new CoolException("娉㈡槑鍘嗗彶妗d繚瀛樺け璐ワ紒锛�");
+                }
+            }
+            //鍒犻櫎鎾鏄庣粏淇℃伅
+            if (waveSeedMapper.deleteByIds(waveSeeds) < 1) {
+                throw new CoolException("鎾鏄庣粏鍒犻櫎鎼虹▼锛侊紒");
+            }
+        });
+
+
+        return null;
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
index dd8259a..190b579 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
@@ -673,8 +673,9 @@
         }
         TaskDetl taskDetl = taskDetls.get(0);
 
-        //鐢熸垚搴撲綅
+        //鐢熸垚鏂扮殑搴撲綅 !important
         Loc loc = this.generateLoc(taskType, taskDetl.getMatId(), taskDetl.getBatch(), taskDetl.getUniqueField(), locTypeHeightType.id);
+
         if(loc == null) {
             throw new CoolException("娌℃湁绌哄簱浣�");
         }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
index 066aa6b..ab01799 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
@@ -327,7 +327,6 @@
         Long hostId = task.getHostId();
         //fixme 灏嗕换鍔″綋鍓�
         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()).eq(Loc::getHostId, hostId));
-//        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()));
         if (loc == null) {
             throw new CoolException("搴撲綅涓嶅瓨鍦�");
         }
@@ -339,6 +338,7 @@
         loc.setLocStsId(LocStsType.F.val());
         loc.setUpdateTime(new Date());
         loc.setBarcode(task.getBarcode());
+
         if (!locService.updateById(loc)) {
             throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
         }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
index 92e794e..413bf12 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
@@ -44,8 +44,8 @@
 
     /**
      * modifty锛�
-     * original : fetch datasource of task type on WAVE_SEED
-     * now: Fetch datasource of task type  on WCS_EXECUTE_OUT_ARRIVED, After completing the task and for setting  the task type equal to WAVE_SEED
+     * original : fetch datasource of task type on WCS_EXECUTE_OUT_TASK_DONE
+     * now: Fetch datasource of task type  on WCS_EXECUTE_OUT_ARRIVED, After completing the task and for setting  the task type equal to GENERATE_WAVE_SEED
      */
     @Scheduled(cron = "0/15 * * * * ? ")
     @Transactional(rollbackFor = Exception.class)
@@ -60,7 +60,7 @@
             if (!autoCreateWaveSeed.equals("true")) {
                 return;
             }
-            //鏌ヨ鐘舵�佷负瀹瑰櫒鍒拌揪鐘舵�佹墍鏈変换鍔″崟鎹�
+            //鏌ヨ鐘舵�佷负RCS浠诲姟瀹屾垚鎵�鏈変换鍔″崟鎹�
 //            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id));
             List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT_TASK_DONE.id));
             HashSet<String> sycMatnrs = new HashSet<>();
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/WaveSeedMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/WaveSeedMapper.xml
index 6921f2c..6647a8e 100644
--- a/zy-asrs-wms/src/main/resources/mapper/asrs/WaveSeedMapper.xml
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/WaveSeedMapper.xml
@@ -11,4 +11,28 @@
         ( SELECT id, site_id, site_no, order_no, anfme, work_qty, matnr, batch, create_time, `status`, create_by, memo, deleted FROM man_wave_seed ) t
         ${ew.customSqlSegment}
     </select>
+    <select id="selectShippingOrderDtel" resultType="com.zy.asrs.wms.asrs.entity.dto.ShippingOrderDetlDto">
+        SELECT
+            mo.order_no,
+            mo.id,
+            wcs.wave_no,
+            mo.anfme,
+            mo.batch,
+            wcs.site_no,
+            wcs.work_qty,
+            wcs.memo
+        FROM
+            man_order_detl mo
+        LEFT JOIN
+            (SELECT wave_no, order_detl_id , site_no, order_no, SUM(anfme) anfme, SUM(work_qty) work_qty, memo, batch, matnr
+        FROM man_wave_seed GROUP BY order_id, matnr, batch) wcs
+            ON mo.id = wcs.order_detl_id
+        <where>
+            1 = 1
+            <if test="orderNo != null and orderNo != ''">
+                AND mo.order_no = #{orderNo}
+            </if>
+        </where>
+
+    </select>
 </mapper>

--
Gitblit v1.9.1