From d2dbfe9ac555029ac6332703912ac7b753304aaf Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 06 三月 2026 15:52:01 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java   |   28 ++++++---
 src/main/java/com/zy/core/network/ZyStationConnectDriver.java      |  100 +++++++++++++++++++++++----------
 src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java       |   10 ++-
 src/main/java/com/zy/common/service/CommonService.java             |    4 
 src/main/java/com/zy/core/network/real/ZyStationV4RealConnect.java |    1 
 src/main/resources/application.yml                                 |    2 
 6 files changed, 98 insertions(+), 47 deletions(-)

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index 43408b8..54be1d4 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -446,7 +446,7 @@
         for (StationObjModel stationObjModel : stationList) {
             try {
                 List<NavigateNode> navigateNodes = navigateUtils.calcByStationId(sourceStationId, stationObjModel.getStationId());
-                if(navigateNodes != null) {
+                if(!navigateNodes.isEmpty()) {
                     targetStationId = stationObjModel.getStationId();
                     break;
                 }
@@ -478,7 +478,7 @@
         for (StationObjModel stationObjModel : stationList) {
             try {
                 List<NavigateNode> navigateNodes = navigateUtils.calcByStationId(stationObjModel.getStationId(), targetStationId);
-                if(navigateNodes != null) {
+                if(!navigateNodes.isEmpty()) {
                     finalSourceStationId = stationObjModel.getStationId();
                     break;
                 }
diff --git a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
index 62b1b93..2bc600c 100644
--- a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
+++ b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
@@ -16,6 +16,7 @@
 import com.zy.core.network.real.ZyStationV3RealConnect;
 import com.zy.core.network.real.ZyStationV4RealConnect;
 import lombok.extern.slf4j.Slf4j;
+import java.util.Collections;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
@@ -31,12 +32,14 @@
     private static final ZyStationFakeSegConnect zyStationFakeSegConnect = new ZyStationFakeSegConnect();
     private static final ZyStationV4FakeSegConnect zyStationV4FakeSegConnect = new ZyStationV4FakeSegConnect();
 
-    private boolean connected = false;
+    private volatile boolean connected = false;
+    private volatile boolean connecting = false;
     private DeviceConfig deviceConfig;
     private RedisUtil redisUtil;
-    private ZyStationConnectApi zyStationConnectApi;
+    private volatile ZyStationConnectApi zyStationConnectApi;
     private volatile boolean closed = false;
     private ScheduledExecutorService executor;
+    private final Object connectLock = new Object();
 
     public ZyStationConnectDriver(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
@@ -50,30 +53,50 @@
 
     @Override
     public boolean connect() {
-        if (deviceConfig.getFake() == 0) {
-            if ("ZyStationV3Thread".equals(deviceConfig.getThreadImpl())) {
-                zyStationConnectApi = new ZyStationV3RealConnect(deviceConfig, redisUtil);
-            } else if ("ZyStationV4Thread".equals(deviceConfig.getThreadImpl())) {
-                zyStationConnectApi = new ZyStationV4RealConnect(deviceConfig, redisUtil);
-            } else {
-                zyStationConnectApi = new ZyStationRealConnect(deviceConfig, redisUtil);
+        synchronized (connectLock) {
+            if (closed) {
+                return false;
             }
-        } else {
-            if ("ZyStationV3Thread".equals(deviceConfig.getThreadImpl())) {
-                zyStationFakeSegConnect.addFakeConnect(deviceConfig, redisUtil);
-                zyStationConnectApi = zyStationFakeSegConnect;
-            } else if ("ZyStationV4Thread".equals(deviceConfig.getThreadImpl())) {
-                zyStationV4FakeSegConnect.addFakeConnect(deviceConfig, redisUtil);
-                zyStationConnectApi = zyStationV4FakeSegConnect;
-            } else {
-                zyStationFakeConnect.addFakeConnect(deviceConfig, redisUtil);
-                zyStationConnectApi = zyStationFakeConnect;
+            if (connected && zyStationConnectApi != null) {
+                return true;
+            }
+
+            connecting = true;
+            try {
+                ZyStationConnectApi connectApi;
+                if (deviceConfig.getFake() == 0) {
+                    if ("ZyStationV3Thread".equals(deviceConfig.getThreadImpl())) {
+                        connectApi = new ZyStationV3RealConnect(deviceConfig, redisUtil);
+                    } else if ("ZyStationV4Thread".equals(deviceConfig.getThreadImpl())) {
+                        connectApi = new ZyStationV4RealConnect(deviceConfig, redisUtil);
+                    } else {
+                        connectApi = new ZyStationRealConnect(deviceConfig, redisUtil);
+                    }
+                } else {
+                    if ("ZyStationV3Thread".equals(deviceConfig.getThreadImpl())) {
+                        zyStationFakeSegConnect.addFakeConnect(deviceConfig, redisUtil);
+                        connectApi = zyStationFakeSegConnect;
+                    } else if ("ZyStationV4Thread".equals(deviceConfig.getThreadImpl())) {
+                        zyStationV4FakeSegConnect.addFakeConnect(deviceConfig, redisUtil);
+                        connectApi = zyStationV4FakeSegConnect;
+                    } else {
+                        zyStationFakeConnect.addFakeConnect(deviceConfig, redisUtil);
+                        connectApi = zyStationFakeConnect;
+                    }
+                }
+
+                boolean connect = connectApi.connect();
+                connected = connect;
+                if (connect) {
+                    zyStationConnectApi = connectApi;
+                } else {
+                    zyStationConnectApi = null;
+                }
+                return connect;
+            } finally {
+                connecting = false;
             }
         }
-
-        boolean connect = zyStationConnectApi.connect();
-        connected = connect;
-        return connect;
     }
 
     @Override
@@ -83,11 +106,13 @@
         if (ex != null) {
             try { ex.shutdownNow(); } catch (Exception ignore) {}
         }
-        if (zyStationConnectApi != null) {
-            zyStationConnectApi.disconnect();
+        ZyStationConnectApi connectApi = zyStationConnectApi;
+        if (connectApi != null) {
+            connectApi.disconnect();
             zyStationConnectApi = null;
         }
         connected = false;
+        connecting = false;
     }
 
     public void start() {
@@ -116,13 +141,18 @@
     }
 
     public List<ZyStationStatusEntity> getStatus() {
-        if (zyStationConnectApi == null) {
-            return null;
+        ZyStationConnectApi connectApi = zyStationConnectApi;
+        if (!connected || connecting || connectApi == null) {
+            return Collections.emptyList();
         }
-        return zyStationConnectApi.getStatus(deviceConfig.getDeviceNo());
+        return connectApi.getStatus(deviceConfig.getDeviceNo());
     }
 
     public CommandResponse sendCommand(StationCommand command) {
+        ZyStationConnectApi connectApi = zyStationConnectApi;
+        if (!connected || connecting || connectApi == null) {
+            return new CommandResponse(false, "璁惧鏈繛鎺ワ紝鍛戒护涓嬪彂澶辫触");
+        }
         while (true) {
             Object lock = redisUtil.get(RedisKeyType.STATION_EXECUTE_COMMAND_LOCK.key);
             if(lock != null) {
@@ -136,16 +166,24 @@
                 break;
             }
         }
-        CommandResponse commandResponse = zyStationConnectApi.sendCommand(deviceConfig.getDeviceNo(), command);
+        CommandResponse commandResponse = connectApi.sendCommand(deviceConfig.getDeviceNo(), command);
         redisUtil.del(RedisKeyType.STATION_EXECUTE_COMMAND_LOCK.key);
         return commandResponse;
     }
 
     public CommandResponse sendOriginCommand(String address, short[] data) {
-        return zyStationConnectApi.sendOriginCommand(address, data);
+        ZyStationConnectApi connectApi = zyStationConnectApi;
+        if (!connected || connecting || connectApi == null) {
+            return new CommandResponse(false, "璁惧鏈繛鎺ワ紝鍘熷鍛戒护涓嬪彂澶辫触");
+        }
+        return connectApi.sendOriginCommand(address, data);
     }
 
     public byte[] readOriginCommand(String address, int length) {
-        return zyStationConnectApi.readOriginCommand(address, length);
+        ZyStationConnectApi connectApi = zyStationConnectApi;
+        if (!connected || connecting || connectApi == null) {
+            return new byte[0];
+        }
+        return connectApi.readOriginCommand(address, length);
     }
 }
diff --git a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
index c5ac97e..6233e0c 100644
--- a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
@@ -230,14 +230,14 @@
         Integer stationId = command.getStationId();
         Integer targetStationId = command.getTargetStaNo();
 
-        List<NavigateNode> navigateNodes = null;
+        List<NavigateNode> navigateNodes = new ArrayList<>();
         try {
             navigateNodes = navigateUtils.calcByStationId(stationId, targetStationId);
         } catch (Exception e) {
             e.printStackTrace();
         }
 
-        if (navigateNodes == null) {
+        if (navigateNodes.isEmpty()) {
             return;
         }
 
@@ -258,8 +258,8 @@
         Integer stationId = command.getStationId();
         Integer targetStationId = command.getTargetStaNo();
 
-        List<NavigateNode> navigateNodes = null;
-        List<NavigateNode> targetNavigateNodes = null;
+        List<NavigateNode> navigateNodes = new ArrayList<>();
+        List<NavigateNode> targetNavigateNodes = new ArrayList<>();
 
         try {
             BasStation startStation = basStationService.selectById(stationId);
@@ -308,14 +308,22 @@
                     continue;
                 }
 
-                navigateNodes = navigateUtils.calcByStationId(stationId, liftStationId);
-                if(navigateNodes == null){
+                try {
+                    navigateNodes = navigateUtils.calcByStationId(stationId, liftStationId);
+                } catch (Exception e) {
+
+                }
+                if(navigateNodes.isEmpty()){
                     continue;
                 }
 
-                //璁$畻鎻愬崌鏈哄埌鐩爣绔欑殑璺緞
-                targetNavigateNodes = navigateUtils.calcByStationId(targetLiftStationId, targetStationId);
-                if(targetNavigateNodes == null) {
+                try {
+                    //璁$畻鎻愬崌鏈哄埌鐩爣绔欑殑璺緞
+                    targetNavigateNodes = navigateUtils.calcByStationId(targetLiftStationId, targetStationId);
+                } catch (Exception e) {
+
+                }
+                if(targetNavigateNodes.isEmpty()) {
                     continue;
                 }
             }
@@ -323,7 +331,7 @@
             e.printStackTrace();
         }
 
-        if (navigateNodes == null || targetNavigateNodes == null) {
+        if (navigateNodes.isEmpty() || targetNavigateNodes.isEmpty()) {
             return;
         }
 
diff --git a/src/main/java/com/zy/core/network/real/ZyStationV4RealConnect.java b/src/main/java/com/zy/core/network/real/ZyStationV4RealConnect.java
index 971f8e6..d65f7e4 100644
--- a/src/main/java/com/zy/core/network/real/ZyStationV4RealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyStationV4RealConnect.java
@@ -116,6 +116,7 @@
 
                 boolean[] status2 = siemensNet.getByteTransform().TransBool(result.Content, i * 10 + 7, 1);
                 statusEntity.setEnableIn(status2[1]);//鍚姩鍏ュ簱
+                statusEntity.setRunBlock(status2[2]);//閲嶆柊瑙勫垝璺嚎
 
                 Integer palletHeight = null;
                 if (status[7]) {
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 245446b..f833e51 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java
@@ -47,6 +47,7 @@
     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);
 
@@ -64,14 +65,16 @@
         Thread readThread = new Thread(() -> {
             while (true) {
                 try {
-                    deviceLogCollectTime = Utils.getDeviceLogCollectTime();
+                    if (initStatus) {
+                        deviceLogCollectTime = Utils.getDeviceLogCollectTime();
+                    }
                     readStatus();
                     Thread.sleep(100);
                 } catch (Exception e) {
                     log.error("StationV4Thread Fail", e);
                 }
             }
-        });
+        }, "DevpRead-" + deviceConfig.getDeviceNo());
         readThread.start();
 
         Thread processThread = new Thread(() -> {
@@ -91,7 +94,7 @@
                     log.error("StationV4Process Fail", e);
                 }
             }
-        });
+        }, "DevpProcess-" + deviceConfig.getDeviceNo());
         processThread.start();
     }
 
@@ -122,6 +125,7 @@
                 stationProtocol.setStationId(entity.getStationId());
                 statusList.add(stationProtocol);
             }
+            initStatus = true;
         }
 
         List<ZyStationStatusEntity> zyStationStatusEntities = zyStationConnectDriver.getStatus();
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 1c25968..6e76f8b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,6 +1,6 @@
 # 绯荤粺鐗堟湰淇℃伅
 app:
-  version: 1.0.4.6
+  version: 1.0.4.7
   version-type: dev  # prd 鎴� dev
 
 server:

--
Gitblit v1.9.1