From 7635dc25bd2a4d565df496b2d96354639966768d Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期四, 25 九月 2025 11:09:44 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/common/utils/NavigateUtils.java | 314 +++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 282 insertions(+), 32 deletions(-)
diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index 4e02d8e..9197cd8 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,9 @@
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;
@@ -25,11 +30,20 @@
@Value("${pythonCalcPath}")
private String pythonCalcPath;
-
@Value("${pythonCalcSimilarity}")
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) {
+ 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, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites) {
//閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍�
int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐�
int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣
@@ -42,17 +56,93 @@
//鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑
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]]);
//寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻
- String pathStr = solution.astarSearch(start, end, pythonCalcPath);
+ NavigateNode res_node = solution.astarSearchJava(start, end);
+ if (res_node == null) {
+ News.error("{} dash {} can't find navigate path!", startPoint, endPoint);
+ return null;
+ }
+
+ ArrayList<NavigateNode> list = new ArrayList<>();
+ //娓叉煋
+ NavigateNode fatherNode = null;//褰撳墠寰幆涓婁竴鑺傜偣锛岀敤浜庢嫄鐐硅绠�
+ while (res_node != null) {
+ res_node.setDirection(null);
+ res_node.setIsInflectionPoint(false);
+ res_node.setZ(lev);//璁剧疆灞傞珮
+
+ //瀵绘壘鎷愮偣
+ HashMap<String, Object> result = searchInflectionPoint(res_node, fatherNode, res_node.getFather());//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣
+ //鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘嫄鐐�
+ if (Boolean.parseBoolean(result.get("result").toString())) {
+ //褰撳墠涓烘嫄鐐�
+ res_node.setIsInflectionPoint(true);
+ //鎷愮偣鏂瑰悜
+ res_node.setDirection(result.get("direction").toString());
+ }
+ list.add(res_node);
+
+ fatherNode = res_node;//鎶婂綋鍓嶈妭鐐逛繚瀛樻垚涓�涓埗鑺傜偣
+ res_node = res_node.getFather();//杩唬鎿嶄綔
+ }
+
+ Collections.reverse(list);
+
+ //灏嗘瘡涓妭鐐归噷闈㈢殑fatherNode鑷充负null(鏂逛究鍚庣画璁$畻鏃剁埗鑺傜偣杩囧瀵艰嚧鏄剧ず鐨勮妭鐐瑰お澶�)
+ for (NavigateNode navigateNode : list) {
+ //鐖惰妭鐐硅缃负null锛屼笉褰卞搷璁$畻缁撴灉锛屼笉褰卞搷鍚庣画鎿嶄綔銆�
+ //姝ゆ搷浣滀粎涓哄悗缁帓鏌ュ鐞嗘彁渚涜瑙夋柟渚裤��
+ navigateNode.setFather(null);
+ }
+
+ //璧峰鑺傜偣璁$畻鏂瑰悜
+ String direction = calcDirection(list.get(0), list.get(1));
+ NavigateNode startNode = list.get(0);
+ startNode.setDirection(direction);
+ //鏇存柊鑺傜偣鍒楄〃
+ list.set(0, startNode);
+ return list;
+ }
+
+ 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);//缁撴潫鑺傜偣
+
+ ArrayList<int[]> whiteList = new ArrayList<>();//璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟
+ whiteList.add(startArr);//灏嗗紑濮嬭妭鐐硅缃负鐧藉悕鍗曪紝浠ラ槻琚繃婊�
+ if (whites != null && !whites.isEmpty()) {
+ whiteList.addAll(whites);//鎵归噺娣诲姞鐧藉悕鍗曡妭鐐�
+ }
+
+ //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑
+ 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]);
+ end.setNodeValue(map[endArr[0]][endArr[1]]);
+ //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻
+
+ String pathStr = solution.astarSearchPython(start, end, pythonCalcPath);
if (pathStr == null) {
News.error("{} dash {} can't find navigate path!", startPoint, endPoint);
return null;
@@ -103,6 +193,91 @@
//鏇存柊鑺傜偣鍒楄〃
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 calcFirstLocation(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites, int firstPathNumber) {
+ //璁$畻璺緞
+ 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);
+ List<NavigateNode> firstList = partList.get(0);
+
+ NavigateNode targetNode = null;
+ if(firstList.size() <= firstPathNumber){
+ targetNode = firstList.get(firstList.size() - 1);
+ }else {
+ targetNode = firstList.get(firstPathNumber);
+ }
+
+ String locNo = NavigatePositionConvert.nodeToLocNo(targetNode);
+ return locNo;
+ }
+
+ public String findTargetLocation(List<List<NavigateNode>> partList) {
+ NavigateNode targetNode = null;
+ for (int i = partList.size(); i > 0; i--) {
+ List<NavigateNode> nodes = partList.get(i - 1);
+ for (NavigateNode node : nodes) {
+ if (node.getNodeValue() == MapNodeType.MAIN_PATH.id) {
+ continue;
+ }
+ targetNode = node;
+ break;
+ }
+
+ if(targetNode != null){
+ break;
+ }
+ }
+
+ if (targetNode == null) {
+ List<NavigateNode> list = partList.get(partList.size() - 1);
+ targetNode = list.get(0);
+ }
+
+ String locNo = NavigatePositionConvert.nodeToLocNo(targetNode);
+ return locNo;
}
//鍒ゆ柇褰撳墠鑺傜偣鍒颁笅涓�涓妭鐐规槸鍚︿负鎷愮偣
@@ -161,11 +336,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);
@@ -180,35 +358,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;
}
@@ -217,9 +457,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;
}
@@ -272,8 +512,7 @@
* 妫�娴嬭矾寰勬槸鍚﹀彲鐢�(鍙蛋)
*/
public boolean checkPathIsAvailable(List<NavigateNode> path, Integer shuttleNo, Integer lev) {
- NavigateSolution solution = new NavigateSolution(NavigationMapType.DFX.id, lev, null, Utils.getShuttlePoints(shuttleNo, lev));//鑾峰彇鏃犵櫧鍚嶅崟鍦板浘(璇ュ湴鍥惧寘鍚皬杞﹀潗鏍�)
- int[][] map = solution.map;
+ 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銆佸皬杞﹀彲璧拌緭閫佺珯
@@ -345,6 +584,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