From c81fc5e2a4f4153be2bb8602ed14a0743e6ecd29 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期四, 05 三月 2026 11:14:50 +0800
Subject: [PATCH] RCS对接优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java |  106 +++++++++++++++++++++++++++++++---------------------
 1 files changed, 63 insertions(+), 43 deletions(-)

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 13c551f..d2d1fc1 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
@@ -322,22 +322,47 @@
 
         // 2. 鑻ユ湭鍛戒腑鎷f枡/鐩樼偣鍏ュ簱锛屽啀鏍¢獙缁勬墭骞剁户缁叾浠栧叆搴撻�昏緫
         if (pickInTask == null && checkInTask == null) {
-            waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
-                    .eq(WaitPakin::getBarcode, param.getBarcode())
-                    .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
-            // 绌烘墭鐩樻棤缁勬墭鏃讹細鑻ラ厤缃惎鐢ㄥ垯鎸� AUTO_FULL_OUT_MATNR_CODE 鑷姩缁勬墭骞剁敓鎴愬叆搴撳崟锛屽啀缁х画鍏ュ簱浠诲姟閫昏緫
-            if (waitPakin == null) {
-                tryAutoPakinForBarcode(param.getBarcode());
+            String barcode = param.getBarcode();
+            // 璇ユ墭鐩樺凡鍦ㄥ簱瀛樹腑锛屼笉鍙噸澶嶇敵璇峰叆搴�
+            List<Loc> inStock = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, barcode));
+            if (!inStock.isEmpty()) {
+                throw new CoolException("barcode=" + barcode + ": 璇ユ墭鐩樺凡鍦ㄥ簱锛屼笉鍙噸澶嶇敵璇峰叆搴�");
+            }
+            // 璇ユ墭鐩樺嚭搴撲腑鏈畬鎴愶紝涓嶅彲鐢宠鍏ュ簱
+            List<Integer> outboundTaskTypes = Arrays.asList(
+                    TaskType.TASK_TYPE_OUT.type,
+                    TaskType.TASK_TYPE_PICK_AGAIN_OUT.type,
+                    TaskType.TASK_TYPE_MERGE_OUT.type,
+                    TaskType.TASK_TYPE_CHECK_OUT.type,
+                    TaskType.TASK_TYPE_EMPITY_OUT.type
+            );
+            Task outboundTask = taskService.getOne(new LambdaQueryWrapper<Task>()
+                    .eq(Task::getBarcode, barcode)
+                    .in(Task::getTaskType, outboundTaskTypes)
+                    .lt(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id));
+            if (outboundTask != null) {
+                throw new CoolException("barcode=" + barcode + ": 璇ユ墭鐩樺嚭搴撲腑鏈畬鎴愶紝涓嶅彲鐢宠鍏ュ簱");
+            }
+
+            // 鎸� barcode 鍔犻攣锛岄伩鍏嶅悓涓� barcode 骞跺彂璇锋眰閲嶅鑷姩缁勬墭銆侀噸澶嶇敓鎴愬叆搴撳崟
+            String barcodeForLock = param.getBarcode();
+            synchronized ((barcodeForLock != null ? barcodeForLock : "").intern()) {
                 waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
                         .eq(WaitPakin::getBarcode, param.getBarcode())
                         .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+                // 绌烘墭鐩樻棤缁勬墭鏃讹細鑻ラ厤缃惎鐢ㄥ垯鎸� AUTO_FULL_OUT_MATNR_CODE 鑷姩缁勬墭骞剁敓鎴愬叆搴撳崟锛屽啀缁х画鍏ュ簱浠诲姟閫昏緫
+                if (waitPakin == null) {
+                    tryAutoPakinForBarcode(param.getBarcode());
+                    waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+                            .eq(WaitPakin::getBarcode, param.getBarcode())
+                            .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+                }
             }
             waitPakin = validateWaitPakin(param.getBarcode());
             waitPakinItems = waitPakinItemService.list(
                     new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, waitPakin.getId()));
         }
-        // 妫�鏌ュ叾浠栧叆搴撲换鍔$被鍨嬶紙鐢ㄧ鍙锋煡璇紝鐘舵�佷负1鎴�2锛�
-        // 娉ㄦ剰锛氱洏鐐瑰叆搴撳凡鍗曠嫭澶勭悊锛屼笉鍐嶅寘鍚湪姝ゅ垪琛ㄤ腑
+        // 妫�鏌ヨ鎵樼洏鍙锋槸鍚﹀凡鏈夊叆搴撲换鍔★紙鍚繘琛屼腑銆佸凡瀹屾垚锛夛紝鏈夊垯鐩存帴澶嶇敤杩斿洖锛屾嫤鎴噸澶嶆彁浜�
         List<Integer> otherInboundTaskTypes = Arrays.asList(
                 TaskType.TASK_TYPE_IN.type,
                 TaskType.TASK_TYPE_MERGE_IN.type,
@@ -347,48 +372,35 @@
         Task existingInTask = taskService.getOne(new LambdaQueryWrapper<Task>()
                 .eq(Task::getBarcode, param.getBarcode())
                 .in(Task::getTaskType, otherInboundTaskTypes)
-                .in(Task::getTaskStatus, TaskStsType.GENERATE_IN.id, TaskStsType.WCS_EXECUTE_IN.id)
                 .orderByDesc(Task::getCreateTime)
                 .last("LIMIT 1"));
 
         if (Objects.nonNull(existingInTask)) {
-            log.info("鎵惧埌鍖归厤鐨勫叾浠栧叆搴撲换鍔� - 浠诲姟缂栫爜锛歿}锛屼换鍔$被鍨嬶細{}锛岀鍙凤細{}",
-                    existingInTask.getTaskCode(), existingInTask.getTaskType(), param.getBarcode());
+            log.info("鎵惧埌璇ユ墭鐩樺彿宸叉湁鍏ュ簱浠诲姟锛屽鐢ㄥ苟鎷︽埅閲嶅鎻愪氦 - 浠诲姟缂栫爜锛歿}锛岀鍙凤細{}锛岀姸鎬侊細{}",
+                    existingInTask.getTaskCode(), param.getBarcode(), existingInTask.getTaskStatus());
 
-            // 妫�鏌ョ粍鎵樻槑缁嗘槸鍚︽湁璁㈠崟缂栫爜锛堜换鍔$紪鍙凤級
-            List<WaitPakinItem> itemsWithAsnCode = waitPakinItems.stream()
-                    .filter(item -> StringUtils.isNotBlank(item.getAsnCode()))
-                    .collect(Collectors.toList());
-
-            if (!itemsWithAsnCode.isEmpty()) {
-                log.info("缁勬墭妗f湁浠诲姟缂栧彿锛屼娇鐢ㄧ幇鏈夊叆搴撲换鍔″崟鍙� - 浠诲姟缂栫爜锛歿}锛岀鍙凤細{}锛屼换鍔$紪鍙锋暟閲忥細{}",
-                        existingInTask.getTaskCode(), param.getBarcode(), itemsWithAsnCode.size());
-
-                // 鏇存柊鍏ュ簱绔欑偣淇℃伅锛堝鏋滀笌褰撳墠鐢宠鐨勭珯鐐逛笉鍚岋級
-                if (StringUtils.isNotBlank(param.getSourceStaNo()) &&
-                        !param.getSourceStaNo().equals(existingInTask.getOrgSite())) {
-                    log.info("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐� - 浠诲姟缂栫爜锛歿}锛屽師绔欑偣锛歿}锛屾柊绔欑偣锛歿}",
-                            existingInTask.getTaskCode(), existingInTask.getOrgSite(), param.getSourceStaNo());
-                    existingInTask.setOrgSite(param.getSourceStaNo());
-                    if (!taskService.updateById(existingInTask)) {
-                        log.warn("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐瑰け璐� - 浠诲姟缂栫爜锛歿}", existingInTask.getTaskCode());
-                    }
+            // 鏇存柊鍏ュ簱绔欑偣淇℃伅锛堝鏋滀笌褰撳墠鐢宠鐨勭珯鐐逛笉鍚岋級
+            if (StringUtils.isNotBlank(param.getSourceStaNo()) &&
+                    !param.getSourceStaNo().equals(existingInTask.getOrgSite())) {
+                log.info("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐� - 浠诲姟缂栫爜锛歿}锛屽師绔欑偣锛歿}锛屾柊绔欑偣锛歿}",
+                        existingInTask.getTaskCode(), existingInTask.getOrgSite(), param.getSourceStaNo());
+                existingInTask.setOrgSite(param.getSourceStaNo());
+                if (!taskService.updateById(existingInTask)) {
+                    log.warn("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐瑰け璐� - 浠诲姟缂栫爜锛歿}", existingInTask.getTaskCode());
                 }
-
-                // 杩斿洖鐜版湁鍏ュ簱浠诲姟鐨勪俊鎭�
-                InTaskMsgDto msgDto = new InTaskMsgDto();
-                msgDto.setWorkNo(existingInTask.getTaskCode());
-                msgDto.setTaskId(existingInTask.getId());
-                msgDto.setLocNo(existingInTask.getTargLoc());
-                msgDto.setSourceStaNo(existingInTask.getOrgSite());
-                msgDto.setStaNo(existingInTask.getTargSite());
-                return msgDto;
-            } else {
-                log.info("缁勬墭妗f病鏈変换鍔$紪鍙凤紝缁х画鍒涘缓鏂颁换鍔� - 绠卞彿锛歿}", param.getBarcode());
             }
-        } else {
-            log.info("鏈壘鍒板尮閰嶇殑鍏朵粬鍏ュ簱浠诲姟锛岀户缁垱寤烘柊浠诲姟 - 绠卞彿锛歿}", param.getBarcode());
+
+            // 鐩存帴杩斿洖宸叉湁浠诲姟淇℃伅锛屼笉鍐嶆柊寤轰换鍔�
+            InTaskMsgDto msgDto = new InTaskMsgDto();
+            msgDto.setWorkNo(existingInTask.getTaskCode());
+            msgDto.setTaskId(existingInTask.getId());
+            msgDto.setLocNo(existingInTask.getTargLoc());
+            msgDto.setSourceStaNo(existingInTask.getOrgSite());
+            msgDto.setStaNo(existingInTask.getTargSite());
+            return msgDto;
         }
+
+        log.info("鏈壘鍒拌鎵樼洏鍙峰凡鏈夊叆搴撲换鍔★紝缁х画鍒涘缓鏂颁换鍔� - 绠卞彿锛歿}", param.getBarcode());
 
         // 鐢熸垚浠诲姟缂栫爜
         String ruleCode = generateTaskCode();
@@ -439,6 +451,14 @@
         if (matnrConfig == null || StringUtils.isBlank(matnrConfig.getVal())) {
             return;
         }
+        // 浜屾纭锛氬凡鏈夎 barcode 鐨勭粍鎵樺垯鐩存帴杩斿洖锛岀敱澶栧眰澶嶇敤锛岄伩鍏嶉噸澶嶈姹傜敓鎴愬鏉″叆搴撳崟
+        WaitPakin existing = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+                .eq(WaitPakin::getBarcode, barcode)
+                .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+        if (existing != null) {
+            log.info("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] barcode={} 宸叉湁缁勬墭锛岃烦杩囪嚜鍔ㄧ粍鎵�", barcode);
+            return;
+        }
         Config qtyConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_PAKIN_QTY));
         double autoQty = 1.0;
         if (qtyConfig != null && StringUtils.isNotBlank(qtyConfig.getVal())) {
@@ -470,7 +490,7 @@
             waitPakin = mobileService.mergeItems(param, 1L);
         } catch (Exception e) {
             log.warn("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] 缁勬墭澶辫触, barcode={}: {}", barcode, e.getMessage());
-            return;
+            throw new CoolException("barcode=" + barcode + ": " + e.getMessage());
         }
         String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, null);
         if (StringUtils.isBlank(ruleCode)) {

--
Gitblit v1.9.1