From 1654b0a8c149f86d38f3202cb88c655ad0a25384 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 01 四月 2026 10:33:25 +0800
Subject: [PATCH] #出库任务路径计算增加cache

---
 src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java |  447 ++++++++++++++++++-------------------------------------
 1 files changed, 151 insertions(+), 296 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java b/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
index e4572e1..17bd7f8 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java
@@ -2,46 +2,38 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.core.common.Cools;
-import com.core.common.DateUtils;
 import com.core.common.SpringUtils;
-import com.zy.asrs.entity.BasDevp;
 import com.zy.asrs.entity.BasStationOpt;
 import com.zy.asrs.entity.DeviceConfig;
-import com.zy.asrs.entity.DeviceDataLog;
-import com.zy.asrs.service.BasDevpService;
 import com.zy.asrs.service.BasStationOptService;
-import com.zy.asrs.utils.Utils;
 import com.zy.common.model.NavigateNode;
 import com.zy.common.utils.NavigateUtils;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.cache.MessageQueue;
-import com.zy.core.cache.OutputQueue;
-import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.SlaveType;
 import com.zy.core.enums.StationCommandType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.model.protocol.StationTaskBufferItem;
 import com.zy.core.network.DeviceConnectPool;
 import com.zy.core.network.ZyStationConnectDriver;
 import com.zy.core.network.entity.ZyStationStatusEntity;
+import com.zy.core.service.StationTaskLoopService;
+import com.zy.core.thread.impl.v5.StationV5RunBlockReroutePlanner;
 import com.zy.core.thread.impl.v5.StationV5SegmentExecutor;
-import com.zy.core.utils.DeviceLogRedisKeyBuilder;
+import com.zy.core.thread.impl.v5.StationV5StatusReader;
+import com.zy.core.thread.support.RecentStationArrivalTracker;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -49,37 +41,35 @@
 @Slf4j
 public class ZyStationV5Thread implements Runnable, com.zy.core.thread.StationThread {
 
-    private static final int RUN_BLOCK_REROUTE_STATE_EXPIRE_SECONDS = 60 * 60 * 24;
+    private static final int SEGMENT_EXECUTOR_POOL_SIZE = 64;
 
-    private List<StationProtocol> statusList = new ArrayList<>();
     private DeviceConfig deviceConfig;
     private RedisUtil redisUtil;
     private ZyStationConnectDriver zyStationConnectDriver;
-    private int deviceLogCollectTime = 200;
-    private boolean initStatus = false;
-    private long deviceDataLogTime = System.currentTimeMillis();
-    private ExecutorService executor = Executors.newFixedThreadPool(9999);
+    private final ExecutorService executor = Executors.newFixedThreadPool(SEGMENT_EXECUTOR_POOL_SIZE);
     private StationV5SegmentExecutor segmentExecutor;
+    private final RecentStationArrivalTracker recentArrivalTracker;
+    private final StationV5StatusReader statusReader;
+    private final StationV5RunBlockReroutePlanner runBlockReroutePlanner;
 
     public ZyStationV5Thread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
         this.redisUtil = redisUtil;
+        this.recentArrivalTracker = new RecentStationArrivalTracker(redisUtil);
         this.segmentExecutor = new StationV5SegmentExecutor(deviceConfig, redisUtil, this::sendCommand);
+        this.statusReader = new StationV5StatusReader(deviceConfig, redisUtil, recentArrivalTracker);
+        this.runBlockReroutePlanner = new StationV5RunBlockReroutePlanner(redisUtil);
     }
 
     @Override
     @SuppressWarnings("InfiniteLoopStatement")
     public void run() {
         this.connect();
-        deviceLogCollectTime = Utils.getDeviceLogCollectTime();
 
         Thread readThread = new Thread(() -> {
             while (true) {
                 try {
-                    if (initStatus) {
-                        deviceLogCollectTime = Utils.getDeviceLogCollectTime();
-                    }
-                    readStatus();
+                    statusReader.readStatus(zyStationConnectDriver);
                     Thread.sleep(100);
                 } catch (Exception e) {
                     log.error("StationV5Thread Fail", e);
@@ -91,15 +81,7 @@
         Thread processThread = new Thread(() -> {
             while (true) {
                 try {
-                    int step = 1;
-                    Task task = MessageQueue.poll(SlaveType.Devp, deviceConfig.getDeviceNo());
-                    if (task != null) {
-                        step = task.getStep();
-                    }
-                    if (step == 2) {
-                        StationCommand cmd = (StationCommand) task.getData();
-                        executor.submit(() -> segmentExecutor.execute(cmd));
-                    }
+                    pollAndDispatchQueuedCommand();
                     Thread.sleep(100);
                 } catch (Exception e) {
                     log.error("StationV5Process Fail", e);
@@ -107,82 +89,6 @@
             }
         }, "DevpProcess-" + deviceConfig.getDeviceNo());
         processThread.start();
-    }
-
-    private void readStatus() {
-        if (zyStationConnectDriver == null) {
-            return;
-        }
-
-        if (statusList.isEmpty()) {
-            BasDevpService basDevpService = null;
-            try {
-                basDevpService = SpringUtils.getBean(BasDevpService.class);
-            } catch (Exception ignore) {
-            }
-            if (basDevpService == null) {
-                return;
-            }
-
-            BasDevp basDevp = basDevpService
-                    .getOne(new QueryWrapper<BasDevp>().eq("devp_no", deviceConfig.getDeviceNo()));
-            if (basDevp == null) {
-                return;
-            }
-
-            List<ZyStationStatusEntity> list = JSONObject.parseArray(basDevp.getStationList(), ZyStationStatusEntity.class);
-            for (ZyStationStatusEntity entity : list) {
-                StationProtocol stationProtocol = new StationProtocol();
-                stationProtocol.setStationId(entity.getStationId());
-                statusList.add(stationProtocol);
-            }
-            initStatus = true;
-        }
-
-        List<ZyStationStatusEntity> zyStationStatusEntities = zyStationConnectDriver.getStatus();
-        for (ZyStationStatusEntity statusEntity : zyStationStatusEntities) {
-            for (StationProtocol stationProtocol : statusList) {
-                if (stationProtocol.getStationId().equals(statusEntity.getStationId())) {
-                    stationProtocol.setTaskNo(statusEntity.getTaskNo());
-                    stationProtocol.setTargetStaNo(statusEntity.getTargetStaNo());
-                    stationProtocol.setAutoing(statusEntity.isAutoing());
-                    stationProtocol.setLoading(statusEntity.isLoading());
-                    stationProtocol.setInEnable(statusEntity.isInEnable());
-                    stationProtocol.setOutEnable(statusEntity.isOutEnable());
-                    stationProtocol.setEmptyMk(statusEntity.isEmptyMk());
-                    stationProtocol.setFullPlt(statusEntity.isFullPlt());
-                    stationProtocol.setPalletHeight(statusEntity.getPalletHeight());
-                    stationProtocol.setError(statusEntity.getError());
-                    stationProtocol.setErrorMsg(statusEntity.getErrorMsg());
-                    stationProtocol.setBarcode(statusEntity.getBarcode());
-                    stationProtocol.setRunBlock(statusEntity.isRunBlock());
-                    stationProtocol.setEnableIn(statusEntity.isEnableIn());
-                    stationProtocol.setWeight(statusEntity.getWeight());
-                    stationProtocol.setTaskWriteIdx(statusEntity.getTaskWriteIdx());
-                }
-
-                if (!Cools.isEmpty(stationProtocol.getSystemWarning())) {
-                    if (stationProtocol.isAutoing() && !stationProtocol.isLoading()) {
-                        stationProtocol.setSystemWarning("");
-                    }
-                }
-            }
-        }
-
-        OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",
-                DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
-
-        if (System.currentTimeMillis() - deviceDataLogTime > deviceLogCollectTime) {
-            DeviceDataLog deviceDataLog = new DeviceDataLog();
-            deviceDataLog.setOriginData(JSON.toJSONString(zyStationStatusEntities));
-            deviceDataLog.setWcsData(JSON.toJSONString(statusList));
-            deviceDataLog.setType(String.valueOf(SlaveType.Devp));
-            deviceDataLog.setDeviceNo(deviceConfig.getDeviceNo());
-            deviceDataLog.setCreateTime(new Date());
-
-            redisUtil.set(DeviceLogRedisKeyBuilder.build(deviceDataLog), deviceDataLog, 60 * 60 * 24);
-            deviceDataLogTime = System.currentTimeMillis();
-        }
     }
 
     @Override
@@ -208,16 +114,36 @@
 
     @Override
     public List<StationProtocol> getStatus() {
-        return statusList;
+        return statusReader.getStatusList();
     }
 
     @Override
     public Map<Integer, StationProtocol> getStatusMap() {
         Map<Integer, StationProtocol> map = new HashMap<>();
-        for (StationProtocol stationProtocol : statusList) {
+        for (StationProtocol stationProtocol : statusReader.getStatusList()) {
             map.put(stationProtocol.getStationId(), stationProtocol);
         }
         return map;
+    }
+
+    private void pollAndDispatchQueuedCommand() {
+        Task task = MessageQueue.poll(SlaveType.Devp, deviceConfig.getDeviceNo());
+        if (task == null || task.getStep() == null || task.getStep() != 2) {
+            return;
+        }
+        submitSegmentCommand((StationCommand) task.getData());
+    }
+
+    private void submitSegmentCommand(StationCommand command) {
+        if (command == null || executor == null || segmentExecutor == null) {
+            return;
+        }
+        executor.submit(() -> segmentExecutor.execute(command));
+    }
+
+    @Override
+    public boolean hasRecentArrival(Integer stationId, Integer taskNo) {
+        return recentArrivalTracker.hasRecentArrival(stationId, taskNo);
     }
 
     @Override
@@ -226,6 +152,16 @@
                                      Integer stationId,
                                      Integer targetStationId,
                                      Integer palletSize) {
+        return getCommand(commandType, taskNo, stationId, targetStationId, palletSize, null);
+    }
+
+    @Override
+    public StationCommand getCommand(StationCommandType commandType,
+                                     Integer taskNo,
+                                     Integer stationId,
+                                     Integer targetStationId,
+                                     Integer palletSize,
+                                     Double pathLenFactor) {
         StationCommand stationCommand = new StationCommand();
         stationCommand.setTaskNo(taskNo);
         stationCommand.setStationId(stationId);
@@ -234,7 +170,7 @@
         stationCommand.setCommandType(commandType);
 
         if (commandType == StationCommandType.MOVE && !stationId.equals(targetStationId)) {
-            List<NavigateNode> nodes = calcPathNavigateNodes(taskNo, stationId, targetStationId);
+            List<NavigateNode> nodes = calcPathNavigateNodes(taskNo, stationId, targetStationId, pathLenFactor);
             return fillMoveCommandPath(stationCommand, nodes, taskNo, stationId, targetStationId);
         }
         return stationCommand;
@@ -245,65 +181,114 @@
                                                                  Integer stationId,
                                                                  Integer targetStationId,
                                                                  Integer palletSize) {
+        return getRunBlockRerouteCommand(taskNo, stationId, targetStationId, palletSize, null);
+    }
+
+    @Override
+    public synchronized StationCommand getRunBlockRerouteCommand(Integer taskNo,
+                                                                 Integer stationId,
+                                                                 Integer targetStationId,
+                                                                 Integer palletSize,
+                                                                 Double pathLenFactor) {
         if (taskNo == null || taskNo <= 0 || stationId == null || targetStationId == null) {
             return null;
         }
         if (Objects.equals(stationId, targetStationId)) {
-            return getCommand(StationCommandType.MOVE, taskNo, stationId, targetStationId, palletSize);
+            return getCommand(StationCommandType.MOVE, taskNo, stationId, targetStationId, palletSize, pathLenFactor);
         }
 
-        RunBlockRerouteState rerouteState = loadRunBlockRerouteState(taskNo, stationId);
-        rerouteState.setTaskNo(taskNo);
-        rerouteState.setBlockStationId(stationId);
-        rerouteState.setLastTargetStationId(targetStationId);
-        rerouteState.setPlanCount((rerouteState.getPlanCount() == null ? 0 : rerouteState.getPlanCount()) + 1);
-        rerouteState.setLastPlanTime(System.currentTimeMillis());
+        StationTaskLoopService taskLoopService = loadStationTaskLoopService();
+        StationTaskLoopService.LoopEvaluation loopEvaluation = taskLoopService == null
+                ? new StationTaskLoopService.LoopEvaluation(taskNo, stationId, StationTaskLoopService.LoopIdentitySnapshot.empty(), 0, 0, false)
+                : taskLoopService.evaluateLoop(taskNo, stationId, true);
+        log.info("杈撻�佺嚎鍫靛閲嶈鍒掔幆绾胯瘑鍒紝taskNo={}, stationId={}, scopeType={}, localStationCount={}, sourceLoopStationCount={}",
+                taskNo,
+                stationId,
+                loopEvaluation.getLoopIdentity().getScopeType(),
+                loopEvaluation.getLoopIdentity().getLocalStationCount(),
+                loopEvaluation.getLoopIdentity().getSourceLoopStationCount());
+        List<List<NavigateNode>> candidatePathList = calcCandidatePathNavigateNodes(taskNo, stationId, targetStationId, pathLenFactor);
+        List<StationCommand> candidateCommandList = new ArrayList<>();
+        for (List<NavigateNode> candidatePath : candidatePathList) {
+            StationCommand rerouteCommand = buildMoveCommand(taskNo, stationId, targetStationId, palletSize, candidatePath);
+            if (rerouteCommand == null || rerouteCommand.getNavigatePath() == null || rerouteCommand.getNavigatePath().isEmpty()) {
+                continue;
+            }
+            candidateCommandList.add(rerouteCommand);
+        }
 
-        List<List<NavigateNode>> candidatePathList = calcCandidatePathNavigateNodes(taskNo, stationId, targetStationId);
-        if (candidatePathList.isEmpty()) {
-            saveRunBlockRerouteState(rerouteState);
+        StationV5RunBlockReroutePlanner.PlanResult planResult = runBlockReroutePlanner.plan(
+                taskNo,
+                stationId,
+                loopEvaluation,
+                candidateCommandList
+        );
+        if (candidateCommandList.isEmpty()) {
             log.warn("杈撻�佺嚎鍫靛閲嶈鍒掑け璐ワ紝鍊欓�夎矾寰勪负绌猴紝taskNo={}, planCount={}, stationId={}, targetStationId={}",
-                    taskNo, rerouteState.getPlanCount(), stationId, targetStationId);
+                    taskNo, planResult.getPlanCount(), stationId, targetStationId);
             return null;
         }
 
-        StationCommand rerouteCommand = selectAvailableRerouteCommand(
-                rerouteState,
-                candidatePathList,
-                taskNo,
-                stationId,
-                targetStationId,
-                palletSize
-        );
-        if (rerouteCommand == null) {
-            log.info("杈撻�佺嚎鍫靛閲嶈鍒掑�欓�夎矾绾垮凡鍏ㄩ儴璇曡繃锛岄噸缃矾绾垮巻鍙插悗閲嶆柊寮�濮嬶紝taskNo={}, planCount={}, stationId={}, targetStationId={}",
-                    taskNo, rerouteState.getPlanCount(), stationId, targetStationId);
-            rerouteState.resetIssuedRoutes();
-            rerouteCommand = selectAvailableRerouteCommand(
-                    rerouteState,
-                    candidatePathList,
-                    taskNo,
-                    stationId,
-                    targetStationId,
-                    palletSize
-            );
-        }
-
+        StationCommand rerouteCommand = planResult.getCommand();
         if (rerouteCommand != null) {
-            saveRunBlockRerouteState(rerouteState);
+            if (taskLoopService != null) {
+                taskLoopService.recordLoopIssue(loopEvaluation, "RUN_BLOCK_REROUTE");
+            }
             log.info("杈撻�佺嚎鍫靛閲嶈鍒掗�変腑鍊欓�夎矾绾匡紝taskNo={}, planCount={}, stationId={}, targetStationId={}, route={}",
-                    taskNo, rerouteState.getPlanCount(), stationId, targetStationId, JSON.toJSONString(rerouteCommand.getNavigatePath()));
+                    taskNo, planResult.getPlanCount(), stationId, targetStationId, JSON.toJSONString(rerouteCommand.getNavigatePath()));
             return rerouteCommand;
         }
 
-        saveRunBlockRerouteState(rerouteState);
         log.warn("杈撻�佺嚎鍫靛閲嶈鍒掓湭鎵惧埌鍙笅鍙戣矾绾匡紝taskNo={}, planCount={}, stationId={}, targetStationId={}, triedRoutes={}",
                 taskNo,
-                rerouteState.getPlanCount(),
+                planResult.getPlanCount(),
                 stationId,
                 targetStationId,
-                JSON.toJSONString(rerouteState.getIssuedRoutePathList()));
+                JSON.toJSONString(planResult.getIssuedRoutePathList()));
         return null;
+    }
+
+    @Override
+    public synchronized boolean clearPath(Integer taskNo) {
+        if (taskNo == null || taskNo <= 0) {
+            return false;
+        }
+        if (zyStationConnectDriver == null) {
+            return false;
+        }
+        List<StationProtocol> status = getStatus();
+        if (status == null || status.isEmpty()) {
+            return false;
+        }
+
+        boolean found = false;
+        boolean success = true;
+        for (StationProtocol stationProtocol : status) {
+            List<StationTaskBufferItem> taskBufferItems = stationProtocol == null ? null : stationProtocol.getTaskBufferItems();
+            if (taskBufferItems == null || taskBufferItems.isEmpty()) {
+                continue;
+            }
+            Integer stationId = stationProtocol.getStationId();
+            for (StationTaskBufferItem item : taskBufferItems) {
+                if (item == null || !Objects.equals(taskNo, item.getTaskNo())) {
+                    continue;
+                }
+                found = true;
+                if (!zyStationConnectDriver.clearTaskBufferSlot(stationId, item.getSlotIdx())) {
+                    success = false;
+                    log.warn("杈撻�佺珯缂撳瓨鍖烘畫鐣欒矾寰勬竻鐞嗗け璐ャ�俿tationId={}, slotIdx={}, taskNo={}",
+                            stationId, item.getSlotIdx(), item.getTaskNo());
+                    continue;
+                }else {
+                    item.setTaskNo(0);
+                    item.setTargetStaNo(0);
+                    success = true;
+                    log.warn("杈撻�佺珯缂撳瓨鍖烘畫鐣欒矾寰勬竻鐞嗘垚鍔熴�俿tationId={}, slotIdx={}, taskNo={}",
+                            stationId, item.getSlotIdx(), item.getTaskNo());
+                }
+            }
+        }
+        return found && success;
     }
 
     @Override
@@ -315,6 +300,9 @@
             e.printStackTrace();
         } finally {
             BasStationOptService optService = SpringUtils.getBean(BasStationOptService.class);
+            if (optService == null) {
+                return commandResponse;
+            }
             List<ZyStationStatusEntity> statusListEntity = zyStationConnectDriver.getStatus();
             ZyStationStatusEntity matched = null;
             if (statusListEntity != null) {
@@ -337,12 +325,10 @@
                     null,
                     JSON.toJSONString(command),
                     JSON.toJSONString(matched),
-                    1,
+                    commandResponse != null && Boolean.TRUE.equals(commandResponse.getResult()) ? 1 : 0,
                     JSON.toJSONString(commandResponse)
             );
-            if (optService != null) {
-                optService.save(basStationOpt);
-            }
+            optService.save(basStationOpt);
         }
         return commandResponse;
     }
@@ -357,22 +343,26 @@
         return zyStationConnectDriver.readOriginCommand(address, length);
     }
 
-    private List<NavigateNode> calcPathNavigateNodes(Integer taskNo, Integer startStationId, Integer targetStationId) {
+    private List<NavigateNode> calcPathNavigateNodes(Integer taskNo,
+                                                     Integer startStationId,
+                                                     Integer targetStationId,
+                                                     Double pathLenFactor) {
         NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
         if (navigateUtils == null) {
             return new ArrayList<>();
         }
-        return navigateUtils.calcByStationId(startStationId, targetStationId, taskNo);
+        return navigateUtils.calcByStationId(startStationId, targetStationId, taskNo, pathLenFactor);
     }
 
     private List<List<NavigateNode>> calcCandidatePathNavigateNodes(Integer taskNo,
                                                                     Integer startStationId,
-                                                                    Integer targetStationId) {
+                                                                    Integer targetStationId,
+                                                                    Double pathLenFactor) {
         NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
         if (navigateUtils == null) {
             return new ArrayList<>();
         }
-        return navigateUtils.calcCandidatePathByStationId(startStationId, targetStationId, taskNo);
+        return navigateUtils.calcCandidatePathByStationId(startStationId, targetStationId, taskNo, pathLenFactor);
     }
 
     private StationCommand buildMoveCommand(Integer taskNo,
@@ -426,146 +416,11 @@
         return stationCommand;
     }
 
-    private StationCommand selectAvailableRerouteCommand(RunBlockRerouteState rerouteState,
-                                                         List<List<NavigateNode>> candidatePathList,
-                                                         Integer taskNo,
-                                                         Integer stationId,
-                                                         Integer targetStationId,
-                                                         Integer palletSize) {
-        if (rerouteState == null || candidatePathList == null || candidatePathList.isEmpty()) {
-            return null;
-        }
-
-        Set<String> issuedRouteSignatureSet = rerouteState.getIssuedRouteSignatureSet();
-        for (List<NavigateNode> candidatePath : candidatePathList) {
-            StationCommand rerouteCommand = buildMoveCommand(taskNo, stationId, targetStationId, palletSize, candidatePath);
-            if (rerouteCommand == null || rerouteCommand.getNavigatePath() == null || rerouteCommand.getNavigatePath().isEmpty()) {
-                continue;
-            }
-            String routeSignature = buildPathSignature(rerouteCommand.getNavigatePath());
-            if (Cools.isEmpty(routeSignature) || issuedRouteSignatureSet.contains(routeSignature)) {
-                continue;
-            }
-
-            issuedRouteSignatureSet.add(routeSignature);
-            rerouteState.getIssuedRoutePathList().add(new ArrayList<>(rerouteCommand.getNavigatePath()));
-            rerouteState.setLastSelectedRoute(new ArrayList<>(rerouteCommand.getNavigatePath()));
-            return rerouteCommand;
-        }
-        return null;
-    }
-
-    private RunBlockRerouteState loadRunBlockRerouteState(Integer taskNo, Integer blockStationId) {
-        if (redisUtil == null || taskNo == null || taskNo <= 0 || blockStationId == null || blockStationId <= 0) {
-            return new RunBlockRerouteState();
-        }
-        Object stateObj = redisUtil.get(buildRunBlockRerouteStateKey(taskNo, blockStationId));
-        if (stateObj == null) {
-            return new RunBlockRerouteState();
-        }
+    private StationTaskLoopService loadStationTaskLoopService() {
         try {
-            RunBlockRerouteState state = JSON.parseObject(String.valueOf(stateObj), RunBlockRerouteState.class);
-            return state == null ? new RunBlockRerouteState() : state.normalize();
+            return SpringUtils.getBean(StationTaskLoopService.class);
         } catch (Exception ignore) {
-            return new RunBlockRerouteState();
-        }
-    }
-
-    private void saveRunBlockRerouteState(RunBlockRerouteState rerouteState) {
-        if (redisUtil == null
-                || rerouteState == null
-                || rerouteState.getTaskNo() == null
-                || rerouteState.getTaskNo() <= 0
-                || rerouteState.getBlockStationId() == null
-                || rerouteState.getBlockStationId() <= 0) {
-            return;
-        }
-        rerouteState.normalize();
-        redisUtil.set(
-                buildRunBlockRerouteStateKey(rerouteState.getTaskNo(), rerouteState.getBlockStationId()),
-                JSON.toJSONString(rerouteState),
-                RUN_BLOCK_REROUTE_STATE_EXPIRE_SECONDS
-        );
-    }
-
-    private String buildPathSignature(List<Integer> path) {
-        if (path == null || path.isEmpty()) {
-            return "";
-        }
-        StringBuilder builder = new StringBuilder();
-        for (Integer stationNo : path) {
-            if (stationNo == null) {
-                continue;
-            }
-            if (builder.length() > 0) {
-                builder.append("->");
-            }
-            builder.append(stationNo);
-        }
-        return builder.toString();
-    }
-
-    private String buildRunBlockRerouteStateKey(Integer taskNo, Integer blockStationId) {
-        return RedisKeyType.STATION_RUN_BLOCK_REROUTE_STATE_.key + taskNo + "_" + blockStationId;
-    }
-
-    @Data
-    private static class RunBlockRerouteState {
-        private Integer taskNo;
-        private Integer blockStationId;
-        private Integer planCount = 0;
-        private Integer lastTargetStationId;
-        private Long lastPlanTime;
-        private List<List<Integer>> issuedRoutePathList = new ArrayList<>();
-        private List<Integer> lastSelectedRoute = new ArrayList<>();
-        private Set<String> issuedRouteSignatureSet = new LinkedHashSet<>();
-
-        private RunBlockRerouteState normalize() {
-            if (planCount == null || planCount < 0) {
-                planCount = 0;
-            }
-            if (issuedRoutePathList == null) {
-                issuedRoutePathList = new ArrayList<>();
-            }
-            if (lastSelectedRoute == null) {
-                lastSelectedRoute = new ArrayList<>();
-            }
-            if (issuedRouteSignatureSet == null) {
-                issuedRouteSignatureSet = new LinkedHashSet<>();
-            }
-            for (List<Integer> routePath : issuedRoutePathList) {
-                if (routePath == null || routePath.isEmpty()) {
-                    continue;
-                }
-                StringBuilder builder = new StringBuilder(buildPathSignatureText(routePath));
-                if (builder.length() > 0) {
-                    issuedRouteSignatureSet.add(builder.toString());
-                }
-            }
-            return this;
-        }
-
-        private void resetIssuedRoutes() {
-            this.issuedRoutePathList = new ArrayList<>();
-            this.lastSelectedRoute = new ArrayList<>();
-            this.issuedRouteSignatureSet = new LinkedHashSet<>();
-        }
-
-        private static String buildPathSignatureText(List<Integer> routePath) {
-            if (routePath == null || routePath.isEmpty()) {
-                return "";
-            }
-            StringBuilder builder = new StringBuilder();
-            for (Integer stationId : routePath) {
-                if (stationId == null) {
-                    continue;
-                }
-                if (builder.length() > 0) {
-                    builder.append("->");
-                }
-                builder.append(stationId);
-            }
-            return builder.toString();
+            return null;
         }
     }
 }

--
Gitblit v1.9.1