From dc3f9cc91759823ce59486f19b138be4b296a0f1 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 28 四月 2026 09:43:28 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java |   90 +++++++++++++++++++++++++++++---------------
 1 files changed, 59 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java b/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java
index 12b5e4c..14ce0c9 100644
--- a/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java
+++ b/src/main/java/com/zy/ai/service/impl/AutoTuneApplyServiceImpl.java
@@ -17,13 +17,14 @@
 import com.zy.asrs.entity.BasCrnp;
 import com.zy.asrs.entity.BasDualCrnp;
 import com.zy.asrs.entity.BasStation;
-import com.zy.asrs.entity.StationFlowCapacity;
+import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.service.BasCrnpService;
 import com.zy.asrs.service.BasDualCrnpService;
 import com.zy.asrs.service.BasStationService;
-import com.zy.asrs.service.StationFlowCapacityService;
+import com.zy.asrs.service.WrkMastService;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.enums.RedisKeyType;
+import com.zy.core.enums.WrkStsType;
 import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
 import org.slf4j.Logger;
@@ -34,6 +35,7 @@
 import org.springframework.transaction.support.TransactionTemplate;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -46,9 +48,16 @@
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AutoTuneApplyServiceImpl.class);
     private static final String PROMPT_SCENE_CODE = "auto_tune_apply";
-    private static final String DIRECTION_OUT = "OUT";
     private static final long APPLY_LOCK_SECONDS = 120L;
     private static final String APPLY_LOCK_BUSY_REASON = "鐢宠璋冨弬閿佸け璐ワ紝閿佷笉鍙敤锛屽彲鑳藉凡鏈変换鍔℃垨 Redis 寮傚父";
+    private static final List<Long> FINAL_WRK_STS_LIST = Arrays.asList(
+            WrkStsType.COMPLETE_INBOUND.sts,
+            WrkStsType.SETTLE_INBOUND.sts,
+            WrkStsType.COMPLETE_OUTBOUND.sts,
+            WrkStsType.SETTLE_OUTBOUND.sts,
+            WrkStsType.COMPLETE_LOC_MOVE.sts,
+            WrkStsType.COMPLETE_CRN_MOVE.sts
+    );
 
     @Autowired
     private AiAutoTuneJobService aiAutoTuneJobService;
@@ -63,7 +72,7 @@
     @Autowired
     private BasDualCrnpService basDualCrnpService;
     @Autowired
-    private StationFlowCapacityService stationFlowCapacityService;
+    private WrkMastService wrkMastService;
     @Autowired
     private PlatformTransactionManager transactionManager;
     @Autowired
@@ -141,7 +150,7 @@
                         now,
                         true
                 );
-                refreshSystemConfigCacheIfNeeded(persistenceResult);
+                refreshSystemConfigCacheSafely(persistenceResult);
                 return buildResult(job, persistenceResult.getAuditChanges(), false);
             } catch (RuntimeException exception) {
                 markWriteFailure(validatedChanges, exception);
@@ -216,7 +225,7 @@
                         sourceChanges,
                         now
                 );
-                refreshRollbackConfigCacheIfNeeded(persistenceResult);
+                refreshRollbackConfigCacheSafely(persistenceResult);
                 return buildResult(rollbackJob, persistenceResult.getRollbackChanges(), false);
             } catch (RuntimeException exception) {
                 Date failureNow = new Date();
@@ -286,7 +295,7 @@
         Integer maxValue = resolveMaxValue(validatedChange, rule, requestedValue);
         if (maxValue == null) {
             return validatedChange.reject("绔欑偣 " + validatedChange.getTargetId()
-                    + " 缂哄皯 OUT 鏂瑰悜 bufferCapacity锛屾棤娉曡瘉鏄� outTaskLimit 涓婇檺");
+                    + " 缂哄皯 outBufferCapacity锛屾棤娉曡瘉鏄� outTaskLimit 涓婇檺");
         }
         if (requestedValue < rule.getMinValue() || requestedValue > maxValue) {
             return validatedChange.reject(validatedChange.getTargetKey() + " 蹇呴』鍦� "
@@ -323,14 +332,14 @@
             if (config == null) {
                 return CurrentValue.rejected("杩愯鍙傛暟涓嶅瓨鍦�: " + validatedChange.getTargetKey());
             }
-            return numericCurrentValue(config.getValue(), false, validatedChange.getTargetKey());
+            return numericCurrentValue(config.getValue(), validatedChange.getTargetKey());
         }
         if (AutoTuneTargetType.STATION.equals(targetType)) {
             BasStation station = basStationService.getById(targetId);
             if (station == null) {
                 return CurrentValue.rejected("绔欑偣涓嶅瓨鍦�: " + validatedChange.getTargetId());
             }
-            return numericCurrentValue(toText(station.getOutTaskLimit()), true, validatedChange.getTargetKey());
+            return stationOutTaskLimitCurrentValue(station.getOutTaskLimit(), validatedChange.getTargetKey());
         }
         if (AutoTuneTargetType.CRN.equals(targetType)) {
             BasCrnp crnp = basCrnpService.getById(targetId);
@@ -338,28 +347,29 @@
                 return CurrentValue.rejected("鍫嗗灈鏈轰笉瀛樺湪: " + validatedChange.getTargetId());
             }
             Integer value = "maxOutTask".equals(validatedChange.getTargetKey()) ? crnp.getMaxOutTask() : crnp.getMaxInTask();
-            return numericCurrentValue(toText(value), false, validatedChange.getTargetKey());
+            return numericCurrentValue(toText(value), validatedChange.getTargetKey());
         }
         BasDualCrnp dualCrnp = basDualCrnpService.getById(targetId);
         if (dualCrnp == null) {
             return CurrentValue.rejected("鍙屽伐浣嶅爢鍨涙満涓嶅瓨鍦�: " + validatedChange.getTargetId());
         }
         Integer value = "maxOutTask".equals(validatedChange.getTargetKey()) ? dualCrnp.getMaxOutTask() : dualCrnp.getMaxInTask();
-        return numericCurrentValue(toText(value), false, validatedChange.getTargetKey());
+        return numericCurrentValue(toText(value), validatedChange.getTargetKey());
     }
 
-    private CurrentValue numericCurrentValue(String oldValue, boolean nullOrNegativeAsZero, String targetKey) {
+    private CurrentValue stationOutTaskLimitCurrentValue(Integer outTaskLimit, String targetKey) {
+        if (outTaskLimit == null || outTaskLimit < 0) {
+            return CurrentValue.rejected(targetKey + " 褰撳墠涓轰笉闄愬埗锛岄渶瑕佷汉宸ュ厛鍒濆鍖栦负鏈夐檺鍊煎悗鎵嶈兘鑷姩璋冨弬");
+        }
+        return numericCurrentValue(toText(outTaskLimit), targetKey);
+    }
+
+    private CurrentValue numericCurrentValue(String oldValue, String targetKey) {
         if (oldValue == null || oldValue.trim().isEmpty()) {
-            if (nullOrNegativeAsZero) {
-                return CurrentValue.accepted(null, 0);
-            }
             return CurrentValue.rejected(targetKey + " 褰撳墠鍊间负绌猴紝鏃犳硶璁$畻姝ラ暱");
         }
         try {
             Integer parsedValue = Integer.valueOf(oldValue.trim());
-            if (nullOrNegativeAsZero && parsedValue < 0) {
-                return CurrentValue.accepted(oldValue, 0);
-            }
             return CurrentValue.accepted(oldValue, parsedValue);
         } catch (Exception exception) {
             return CurrentValue.rejected(targetKey + " 褰撳墠鍊间笉鏄暣鏁帮紝鏃犳硶璁$畻姝ラ暱");
@@ -373,16 +383,11 @@
             return rule.getMaxValue();
         }
         Integer targetId = parseTargetId(validatedChange.getTargetId(), rule.getTargetType());
-        StationFlowCapacity capacity = stationFlowCapacityService.getOne(
-                new QueryWrapper<StationFlowCapacity>()
-                        .eq("station_id", targetId)
-                        .eq("direction_code", DIRECTION_OUT)
-                        .last("limit 1")
-        );
-        if (capacity == null || capacity.getBufferCapacity() == null) {
+        BasStation station = basStationService.getById(targetId);
+        if (station == null || station.getOutBufferCapacity() == null) {
             return requestedValue == 0 ? 0 : null;
         }
-        return Math.max(0, capacity.getBufferCapacity());
+        return Math.max(0, station.getOutBufferCapacity());
     }
 
     private Date findCooldownExpireTime(ValidatedChange validatedChange, Date now) {
@@ -484,9 +489,9 @@
         }
     }
 
-    private void refreshSystemConfigCacheIfNeeded(ApplyPersistenceResult persistenceResult) {
+    private void refreshSystemConfigCacheSafely(ApplyPersistenceResult persistenceResult) {
         if (persistenceResult != null && persistenceResult.isRefreshConfigCache()) {
-            configService.refreshSystemConfigCache();
+            refreshSystemConfigCacheSafely("apply");
         }
     }
 
@@ -584,9 +589,17 @@
         return List.of(rollbackChange);
     }
 
-    private void refreshRollbackConfigCacheIfNeeded(RollbackPersistenceResult persistenceResult) {
+    private void refreshRollbackConfigCacheSafely(RollbackPersistenceResult persistenceResult) {
         if (persistenceResult != null && persistenceResult.isRefreshConfigCache()) {
+            refreshSystemConfigCacheSafely("rollback");
+        }
+    }
+
+    private void refreshSystemConfigCacheSafely(String scene) {
+        try {
             configService.refreshSystemConfigCache();
+        } catch (RuntimeException exception) {
+            LOGGER.warn("AI鑷姩璋冨弬{}宸叉彁浜わ紝浣嗗埛鏂扮郴缁熼厤缃紦瀛樺け璐�", scene, exception);
         }
     }
 
@@ -670,7 +683,7 @@
         job.setTriggerType(AutoTuneTriggerType.normalize(request.getTriggerType()));
         job.setStatus(AutoTuneJobStatus.RUNNING.getCode());
         job.setStartTime(now);
-        job.setHasActiveTasks(0);
+        job.setHasActiveTasks(resolveHasActiveTasksForAudit());
         job.setPromptSceneCode(PROMPT_SCENE_CODE);
         job.setSummary(dryRun ? "AI鑷姩璋冨弬 dry-run: " + safeReason(request.getReason()) : safeReason(request.getReason()));
         job.setIntervalBefore(readIntervalMinutes());
@@ -689,7 +702,7 @@
         job.setTriggerType(AutoTuneTriggerType.ROLLBACK.getCode());
         job.setStatus(AutoTuneJobStatus.RUNNING.getCode());
         job.setStartTime(now);
-        job.setHasActiveTasks(0);
+        job.setHasActiveTasks(resolveHasActiveTasksForAudit());
         job.setPromptSceneCode(PROMPT_SCENE_CODE);
         job.setSummary(safeReason(reason));
         job.setIntervalBefore(readIntervalMinutes());
@@ -703,6 +716,21 @@
         return job;
     }
 
+    private int resolveHasActiveTasksForAudit() {
+        if (wrkMastService == null) {
+            LOGGER.warn("AI鑷姩璋冨弬瀹¤鏃犳硶鑾峰彇 WrkMastService锛宧asActiveTasks 鎸� 0 璁板綍");
+            return 0;
+        }
+        try {
+            QueryWrapper<WrkMast> queryWrapper = new QueryWrapper<>();
+            queryWrapper.and(wrapper -> wrapper.notIn("wrk_sts", FINAL_WRK_STS_LIST).or().isNull("wrk_sts"));
+            return wrkMastService.count(queryWrapper) > 0 ? 1 : 0;
+        } catch (RuntimeException exception) {
+            LOGGER.warn("AI鑷姩璋冨弬瀹¤鏌ヨ鏈畬鎴愪换鍔″け璐ワ紝hasActiveTasks 鎸� 0 璁板綍", exception);
+            return 0;
+        }
+    }
+
     private void finishJob(AiAutoTuneJob job,
                            AutoTuneApplyRequest request,
                            List<AiAutoTuneChange> auditChanges,

--
Gitblit v1.9.1