From ce511a3d55e5f349b1647172e562c1659bbc8172 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期五, 09 一月 2026 15:27:27 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/thread/fake/FakeNyShuttleThread.java |  262 ++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 200 insertions(+), 62 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/fake/FakeNyShuttleThread.java b/src/main/java/com/zy/core/thread/fake/FakeNyShuttleThread.java
index 8362d60..f93f317 100644
--- a/src/main/java/com/zy/core/thread/fake/FakeNyShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/fake/FakeNyShuttleThread.java
@@ -6,10 +6,12 @@
 import com.zy.common.SpringUtils;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
-import com.zy.core.ThreadHandler;
 import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.SlaveType;
+import com.zy.core.model.param.UpdateFakeThreadStatusParam;
 import com.zy.core.properties.DeviceConfig;
+import com.zy.core.thread.FakeThread;
 import com.zy.core.thread.impl.NyShuttleThread;
 import com.zy.core.utils.FakeDeviceUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -17,19 +19,19 @@
 import java.io.*;
 import java.net.ServerSocket;
 import java.net.Socket;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
 @SuppressWarnings("all")
-public class FakeNyShuttleThread implements ThreadHandler {
+public class FakeNyShuttleThread implements FakeThread {
 
     private RedisUtil redisUtil;
     private JSONObject fakeStatusDemo = JSONObject.parseObject("{\"mode\":1,\"extend\":{\"countQuantity\":400,\"suspendState\":0,\"minCellVoltage\":3279,\"chargeCycleTimes\":0,\"maxCellVoltage\":3281,\"surplusQuantity\":204,\"voltage\":5248},\"hasLift\":false,\"hasPallet\":false,\"batteryVoltage\":5248,\"runDirection\":\"2\",\"currentCode\":\"{\\\"x\\\":19,\\\"y\\\":11,\\\"z\\\":2}\",\"errorCode\":\"0\",\"hasCharge\":false,\"batteryPower\":\"51\",\"speed\":0,\"deviceStatus\":1}");
     private ServerSocket serverSocket;
     private Integer gatewayPort;
+    private boolean enableFake;
+    private boolean enableFakeDeviceThread;
     private ConcurrentHashMap<String, Thread> fakeThreadMap = new ConcurrentHashMap();
     private ConcurrentHashMap<String, Socket> fakeServerMap = new ConcurrentHashMap();
     private ConcurrentHashMap<String, JSONObject> fakeStatusMap = new ConcurrentHashMap();
@@ -37,28 +39,42 @@
 
     private boolean fake = false;
 
-    public FakeNyShuttleThread(RedisUtil redisUtil, Integer gatewayPort) {
+    public FakeNyShuttleThread(RedisUtil redisUtil, Integer gatewayPort, boolean enableFake, boolean enableFakeDeviceThread) {
         this.redisUtil = redisUtil;
         this.gatewayPort = gatewayPort;
+        this.enableFake = enableFake;
+        this.enableFakeDeviceThread = enableFakeDeviceThread;
     }
 
     @Override
     public void run() {
         News.info("Fake Server is Started");
 
+        FakeDeviceUtils fakeDeviceUtils = null;
+        while (true) {
+            try {
+                fakeDeviceUtils = SpringUtils.getBean(FakeDeviceUtils.class);
+            }catch (Exception e){}
+
+            if(fakeDeviceUtils == null){
+                continue;
+            }
+
+            break;
+        }
+
         acceptorThread();
         fakeCommandThread();
 
-        while (true) {
-            try {
-                initFakeDeviceServer();
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-        }
+        initDeviceThread(fakeDeviceUtils);
+        initFakeDeviceServer(fakeDeviceUtils);
     }
 
     private void acceptorThread() {
+        if(!enableFake){
+            return;
+        }
+
         Thread acceptorThread = new Thread(() -> {
             log.info("{}:acceptorThread is start");
             try {
@@ -95,7 +111,13 @@
                     }
 
 //                    log.info("acceptorThread is end:{}", sb.toString());
-                    JSONObject result = JSON.parseObject(sb.toString());
+                    JSONObject result = null;
+                    try {
+                        result = JSON.parseObject(sb.toString());
+                    }catch (Exception e) {
+                        log.error("error body:{}", sb.toString());
+                        e.printStackTrace();
+                    }
                     if(result == null){
                         continue;
                     }
@@ -134,6 +156,10 @@
     }
 
     private void fakeCommandThread() {
+        if(!enableFake){
+            return;
+        }
+
         Thread fakeCommandThread = new Thread(() -> {
             while (true) {
                 try {
@@ -146,7 +172,11 @@
                     }
                     List<DeviceConfig> deviceConfigs = fakeDeviceUtils.getFakeDeviceConfig();
                     for (DeviceConfig device : deviceConfigs) {
-                        excuteFakeCommand(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo());
+                        if (!device.getDeviceType().equals(String.valueOf(SlaveType.Shuttle))) {
+                            continue;
+                        }
+
+                        excuteFakeCommand(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo(), device);
                     }
                 }catch (Exception e){
                     e.printStackTrace();
@@ -156,14 +186,11 @@
         fakeCommandThread.start();
     }
 
-    private synchronized void initFakeDeviceServer() {
-        FakeDeviceUtils fakeDeviceUtils = null;
-        try {
-            fakeDeviceUtils = SpringUtils.getBean(FakeDeviceUtils.class);
-        }catch (Exception e){}
-        if(fakeDeviceUtils == null){
+    private synchronized void initFakeDeviceServer(FakeDeviceUtils fakeDeviceUtils) {
+        if(!enableFake){
             return;
         }
+
         List<DeviceConfig> deviceConfigs = fakeDeviceUtils.getFakeDeviceConfig();
         for (DeviceConfig device : deviceConfigs) {
             if (!device.getDeviceType().equals(String.valueOf(SlaveType.Shuttle))) {
@@ -194,15 +221,38 @@
             });
             fakeThread.start();
             fakeThreadMap.put(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo(), fakeThread);
-
-            // init
-            ThreadHandler thread = new NyShuttleThread(device, redisUtil);;
-            new Thread(thread).start();
-            SlaveConnection.put(SlaveType.Shuttle, device.getDeviceNo(), thread);
         }
     }
 
-    private void excuteFakeCommand(String key) {
+    private void initDeviceThread(FakeDeviceUtils fakeDeviceUtils) {
+        if (!enableFakeDeviceThread) {
+            return;
+        }
+        List<DeviceConfig> deviceConfigs = fakeDeviceUtils.getFakeDeviceConfig();
+        for (DeviceConfig device : deviceConfigs) {
+            if (!device.getDeviceType().equals(String.valueOf(SlaveType.Shuttle))) {
+                continue;
+            }
+
+            if (!device.getThreadImpl().equals("NyShuttleThread")) {
+                continue;
+            }
+
+            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
+            if (shuttleThread == null) {
+                // init
+                NyShuttleThread thread = new NyShuttleThread(device, redisUtil);;
+                new Thread(thread).start();
+                SlaveConnection.put(SlaveType.Shuttle, device.getDeviceNo(), thread);
+            }
+
+            try {
+                Thread.sleep(1000);
+            }catch (Exception e){}
+        }
+    }
+
+    private void excuteFakeCommand(String key, DeviceConfig deviceConfig) {
         if (!fakeCommandMap.containsKey(key)) {
             return;
         }
@@ -210,6 +260,7 @@
         fakeCommandMap.remove(key);
         new Thread(() -> {
             try {
+                log.info("Fake Shuttle Command Running: {}", JSON.toJSONString(command));
                 JSONObject fakeStatus = fakeStatusMap.get(key);
                 String commandType = command.getString("commandType");
                 if (commandType == null) {
@@ -220,56 +271,84 @@
                     fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
                     fakeStatusMap.put(key, fakeStatus);
 
-                    //delay
-                    Thread.sleep(2000);
+                    long startTime = System.currentTimeMillis();
+                    while (true) {
+                        if((System.currentTimeMillis() - startTime) < 1000 * 2) {
+                            continue;
+                        }
+                        break;
+                    }
                     fakeStatus.put("hasLift", true);
                     fakeStatus.put("deviceStatus", 1);//璁惧绌洪棽
                     fakeStatusMap.put(key, fakeStatus);
-                }else if (commandType.equals("liftDown")) {
+                } else if (commandType.equals("liftDown")) {
                     fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
                     fakeStatusMap.put(key, fakeStatus);
 
-                    //delay
-                    Thread.sleep(2000);
+                    long startTime = System.currentTimeMillis();
+                    while (true) {
+                        if((System.currentTimeMillis() - startTime) < 1000 * 2) {
+                            continue;
+                        }
+                        break;
+                    }
                     fakeStatus.put("hasLift", false);
                     fakeStatus.put("deviceStatus", 1);//璁惧绌洪棽
                     fakeStatusMap.put(key, fakeStatus);
-                }else if (commandType.equals("charge")) {
+                } else if (commandType.equals("charge")) {
                     fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
                     fakeStatusMap.put(key, fakeStatus);
 
-                    //delay
-                    Thread.sleep(2000);
+                    long startTime = System.currentTimeMillis();
+                    while (true) {
+                        if((System.currentTimeMillis() - startTime) < 1000 * 2) {
+                            continue;
+                        }
+                        break;
+                    }
                     fakeStatus.put("hasCharge", true);
 
                     Integer batteryPower = Integer.parseInt(fakeStatus.getString("batteryPower"));
                     while (true) {
-                        Thread.sleep(10000);
+                        if((System.currentTimeMillis() - startTime) < 1000 * 10) {
+                            continue;
+                        }
                         batteryPower = batteryPower + 1;
                         fakeStatus.put("batteryPower", batteryPower);
                         fakeStatusMap.put(key, fakeStatus);
-                        if(batteryPower >= 100) {
+                        startTime = System.currentTimeMillis();
+                        if (batteryPower >= 100) {
                             break;
                         }
                     }
 
                     fakeStatus.put("deviceStatus", 1);//璁惧绌洪棽
                     fakeStatusMap.put(key, fakeStatus);
-                }else if (commandType.equals("stopCharge")) {
+                } else if (commandType.equals("stopCharge")) {
                     fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
                     fakeStatusMap.put(key, fakeStatus);
 
-                    //delay
-                    Thread.sleep(2000);
+                    long startTime = System.currentTimeMillis();
+                    while (true) {
+                        if((System.currentTimeMillis() - startTime) < 1000 * 2) {
+                            continue;
+                        }
+                        break;
+                    }
                     fakeStatus.put("hasCharge", false);
                     fakeStatus.put("deviceStatus", 1);//璁惧绌洪棽
                     fakeStatusMap.put(key, fakeStatus);
-                }else if (commandType.equals("updateFloor")) {
+                } else if (commandType.equals("updateFloor")) {
                     fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
                     fakeStatusMap.put(key, fakeStatus);
 
-                    //delay
-                    Thread.sleep(2000);
+                    long startTime = System.currentTimeMillis();
+                    while (true) {
+                        if((System.currentTimeMillis() - startTime) < 1000 * 2) {
+                            continue;
+                        }
+                        break;
+                    }
 
                     JSONObject body = command.getJSONObject("commandBody");
                     String currentCode = fakeStatus.getString("currentCode");
@@ -278,15 +357,50 @@
                     fakeStatus.put("currentCode", JSON.toJSONString(point));
                     fakeStatus.put("deviceStatus", 1);//璁惧绌洪棽
                     fakeStatusMap.put(key, fakeStatus);
-                }else if (commandType.equals("move")) {
-                    fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
-                    fakeStatusMap.put(key, fakeStatus);
-                    Thread.sleep(2000);
+                } else if (commandType.equals("move") || commandType.equals("intoLift") || commandType.equals("outLift")) {
+                    String baseCommandKey = RedisKeyType.FAKE_SHUTTLE_MOVE_EXECUTE_COMMAND_LIST.key + deviceConfig.getDeviceNo() + "_";
+                    while (true) {
+                        Set<String> keys = redisUtil.searchKeys(baseCommandKey);
+                        if (keys.isEmpty()) {
+                            break;
+                        }
+                    }
+
+                    String finalKey = baseCommandKey + System.currentTimeMillis();
+                    redisUtil.set(finalKey, true, 60 * 2);
 
                     JSONObject body = command.getJSONObject("commandBody");
+                    String requestType = body.getString("requestType");
                     String pathList = body.getString("path");
-                    List<JSONObject> list = JSON.parseArray(pathList, JSONObject.class);
-                    for (JSONObject path : list) {
+                    List<JSONObject> executePathList = JSON.parseArray(pathList, JSONObject.class);
+
+                    fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
+                    fakeStatusMap.put(key, fakeStatus);
+                    long startTime = System.currentTimeMillis();
+                    while (true) {
+                        if((System.currentTimeMillis() - startTime) < 1000 * 2) {
+                            continue;
+                        }
+                        break;
+                    }
+
+                    for (JSONObject path : executePathList) {
+                        while (true) {
+                            JSONObject realFakeStatus = fakeStatusMap.get(key);
+                            Integer errorCode = realFakeStatus.getInteger("errorCode");
+                            if (errorCode > 0) {
+                                continue;
+                            }
+                            break;
+                        }
+
+                        while (true) {
+                            if((System.currentTimeMillis() - startTime) < 1000 * 1) {
+                                continue;
+                            }
+                            break;
+                        }
+
                         String currentCode = fakeStatus.getString("currentCode");
                         JSONObject point = JSON.parseObject(currentCode);
                         point.put("x", path.getInteger("xp"));
@@ -295,23 +409,24 @@
                         fakeStatus.put("currentCode", JSON.toJSONString(point));
                         fakeStatus.put("deviceStatus", 0);//璁惧蹇欑
                         fakeStatusMap.put(key, fakeStatus);
-                        Thread.sleep(2000);
+                        startTime = System.currentTimeMillis();
                     }
 
                     fakeStatus.put("deviceStatus", 1);//璁惧绌洪棽
                     fakeStatusMap.put(key, fakeStatus);
+                    redisUtil.del(finalKey);
                 }
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }).start();
     }
 
     private void handleClient(DeviceConfig device) throws IOException {
+        StringBuffer sb = new StringBuffer();
         try {
             Socket socket = fakeServerMap.get(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo());
             if (socket == null) {
-                removeFake(device);
                 return;
             }
             InputStream inputStream = socket.getInputStream();
@@ -323,13 +438,14 @@
             // 鑾峰彇杈撳叆娴�
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
             // 璇诲彇鏈嶅姟鍣ㄧ殑鍝嶅簲
-            StringBuffer sb = new StringBuffer();
             char[] chars = new char[2048];//缂撳啿鍖�
             while (true) {
                 reader.read(chars);
                 String trim = new String(chars);
-                sb.append(trim);
-                if (trim.lastIndexOf("\r\n") != -1) {
+                int lastIndexOf = trim.lastIndexOf("\r\n");
+                if (lastIndexOf != -1) {
+                    trim = trim.substring(0, lastIndexOf);
+                    sb.append(trim);
                     break;
                 }
             }
@@ -338,17 +454,12 @@
 //            log.info("鏀跺埌Client Data: {}", JSON.toJSONString(result));
             processCommand(result, device);
         } catch (Exception e) {
+            log.error("handleClient deviceNo:{},recevie:{}", device.getDeviceNo(), sb);
             e.printStackTrace();
         }
     }
 
     private void removeFake(DeviceConfig device) {
-        Thread thread = fakeThreadMap.get(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo());
-        if (thread != null) {
-            thread.interrupt();
-        }
-
-        fakeThreadMap.remove(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo());
         fakeServerMap.remove(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo());
         fakeStatusMap.remove(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo());
         fakeCommandMap.remove(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo());
@@ -386,7 +497,7 @@
         } else if (requestType.equals("updateFloor")) {
             fakeCommandMap.put(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo(), fakeCommand);
             response = genereateFakeCommandResponse(requestId, taskId, requestType);
-        } else if (requestType.equals("move")) {
+        } else if (requestType.equals("move") || requestType.equals("intoLift") || requestType.equals("outLift")) {
             fakeCommandMap.put(String.valueOf(SlaveType.Shuttle) + device.getDeviceNo(), fakeCommand);
             response = genereateFakeCommandResponse(requestId, taskId, requestType);
         } else if (requestType.equals("readState")) {
@@ -475,4 +586,31 @@
 
     }
 
+    @Override
+    public ConcurrentHashMap<String, Thread> getFakeThreadMap() {
+        return this.fakeThreadMap;
+    }
+
+    @Override
+    public ConcurrentHashMap<String, JSONObject> getFakeStatusMap() {
+        return this.fakeStatusMap;
+    }
+
+    @Override
+    public ConcurrentHashMap<String, JSONObject> getFakeCommandMap() {
+        return this.fakeCommandMap;
+    }
+
+    @Override
+    public boolean updateFakeStatus(UpdateFakeThreadStatusParam param) {
+        String key = param.getDeviceType() + param.getDeviceNo();
+        JSONObject result = fakeStatusMap.get(key);
+        if (result == null) {
+            return false;
+        }
+
+        JSONObject newData = JSON.parseObject(param.getData());
+        this.fakeStatusMap.put(key, newData);
+        return true;
+    }
 }

--
Gitblit v1.9.1