From 343c122adb54e01d4cd05ea382819bf071330589 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 06 四月 2026 18:30:18 +0800
Subject: [PATCH] #入库请求优化,先检查异常

---
 src/main/java/com/zy/common/service/CommonService.java |  112 ++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 96 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index 578a1a4..c34ef3d 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -31,7 +31,7 @@
 @Service
 public class CommonService {
 
-    private static final long OUT_STATION_ROUTE_CACHE_SECONDS = 300L;
+    private static final long OUT_STATION_ROUTE_CACHE_SECONDS = 60 * 60 * 24 * 7;
 
     @Autowired
     private WrkMastService wrkMastService;
@@ -124,7 +124,7 @@
         return true;
     }
 
-    public boolean cancelTask(CancelTaskParam param) {
+    public boolean cancelTask(CancelTaskParam param, boolean allowDirectCancel) {
         WrkMast wrkMast = null;
         Integer wrkNo = param.getWrkNo();
         String taskNo = param.getTaskNo();//wms浠诲姟鍙�
@@ -141,24 +141,42 @@
             throw new CoolException("浠诲姟涓嶅瓨鍦�");
         }
 
-        boolean cancelSuccess = false;
-        if (wrkMast.getIoType().equals(WrkIoType.IN.id) && !wrkMast.getWrkSts().equals(WrkStsType.NEW_INBOUND.sts)) {
-            cancelSuccess = true;
-        } else if (wrkMast.getIoType().equals(WrkIoType.OUT.id) && !wrkMast.getWrkSts().equals(WrkStsType.NEW_OUTBOUND.sts)) {
-            cancelSuccess = true;
-        } else if (wrkMast.getIoType().equals(WrkIoType.LOC_MOVE.id) && !wrkMast.getWrkSts().equals(WrkStsType.NEW_LOC_MOVE.sts)) {
-            cancelSuccess = true;
-        } else if (wrkMast.getIoType().equals(WrkIoType.CRN_MOVE.id) && !wrkMast.getWrkSts().equals(WrkStsType.NEW_CRN_MOVE.sts)) {
-            cancelSuccess = true;
+        if (allowDirectCancel) {
+            boolean updated = wrkMastService.update(null, new UpdateWrapper<WrkMast>()
+                    .eq("wrk_no", wrkMast.getWrkNo())
+                    .set("mk", "taskCancel")
+                    .set("modi_time", new Date()));
+            if (!updated) {
+                throw new CoolException("浠诲姟鍙栨秷澶辫触");
+            }
+            return true;
         }
 
-        if (cancelSuccess) {
+        Long expectedWrkSts;
+        if (wrkMast.getIoType().equals(WrkIoType.IN.id)) {
+            expectedWrkSts = WrkStsType.NEW_INBOUND.sts;
+        } else if (wrkMast.getIoType().equals(WrkIoType.OUT.id)) {
+            expectedWrkSts = WrkStsType.NEW_OUTBOUND.sts;
+        } else if (wrkMast.getIoType().equals(WrkIoType.LOC_MOVE.id)) {
+            expectedWrkSts = WrkStsType.NEW_LOC_MOVE.sts;
+        } else if (wrkMast.getIoType().equals(WrkIoType.CRN_MOVE.id)) {
+            expectedWrkSts = WrkStsType.NEW_CRN_MOVE.sts;
+        } else {
+            throw new CoolException("浠诲姟绫诲瀷涓嶆敮鎸佸彇娑�");
+        }
+
+        if (!expectedWrkSts.equals(wrkMast.getWrkSts())) {
             throw new CoolException("浠诲姟宸叉墽琛岋紝鍙栨秷澶辫触");
         }
 
-        wrkMast.setMk("taskCancel");
-        wrkMast.setModiTime(new Date());
-        wrkMastService.updateById(wrkMast);
+        boolean updated = wrkMastService.update(null, new UpdateWrapper<WrkMast>()
+                .eq("wrk_no", wrkMast.getWrkNo())
+                .eq("wrk_sts", expectedWrkSts)
+                .set("mk", "taskCancel")
+                .set("modi_time", new Date()));
+        if (!updated) {
+            throw new CoolException("浠诲姟鐘舵�佸凡鍙樺寲锛屽彇娑堝け璐�");
+        }
         return true;
     }
 
@@ -264,6 +282,10 @@
     }
 
     public CancelTaskBatchResult cancelTaskBatch(CancelTaskBatchParam param) {
+        return cancelTaskBatch(param, false);
+    }
+
+    public CancelTaskBatchResult cancelTaskBatch(CancelTaskBatchParam param, boolean allowDirectCancel) {
         if (param == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
@@ -283,7 +305,7 @@
 
             boolean cancelStatus = false;
             try {
-                cancelStatus = cancelTask(cancelTaskParam);
+                cancelStatus = cancelTask(cancelTaskParam, allowDirectCancel);
             } catch (Exception e) {
             }
 
@@ -656,12 +678,18 @@
             stationList = basDualCrnp.getInStationList$();
         }
 
+        Integer cachedTargetStationId = resolveCachedInStationId(findCrnNoResult, sourceStationId, stationList);
+        if (cachedTargetStationId != null) {
+            return cachedTargetStationId;
+        }
+
         Integer targetStationId = null;
         for (StationObjModel stationObjModel : stationList) {
             try {
                 List<NavigateNode> navigateNodes = navigateUtils.calcReachablePathByStationId(sourceStationId, stationObjModel.getStationId());
                 if(!navigateNodes.isEmpty()) {
                     targetStationId = stationObjModel.getStationId();
+                    cacheInStationId(findCrnNoResult, sourceStationId, targetStationId);
                     break;
                 }
             } catch (Exception e) {
@@ -710,6 +738,58 @@
     }
 
     /**
+     * 鍏ュ簱璺緞鎼滅储鍚屾牱浠d环杈冮珮锛屽彧缂撳瓨宸茬‘璁ゅ彲杈剧殑鐩爣绔欑偣缁撴灉锛屽苟閫氳繃 TTL 闄愬埗闄堟棫椋庨櫓銆�
+     */
+    private Integer resolveCachedInStationId(FindCrnNoResult findCrnNoResult,
+                                             Integer sourceStationId,
+                                             List<StationObjModel> stationList) {
+        if (findCrnNoResult == null || findCrnNoResult.getCrnType() == null
+                || findCrnNoResult.getCrnNo() == null || sourceStationId == null
+                || stationList == null || stationList.isEmpty()) {
+            return null;
+        }
+
+        Object cacheValue = redisUtil.get(buildInStationRouteCacheKey(findCrnNoResult, sourceStationId));
+        if (cacheValue == null) {
+            return null;
+        }
+
+        Integer cachedStationId = parseInteger(cacheValue);
+        if (cachedStationId == null) {
+            return null;
+        }
+
+        for (StationObjModel stationObjModel : stationList) {
+            if (stationObjModel != null && cachedStationId.equals(stationObjModel.getStationId())) {
+                return cachedStationId;
+            }
+        }
+        return null;
+    }
+
+    private void cacheInStationId(FindCrnNoResult findCrnNoResult,
+                                  Integer sourceStationId,
+                                  Integer targetStationId) {
+        if (findCrnNoResult == null || findCrnNoResult.getCrnType() == null
+                || findCrnNoResult.getCrnNo() == null || sourceStationId == null
+                || targetStationId == null) {
+            return;
+        }
+        redisUtil.set(buildInStationRouteCacheKey(findCrnNoResult, sourceStationId),
+                targetStationId,
+                OUT_STATION_ROUTE_CACHE_SECONDS);
+    }
+
+    private String buildInStationRouteCacheKey(FindCrnNoResult findCrnNoResult, Integer sourceStationId) {
+        return RedisKeyType.IN_STATION_ROUTE_CACHE.key
+                + findCrnNoResult.getCrnType().name()
+                + "_"
+                + findCrnNoResult.getCrnNo()
+                + "_"
+                + sourceStationId;
+    }
+
+    /**
      * 鍑哄簱璺緞鎼滅储浠d环杈冮珮锛屽彧缂撳瓨宸茬‘璁ゅ彲杈剧殑绔欑偣缁撴灉锛屽苟閫氳繃 TTL 鎺у埗闄堟棫椋庨櫓銆�
      */
     private Integer resolveCachedOutStationId(FindCrnNoResult findCrnNoResult,

--
Gitblit v1.9.1