package com.zy.common.utils; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import com.zy.core.News; import org.springframework.stereotype.Component; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.core.exception.CoolException; import com.zy.common.model.NavigateNode; @Component public class NavigateUtils { public synchronized List calcByStationId(int lev, Integer startStationId, Integer endStationId) { NavigateSolution navigateSolution = new NavigateSolution(); List> stationMap = navigateSolution.getStationMap(lev); NavigateNode startNode = navigateSolution.findStationNavigateNode(stationMap, startStationId); if (startNode == null){ throw new CoolException("未找到该 起点 对应的节点"); } NavigateNode endNode = navigateSolution.findStationNavigateNode(stationMap, endStationId); if (endNode == null){ throw new CoolException("未找到该 终点 对应的节点"); } long startTime = System.currentTimeMillis(); News.info("[WCS Debug] 站点路径开始计算,startStationId={},endStationId={}", startStationId, endStationId); NavigateNode res_node = navigateSolution.astarSearchJava(stationMap, startNode, endNode); if (res_node == null) { throw new CoolException("未找到该路径"); } News.info("[WCS Debug] 站点路径计算完成,耗时:{}ms", System.currentTimeMillis() - startTime); ArrayList list = new ArrayList<>(); // 使用 visited 集合防止父链出现环导致死循环,同时设置安全步数上限 HashSet visited = new HashSet<>(); int maxSteps = stationMap.size() * stationMap.get(0).size() + 5; // 安全上限 int steps = 0; while (res_node != null && visited.add(res_node) && steps++ < maxSteps) { list.add(res_node); res_node = res_node.getFather();//迭代操作 } if (steps >= maxSteps) { throw new CoolException("路径回溯超出安全上限,疑似存在父链循环"); } Collections.reverse(list); //将每个节点里面的fatherNode至为null(方便后续计算时父节点过多导致显示的节点太多) for (NavigateNode navigateNode : list) { //父节点设置为null,不影响计算结果,不影响后续操作。 //此操作仅为后续排查处理提供视觉方便。 navigateNode.setFather(null); } //去重 HashSet set = new HashSet<>(); List fitlerList = new ArrayList<>(); for(NavigateNode navigateNode : list){ JSONObject valuObject = JSON.parseObject(navigateNode.getNodeValue()); if(set.add(valuObject.getInteger("stationId"))){ fitlerList.add(navigateNode); } } return fitlerList; } public synchronized List calcByTrackSiteNo(int lev, Integer startTrackSiteNo, Integer endTrackSiteNo) { NavigateSolution navigateSolution = new NavigateSolution(); List> rgvTrackMap = navigateSolution.getRgvTrackMap(lev); NavigateNode startNode = navigateSolution.findTrackSiteNoNavigateNode(rgvTrackMap, startTrackSiteNo); if (startNode == null){ throw new CoolException("未找到该 起点 对应的节点"); } NavigateNode endNode = navigateSolution.findTrackSiteNoNavigateNode(rgvTrackMap, endTrackSiteNo); if (endNode == null){ throw new CoolException("未找到该 终点 对应的节点"); } long startTime = System.currentTimeMillis(); News.info("[WCS Debug] RGV路径开始计算,startTrackSiteNo:{},endTrackSiteNo={}", startTrackSiteNo, endTrackSiteNo); NavigateNode res_node = navigateSolution.astarSearchJava(rgvTrackMap, startNode, endNode); if (res_node == null) { throw new CoolException("未找到该路径"); } News.info("[WCS Debug] RGV路径计算完成,耗时:{}ms", System.currentTimeMillis() - startTime); ArrayList list = new ArrayList<>(); // 使用 visited 集合防止父链出现环导致死循环,同时设置安全步数上限 HashSet visited = new HashSet<>(); int maxSteps = rgvTrackMap.size() * rgvTrackMap.get(0).size() + 5; // 安全上限 int steps = 0; while (res_node != null && visited.add(res_node) && steps++ < maxSteps) { list.add(res_node); res_node = res_node.getFather();//迭代操作 } if (steps >= maxSteps) { throw new CoolException("路径回溯超出安全上限,疑似存在父链循环"); } Collections.reverse(list); //将每个节点里面的fatherNode至为null(方便后续计算时父节点过多导致显示的节点太多) for (NavigateNode navigateNode : list) { //父节点设置为null,不影响计算结果,不影响后续操作。 //此操作仅为后续排查处理提供视觉方便。 navigateNode.setFather(null); } //去重 HashSet set = new HashSet<>(); List fitlerList = new ArrayList<>(); for(NavigateNode navigateNode : list){ JSONObject valuObject = JSON.parseObject(navigateNode.getNodeValue()); if(set.add(valuObject.getInteger("trackSiteNo"))){ fitlerList.add(navigateNode); } } return fitlerList; } public synchronized List findLiftStationList(int lev) { NavigateSolution navigateSolution = new NavigateSolution(); List> stationMap = navigateSolution.getStationMap(lev); List liftStationList = new ArrayList<>(); for (List navigateNodes : stationMap) { for (NavigateNode navigateNode : navigateNodes) { String nodeType = navigateNode.getNodeType(); if(nodeType == null){ continue; } if(!nodeType.equals("devp")){ continue; } JSONObject valuObject = JSON.parseObject(navigateNode.getNodeValue()); if(valuObject == null){ continue; } if (valuObject.containsKey("liftNo")) { liftStationList.add(navigateNode); } } } return liftStationList; } }