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.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 输送站假连接(模拟) */ public class ZyStationFakeConnect implements ZyStationConnectApi { private List statusList = new ArrayList<>(); private final DeviceConfig deviceConfig; // 允许并行执行多个命令任务(固定线程池)。如需更高并发可调整大小。 private final ExecutorService executor = Executors .newFixedThreadPool(9999); public ZyStationFakeConnect(DeviceConfig deviceConfig) { this.deviceConfig = deviceConfig; } @Override public boolean connect() { return true; } @Override public boolean disconnect() { executor.shutdownNow(); return true; } @Override public List 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("");// 模拟无条码 } } return this.statusList; } @Override public CommandResponse sendCommand(StationCommand command) { executor.submit(() -> { try { handleCommand(command); } catch (Exception e) { e.printStackTrace(); } }); return new CommandResponse(true, "命令已受理(异步执行)"); } 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; } 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 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 navigateNodes = null; List targetNavigateNodes = null; try { List liftStationList = navigateUtils.findLiftStationList(Integer.parseInt(startLev)); if(liftStationList.isEmpty()){ //未找到提升机节点 return; } List 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 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) { try { Thread.sleep(ms); } catch (InterruptedException e) { e.printStackTrace(); } } }