From 6cf4a3e2ba925e75b60f13bb8ebc5e92d37809b2 Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期五, 25 七月 2025 13:53:34 +0800 Subject: [PATCH] # --- src/main/java/com/zy/common/utils/NavigateUtils.java | 199 +++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 166 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java index 22d5fab..d49b64b 100644 --- a/src/main/java/com/zy/common/utils/NavigateUtils.java +++ b/src/main/java/com/zy/common/utils/NavigateUtils.java @@ -2,7 +2,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; -import com.core.common.SpringUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.core.common.SnowflakeIdWorker; +import com.core.exception.CoolException; import com.zy.asrs.utils.Utils; import com.zy.common.model.MapNode; import com.zy.common.model.NavigateNode; @@ -10,6 +12,8 @@ import com.zy.core.News; import com.zy.core.enums.MapNodeType; import com.zy.core.model.PythonSimilarityResult; +import com.zy.system.entity.Config; +import com.zy.system.service.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -30,12 +34,16 @@ private String pythonCalcSimilarity; @Autowired private NavigateMapData navigateMapData; + @Autowired + private SnowflakeIdWorker snowflakeIdWorker; + @Autowired + private ConfigService configService; - public List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) { - return calcJava(startPoint, endPoint, mapType, shuttlePoints, whites); + public List<NavigateNode> calc(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites) { + return calcJava(startPoint, endPoint, mapTypes, shuttlePoints, whites); } - public List<NavigateNode> calcJava(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) { + public List<NavigateNode> calcJava(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites) { //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍� int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐� int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣 @@ -48,14 +56,17 @@ //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑 int lev = Utils.getLev(startPoint); + NavigateSolution solution = new NavigateSolution(mapTypes, lev, whiteList, shuttlePoints); + int[][] map = solution.map; //鍒濆鍖栧紑濮嬭妭鐐� NavigateNode start = new NavigateNode(startArr[0], startArr[1]); //寮�濮嬭妭鐐规棤鐖惰妭鐐� start.setFather(null); + start.setNodeValue(map[startArr[0]][startArr[1]]); NavigateNode end = new NavigateNode(endArr[0], endArr[1]); - NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); + end.setNodeValue(map[endArr[0]][endArr[1]]); //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻 NavigateNode res_node = solution.astarSearchJava(start, end); @@ -105,7 +116,7 @@ return list; } - public List<NavigateNode> calcPython(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) { + public List<NavigateNode> calcPython(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites) { //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍� int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐� int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣 @@ -118,14 +129,17 @@ //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑 int lev = Utils.getLev(startPoint); + NavigateSolution solution = new NavigateSolution(mapTypes, lev, whiteList, shuttlePoints); + int[][] map = solution.map; //鍒濆鍖栧紑濮嬭妭鐐� NavigateNode start = new NavigateNode(startArr[0], startArr[1]); + start.setNodeValue(map[startArr[0]][startArr[1]]); //寮�濮嬭妭鐐规棤鐖惰妭鐐� start.setFather(null); NavigateNode end = new NavigateNode(endArr[0], endArr[1]); - NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); + end.setNodeValue(map[endArr[0]][endArr[1]]); //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻 String pathStr = solution.astarSearchPython(start, end, pythonCalcPath); @@ -179,6 +193,49 @@ //鏇存柊鑺傜偣鍒楄〃 list.set(0, startNode); return list; + } + + //璁$畻甯︽湯绔钀借矾寰� + public List<List<NavigateNode>> calcEndPath(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites, int lastPathPart) { + //璁$畻璺緞 + List<NavigateNode> navigateNodes = calc(startPoint, endPoint, mapTypes, shuttlePoints, whites); + if (navigateNodes == null) { + News.error("{} dash {} can't find navigate path!", startPoint, endPoint); + return null; + } + + //鑾峰彇鍒嗘璺緞 + List<List<NavigateNode>> partList = this.getSectionPath(navigateNodes); + //鏍规嵁浼犲叆鐨勬湯绔钀借矾寰勶紝鎵惧埌鏈鐐逛綅 + int partResult = partList.size() - lastPathPart; + if (partResult == 0) {//璺緞鏁伴噺鐩稿悓鏃犻渶鍒嗗壊 + return partList; + } else if (partResult < 0) { + throw new CoolException("鍒嗘璺緞涓庢湯绔矾寰勬暟閲忚绠楀紓甯�"); + } + int pathIdx = partResult - 1; + List<List<NavigateNode>> filterList = new ArrayList<>(); + for (int i = 0; i <= pathIdx; i++) { + filterList.add(partList.get(i)); + } + return filterList; + } + + //璁$畻鏈娈佃惤鍦板潃 + public String calcEndLocation(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites, int lastPathPart) { + List<List<NavigateNode>> endPath = calcEndPath(startPoint, endPoint, mapTypes, shuttlePoints, whites, lastPathPart); + if (endPath == null) { + return null; + } + + return findTargetLocation(endPath); + } + + public String findTargetLocation(List<List<NavigateNode>> partList) { + List<NavigateNode> nodes = partList.get(partList.size() - 1); + NavigateNode targetNode = nodes.get(0); + String locNo = NavigatePositionConvert.nodeToLocNo(targetNode); + return locNo; } //鍒ゆ柇褰撳墠鑺傜偣鍒颁笅涓�涓妭鐐规槸鍚︿负鎷愮偣 @@ -237,11 +294,14 @@ * 鍔犺浆寮妭鐐� * 鑾峰彇鍒嗘璺緞锛屾瘡褰撴湁涓�涓嫄鐐瑰垯杩涜涓�娆″垎娈碉紝鏈�缁堣繑鍥炴�诲垎娈垫暟鎹� */ - public ArrayList<ArrayList<NavigateNode>> getSectionPath(List<NavigateNode> mapList) { - ArrayList<ArrayList<NavigateNode>> list = new ArrayList<>(); + public List<List<NavigateNode>> getSectionPath(List<NavigateNode> mapList) { + NavigateNode firstNode = mapList.get(0); + //鑾峰彇鍦板浘 + List<List<MapNode>> mapNodes = navigateMapData.getJsonData(firstNode.getZ(), NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null); - ArrayList<NavigateNode> data = new ArrayList<>(); - String direction = mapList.get(0).getDirection();//琛岃蛋鏂瑰悜 + List<List<NavigateNode>> list = new ArrayList<>(); + List<NavigateNode> data = new ArrayList<>(); + String direction = firstNode.getDirection();//琛岃蛋鏂瑰悜 for (NavigateNode navigateNode : mapList) { data.add(navigateNode); @@ -256,35 +316,97 @@ //鐩磋绾胯矾 navigateNode.setDirection(direction);//璁剧疆琛岃蛋鏂瑰悜 } - Integer distance = getXToNextDistance(navigateNode);//鑾峰彇褰撳墠鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈 + Integer distance = getXToNextDistance(mapNodes, navigateNode);//鑾峰彇褰撳墠鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈 navigateNode.setMoveDistance(distance); } //灏嗘渶鍚庝竴娈垫暟鎹坊鍔犺繘鍏� list.add(data); - return list; + //鍒嗘璺緞-澶勭悊瓒呴暱鐩寸嚎娈佃矾寰� + List<List<NavigateNode>> paths = getSectionPathToSplitOverLength(list); + return paths; + } + + //鍒嗘璺緞-澶勭悊瓒呴暱鐩寸嚎娈佃矾寰� + public List<List<NavigateNode>> getSectionPathToSplitOverLength(List<List<NavigateNode>> list) { + int overLength = 9;//榛樿9鑺� + Config shuttleMoveOverLengthConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleMoveOverLength")); + if (shuttleMoveOverLengthConfig != null) { + overLength = Integer.parseInt(shuttleMoveOverLengthConfig.getValue()); + } + + List<List<NavigateNode>> paths = new ArrayList<>(); + for (List<NavigateNode> nodes : list) { + long nextId = snowflakeIdWorker.nextId(); + + if (nodes.size() > overLength) { + List<NavigateNode> copy = JSON.parseArray(JSON.toJSONString(nodes), NavigateNode.class); + List<NavigateNode> tmp = new ArrayList<>(); + int tmpCount = 0; + NavigateNode lastNode = null; + for (NavigateNode node : copy) { + tmp.add(node); + tmpCount++; + + if(tmpCount >= overLength) { + if (lastNode == null) { + NavigateNode startNode = tmp.get(0); + startNode.setLinePartAllowGo(true);//鐩寸嚎娈佃秴闀块儴鍒嗗厑璁哥洿鎺ヨ璧� + startNode.setLinePartFlag(nextId);//鐩寸嚎娈垫暟鎹爣璇� + tmp.set(0, startNode); + } + NavigateNode targetNode = tmp.get(tmp.size() - 1); + targetNode.setLinePartAllowGo(true);//鐩寸嚎娈佃秴闀块儴鍒嗗厑璁哥洿鎺ヨ璧� + targetNode.setLinePartFlag(nextId);//鐩寸嚎娈垫暟鎹爣璇� + if (lastNode != null) { + tmp.add(0, lastNode); + } + + paths.add(tmp); + tmp = new ArrayList<>(); + tmpCount = 0; + lastNode = targetNode; + } + } + + if (tmpCount > 0) { + tmp.add(0, lastNode); + paths.add(tmp); + } + }else { + NavigateNode startNode = nodes.get(0); + startNode.setLinePartAllowGo(true);//鐩寸嚎娈佃秴闀块儴鍒嗗厑璁哥洿鎺ヨ璧� + startNode.setLinePartFlag(nextId);//鐩寸嚎娈垫暟鎹爣璇� + nodes.set(0, startNode); + paths.add(nodes); + } + } + return paths; } //鑾峰彇浠巟鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈 - public Integer getXToNextDistance(NavigateNode xNode) { - NavigateMapData mapData = SpringUtils.getBean(NavigateMapData.class); - List<List<MapNode>> lists = mapData.getJsonData(xNode.getZ(), NavigationMapType.NONE.id, null, null); - if (lists != null) { - MapNode mapNode = lists.get(xNode.getX()).get(xNode.getY()); - if (mapNode != null) { - switch (xNode.getDirection()) { - case "top": - return mapNode.getTop(); - case "bottom": - return mapNode.getBottom(); - case "left": - return mapNode.getLeft(); - case "right": - return mapNode.getRight(); - } - } + public Integer getXToNextDistance(List<List<MapNode>> mapLists, NavigateNode xNode) { + if (mapLists == null) { return 0; + } + + if (mapLists.isEmpty()) { + return 0; + } + + MapNode mapNode = mapLists.get(xNode.getX()).get(xNode.getY()); + if (mapNode != null) { + switch (xNode.getDirection()) { + case "top": + return mapNode.getTop(); + case "bottom": + return mapNode.getBottom(); + case "left": + return mapNode.getLeft(); + case "right": + return mapNode.getRight(); + } } return 0; } @@ -293,9 +415,9 @@ * 鏍规嵁鍘熷鑺傜偣缁撴灉锛岃绠楁�昏璧拌窛绂� */ public Integer getOriginPathAllDistance(List<NavigateNode> path) { - ArrayList<ArrayList<NavigateNode>> sectionPath = getSectionPath(path); + List<List<NavigateNode>> sectionPath = getSectionPath(path); Integer allDistance = 0; - for (ArrayList<NavigateNode> navigateNodes : sectionPath) { + for (List<NavigateNode> navigateNodes : sectionPath) { Integer distance = getCurrentPathAllDistance(navigateNodes); allDistance += distance; } @@ -348,7 +470,7 @@ * 妫�娴嬭矾寰勬槸鍚﹀彲鐢�(鍙蛋) */ public boolean checkPathIsAvailable(List<NavigateNode> path, Integer shuttleNo, Integer lev) { - int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.DFX.id, null, Utils.getShuttlePoints(shuttleNo, lev)); + int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.getDfxWithDevice(), null, Utils.getShuttlePoints(shuttleNo, lev)); for (NavigateNode node : path) { int value = map[node.getX()][node.getY()]; if (value != MapNodeType.NORMAL_PATH.id && value != MapNodeType.MAIN_PATH.id && value != MapNodeType.CHARGE.id && value != MapNodeType.CONVEYOR_CAR_GO.id) {//姣嶈建閬�3銆佸瓙杞ㄩ亾0銆佸厖鐢垫々5銆佸皬杞﹀彲璧拌緭閫佺珯 @@ -420,6 +542,17 @@ return 0D; } + //妫�娴嬪簱浣嶈矾寰勬槸鍚﹀彲鐢�(鐢ㄤ簬搴撲綅鏄惁鍙Щ鍔ㄦ娴�) + public boolean checkLocPathIsAvailable(String startLocNo, String endLocNo) { + List<int[]> shuttlePoints = Utils.getShuttlePoints(0, Utils.getLev(startLocNo)); + //璁$畻搴撲綅鍒版彁鍗囨満搴撲綅锛岃矾寰勬槸鍚﹀彲鐢� + List<NavigateNode> nodeList = this.calc(startLocNo, endLocNo, NavigationMapType.getMapTypes(NavigationMapType.DFX), shuttlePoints, null); + if (nodeList == null) { + return false; + } + return true; + } + public static void main(String[] args) { // //璁$畻璺緞 // List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null); -- Gitblit v1.9.1