From dad4b7fd3a7fcaed73d28f0ebd9e90d86ca21225 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 22 七月 2025 12:34:51 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/common/utils/NavigateUtils.java |  119 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 82 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index 13888cf..dd88872 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -2,7 +2,6 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.core.common.SpringUtils;
 import com.core.exception.CoolException;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.model.MapNode;
@@ -189,7 +188,7 @@
     }
 
     //璁$畻甯︽湯绔钀借矾寰�
-    public ArrayList<ArrayList<NavigateNode>> calcEndPath(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites, int lastPathPart) {
+    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) {
@@ -198,7 +197,7 @@
         }
 
         //鑾峰彇鍒嗘璺緞
-        ArrayList<ArrayList<NavigateNode>> partList = this.getSectionPath(navigateNodes);
+        List<List<NavigateNode>> partList = this.getSectionPath(navigateNodes);
         //鏍规嵁浼犲叆鐨勬湯绔钀借矾寰勶紝鎵惧埌鏈鐐逛綅
         int partResult = partList.size() - lastPathPart;
         if (partResult == 0) {//璺緞鏁伴噺鐩稿悓鏃犻渶鍒嗗壊
@@ -207,7 +206,7 @@
             throw new CoolException("鍒嗘璺緞涓庢湯绔矾寰勬暟閲忚绠楀紓甯�");
         }
         int pathIdx = partResult - 1;
-        ArrayList<ArrayList<NavigateNode>> filterList = new ArrayList<>();
+        List<List<NavigateNode>> filterList = new ArrayList<>();
         for (int i = 0; i <= pathIdx; i++) {
             filterList.add(partList.get(i));
         }
@@ -216,7 +215,7 @@
 
     //璁$畻鏈娈佃惤鍦板潃
     public String calcEndLocation(String startPoint, String endPoint, List<NavigationMapType> mapTypes, List<int[]> shuttlePoints, List<int[]> whites, int lastPathPart) {
-        ArrayList<ArrayList<NavigateNode>> endPath = calcEndPath(startPoint, endPoint, mapTypes, shuttlePoints, whites, lastPathPart);
+        List<List<NavigateNode>> endPath = calcEndPath(startPoint, endPoint, mapTypes, shuttlePoints, whites, lastPathPart);
         if (endPath == null) {
             return null;
         }
@@ -224,13 +223,8 @@
         return findTargetLocation(endPath);
     }
 
-    public String findTargetLocation(List<NavigateNode> nodeList) {
-        ArrayList<ArrayList<NavigateNode>> sectionPath = this.getSectionPath(nodeList);
-        return findTargetLocation(sectionPath);
-    }
-
-    public String findTargetLocation(ArrayList<ArrayList<NavigateNode>> partList) {
-        ArrayList<NavigateNode> nodes = partList.get(partList.size() - 1);
+    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;
@@ -292,11 +286,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);
@@ -311,35 +308,83 @@
                 //鐩磋绾胯矾
                 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) {
+        List<List<NavigateNode>> paths = new ArrayList<>();
+        int overLength = 9;
+        for (List<NavigateNode> nodes : list) {
+            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);//鐩寸嚎娈佃秴闀块儴鍒嗗厑璁哥洿鎺ヨ璧�
+                            tmp.set(0, startNode);
+                        }
+                        NavigateNode targetNode = tmp.get(tmp.size() - 1);
+                        targetNode.setLinePartAllowGo(true);//鐩寸嚎娈佃秴闀块儴鍒嗗厑璁哥洿鎺ヨ璧�
+                        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 {
+                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;
     }
@@ -348,9 +393,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;
         }

--
Gitblit v1.9.1