From da77cc0503552bb7644353c98f280e4f6bf533f2 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期六, 07 三月 2026 09:48:16 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/network/ZyStationConnectDriver.java |  114 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 88 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
index 78be50b..2bc600c 100644
--- a/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
+++ b/src/main/java/com/zy/core/network/ZyStationConnectDriver.java
@@ -3,6 +3,7 @@
 import com.zy.asrs.entity.DeviceConfig;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.ThreadHandler;
+import com.zy.core.enums.RedisKeyType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.network.api.ZyStationConnectApi;
@@ -10,9 +11,12 @@
 import java.util.List;
 import com.zy.core.network.fake.ZyStationFakeConnect;
 import com.zy.core.network.fake.ZyStationFakeSegConnect;
+import com.zy.core.network.fake.ZyStationV4FakeSegConnect;
 import com.zy.core.network.real.ZyStationRealConnect;
 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;
@@ -26,13 +30,16 @@
 
     private static final ZyStationFakeConnect zyStationFakeConnect = new ZyStationFakeConnect();
     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;
@@ -46,25 +53,50 @@
 
     @Override
     public boolean connect() {
-        if (deviceConfig.getFake() == 0) {
-            if ("ZyStationV3Thread".equals(deviceConfig.getThreadImpl())) {
-                zyStationConnectApi = new ZyStationV3RealConnect(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 {
-                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
@@ -74,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() {
@@ -107,21 +141,49 @@
     }
 
     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) {
-        return zyStationConnectApi.sendCommand(deviceConfig.getDeviceNo(), 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) {
+                try {
+                    Thread.sleep(500);
+                }catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }else {
+                redisUtil.set(RedisKeyType.STATION_EXECUTE_COMMAND_LOCK.key, "lock", 60 * 5);
+                break;
+            }
+        }
+        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);
     }
 }

--
Gitblit v1.9.1