From 63b01db83d9aad8a15276b4236a9a22e4aeef065 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 05 五月 2026 12:30:59 +0800
Subject: [PATCH] # Agent数据分析V3.0.1.7

---
 src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java |  262 +++++++++++++++++++++++++++------------------------
 1 files changed, 139 insertions(+), 123 deletions(-)

diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index ed14a84..f638681 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -37,15 +37,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 
 @Component
 public class CrnOperateProcessUtils {
@@ -149,10 +141,10 @@
                         WrkStsType.NEW_OUTBOUND.sts,
                         WrkStsType.NEW_LOC_MOVE.sts));
         taskQueue.sort(Comparator.comparingInt((WrkMast wrkMast) -> resolveTaskTypeRank(wrkMast, lastIo))
-                .thenComparingInt(this::resolveBatchOutboundRank)
-                .thenComparingInt(this::resolveBatchSeqOrder)
                 .thenComparingDouble(this::resolveTaskIoPri)
                 .thenComparingLong(this::resolveTaskQueueTime)
+                .thenComparingInt(this::resolveBatchOutboundRank)
+                .thenComparingInt(this::resolveBatchSeqOrder)
                 .thenComparingInt(this::resolveTaskQueueNo));
 
         for (WrkMast wrkMast : taskQueue) {
@@ -377,7 +369,7 @@
             return false;
         }
 
-        if (isOutboundStationTaskLimitReached()) {
+        if (isConveyorStationTaskLimitReached()) {
             return false;
         }
 
@@ -393,6 +385,7 @@
 
         //妫�鏌ユ槸鍚︿负鍑哄簱妯″紡
         if(!checkOutTargetStationIoMode(wrkMast)) {
+            News.taskInfo(wrkMast.getWrkNo(), "鍫嗗灈鏈�:{} 浠诲姟:{}绂佹鎵ц锛屽嚭搴撶珯:{} 涓嶅浜庡嚭搴撴ā寮�", basCrnp.getCrnNo(), wrkMast.getWrkNo(), wrkMast.getStaNo());
             return false;
         }
 
@@ -593,15 +586,17 @@
         return false;
     }
 
-    private boolean isOutboundStationTaskLimitReached() {
-        int stationMaxTaskCount = getSystemConfigInt("stationMaxTaskCountLimit", 30);
-        if (stationMaxTaskCount <= 0) {
+    private boolean isConveyorStationTaskLimitReached() {
+        int conveyorStationTaskLimit = getSystemConfigInt("conveyorStationTaskLimit", 30);
+        if (conveyorStationTaskLimit <= 0) {
             return false;
         }
 
         int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
-        if (currentStationTaskCount >= stationMaxTaskCount) {
-            News.warn("杈撻�佺珯鐐逛换鍔℃暟閲忚揪鍒颁笂闄愶紝宸插仠姝换鍔′笅鍙戙�傚綋鍓嶄换鍔℃暟={}锛屼笂闄�={}", currentStationTaskCount, stationMaxTaskCount);
+        if (currentStationTaskCount >= conveyorStationTaskLimit) {
+            News.warn("杈撻�佺珯鐐逛换鍔℃暟閲忚揪鍒颁笂闄愶紝宸插仠姝换鍔′笅鍙戙�傚綋鍓嶄换鍔℃暟={}锛屼笂闄�={}",
+                    currentStationTaskCount,
+                    conveyorStationTaskLimit);
             return true;
         }
         return false;
@@ -644,6 +639,10 @@
 
         StationProtocol targetStationProtocol = targetStationThread.getStatusMap().get(wrkMast.getStaNo());
         if (targetStationProtocol == null) {
+            return false;
+        }
+
+        if (targetStationProtocol.getIoMode() == null) {
             return false;
         }
 
@@ -721,36 +720,53 @@
                 return;
             }
 
-            Long updateWrkSts = null;
-            Date now = new Date();
-            if(wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts){
-                updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
-                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null);
-            }else if(wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts){
-                updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
-                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null);
-            }else if(wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts){
-                updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
-                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null);
-            }else if(wrkMast.getWrkSts() == WrkStsType.CRN_MOVE_RUN.sts){
-                updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
-            }else{
-                News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+            String ownerLockKey = RedisKeyType.CRN_IO_EXECUTE_FINISH_OWNER_LOCK.key + wrkMast.getWrkNo();
+            String ownerLockToken = UUID.randomUUID().toString();
+            if (!redisUtil.trySetStringIfAbsent(ownerLockKey, ownerLockToken, 10)) {
                 return;
             }
+            try {
+                wrkMast = wrkMastService.selectByWorkNo(crnProtocol.getTaskNo());
+                if (wrkMast == null) {
+                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                    return;
+                }
 
-            wrkMast.setWrkSts(updateWrkSts);
-            wrkMast.setSystemMsg("");
-            wrkMast.setIoTime(now);
-            wrkMast.setModiTime(now);
-            if (wrkMastService.updateById(wrkMast)) {
-                wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
-                CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
-                MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
-                News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                Long currentWrkSts = wrkMast.getWrkSts();
+                Long updateWrkSts = null;
+                Date now = new Date();
+                if(currentWrkSts == WrkStsType.INBOUND_RUN.sts){
+                    updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
+                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null);
+                }else if(currentWrkSts == WrkStsType.OUTBOUND_RUN.sts){
+                    updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
+                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null);
+                }else if(currentWrkSts == WrkStsType.LOC_MOVE_RUN.sts){
+                    updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
+                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null);
+                }else if(currentWrkSts == WrkStsType.CRN_MOVE_RUN.sts){
+                    updateWrkSts = WrkStsType.COMPLETE_CRN_MOVE.sts;
+                }else{
+                    News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                    return;
+                }
+
+                if (wrkMastService.updateWrkStsByWrkNoAndCurrentWrkSts(wrkMast.getWrkNo(), updateWrkSts, currentWrkSts) > 0) {
+                    wrkMast.setWrkSts(updateWrkSts);
+                    wrkMast.setSystemMsg("");
+                    wrkMast.setIoTime(now);
+                    wrkMast.setModiTime(now);
+                    wrkAnalysisService.markCraneComplete(wrkMast, now, updateWrkSts);
+                    CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getTaskNo(), crnProtocol.getCrnNo());
+                    MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
+                    News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                    redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock",10);
+                } else {
+                    News.info("鍫嗗灈鏈哄畬鎴愮‘璁よ烦杩囷紝浠诲姟鐘舵�佸凡鍙樺寲銆傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
+                }
+            } finally {
+                redisUtil.compareAndDelete(ownerLockKey, ownerLockToken);
             }
-
-            redisUtil.set(RedisKeyType.CRN_IO_EXECUTE_FINISH_LIMIT.key + basCrnp.getCrnNo(), "lock",10);
         }
     }
 
@@ -759,96 +775,96 @@
         if (basCrnp == null || basCrnp.getCrnNo() == null) {
             return;
         }
-            String key = RedisKeyType.PLANNER_SCHEDULE.key + "CRN-" + basCrnp.getCrnNo();
-            List<Object> items = redisUtil.lGet(key, 0, -1);
-            if (items == null || items.isEmpty()) {
-                return;
+        String key = RedisKeyType.PLANNER_SCHEDULE.key + "CRN-" + basCrnp.getCrnNo();
+        List<Object> items = redisUtil.lGet(key, 0, -1);
+        if (items == null || items.isEmpty()) {
+            return;
+        }
+
+        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
+        if (crnThread == null) {
+            return;
+        }
+        CrnProtocol crnProtocol = crnThread.getStatus();
+        if (crnProtocol == null) {
+            return;
+        }
+        List<WrkMast> running = wrkMastService.list(new QueryWrapper<WrkMast>()
+                .eq("crn_no", basCrnp.getCrnNo())
+                .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts, WrkStsType.LOC_MOVE_RUN.sts, WrkStsType.CRN_MOVE_RUN.sts)
+        );
+        if (!running.isEmpty()) {
+            return;
+        }
+        if (!(crnProtocol.getMode() == CrnModeType.AUTO.id
+                && crnProtocol.getTaskNo() == 0
+                && crnProtocol.getStatus() == CrnStatusType.IDLE.id
+                && crnProtocol.getLoaded() == 0
+                && crnProtocol.getForkPos() == 0
+                && crnProtocol.getAlarm() == 0)) {
+            return;
+        }
+
+        for (Object v : items) {
+            String s = String.valueOf(v);
+            JSONObject obj = null;
+            try { obj = JSON.parseObject(s); } catch (Exception ignore) {}
+            if (obj == null) {
+                continue;
+            }
+            Integer startEpochSec = obj.getInteger("startEpochSec");
+            Integer endEpochSec = obj.getInteger("endEpochSec");
+            Integer taskId = obj.getInteger("taskId");
+            String taskType = obj.getString("taskType");
+            if (startEpochSec == null || taskId == null || taskType == null) {
+                continue;
+            }
+            int earlySlackSec = 5;
+            int lateSlackSec = 10;
+            Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
+            if (systemConfigMapObj != null) {
+                try {
+                    HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+                    String es = systemConfigMap.getOrDefault("plannerEarlySlackSec", "60");
+                    String ls = systemConfigMap.getOrDefault("plannerLateSlackSec", "10");
+                    earlySlackSec = Integer.parseInt(es);
+                    lateSlackSec = Integer.parseInt(ls);
+                } catch (Exception ignore) {}
+            }
+            if (nowSec < startEpochSec - earlySlackSec) {
+                continue;
+            }
+            if (endEpochSec != null && nowSec > endEpochSec + lateSlackSec) {
+                redisUtil.lRemove(key, 1, s);
+                continue;
             }
 
-            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
-            if (crnThread == null) {
-                return;
-            }
-            CrnProtocol crnProtocol = crnThread.getStatus();
-            if (crnProtocol == null) {
-                return;
-            }
-            List<WrkMast> running = wrkMastService.list(new QueryWrapper<WrkMast>()
-                    .eq("crn_no", basCrnp.getCrnNo())
-                    .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts, WrkStsType.LOC_MOVE_RUN.sts, WrkStsType.CRN_MOVE_RUN.sts)
-            );
-            if (!running.isEmpty()) {
-                return;
-            }
-            if (!(crnProtocol.getMode() == CrnModeType.AUTO.id
-                    && crnProtocol.getTaskNo() == 0
-                    && crnProtocol.getStatus() == CrnStatusType.IDLE.id
-                    && crnProtocol.getLoaded() == 0
-                    && crnProtocol.getForkPos() == 0
-                    && crnProtocol.getAlarm() == 0)) {
-                return;
+            WrkMast wrkMast = wrkMastService.selectByWorkNo(taskId);
+            if (wrkMast == null) {
+                redisUtil.lRemove(key, 1, s);
+                continue;
             }
 
-            for (Object v : items) {
-                String s = String.valueOf(v);
-                JSONObject obj = null;
-                try { obj = JSON.parseObject(s); } catch (Exception ignore) {}
-                if (obj == null) {
-                    continue;
-                }
-                Integer startEpochSec = obj.getInteger("startEpochSec");
-                Integer endEpochSec = obj.getInteger("endEpochSec");
-                Integer taskId = obj.getInteger("taskId");
-                String taskType = obj.getString("taskType");
-                if (startEpochSec == null || taskId == null || taskType == null) {
-                    continue;
-                }
-                int earlySlackSec = 5;
-                int lateSlackSec = 10;
-                Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
-                if (systemConfigMapObj != null) {
-                    try {
-                        HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
-                        String es = systemConfigMap.getOrDefault("plannerEarlySlackSec", "60");
-                        String ls = systemConfigMap.getOrDefault("plannerLateSlackSec", "10");
-                        earlySlackSec = Integer.parseInt(es);
-                        lateSlackSec = Integer.parseInt(ls);
-                    } catch (Exception ignore) {}
-                }
-                if (nowSec < startEpochSec - earlySlackSec) {
-                    continue;
-                }
-                if (endEpochSec != null && nowSec > endEpochSec + lateSlackSec) {
+            if ("IN".equalsIgnoreCase(taskType)) {
+                boolean result = this.crnExecuteInPlanner(basCrnp, crnThread, wrkMast);//鍏ュ簱
+                if (result) {
                     redisUtil.lRemove(key, 1, s);
-                    continue;
+                    break;
                 }
-
-                WrkMast wrkMast = wrkMastService.selectByWorkNo(taskId);
-                if (wrkMast == null) {
+            } else if ("OUT".equalsIgnoreCase(taskType)) {
+                boolean result = this.crnExecuteOutPlanner(basCrnp, crnThread, wrkMast);//鍑哄簱
+                if (result) {
                     redisUtil.lRemove(key, 1, s);
-                    continue;
+                    break;
                 }
-
-                if ("IN".equalsIgnoreCase(taskType)) {
-                    boolean result = this.crnExecuteInPlanner(basCrnp, crnThread, wrkMast);//鍏ュ簱
-                    if (result) {
-                        redisUtil.lRemove(key, 1, s);
-                        break;
-                    }
-                } else if ("OUT".equalsIgnoreCase(taskType)) {
-                    boolean result = this.crnExecuteOutPlanner(basCrnp, crnThread, wrkMast);//鍑哄簱
-                    if (result) {
-                        redisUtil.lRemove(key, 1, s);
-                        break;
-                    }
-                } else if ("MOVE".equalsIgnoreCase(taskType)) {
-                    boolean result = this.crnExecuteMovePlanner(basCrnp, crnThread, wrkMast);//绉诲簱
-                    if (result) {
-                        redisUtil.lRemove(key, 1, s);
-                        break;
-                    }
+            } else if ("MOVE".equalsIgnoreCase(taskType)) {
+                boolean result = this.crnExecuteMovePlanner(basCrnp, crnThread, wrkMast);//绉诲簱
+                if (result) {
+                    redisUtil.lRemove(key, 1, s);
+                    break;
                 }
             }
+        }
     }
 
     private synchronized boolean crnExecuteMovePlanner(BasCrnp basCrnp, CrnThread crnThread, WrkMast wrkMast) {

--
Gitblit v1.9.1