From 7a546480f6ddfaee1366f280981a002a08412c11 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期三, 17 十二月 2025 15:11:07 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java |  476 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 413 insertions(+), 63 deletions(-)

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 2425a7f..3df812f 100644
--- a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
@@ -6,30 +6,37 @@
 import com.zy.asrs.entity.DeviceConfig;
 import com.zy.common.model.NavigateNode;
 import com.zy.common.utils.NavigateUtils;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
+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;
 import com.zy.core.network.entity.ZyStationStatusEntity;
 
-import java.util.ArrayList;
 import java.util.List;
 
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.function.Supplier;
 
 /**
  * 杈撻�佺珯鍋囪繛鎺ワ紙妯℃嫙锛�
  */
 public class ZyStationFakeConnect implements ZyStationConnectApi {
 
-    private List<ZyStationStatusEntity> statusList = new ArrayList<>();
+    private final List<ZyStationStatusEntity> statusList = new CopyOnWriteArrayList<>();
+    private static int LOCK_STATION = 0;
     private final DeviceConfig deviceConfig;
+    private RedisUtil redisUtil;
     // 鍏佽骞惰鎵ц澶氫釜鍛戒护浠诲姟锛堝浐瀹氱嚎绋嬫睜锛夈�傚闇�鏇撮珮骞跺彂鍙皟鏁村ぇ灏忋��
     private final ExecutorService executor = Executors
-            .newFixedThreadPool(Math.max(2, Runtime.getRuntime().availableProcessors()));
+            .newFixedThreadPool(9999);
 
-    public ZyStationFakeConnect(DeviceConfig deviceConfig) {
+    public ZyStationFakeConnect(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
+        this.redisUtil = redisUtil;
     }
 
     @Override
@@ -46,18 +53,20 @@
     @Override
     public List<ZyStationStatusEntity> getStatus() {
         if (this.statusList.isEmpty()) {
-            this.statusList = JSON.parseArray(deviceConfig.getFakeInitStatus(), ZyStationStatusEntity.class);
-
-            for (ZyStationStatusEntity status : this.statusList) {
-                status.setAutoing(true);// 妯℃嫙鑷姩杩愯
-                status.setLoading(false);// 妯℃嫙鏈夌墿
-                status.setInEnable(true);// 妯℃嫙鍙叆
-                status.setOutEnable(true);// 妯℃嫙鍙嚭
-                status.setEmptyMk(false);// 妯℃嫙绌烘澘淇″彿
-                status.setFullPlt(false);// 妯℃嫙婊℃墭鐩�
-                status.setPalletHeight(0);// 妯℃嫙鎵樼洏楂樺害涓�0
-                status.setError(0);// 妯℃嫙鏃犳姤璀�
-                status.setBarcode("");// 妯℃嫙鏃犳潯鐮�
+            List<ZyStationStatusEntity> init = JSON.parseArray(deviceConfig.getFakeInitStatus(), ZyStationStatusEntity.class);
+            if (init != null) {
+                statusList.addAll(init);
+                for (ZyStationStatusEntity status : this.statusList) {
+                    status.setAutoing(true);// 妯℃嫙鑷姩杩愯
+                    status.setLoading(false);// 妯℃嫙鏈夌墿
+                    status.setInEnable(true);// 妯℃嫙鍙叆
+                    status.setOutEnable(true);// 妯℃嫙鍙嚭
+                    status.setEmptyMk(false);// 妯℃嫙绌烘澘淇″彿
+                    status.setFullPlt(false);// 妯℃嫙婊℃墭鐩�
+                    status.setPalletHeight(0);// 妯℃嫙鎵樼洏楂樺害涓�0
+                    status.setError(0);// 妯℃嫙鏃犳姤璀�
+                    status.setBarcode("");// 妯℃嫙鏃犳潯鐮�
+                }
             }
         }
 
@@ -77,6 +86,85 @@
     }
 
     private void handleCommand(StationCommand command) {
+        News.info("[WCS Debug] 绔欑偣浠跨湡妯℃嫙宸插惎鍔紝鍛戒护鏁版嵁={}", JSON.toJSONString(command));
+        Integer taskNo = command.getTaskNo();
+        Integer stationId = command.getStationId();
+        Integer targetStationId = command.getTargetStaNo();
+        boolean generateBarcode = false;
+
+        if(taskNo == 0 && targetStationId == 0){
+            //娓呯┖绔欑偣
+            resetStation(stationId);
+            return;
+        }
+
+        //浠诲姟鍙峰睘浜庝豢鐪熷叆搴撲换鍔″彿
+        if (checkTaskNoInArea(taskNo)) {
+            //鐢熸垚浠跨湡鏁版嵁
+            generateBarcode = true;
+        }
+
+        if (taskNo == 9998 && targetStationId == 0) {
+            //鐢熸垚鍑哄簱绔欑偣浠跨湡鏁版嵁
+            generateFakeOutStationData(stationId);
+            return;
+        }
+
+        if (taskNo > 0 && taskNo != 9999 && taskNo != 9998 && stationId == targetStationId) {
+            //涓嬪彂浠诲姟鏁版嵁-涓嶅厑璁稿彧鏄笅鍙戞暟鎹�
+            generateStationData(taskNo, stationId, targetStationId);
+        }
+
+        String startLev = String.valueOf(stationId).substring(0, 1);
+        String endLev = String.valueOf(targetStationId).substring(0, 1);
+
+        if (startLev.equals(endLev)) {
+            currentLevCommand(command, generateBarcode);
+        }else {
+            diffLevCommand(command, generateBarcode);
+        }
+    }
+
+    private void generateFakeOutStationData(Integer stationId) {
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        synchronized (status) {
+            status.setLoading(true);
+        }
+    }
+
+    private void generateStationData(Integer taskNo, Integer stationId, Integer targetStationId) {
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        synchronized (status) {
+            status.setTaskNo(taskNo);
+            status.setTargetStaNo(targetStationId);
+        }
+    }
+
+    private void resetStation(Integer stationId) {
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        synchronized (status) {
+            status.setTaskNo(0);
+            status.setLoading(false);
+            status.setBarcode("");
+        }
+    }
+
+    private void currentLevCommand(StationCommand command, boolean generateBarcode) {
         NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
         if (navigateUtils == null) {
             return;
@@ -86,10 +174,12 @@
         Integer stationId = command.getStationId();
         Integer targetStationId = command.getTargetStaNo();
 
+        String startLev = String.valueOf(stationId).substring(0, 1);
+
         List<NavigateNode> navigateNodes = null;
 
         try {
-            navigateNodes = navigateUtils.calcByStationId(stationId, targetStationId);
+            navigateNodes = navigateUtils.calcByStationId(Integer.parseInt(startLev), stationId, targetStationId);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -98,67 +188,150 @@
             return;
         }
 
+        stationMove(navigateNodes, taskNo, targetStationId, false, generateBarcode);
+    }
+
+    private void diffLevCommand(StationCommand command, boolean generateBarcode) {
+        NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
+        if (navigateUtils == null) {
+            return;
+        }
+
+        Integer taskNo = command.getTaskNo();
+        Integer stationId = command.getStationId();
+        Integer targetStationId = command.getTargetStaNo();
+
+        String startLev = String.valueOf(stationId).substring(0, 1);
+        String endLev = String.valueOf(targetStationId).substring(0, 1);
+        
+        List<NavigateNode> navigateNodes = null;
+        List<NavigateNode> targetNavigateNodes = null;
+
+        try {
+            List<NavigateNode> liftStationList = navigateUtils.findLiftStationList(Integer.parseInt(startLev));
+            if(liftStationList.isEmpty()){
+                //鏈壘鍒版彁鍗囨満鑺傜偣
+                return;
+            }
+
+            List<NavigateNode> targetLiftStationList = navigateUtils.findLiftStationList(Integer.parseInt(endLev));
+            if(targetLiftStationList.isEmpty()){
+                //鏈壘鍒版彁鍗囨満鑺傜偣
+                return;
+            }
+            for (NavigateNode liftStation : liftStationList) {
+                JSONObject valuObject = JSON.parseObject(liftStation.getNodeValue());
+                if(valuObject == null){
+                    continue;
+                }
+                Integer liftStationId = valuObject.getInteger("stationId");
+                Integer liftNo = valuObject.getInteger("liftNo");
+
+                Integer targetLiftStationId = null;
+                for (NavigateNode targetLiftStation : targetLiftStationList) {
+                    JSONObject targetValuObject = JSON.parseObject(targetLiftStation.getNodeValue());
+                    if(targetValuObject == null){
+                        continue;
+                    }
+                    Integer targetLiftNo = targetValuObject.getInteger("liftNo");
+                    if(liftNo.equals(targetLiftNo)){
+                        targetLiftStationId = targetValuObject.getInteger("stationId");
+                        break;
+                    }
+                }
+
+                if(targetLiftStationId == null){
+                    continue;
+                }
+
+                navigateNodes = navigateUtils.calcByStationId(Integer.parseInt(startLev), stationId, liftStationId);
+                if(navigateNodes == null){
+                    continue;
+                }
+
+                //璁$畻鎻愬崌鏈哄埌鐩爣绔欑殑璺緞
+                targetNavigateNodes = navigateUtils.calcByStationId(Integer.parseInt(endLev), targetLiftStationId, targetStationId);
+                if(targetNavigateNodes == null) {
+                    continue;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (navigateNodes == null || targetNavigateNodes == null) {
+            return;
+        }
+
+        stationMove(navigateNodes, taskNo, stationId, true, generateBarcode);
+        stationMove(targetNavigateNodes, taskNo, targetStationId, false, generateBarcode);
+    }
+
+    private void stationMove(List<NavigateNode> navigateNodes, Integer taskNo, Integer targetStationId, boolean clearData, boolean generateBarcode) {
         Integer lastStationId = null;
-        for (int i = 0; i < navigateNodes.size(); i++) {
+
+        int i = 0;
+        while (i < navigateNodes.size()) {
             NavigateNode navigateNode = navigateNodes.get(i);
             JSONObject valueObject = JSON.parseObject(navigateNode.getNodeValue());
             Integer currentStationId = valueObject.getInteger("stationId");
-            ZyStationStatusEntity status = statusList.stream()
-                    .filter(item -> item.getStationId().equals(currentStationId)).findFirst().orElse(null);
-            if (status == null) {
-                continue;
-            }
 
+            Integer nextStationId = null;
             try {
-                while (true) {
-                    ZyStationStatusEntity nextStatus = statusList.stream()
-                            .filter(item -> item.getStationId().equals(currentStationId)).findFirst().orElse(null);
-                    if (nextStatus == null) {
-                        continue;
-                    }
-
-                    if (nextStatus.getTaskNo() == 0) {
-                        break;
-                    }
-
-                    sleep(100);
-                }
+                NavigateNode nextNode = navigateNodes.get(i + 1);
+                JSONObject nextValueObject = JSON.parseObject(nextNode.getNodeValue());
+                nextStationId = nextValueObject.getInteger("stationId");
             } catch (Exception e) {
-                continue;
+
             }
 
-            synchronized (status) {
-                status.setTaskNo(taskNo);
-                status.setTargetStaNo(targetStationId);
-                status.setLoading(true);
+            if (nextStationId != null) {
+
             }
 
-            if (lastStationId != null) {
-                Integer finalLastStationId = lastStationId;
-                ZyStationStatusEntity lastStatus = statusList.stream()
-                        .filter(item -> item.getStationId().equals(finalLastStationId)).findFirst().orElse(null);
-                if (lastStatus != null) {
-                    synchronized (lastStatus) {
-                        lastStatus.setTaskNo(0);
-                        lastStatus.setTargetStaNo(0);
-                        lastStatus.setLoading(false);
-                    }
+            if (i == 0) {
+                boolean result = initStationMove(taskNo, currentStationId, taskNo, targetStationId, true, null);
+                if (!result) {
+                    continue;
                 }
+                sleep(1000);
             }
-            lastStationId = currentStationId;
+
+            if(nextStationId != null) {
+                boolean result = stationMoveToNext(taskNo, currentStationId, nextStationId, taskNo, targetStationId);
+                if (!result) {
+                    continue;
+                }
+                lastStationId = currentStationId;
+            }
+
+            i++;
             sleep(1000);
         }
 
-        sleep(10000);
-        if (lastStationId != null) {
-            Integer finalLastStationId = lastStationId;
-            ZyStationStatusEntity lastStatus = statusList.stream()
-                    .filter(item -> item.getStationId().equals(finalLastStationId)).findFirst().orElse(null);
-            if (lastStatus != null) {
-                synchronized (lastStatus) {
-                    lastStatus.setTaskNo(0);
-                    lastStatus.setTargetStaNo(0);
-                    lastStatus.setLoading(false);
+        if (generateBarcode) {
+            if (lastStationId != null) {
+                while (true) {
+                    boolean result = generateStationBarcode(taskNo, targetStationId);
+                    sleep(1000);
+                    if (!result) {
+                        continue;
+                    }
+                    break;
+                }
+            }
+        }
+
+        if (clearData) {
+            sleep(10000);
+            if (lastStationId != null) {
+                while (true) {
+                    boolean result = clearStation(taskNo, targetStationId);
+                    sleep(1000);
+                    if (!result) {
+                        continue;
+                    }
+                    break;
                 }
             }
         }
@@ -171,4 +344,181 @@
             e.printStackTrace();
         }
     }
-}
\ No newline at end of file
+
+    public synchronized boolean setLockStation(Integer uuid) {
+        if (LOCK_STATION == 0) {
+            LOCK_STATION = uuid;
+            return true;
+        }else {
+            if(LOCK_STATION == uuid) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public synchronized boolean releaseLockStation(Integer uuid) {
+        if (LOCK_STATION != uuid) {
+            return false;
+        }
+
+        LOCK_STATION = 0;
+        return true;
+    }
+
+    public synchronized boolean updateStationData(Integer lockTaskNo, Integer stationId, Integer taskNo, Integer targetStaNo, Boolean isLoading, String barcode) {
+        if (LOCK_STATION != lockTaskNo) {
+            return false;
+        }
+
+        ZyStationStatusEntity currentStatus = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+
+        if (currentStatus == null) {
+            return false;
+        }
+
+        if (taskNo != null) {
+            currentStatus.setTaskNo(taskNo);
+        }
+
+        if (targetStaNo != null) {
+            currentStatus.setTargetStaNo(targetStaNo);
+        }
+
+        if (isLoading != null) {
+            currentStatus.setLoading(isLoading);
+        }
+
+        if (barcode != null) {
+            currentStatus.setBarcode(barcode);
+        }
+        return true;
+    }
+
+    public synchronized boolean initStationMove(Integer lockTaskNo, Integer currentStationId, Integer taskNo, Integer targetStationId, Boolean isLoading, String barcode) {
+        boolean executeResult = lockExecute(lockTaskNo, () -> {
+            ZyStationStatusEntity currentStatus = statusList.stream()
+                .filter(item -> item.getStationId().equals(currentStationId)).findFirst().orElse(null);
+
+            if (currentStatus == null) {
+                return false;
+            }
+
+            if(currentStatus.getTaskNo().equals(taskNo)) {
+                return true;
+            }
+
+            if (currentStatus.getTaskNo() > 0 || currentStatus.isLoading()) {
+                return false;
+            }
+
+            boolean result = updateStationData(taskNo, currentStationId, taskNo, targetStationId, isLoading, barcode);
+            if (!result) {
+                return false;
+            }
+            return true;
+        });
+
+        return executeResult;
+    }
+
+    public synchronized boolean stationMoveToNext(Integer lockTaskNo, Integer currentStationId, Integer nextStationId, Integer taskNo, Integer targetStaNo) {
+        boolean executeResult = lockExecute(lockTaskNo, () -> {
+            ZyStationStatusEntity currentStatus = statusList.stream()
+                    .filter(item -> item.getStationId().equals(currentStationId)).findFirst().orElse(null);
+
+            ZyStationStatusEntity nextStatus = statusList.stream()
+                    .filter(item -> item.getStationId().equals(nextStationId)).findFirst().orElse(null);
+
+            if (currentStatus == null || nextStatus == null) {
+                return false;
+            }
+
+            if (nextStatus.getTaskNo() > 0 || nextStatus.isLoading()) {
+                return false;
+            }
+
+            boolean result = updateStationData(lockTaskNo, nextStationId, taskNo, targetStaNo, true, null);
+            if (!result) {
+                return false;
+            }
+
+            boolean result2 = updateStationData(lockTaskNo, currentStationId, 0, 0, false, null);
+            if (!result2) {
+                return false;
+            }
+
+            return true;
+        });
+        return executeResult;
+    }
+
+    public synchronized boolean generateStationBarcode(Integer lockTaskNo, Integer currentStationId) {
+        boolean executeResult = lockExecute(lockTaskNo, () -> {
+            ZyStationStatusEntity currentStatus = statusList.stream()
+                    .filter(item -> item.getStationId().equals(currentStationId)).findFirst().orElse(null);
+
+            if (currentStatus == null) {
+                return false;
+            }
+
+            String barcodeTime = String.valueOf(System.currentTimeMillis());
+            String barcode = barcodeTime.substring(5);
+
+            boolean result = updateStationData(lockTaskNo, currentStationId, null, null, null, barcode);
+            if (!result) {
+                return false;
+            }
+            return true;
+        });
+
+        return executeResult;
+    }
+
+    public synchronized boolean clearStation(Integer lockTaskNo, Integer currentStationId) {
+        boolean executeResult = lockExecute(lockTaskNo, () -> {
+            ZyStationStatusEntity currentStatus = statusList.stream()
+                    .filter(item -> item.getStationId().equals(currentStationId)).findFirst().orElse(null);
+
+            if (currentStatus == null) {
+                return false;
+            }
+
+            boolean result = updateStationData(lockTaskNo, currentStationId, 0, 0, false, "");
+            if (!result) {
+                return false;
+            }
+            return true;
+        });
+
+        return executeResult;
+    }
+
+    public synchronized boolean lockExecute(Integer taskNo, Supplier<Boolean> function) {
+        if (!setLockStation(taskNo)) {
+            return false;
+        }
+
+        boolean result = function.get();
+        releaseLockStation(taskNo);
+        return result;
+    }
+
+    private synchronized boolean checkTaskNoInArea(Integer taskNo) {
+        Object fakeTaskNoAreaObj = redisUtil.get(RedisKeyType.FAKE_TASK_NO_AREA.key);
+        if (fakeTaskNoAreaObj == null) {
+            return false;
+        }
+
+        JSONObject data = JSON.parseObject(String.valueOf(fakeTaskNoAreaObj));
+        Integer start = data.getInteger("start");
+        Integer end = data.getInteger("end");
+
+        if(taskNo >= start && taskNo <= end) {
+            return true;
+        }
+
+        return false;
+    }
+}

--
Gitblit v1.9.1