From 03c3ae747f82ad22c761c79e7b1c0e0031c57d41 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 06 四月 2026 20:28:35 +0800
Subject: [PATCH] #出库站点命令下发

---
 src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java |   52 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java b/src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java
index 064b5cd..e7d93b9 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java
@@ -30,6 +30,9 @@
 import com.zy.core.network.DeviceConnectPool;
 import com.zy.core.network.ZyStationConnectDriver;
 import com.zy.core.network.entity.ZyStationStatusEntity;
+import com.zy.core.thread.impl.v5.StationMoveSegmentExecutor;
+import com.zy.core.thread.support.RecentStationArrivalTracker;
+import com.zy.core.thread.support.StationErrLogSupport;
 import com.zy.core.utils.DeviceLogRedisKeyBuilder;
 import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
@@ -48,17 +51,22 @@
     private static final double DEFAULT_STATION_COMMAND_SEGMENT_ADVANCE_RATIO = 0.3d;
 
     private List<StationProtocol> statusList = new ArrayList<>();
+    private volatile List<Integer> taskNoList = new ArrayList<>();
     private DeviceConfig deviceConfig;
     private RedisUtil redisUtil;
     private ZyStationConnectDriver zyStationConnectDriver;
+    private StationMoveSegmentExecutor segmentExecutor;
     private int deviceLogCollectTime = 200;
     private boolean initStatus = false;
     private long deviceDataLogTime = System.currentTimeMillis();
     private ExecutorService executor = Executors.newFixedThreadPool(9999);
+    private final RecentStationArrivalTracker recentArrivalTracker;
 
     public ZyStationV4Thread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
         this.redisUtil = redisUtil;
+        this.recentArrivalTracker = new RecentStationArrivalTracker(redisUtil);
+        this.segmentExecutor = new StationMoveSegmentExecutor(deviceConfig, redisUtil, this::sendCommand);
     }
 
     @Override
@@ -92,7 +100,7 @@
                     }
                     if (step == 2) {
                         StationCommand cmd = (StationCommand) task.getData();
-                        executor.submit(() -> executeMoveWithSeg(cmd));
+                        executor.submit(() -> segmentExecutor.execute(cmd));
                     }
                     Thread.sleep(100);
                 } catch (Exception e) {
@@ -134,6 +142,7 @@
         }
 
         List<ZyStationStatusEntity> zyStationStatusEntities = zyStationConnectDriver.getStatus();
+        LinkedHashSet<Integer> taskNoSet = new LinkedHashSet<>();
         for (ZyStationStatusEntity statusEntity : zyStationStatusEntities) {
             for (StationProtocol stationProtocol : statusList) {
                 if (stationProtocol.getStationId().equals(statusEntity.getStationId())) {
@@ -153,6 +162,19 @@
                     stationProtocol.setEnableIn(statusEntity.isEnableIn());
                     stationProtocol.setWeight(statusEntity.getWeight());
                     stationProtocol.setTaskWriteIdx(statusEntity.getTaskWriteIdx());
+                    stationProtocol.setTaskBufferItems(statusEntity.getTaskBufferItems());
+                    if (statusEntity.getTaskNo() != null && statusEntity.getTaskNo() > 0) {
+                        taskNoSet.add(statusEntity.getTaskNo());
+                    }
+                    if (statusEntity.getTaskBufferItems() != null) {
+                        statusEntity.getTaskBufferItems().forEach(item -> {
+                            Integer bufferTaskNo = item == null ? null : item.getTaskNo();
+                            if (bufferTaskNo != null && bufferTaskNo > 0) {
+                                taskNoSet.add(bufferTaskNo);
+                            }
+                        });
+                    }
+                    recentArrivalTracker.observe(statusEntity.getStationId(), statusEntity.getTaskNo(), statusEntity.isLoading());
                 }
 
                 if (!Cools.isEmpty(stationProtocol.getSystemWarning())) {
@@ -164,8 +186,10 @@
                 }
             }
         }
+        taskNoList = new ArrayList<>(taskNoSet);
 
         OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
+        StationErrLogSupport.sync(deviceConfig, redisUtil, statusList);
 
         if (System.currentTimeMillis() - deviceDataLogTime > deviceLogCollectTime) {
             DeviceDataLog deviceDataLog = new DeviceDataLog();
@@ -210,6 +234,16 @@
             map.put(stationProtocol.getStationId(), stationProtocol);
         }
         return map;
+    }
+
+    @Override
+    public List<Integer> getAllTaskNoList() {
+        return taskNoList;
+    }
+
+    @Override
+    public boolean hasRecentArrival(Integer stationId, Integer taskNo) {
+        return recentArrivalTracker.hasRecentArrival(stationId, taskNo);
     }
 
     @Override
@@ -271,6 +305,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) {
@@ -293,12 +330,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;
     }
@@ -321,7 +356,7 @@
         if (navigateUtils == null) {
             return new ArrayList<>();
         }
-        return navigateUtils.calcByStationId(startStationId, targetStationId, taskNo, pathLenFactor);
+        return navigateUtils.calcOptimalPathByStationId(startStationId, targetStationId, taskNo, pathLenFactor);
     }
 
     private void executeMoveWithSeg(StationCommand original) {
@@ -558,4 +593,9 @@
         } catch (Exception ignore) {
         }
     }
+
+    @Override
+    public boolean clearPath(Integer taskNo) {
+        return false;
+    }
 }

--
Gitblit v1.9.1