#
Junjie
昨天 ce8c67734acf64325849f47f9f17aaccf9163b9b
src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
@@ -6,6 +6,7 @@
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;
@@ -26,7 +27,7 @@
    private final DeviceConfig deviceConfig;
    // 允许并行执行多个命令任务(固定线程池)。如需更高并发可调整大小。
    private final ExecutorService executor = Executors
            .newFixedThreadPool(Math.max(2, Runtime.getRuntime().availableProcessors()));
            .newFixedThreadPool(9999);
    public ZyStationFakeConnect(DeviceConfig deviceConfig) {
        this.deviceConfig = deviceConfig;
@@ -77,6 +78,77 @@
    }
    private void handleCommand(StationCommand command) {
        News.info("[WCS Debug] 站点仿真模拟已启动,命令数据={}", JSON.toJSONString(command));
        Integer taskNo = command.getTaskNo();
        Integer stationId = command.getStationId();
        Integer targetStationId = command.getTargetStaNo();
        if(taskNo == 0 && targetStationId == 0){
            //清空站点
            resetStation(stationId);
            return;
        }
        if (taskNo == 9999 && targetStationId == 0) {
            //生成仿真数据
            generateFakeData(stationId, taskNo);
            return;
        }
        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;
        }
        String barcodeTime = String.valueOf(System.currentTimeMillis());
        String barcode = barcodeTime.substring(5);
        status.setTaskNo(taskNo);
        status.setLoading(true);
        status.setBarcode(barcode);
    }
    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;
@@ -86,10 +158,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,6 +172,86 @@
            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);
@@ -117,7 +271,7 @@
                        continue;
                    }
                    if (nextStatus.getTaskNo() == 0) {
                    if (nextStatus.getTaskNo() == 0 || nextStatus.getTaskNo() == 9999) {
                        break;
                    }
@@ -125,12 +279,6 @@
                }
            } catch (Exception e) {
                continue;
            }
            synchronized (status) {
                status.setTaskNo(taskNo);
                status.setTargetStaNo(targetStationId);
                status.setLoading(true);
            }
            if (lastStationId != null) {
@@ -145,20 +293,29 @@
                    }
                }
            }
            synchronized (status) {
                status.setTaskNo(taskNo);
                status.setTargetStaNo(targetStationId);
                status.setLoading(true);
            }
            lastStationId = currentStationId;
            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 (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);
                    }
                }
            }
        }