From f574055ed80a64cbccd601b200afc437a87b52eb Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期六, 07 二月 2026 16:03:39 +0800
Subject: [PATCH] RCS入库流程优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java   |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java                    |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ExMsgParams.java          |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java        |   16 ++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/dto/LocationAllocateResponse.java |    6 +
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsRcsServiceImpl.java      |    8 +
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/InTaskMsgDto.java            |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java     |  107 ++++++++++++---------
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java           |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java        |  124 ++++++++++++++++++++++--
 10 files changed, 212 insertions(+), 62 deletions(-)

diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/dto/LocationAllocateResponse.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/dto/LocationAllocateResponse.java
index 5f91fff..c4e6ae8 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/dto/LocationAllocateResponse.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/dto/LocationAllocateResponse.java
@@ -16,4 +16,10 @@
 
     @ApiModelProperty("搴撲綅鍙�")
     private String locNo;
+
+    @ApiModelProperty("鎵规鍙�")
+    private String batchNo;
+
+    @ApiModelProperty("浠诲姟鍙�")
+    private String taskNo;
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsRcsServiceImpl.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsRcsServiceImpl.java
index b8a3d84..ed3f4f3 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsRcsServiceImpl.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsRcsServiceImpl.java
@@ -355,8 +355,10 @@
         
         // 灏員askReportParams杞崲涓篍xMsgParams鏍煎紡锛坱askNo -> seqNum锛�
         // 鏍规嵁RCS鏂版帴鍙h鑼冿紝taskNo瀵瑰簲鏃ф帴鍙g殑seqNum
+        // 鎵规鍙风敤浜庨獙璇佷换鍔′富琛紝浠诲姟鍙风敤浜庢煡璇㈠拰鍏宠仈鏄庣粏
         JSONObject exMsgParams = new JSONObject();
         exMsgParams.put("seqNum", params.getTaskNo()); // taskNo鏄犲皠鍒皊eqNum
+        exMsgParams.put("batchNo", params.getBatchNo()); // 鎵规鍙风敤浜庣簿纭叧鑱�
         // eventType璁剧疆涓篍ND锛岃〃绀轰换鍔″畬鎴愶紙鏍规嵁涓氬姟闇�姹傚彲鑳介渶瑕佽皟鏁达級
         exMsgParams.put("eventType", "END");
         exMsgParams.put("robotCode", null);
@@ -455,11 +457,15 @@
                     JSONObject data = responseJson.getJSONObject("data");
                     if (data != null) {
                         String locNo = data.getString("locNo");
+                        String batchNo = data.getString("batchNo");
+                        String taskNo = data.getString("taskNo");
                         log.info("========== 鐢宠鍏ュ簱浠诲姟鎴愬姛 ==========");
-                        log.info("鍒嗛厤搴撲綅鍙凤細{}", locNo);
+                        log.info("鍒嗛厤搴撲綅鍙凤細{}锛屾壒娆″彿锛歿}锛屼换鍔″彿锛歿}", locNo, batchNo, taskNo);
                         
                         LocationAllocateResponse response = new LocationAllocateResponse();
                         response.setLocNo(locNo);
+                        response.setBatchNo(batchNo);
+                        response.setTaskNo(taskNo);
                         return R.ok(response);
                     } else {
                         log.error("========== 鐢宠鍏ュ簱浠诲姟澶辫触 ==========");
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
index 13a9301..f8be5e6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
@@ -126,7 +126,7 @@
     /**
      * @author Ryan
      * @date 2026/2/6
-     * @description: 鐢宠鍏ュ簱浠诲姟锛屽垎閰嶅簱浣嶏紙鍐呴儴鎺ュ彛锛�
+     * @description: 鐢宠鍏ュ簱浠诲姟锛屽垎閰嶅簱浣�
      * @version 1.0
      */
     @ApiOperation("鐢宠鍏ュ簱浠诲姟锛屽垎閰嶅簱浣�")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/InTaskMsgDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/InTaskMsgDto.java
index 6399d72..bc3c27c 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/InTaskMsgDto.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/InTaskMsgDto.java
@@ -13,4 +13,5 @@
     private String locNo;
 
     private String workNo;
+    private Long taskId;
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ExMsgParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ExMsgParams.java
index 3c1109e..747c704 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ExMsgParams.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ExMsgParams.java
@@ -12,6 +12,9 @@
 
     private String seqNum;
 
+    @ApiModelProperty("鎵规鍙凤紙鐢ㄤ簬绮剧‘鍏宠仈浠诲姟鏄庣粏锛�")
+    private String batchNo;
+
     @ApiModelProperty("浜嬩欢绫诲瀷锛� {START: 涓嬪彂鎴愬姛,  OTBIN: 鍙栬揣鎴愬姛, END: 鏀捐揣鎴愬姛}")
     private String eventType;
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
index ee5af53..e0ac9b8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -623,57 +623,74 @@
         //TODO 鍚庣画闇�鏍规嵁绛栫暐閰嶇疆锛岃幏鍙栫粍鎷栨暟鎹�傚锛氭贩瑁咃紝鎸夋壒娆℃贩瑁呯瓑
         LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new LambdaQueryWrapper<>();
         
-        // 鏋勫缓OR鏌ヨ鏉′欢缁�
-        // 缁熻鏈夋晥鏉′欢鏁伴噺
-        int conditionCount = 0;
-        if (!Cools.isEmpty(code)) conditionCount++;
-        if (!Cools.isEmpty(batch)) conditionCount++;
-        if (!Objects.isNull(fieldIndex)) conditionCount++;
-        if (!Cools.isEmpty(matnrCode)) conditionCount++;
-        if (!Cools.isEmpty(asnCode)) conditionCount++;
-        
-        // 濡傛灉鍙湁涓�涓潯浠讹紝鐩存帴浣跨敤eq锛涘鏋滄湁澶氫釜鏉′欢锛屼娇鐢╝nd鍖呰9or鏉′欢缁�
-        if (conditionCount == 1) {
-            // 鍗曚釜鏉′欢锛岀洿鎺ユ煡璇�
+        // 濡傛灉鏈堿SN鍗曞彿锛屽垯鍙煡璇㈣鍗曞彿涓嬬殑鐗╂枡锛圓SN鍗曞彿浣滀负蹇呴』鏉′欢锛�
+        if (!Cools.isEmpty(asnCode)) {
+            // ASN鍗曞彿浣滀负蹇呴』鏉′欢
+            queryWrapper.eq(WarehouseAreasItem::getAsnCode, asnCode);
+            
+            // 濡傛灉鍚屾椂鏈夌墿鏂欑紪鐮侊紝鍒欐煡璇㈣ASN鍗曞彿涓嬬殑璇ョ墿鏂�
+            if (!Cools.isEmpty(matnrCode)) {
+                queryWrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode);
+            }
+            
+            // 濡傛灉鍚屾椂鏈夋壒娆★紝鍒欐煡璇㈣ASN鍗曞彿涓嬬殑璇ユ壒娆�
+            if (!Cools.isEmpty(batch)) {
+                queryWrapper.eq(WarehouseAreasItem::getSplrBatch, batch);
+            }
+            
+            // 濡傛灉鍚屾椂鏈夌エ鍙凤紝鍒欐煡璇㈣ASN鍗曞彿涓嬬殑璇ョエ鍙�
+            if (!Objects.isNull(fieldIndex)) {
+                queryWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex);
+            }
+            
+            // 濡傛灉鍚屾椂鏈夎窡韪爜锛屽垯鏌ヨ璇SN鍗曞彿涓嬬殑璇ヨ窡韪爜
             if (!Cools.isEmpty(code)) {
                 queryWrapper.eq(WarehouseAreasItem::getTrackCode, code);
-            } else if (!Cools.isEmpty(batch)) {
-                queryWrapper.eq(WarehouseAreasItem::getSplrBatch, batch);
-            } else if (!Objects.isNull(fieldIndex)) {
-                queryWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex);
-            } else if (!Cools.isEmpty(matnrCode)) {
-                queryWrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode);
-            } else if (!Cools.isEmpty(asnCode)) {
-                queryWrapper.eq(WarehouseAreasItem::getAsnCode, asnCode);
             }
         } else {
-            // 澶氫釜鏉′欢锛屼娇鐢∣R杩炴帴
-            queryWrapper.and(wrapper -> {
-                boolean first = true;
+            // 娌℃湁ASN鍗曞彿鏃讹紝鍙互鎵弿浠绘剰鐗╂枡缁勬墭锛屼娇鐢∣R杩炴帴澶氫釜鏉′欢
+            // 缁熻鏈夋晥鏉′欢鏁伴噺
+            int conditionCount = 0;
+            if (!Cools.isEmpty(code)) conditionCount++;
+            if (!Cools.isEmpty(batch)) conditionCount++;
+            if (!Objects.isNull(fieldIndex)) conditionCount++;
+            if (!Cools.isEmpty(matnrCode)) conditionCount++;
+            
+            // 濡傛灉鍙湁涓�涓潯浠讹紝鐩存帴浣跨敤eq
+            if (conditionCount == 1) {
                 if (!Cools.isEmpty(code)) {
-                    wrapper.eq(WarehouseAreasItem::getTrackCode, code);
-                    first = false;
+                    queryWrapper.eq(WarehouseAreasItem::getTrackCode, code);
+                } else if (!Cools.isEmpty(batch)) {
+                    queryWrapper.eq(WarehouseAreasItem::getSplrBatch, batch);
+                } else if (!Objects.isNull(fieldIndex)) {
+                    queryWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex);
+                } else if (!Cools.isEmpty(matnrCode)) {
+                    queryWrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode);
                 }
-                if (!Cools.isEmpty(batch)) {
-                    if (!first) wrapper.or();
-                    wrapper.eq(WarehouseAreasItem::getSplrBatch, batch);
-                    first = false;
-                }
-                if (!Objects.isNull(fieldIndex)) {
-                    if (!first) wrapper.or();
-                    wrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex);
-                    first = false;
-                }
-                if (!Cools.isEmpty(matnrCode)) {
-                    if (!first) wrapper.or();
-                    wrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode);
-                    first = false;
-                }
-                if (!Cools.isEmpty(asnCode)) {
-                    if (!first) wrapper.or();
-                    wrapper.eq(WarehouseAreasItem::getAsnCode, asnCode);
-                }
-            });
+            } else if (conditionCount > 1) {
+                // 澶氫釜鏉′欢锛屼娇鐢∣R杩炴帴
+                queryWrapper.and(wrapper -> {
+                    boolean first = true;
+                    if (!Cools.isEmpty(code)) {
+                        wrapper.eq(WarehouseAreasItem::getTrackCode, code);
+                        first = false;
+                    }
+                    if (!Cools.isEmpty(batch)) {
+                        if (!first) wrapper.or();
+                        wrapper.eq(WarehouseAreasItem::getSplrBatch, batch);
+                        first = false;
+                    }
+                    if (!Objects.isNull(fieldIndex)) {
+                        if (!first) wrapper.or();
+                        wrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex);
+                        first = false;
+                    }
+                    if (!Cools.isEmpty(matnrCode)) {
+                        if (!first) wrapper.or();
+                        wrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode);
+                    }
+                });
+            }
         }
         
         // 鎵撳嵃鏌ヨ鍙傛暟鍒版帶鍒跺彴
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
index 2500a3a..b836ec9 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -150,6 +150,7 @@
 
         // 璁剧疆宸ヤ綔鍗曞彿骞惰繑鍥�
         locNo.setWorkNo(ruleCode);
+        locNo.setTaskId(task.getId());
         return locNo;
     }
 
@@ -174,7 +175,7 @@
     private WaitPakin validateWaitPakin(String barcode) {
         WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
                 .eq(WaitPakin::getBarcode, barcode)
-                .eq(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val));
+                .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
 
         if (Cools.isEmpty(waitPakin)) {
             throw new CoolException("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�");
@@ -231,13 +232,30 @@
 
     /**
      * 鑾峰彇骞堕獙璇佺粍鎷栨槑缁�
+     * 鍙繑鍥炴湭瀹屽叏浣跨敤鐨勬槑缁嗭紙workQty < anfme 鎴� workQty 涓� null锛�
      */
     private List<WaitPakinItem> getWaitPakinItems(Long pakinId) {
-        List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakinId));
+        List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>()
+                .eq(WaitPakinItem::getPakinId, pakinId));
+        
         if (waitPakinItems.isEmpty()) {
             throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪");
         }
-        return waitPakinItems;
+        
+        // 杩囨护鎺夊凡瀹屽叏浣跨敤鐨勬槑缁嗭紙workQty >= anfme锛�
+        List<WaitPakinItem> availableItems = waitPakinItems.stream()
+                .filter(item -> {
+                    Double workQty = item.getWorkQty() == null ? 0.0 : item.getWorkQty();
+                    Double anfme = item.getAnfme() == null ? 0.0 : item.getAnfme();
+                    return workQty < anfme; // 鍙繑鍥炴湭瀹屽叏浣跨敤鐨勬槑缁�
+                })
+                .collect(Collectors.toList());
+        
+        if (availableItems.isEmpty()) {
+            throw new CoolException("缁勬嫋鏄庣粏宸插叏閮ㄤ娇鐢紝鏃犳硶鍐嶆鍒涘缓浠诲姟");
+        }
+        
+        return availableItems;
     }
 
     /**
@@ -261,6 +279,15 @@
         if (!taskItemService.saveBatch(taskItems)) {
             throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒");
         }
+        
+        // 鏇存柊缁勬墭鏄庣粏鐨勬墽琛屾暟閲忥紝鏍囪鏄庣粏宸茶鎻愬彇浣跨敤
+        waitPakinItems.forEach(item -> {
+            if (!waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>()
+                    .set(WaitPakinItem::getWorkQty, item.getAnfme())
+                    .eq(WaitPakinItem::getId, item.getId()))) {
+                throw new CoolException("缁勬墭鏄庣粏鎵ц鏁伴噺淇敼澶辫触锛侊紒");
+            }
+        });
     }
 
     /**
@@ -467,14 +494,88 @@
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
         log.info("========== 鎺ユ敹RCS鍥炶皟 ==========");
-        log.info("浠诲姟缂栧彿锛歿}锛屼簨浠剁被鍨嬶細{}", params.getSeqNum(), params.getEventType());
-        Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSeqNum()));
+        log.info("浠诲姟缂栧彿锛歿}锛屾壒娆″彿锛歿}锛屼簨浠剁被鍨嬶細{}", params.getSeqNum(), params.getBatchNo(), params.getEventType());
+        
+        // 浼樺厛浣跨敤鎵规鍙锋煡璇换鍔′富琛紙鎵规鍙� = 浠诲姟缂栫爜锛屾洿鍙潬锛�
+        String taskCode = params.getBatchNo();
+        String taskNo = params.getSeqNum();
+        String locCode = null; // 搴撲綅浠g爜锛堝搴撲綅浠诲姟鏃朵粠浠诲姟鍙蜂腑鎻愬彇锛�
+        
+        // 濡傛灉鎵规鍙蜂负绌猴紝浣跨敤浠诲姟鍙锋煡璇�
+        if (StringUtils.isBlank(taskCode)) {
+            taskCode = taskNo;
+        }
+        
+        // 澶勭悊鍑哄簱浠诲姟澶氬簱浣嶇殑鎯呭喌锛氫换鍔″彿鏍煎紡鍙兘鏄� "浠诲姟缂栫爜_搴撲綅浠g爜"
+        // 濡傛灉浠诲姟鍙峰寘鍚笅鍒掔嚎锛屾彁鍙栧簱浣嶄唬鐮�
+        if (StringUtils.isNotBlank(taskNo) && taskNo.contains("_")) {
+            locCode = taskNo.substring(taskNo.lastIndexOf("_") + 1);
+            // 濡傛灉鎵规鍙蜂负绌猴紝浠庝换鍔″彿涓彁鍙栧師濮嬩换鍔$紪鐮�
+            if (StringUtils.isBlank(taskCode)) {
+                taskCode = taskNo.substring(0, taskNo.lastIndexOf("_"));
+            }
+            log.info("妫�娴嬪埌澶氬簱浣嶄换鍔★紝鎻愬彇搴撲綅浠g爜锛歿}锛屽師濮嬩换鍔$紪鐮侊細{}", locCode, taskCode);
+        }
+        
+        // 浣跨敤鎵规鍙凤紙浠诲姟缂栫爜锛夋煡璇换鍔′富琛�
+        Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, taskCode));
+        
         if (Objects.isNull(task)) {
-            log.error("浠诲姟涓嶅瓨鍦ㄦ垨宸茬粨鏉燂紒浠诲姟缂栧彿锛歿}", params.getSeqNum());
-            throw new CoolException("浠诲姟涓嶅瓨鍦ㄦ垨宸茬粨鏉燂紒锛�");
+            log.error("浠诲姟涓嶅瓨鍦ㄦ垨宸茬粨鏉燂紒浠诲姟缂栧彿锛歿}锛屾壒娆″彿锛歿}", taskNo, taskCode);
+            throw new CoolException("浠诲姟涓嶅瓨鍦ㄦ垨宸茬粨鏉燂紒锛佷换鍔$紪鍙凤細" + taskNo + "锛屾壒娆″彿锛�" + taskCode);
+        }
+        
+        // 楠岃瘉鎵规鍙峰拰浠诲姟鍙风殑鍏宠仈鍏崇郴
+        if (StringUtils.isNotBlank(params.getBatchNo()) && !params.getBatchNo().equals(task.getTaskCode())) {
+            log.warn("鎵规鍙蜂笌浠诲姟缂栫爜涓嶅尮閰嶏紒鎵规鍙凤細{}锛屼换鍔$紪鐮侊細{}", params.getBatchNo(), task.getTaskCode());
         }
         log.info("鏌ヨ鍒颁换鍔� - 浠诲姟缂栫爜锛歿}锛屼换鍔$被鍨嬶細{}锛屽綋鍓嶇姸鎬侊細{}", 
                 task.getTaskCode(), task.getTaskType(), task.getTaskStatus());
+        
+        // 瀵逛簬澶氬簱浣嶅嚭搴撲换鍔★紝閫氳繃搴撲綅浠g爜绮剧‘鍏宠仈浠诲姟鏄庣粏
+        List<TaskItem> relatedTaskItems = null;
+        if (StringUtils.isNotBlank(locCode)) {
+            // 1. 閫氳繃搴撲綅浠g爜鏌ヨLocItem
+            LocItem locItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, locCode));
+            if (Objects.isNull(locItem)) {
+                log.warn("鏈壘鍒板簱浣嶆槑缁嗭紒搴撲綅浠g爜锛歿}锛屼换鍔$紪鐮侊細{}", locCode, task.getTaskCode());
+            } else {
+                // 2. 閫氳繃浠诲姟ID鍜孡ocItem.id锛堝嵆TaskItem.source锛夋煡璇㈠搴旂殑浠诲姟鏄庣粏
+                relatedTaskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>()
+                        .eq(TaskItem::getTaskId, task.getId())
+                        .eq(TaskItem::getSource, locItem.getId()));
+                if (relatedTaskItems.isEmpty()) {
+                    log.warn("鏈壘鍒板搴旂殑浠诲姟鏄庣粏锛佷换鍔$紪鐮侊細{}锛屽簱浣嶄唬鐮侊細{}锛孡ocItem.id锛歿}", 
+                            task.getTaskCode(), locCode, locItem.getId());
+                } else {
+                    log.info("閫氳繃搴撲綅浠g爜绮剧‘鍏宠仈鍒颁换鍔℃槑缁� - 浠诲姟缂栫爜锛歿}锛屽簱浣嶄唬鐮侊細{}锛屼换鍔℃槑缁嗘暟閲忥細{}", 
+                            task.getTaskCode(), locCode, relatedTaskItems.size());
+                }
+            }
+        }
+        
+        // 楠岃瘉浠诲姟鐘舵�侊細鍙湁宸蹭笅鍙戝埌RCS鐨勪换鍔℃墠鑳借鍥炶皟澶勭悊
+        // 鍏ュ簱浠诲姟锛氱姸鎬� >= WCS_EXECUTE_IN(2) 琛ㄧず宸蹭笅鍙�
+        // 鍑哄簱浠诲姟锛氱姸鎬� >= WCS_EXECUTE_OUT(102) 琛ㄧず宸蹭笅鍙�
+        boolean isValidStatus = false;
+        if (task.getTaskType() < 100) {
+            // 鍏ュ簱浠诲姟
+            if (task.getTaskStatus() >= TaskStsType.WCS_EXECUTE_IN.id) {
+                isValidStatus = true;
+            }
+        } else {
+            // 鍑哄簱浠诲姟
+            if (task.getTaskStatus() >= TaskStsType.WCS_EXECUTE_OUT.id) {
+                isValidStatus = true;
+            }
+        }
+        
+        if (!isValidStatus) {
+            log.error("浠诲姟鐘舵�佷笉姝g‘锛屾棤娉曞鐞嗗洖璋冿紒浠诲姟缂栫爜锛歿}锛屼换鍔$被鍨嬶細{}锛屽綋鍓嶇姸鎬侊細{}锛屾湡鏈涚姸鎬侊細宸蹭笅鍙戝埌RCS", 
+                    task.getTaskCode(), task.getTaskType(), task.getTaskStatus());
+            throw new CoolException("浠诲姟鐘舵�佷笉姝g‘锛屾棤娉曞鐞嗗洖璋冿紒浠诲姟缂栫爜锛�" + task.getTaskCode() + 
+                    "锛屽綋鍓嶇姸鎬侊細" + task.getTaskStatus() + "锛屼换鍔″彲鑳芥湭涓嬪彂鍒癛CS鎴栧凡琚鐞�");
+        }
 
         /**鏂欑鎼繍涓紝 淇敼绔欑偣鐘舵��*/
 //        if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_OBIT.event)) {
@@ -1003,13 +1104,16 @@
         // 8. 鍒涘缓骞朵繚瀛樹换鍔℃槑缁�
         // 9. 鏇存柊缁勬墭鐘舵��
         InTaskMsgDto msgDto = createInTask(param);
-        
-        log.info("========== 鐢宠鍏ュ簱浠诲姟鎴愬姛 ==========");
-        log.info("浠诲姟缂栫爜锛歿}锛屽簱浣嶅彿锛歿}", msgDto.getWorkNo(), msgDto.getLocNo());
+        //RCS宸茬粡鍦ㄨ緭閫佺嚎涓婏紝鎵�浠ヤ笉闇�瑕佷笅鍙戜换鍔�
+        taskService.updateById(new Task(){{setId(msgDto.getTaskId());setTaskStatus(2);}});
+        log.info("========== RCS-鐢宠鍏ュ簱浠诲姟鎴愬姛 ==========");
+        log.info("RCS-杩斿洖 浠诲姟缂栫爜锛歿}锛屽簱浣嶅彿锛歿}", msgDto.getWorkNo(), msgDto.getLocNo());
 
         // 杩斿洖缁撴灉锛屽彧杩斿洖搴撲綅鍙凤紙鏍规嵁鎺ュ彛鏂囨。瑕佹眰锛�
         JSONObject result = new JSONObject();
         result.put("locNo", msgDto.getLocNo());
+        result.put("batchNo", msgDto.getWorkNo());
+        result.put("taskNo", msgDto.getWorkNo());
         return R.ok(result);
     }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
index 859ccf6..a8ca7fa 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -74,7 +74,7 @@
     /**
      * 浠诲姟绫诲瀷
      */
-    @ApiModelProperty(value= "浠诲姟绫诲瀷")
+        @ApiModelProperty(value= "浠诲姟绫诲瀷")
     private Integer taskType;
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
index 39d5ac4..3561695 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -253,9 +253,19 @@
     public void pubTaskToWcs() {
         log.info("瀹氭椂浠诲姟寮�濮嬫墽琛岋細浠诲姟涓嬪彂鍒癛CS");
         Long loginUserId = SystemAuthUtils.getLoginUserId();
-        List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_LOC_MOVE.type, TaskType.TASK_TYPE_EMPITY_IN.type
-                , TaskType.TASK_TYPE_CHECK_IN.type, TaskType.TASK_TYPE_MERGE_IN.type, TaskType.TASK_TYPE_EMPITY_OUT.type, TaskType.TASK_TYPE_PICK_IN.type,
-                TaskType.TASK_TYPE_PICK_AGAIN_OUT.type, TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type);
+        List<Integer> list = Arrays.asList(
+                 TaskType.TASK_TYPE_LOC_MOVE.type
+                ,TaskType.TASK_TYPE_OUT.type
+                ,TaskType.TASK_TYPE_EMPITY_OUT.type
+                ,TaskType.TASK_TYPE_CHECK_OUT.type
+                ,TaskType.TASK_TYPE_MERGE_OUT.type
+                ,TaskType.TASK_TYPE_PICK_AGAIN_OUT.type
+                ,TaskType.TASK_TYPE_IN.type
+                ,TaskType.TASK_TYPE_EMPITY_IN.type
+                ,TaskType.TASK_TYPE_CHECK_IN.type
+                ,TaskType.TASK_TYPE_MERGE_IN.type
+                ,TaskType.TASK_TYPE_PICK_IN.type
+        );
         List<Integer> integers = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
                 .in(Task::getTaskType, list)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index f76d167..51acead 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -1781,7 +1781,10 @@
                     // 涓烘瘡涓笉鍚岀殑搴撲綅鍒涘缓涓�涓猅askItemParam
                     for (String locCode : locCodes) {
                         TaskItemParam outItemParam = new TaskItemParam();
-                        outItemParam.setTaskNo(task.getTaskCode());
+                        String taskNo = locCodes.size() > 1
+                                ? task.getTaskCode() + "_" + locCode 
+                                : task.getTaskCode();
+                        outItemParam.setTaskNo(taskNo);
                         outItemParam.setPriority(1);
                         outItemParam.setOriLoc(locCode);
                         outItemParam.setDestSta(task.getTargSite());

--
Gitblit v1.9.1