From 80d97d40c44165674ee0168be5f08c8ca52d3c06 Mon Sep 17 00:00:00 2001 From: zjj <3272660260@qq.com> Date: 星期一, 09 六月 2025 09:36:43 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/jxgtwcs' into jxgtwcs --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java | 126 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 119 insertions(+), 7 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java index c696b12..a79de4f 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java @@ -4,23 +4,23 @@ import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.SpringUtils; +import com.zy.asrs.wcs.core.entity.ShuttleStandby; import com.zy.asrs.wcs.core.model.MapNode; import com.zy.asrs.wcs.core.model.NavigateNode; -import com.zy.asrs.wcs.core.model.PythonResult; import com.zy.asrs.wcs.core.model.PythonSimilarityResult; import com.zy.asrs.wcs.core.model.enums.MapNodeType; import com.zy.asrs.wcs.core.model.enums.NavigationMapType; +import com.zy.asrs.wcs.core.service.ShuttleStandbyService; import com.zy.asrs.wcs.rcs.News; -import com.zy.asrs.wcs.system.entity.Dict; -import com.zy.asrs.wcs.system.service.DictService; +import com.zy.asrs.wcs.rcs.entity.Device; +import com.zy.asrs.wcs.rcs.thread.LiftThread; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -32,9 +32,86 @@ @Value("${pythonCalcPath}") private String pythonCalcPath; - @Value("${pythonCalcSimilarity}") private String pythonCalcSimilarity; + @Autowired + private LiftDispatcher liftDispatcher; + @Autowired + private ShuttleStandbyService shuttleStandbyService; + + public List<NavigateNode> calcWhiteList(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) { + //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍� + int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐� + int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣 + + ArrayList<int[]> whiteList = new ArrayList<>();//璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟 + whiteList.add(startArr);//灏嗗紑濮嬭妭鐐硅缃负鐧藉悕鍗曪紝浠ラ槻琚繃婊� + whiteList.add(endArr);//灏嗙粨鏉熻妭鐐硅缃负鐧藉悕鍗曪紝浠ラ槻琚繃婊� + + //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑 + int lev = Utils.getLev(startPoint); + + //鍒濆鍖栧紑濮嬭妭鐐� + NavigateNode start = new NavigateNode(startArr[0], startArr[1]); + //寮�濮嬭妭鐐规棤鐖惰妭鐐� + start.setFather(null); + + NavigateNode end = new NavigateNode(endArr[0], endArr[1]); + NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); + //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻 + + String pathStr = solution.astarSearch(start, end, pythonCalcPath); + if (pathStr == null) { + News.error("{} dash {} can't find navigate path!", startPoint, endPoint); + return null; + } + + List<NavigateNode> list = new ArrayList<>(); + + NavigateNode fatherNode = null;//褰撳墠寰幆涓婁竴鑺傜偣锛岀敤浜庢嫄鐐硅绠� + JSONArray rows = JSON.parseArray(pathStr); + + for (int i = 0; i < rows.size(); i++) { + Object currentObj = rows.get(i); + + NavigateNode nextNode = null; + if ((i + 1) < rows.size()) { + Object object = rows.get(i + 1); + nextNode = pythonObjTransferNode(object, lev); + } + + NavigateNode node = pythonObjTransferNode(currentObj, lev); + + //瀵绘壘鎷愮偣 + HashMap<String, Object> result = searchInflectionPoint(node, fatherNode, nextNode);//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣 + //鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘嫄鐐� + if (Boolean.parseBoolean(result.get("result").toString())) { + //褰撳墠涓烘嫄鐐� + node.setIsInflectionPoint(true); + //鎷愮偣鏂瑰悜 + node.setDirection(result.get("direction").toString()); + } + + list.add(node); + + fatherNode = node;//鎶婂綋鍓嶈妭鐐逛繚瀛樻垚涓�涓埗鑺傜偣 + } + + //灏嗘瘡涓妭鐐归噷闈㈢殑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> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) { //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍� @@ -302,7 +379,17 @@ public Double similarityPath(List<NavigateNode> firstPath, List<NavigateNode> secondPath) { try { - ProcessBuilder processBuilder = new ProcessBuilder("python", pythonCalcSimilarity, JSON.toJSONString(firstPath), JSON.toJSONString(secondPath)); + List<int[]> first = new ArrayList<>(); + for (NavigateNode node : firstPath) { + first.add(new int[]{node.getX(), node.getY()}); + } + + List<int[]> second = new ArrayList<>(); + for (NavigateNode node : secondPath) { + second.add(new int[]{node.getX(), node.getY()}); + } + + ProcessBuilder processBuilder = new ProcessBuilder("python", pythonCalcSimilarity, JSON.toJSONString(first), JSON.toJSONString(second)); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); @@ -340,6 +427,31 @@ return 0D; } + //妫�娴嬪簱浣嶈矾寰勬槸鍚﹀彲鐢�(鐢ㄤ簬搴撲綅鏄惁鍙Щ鍔ㄦ娴�) + public boolean checkLocPathIsAvailable(String startLocNo, Long hostId) { + //鑾峰彇璺濈鐩爣浣嶇疆鏈�杩戠殑鍙崲灞傛彁鍗囨満(鍙兘涓嶇┖闂�) + LiftThread liftThread = liftDispatcher.searchLift(startLocNo, hostId, true); + if (liftThread == null) { + return false; + } + Device transferLiftDevice = liftThread.getDevice(); + + ShuttleStandby shuttleStandbyTo = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>() + .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId()) + .eq(ShuttleStandby::getDeviceLev, Utils.getLev(startLocNo)) + .eq(ShuttleStandby::getStatus, 1)); + + //鎻愬崌鏈哄簱浣嶅彿 + String liftLocNo = shuttleStandbyTo.getDeviceLoc(); + + //璁$畻搴撲綅鍒版彁鍗囨満搴撲綅锛岃矾寰勬槸鍚﹀彲鐢� + List<NavigateNode> nodeList = this.calc(startLocNo, liftLocNo, NavigationMapType.DFX.id, 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