From 82c36e2b434fa7a1c16b0448aa4cf1483107f79c Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期二, 02 十二月 2025 16:28:20 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java |  302 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 272 insertions(+), 30 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 4354c7e..1ec6b2d 100644
--- a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
@@ -1,12 +1,18 @@
 package com.zy.core.network.fake;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.core.common.SpringUtils;
 import com.zy.asrs.entity.DeviceConfig;
+import com.zy.common.model.NavigateNode;
+import com.zy.common.utils.NavigateUtils;
+import com.zy.core.News;
 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.Collections;
+
+import java.util.ArrayList;
 import java.util.List;
 
 import java.util.concurrent.ExecutorService;
@@ -17,17 +23,14 @@
  */
 public class ZyStationFakeConnect implements ZyStationConnectApi {
 
-    private ZyStationStatusEntity status;
+    private List<ZyStationStatusEntity> statusList = new ArrayList<>();
     private final DeviceConfig deviceConfig;
-    private final ExecutorService executor = Executors.newSingleThreadExecutor();
+    // 鍏佽骞惰鎵ц澶氫釜鍛戒护浠诲姟锛堝浐瀹氱嚎绋嬫睜锛夈�傚闇�鏇撮珮骞跺彂鍙皟鏁村ぇ灏忋��
+    private final ExecutorService executor = Executors
+            .newFixedThreadPool(9999);
 
     public ZyStationFakeConnect(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
-        this.status = JSON.parseObject(deviceConfig.getFakeInitStatus(), ZyStationStatusEntity.class);
-        if (this.status == null) {
-            this.status = new ZyStationStatusEntity();
-            this.status.setStationId(deviceConfig.getDeviceNo());
-        }
     }
 
     @Override
@@ -37,43 +40,282 @@
 
     @Override
     public boolean disconnect() {
+        executor.shutdownNow();
         return true;
     }
 
     @Override
     public List<ZyStationStatusEntity> getStatus() {
-        return Collections.singletonList(status);
+        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("");// 妯℃嫙鏃犳潯鐮�
+            }
+        }
+
+        return this.statusList;
     }
 
     @Override
     public CommandResponse sendCommand(StationCommand command) {
-        CommandResponse response = new CommandResponse(false);
-        executor.submit(() -> handleCommand(command));
-        response.setResult(true);
-        return response;
+        executor.submit(() -> {
+            try {
+                handleCommand(command);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+        return new CommandResponse(true, "鍛戒护宸插彈鐞嗭紙寮傛鎵ц锛�");
     }
 
     private void handleCommand(StationCommand command) {
-        // 绠�鍗曠殑妯℃嫙锛氳缃伐浣滃彿鍜岀洰鏍囩珯锛屽苟妯℃嫙鏈夌墿/鍙叆/鍙嚭鐘舵�佸垏鎹�
-        this.status.setTaskNo(command.getTaskNo());
-        this.status.setTargetStaNo(command.getTargetStaNo());
+        News.info("[WCS Debug] 绔欑偣浠跨湡妯℃嫙宸插惎鍔紝鍛戒护鏁版嵁={}", JSON.toJSONString(command));
+        Integer taskNo = command.getTaskNo();
+        Integer stationId = command.getStationId();
+        Integer targetStationId = command.getTargetStaNo();
 
-        // 妯℃嫙鍒扮珯杩囩▼
-        this.status.setAutoing(true);
-        this.status.setLoading(true);
-        sleep(1000);
+        if(taskNo == 0 && targetStationId == 0){
+            //娓呯┖绔欑偣
+            resetStation(stationId);
+            return;
+        }
 
-        // 妯℃嫙鏀句笅鎵樼洏
-        this.status.setInEnable(true);
-        this.status.setOutEnable(false);
-        sleep(1000);
+        if (taskNo == 9999 && targetStationId == 0) {
+            //鐢熸垚浠跨湡鏁版嵁
+            generateFakeData(stationId, taskNo);
+            return;
+        }
 
-        // 瀹屾垚浠诲姟锛屽浣嶇姸鎬�
-        this.status.setLoading(false);
-        this.status.setAutoing(false);
-        this.status.setTaskNo(0);
-        this.status.setInEnable(false);
-        this.status.setOutEnable(true);
+        if (taskNo == 9998 && targetStationId == 0) {
+            //鐢熸垚鍑哄簱绔欑偣浠跨湡鏁版嵁
+            generateFakeOutStationData(stationId);
+            return;
+        }
+
+        String startLev = String.valueOf(stationId).substring(0, 1);
+        String endLev = String.valueOf(targetStationId).substring(0, 1);
+
+        if (startLev.equals(endLev)) {
+            currentLevCommand(command);
+        }else {
+            diffLevCommand(command);
+        }
+    }
+
+    private void generateFakeData(Integer stationId, Integer taskNo) {
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        status.setTaskNo(taskNo);
+        status.setLoading(true);
+        status.setBarcode(String.valueOf(System.currentTimeMillis()));
+    }
+
+    private void generateFakeOutStationData(Integer stationId) {
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        status.setLoading(true);
+    }
+
+    private void resetStation(Integer stationId) {
+        ZyStationStatusEntity status = statusList.stream()
+                .filter(item -> item.getStationId().equals(stationId)).findFirst().orElse(null);
+        if (status == null) {
+            return;
+        }
+
+        status.setTaskNo(0);
+        status.setLoading(false);
+        status.setBarcode("");
+    }
+
+    private void currentLevCommand(StationCommand command) {
+        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);
+
+        List<NavigateNode> navigateNodes = null;
+
+        try {
+            navigateNodes = navigateUtils.calcByStationId(Integer.parseInt(startLev), stationId, targetStationId);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (navigateNodes == null) {
+            return;
+        }
+
+        stationMove(navigateNodes, taskNo, targetStationId, false);
+    }
+
+    private void diffLevCommand(StationCommand command) {
+        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);
+        stationMove(targetNavigateNodes, taskNo, targetStationId, false);
+    }
+
+    private void stationMove(List<NavigateNode> navigateNodes, Integer taskNo, Integer targetStationId, boolean clearData) {
+        Integer lastStationId = null;
+        for (int i = 0; i < navigateNodes.size(); i++) {
+            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;
+            }
+
+            try {
+                while (true) {
+                    ZyStationStatusEntity nextStatus = statusList.stream()
+                            .filter(item -> item.getStationId().equals(currentStationId)).findFirst().orElse(null);
+                    if (nextStatus == null) {
+                        continue;
+                    }
+
+                    if (nextStatus.getTaskNo() == 0 || nextStatus.getTaskNo() == 9999) {
+                        break;
+                    }
+
+                    sleep(100);
+                }
+            } catch (Exception e) {
+                continue;
+            }
+
+            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);
+                    }
+                }
+            }
+
+            synchronized (status) {
+                status.setTaskNo(taskNo);
+                status.setTargetStaNo(targetStationId);
+                status.setLoading(true);
+            }
+
+            lastStationId = currentStationId;
+            sleep(1000);
+        }
+
+        if (clearData) {
+            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);
+                    }
+                }
+            }
+        }
     }
 
     private void sleep(long ms) {

--
Gitblit v1.9.1