From 98f1c4c9ffbbb3347ad752821505bc3c70ea4efc Mon Sep 17 00:00:00 2001
From: lsh <lsh@163.com>
Date: 星期日, 27 四月 2025 10:52:50 +0800
Subject: [PATCH] *

---
 src/main/java/com/zy/asrs/utils/RouteUtils.java             |  132 +++++++++++++++++++++++++++++----
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |   16 ++-
 src/main/java/com/zy/asrs/entity/BasDevpPosition.java       |   15 +++
 src/main/java/com/zy/asrs/utils/TrackRangeUtils.java        |   34 ++++++++
 4 files changed, 173 insertions(+), 24 deletions(-)

diff --git a/src/main/java/com/zy/asrs/entity/BasDevpPosition.java b/src/main/java/com/zy/asrs/entity/BasDevpPosition.java
index e1795f8..26587cd 100644
--- a/src/main/java/com/zy/asrs/entity/BasDevpPosition.java
+++ b/src/main/java/com/zy/asrs/entity/BasDevpPosition.java
@@ -42,7 +42,20 @@
         this.plcPosition = plcPosition;
     }
 
-//    BasDevpPosition basDevpPosition = new BasDevpPosition(
+    public BasDevpPosition(BasDevpPosition basDevpPosition) {
+        this.id = basDevpPosition.getId();
+        this.devNo = basDevpPosition.getDevNo();
+        this.plcId = basDevpPosition.getPlcId();
+        this.plcPosition = basDevpPosition.getPlcPosition();
+    }
+
+    public BasDevpPosition(BasDevpPosition basDevpPosition,Long plcPosition) {
+        this.id = basDevpPosition.getId();
+        this.devNo = basDevpPosition.getDevNo();
+        this.plcId = basDevpPosition.getPlcId();
+        this.plcPosition = plcPosition;
+    }
+    //    BasDevpPosition basDevpPosition = new BasDevpPosition(
 //            null,    // 
 //            null,    // 
 //            null    // 
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 1fbc07a..be3b65a 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1211,7 +1211,7 @@
 
                     if (rgvOtherStatusEnable(rgvSlave)){
                         //鍒嗘垚涓婁笅涓ら儴鍒嗕换鍔�
-                        List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions);
+                        List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions,itSmall);
                         List<Integer> rangeListSou = avoidRange[itSmall ? 0 : 1];
                         List<Integer> rangeListSouOther = avoidRange[itSmall ? 1 : 0];
                         //灏辫繎鎺掑簭
@@ -1223,15 +1223,17 @@
 
                         //绛涢�夎寖鍥村唴浠诲姟
                         //灏辫繎鎺掑簭
-                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(rgvSlave.getOtherId());
                         //绛涢�夊湪鑼冨洿浠诲姟
-                        List<Integer> belongToRange = RouteUtils.belongToRange(rangeList, rgvProtocolOther.getRgvPosDestination(), basDevpPositions);
+                        Long[][] avoidedRange = new TrackRangeUtils().avoidRangeArr(rgvSlave, trackEntireLength, trackBenchmark, avoidDistance);
+                        List<Integer> belongToRange = RouteUtils.SortNearby(RouteUtils.belongToRange(rangeList, avoidedRange[0], basDevpPositions), rgvProtocol.RgvPos, basDevpPositions);
+
                         for (Integer staNoNow : belongToRange){
                             for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                 if (rgvStn.getStaNo().equals(staNoNow)){
                                     TaskWrk taskWrk = deviceDetection(rgvStn);
                                     if (taskWrk!=null){
-                                        if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
+                                        BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
+                                        if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                             sign = taskGenerate(rgvSlave,rgvStn,0);
                                         }
                                     }
@@ -1263,7 +1265,8 @@
                                     if (rgvStn.getStaNo().equals(staNoNow)){
                                         TaskWrk taskWrk = deviceDetection(rgvStn);
                                         if (taskWrk!=null){
-                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
+                                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
+                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                                 sign = taskGenerate(rgvSlave,rgvStn,0);
                                             }
                                         }
@@ -1296,7 +1299,8 @@
                                     if (rgvStn.getStaNo().equals(staNoNow)){
                                         TaskWrk taskWrk = deviceDetection(rgvStn);
                                         if (taskWrk!=null){
-                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
+                                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
+                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                                 sign = taskGenerate(rgvSlave,rgvStn,0);
                                             }
                                         }
diff --git a/src/main/java/com/zy/asrs/utils/RouteUtils.java b/src/main/java/com/zy/asrs/utils/RouteUtils.java
index 899c8d1..905be8d 100644
--- a/src/main/java/com/zy/asrs/utils/RouteUtils.java
+++ b/src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -7,6 +7,7 @@
 import com.zy.core.model.RgvSlave;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import static java.util.stream.Collectors.toList;
@@ -16,55 +17,154 @@
  */
 public class RouteUtils {
     //鎺掑簭  鎵ц鏂瑰悜锛堥潰鏈濊建閬� 瀹氫綅鍊煎乏灏忓彸澶э級  0:宸� 灏�   1:鍙� 澶�
-    public static List<Integer>[] gradeRange(List<Integer> staNoList,List<BasDevpPosition> basDevpPositions) {
+    public static List<Integer>[] gradeRange(List<Integer> staNoList, List<BasDevpPosition> basDevpPositionList, boolean itSmall) {
         List<Integer>[] avoidRangeArray = new ArrayList[2];
 
+        Integer[] rangeList = new Integer[staNoList.size()];
+        List<Integer> rangeList1 = new ArrayList<>();
+        List<Integer> rangeList2 = new ArrayList<>();
 
+        int i = 0;
+        for (BasDevpPosition basDevpPosition : basDevpPositionList) {
+            for (Integer staNo : staNoList) {
+                if (basDevpPosition.getDevNo().equals(staNo)) {
+                    rangeList[i] = staNo;
+                    i = i + 1;
+                    break;
+                }
+            }
+        }
+        boolean sign = true;
+        for (int j = 0; j < rangeList.length; j++) {
+            if (itSmall) {
+                if (sign) {
+                    rangeList1.add(rangeList[j]);
+                } else {
+                    rangeList2.add(rangeList[j]);
+                }
+                if (sign && j >= rangeList.length / 2) {
+                    sign = false;
+                }
+            } else {
+                if (sign && j >= rangeList.length / 2) {
+                    sign = false;
+                }
+                if (sign) {
+                    rangeList1.add(rangeList[j]);
+                } else {
+                    rangeList2.add(rangeList[j]);
+                }
+            }
+        }
 
-
-
-
+        avoidRangeArray[0] = rangeList1;
+        avoidRangeArray[1] = rangeList2;
         return avoidRangeArray;
     }
 
 
-
-
     //鑾峰彇鍦ㄨ寖鍥寸殑绔欑偣
-    public static List<Integer> belongToRange(List<Integer> staNoList,Long position,List<BasDevpPosition> basDevpPositions){
+    public static List<Integer> belongToRange(List<Integer> staNoList, Long[] avoid, List<BasDevpPosition> basDevpPositions) {
         List<Integer> siteList = new ArrayList<>();
+
+        for (BasDevpPosition basDevpPosition : basDevpPositions) {
+            if (new TrackRangeUtils().avoidRange(basDevpPosition.getPlcPosition(), avoid)) {
+                for (Integer staNo : staNoList) {
+                    if (basDevpPosition.getDevNo().equals(staNo)) {
+                        siteList.add(staNo);
+                        break;
+                    }
+                }
+            }
+        }
 
         return siteList;
     }
 
     //鎻愬彇绔欑偣闆嗗悎
-    public static List<Integer> BasDevpPositionExtractSites(List<BasDevpPosition> basDevpPositions){
+    public static List<Integer> BasDevpPositionExtractSites(List<BasDevpPosition> basDevpPositions) {
         List<Integer> siteList = new ArrayList<>();
-        for (BasDevpPosition basDevpPosition : basDevpPositions){
-            if (!siteList.contains(basDevpPosition.getDevNo())){
+        for (BasDevpPosition basDevpPosition : basDevpPositions) {
+            if (!siteList.contains(basDevpPosition.getDevNo())) {
                 siteList.add(basDevpPosition.getDevNo());
             }
         }
         return siteList;
     }
 
-    //鎻愬彇绔欑偣闆嗗悎
-    public static List<Integer> SortNearby(List<Integer> staNoList,Long rgvNowPos,List<BasDevpPosition> basDevpPositions){
+    //鎻愬彇绔欑偣闆嗗悎//灏辫繎鎺掑簭
+    public static List<Integer> SortNearby(List<Integer> staNoList, Long rgvNowPos, List<BasDevpPosition> basDevpPositionList) {
         List<Integer> siteList = new ArrayList<>();
+
+        List<BasDevpPosition> basDevpPositions = devpNoSort(basDevpPositionList, rgvNowPos);
+        for (BasDevpPosition basDevpPosition : basDevpPositions) {
+            for (Integer staNo : staNoList) {
+                if (basDevpPosition.getDevNo().equals(staNo)) {
+                    siteList.add(staNo);
+                    break;
+                }
+            }
+        }
+
 
         return siteList;
     }
 
+    //绔欑偣杩囨护
+    public static List<BasDevpPosition> devpNoSort(List<BasDevpPosition> devpPositionList, Long rgvNowPos) {
 
+        List<BasDevpPosition> basDevpPositions = new ArrayList<>();
+        List<BasDevpPosition> basDevpPositionSort = new ArrayList<>();
+        ArrayList<Long> arrayList = new ArrayList<>();
+        for (BasDevpPosition basDevpPosition : devpPositionList) {
+            long position = Math.abs(basDevpPosition.getPlcPosition() - rgvNowPos);
+            BasDevpPosition devpPosition = new BasDevpPosition(basDevpPosition, position);
+            basDevpPositions.add(devpPosition);
+            arrayList.add(position);
+        }
+        Collections.sort(arrayList); // 鍗囧簭鎺掑簭
+        for (Long position : arrayList) {
+            for (BasDevpPosition basDevpPosition : basDevpPositions) {
+                if (basDevpPosition.getPlcPosition().equals(position)) {
+                    basDevpPositionSort.add(basDevpPosition);
+                    break;
+                }
+            }
+        }
+        return basDevpPositionSort;
+    }
 
     //妫�娴嬫槸鍚﹀湪鑼冨洿
-    public static boolean CheckIfItIsWithinTheRange(List<Integer> staNoList,Integer staNo,List<BasDevpPosition> basDevpPositions){
+    public static boolean CheckIfItIsWithinTheRange(List<Integer> staNoList, Long staNoNowPos, List<BasDevpPosition> basDevpPositionList, boolean itSmall) {
         List<Integer> siteList = new ArrayList<>();
-        if (staNoList.isEmpty()){
-            return true;
+
+
+        Integer[] rangeList = new Integer[staNoList.size()];
+        int i = 0;
+        for (BasDevpPosition basDevpPosition : basDevpPositionList) {
+            for (Integer staNo : staNoList) {
+                if (basDevpPosition.getDevNo().equals(staNo)) {
+                    rangeList[i] = staNo;
+                    i = i + 1;
+                    break;
+                }
+            }
         }
 
-        return false;
+        if (itSmall) {
+            return staNoNowPos <= rangeList[rangeList.length - 1];
+        }
+        return staNoNowPos >= rangeList[0];
+    }
+
+    public static long absoluteDifference(Long a, Long b) {
+        if (a == null || b == null) {
+            a = 0L;
+            b = 0L;
+//            throw new IllegalArgumentException("");
+            System.out.println("a or b is null");
+        }
+        return Math.abs(a - b);
     }
 
 }
diff --git a/src/main/java/com/zy/asrs/utils/TrackRangeUtils.java b/src/main/java/com/zy/asrs/utils/TrackRangeUtils.java
index 2be2744..35648dc 100644
--- a/src/main/java/com/zy/asrs/utils/TrackRangeUtils.java
+++ b/src/main/java/com/zy/asrs/utils/TrackRangeUtils.java
@@ -23,7 +23,7 @@
         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
 
         RgvProtocol rgvProtocolE, rgvProtocolB;
-        if (rgvProtocol.getRgvPos() < rgvProtocolOther.getRgvPos()) {
+        if (IsItSmall(slave)) {
             rgvProtocolE = rgvProtocolOther;
             rgvProtocolB = rgvProtocol;
         } else {
@@ -42,6 +42,38 @@
 
     }
 
+    public Long[][] avoidRangeArr(RgvSlave slave, Long trackEntireLength, Long trackBenchmark, Long avoidDistance) {
+        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
+        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
+
+        RgvProtocol rgvProtocolE, rgvProtocolB;
+        if (IsItSmall(slave)) {
+            rgvProtocolE = rgvProtocolOther;
+            rgvProtocolB = rgvProtocol;
+
+            long entireLength = rgvProtocolE.getRgvPosDestination() - rgvProtocolE.getCarBodyJiaoMing() - avoidDistance - rgvProtocolB.getCarBodyKunPeng();
+            long benchmark = trackBenchmark + rgvProtocolB.getCarBodyJiaoMing();
+
+            long entireLengthOther = trackEntireLength - rgvProtocolE.getCarBodyKunPeng();
+            long benchmarkOther = rgvProtocolB.getRgvPosDestination() + rgvProtocolB.getCarBodyKunPeng() + avoidDistance + rgvProtocolE.getCarBodyJiaoMing();
+
+            return new Long[][]{new Long[]{entireLength, benchmark}, new Long[]{entireLengthOther, benchmarkOther}};
+
+        } else {
+            rgvProtocolE = rgvProtocol;
+            rgvProtocolB = rgvProtocolOther;
+
+            long entireLength = trackEntireLength - rgvProtocolE.getCarBodyKunPeng();
+            long benchmark = rgvProtocolB.getRgvPosDestination() + rgvProtocolB.getCarBodyKunPeng() + avoidDistance + rgvProtocolE.getCarBodyJiaoMing();
+
+            long entireLengthOther = rgvProtocolE.getRgvPosDestination() - rgvProtocolE.getCarBodyJiaoMing() - avoidDistance - rgvProtocolB.getCarBodyKunPeng();
+            long benchmarkOther = trackBenchmark + rgvProtocolB.getCarBodyJiaoMing();
+
+            return new Long[][]{new Long[]{entireLength, benchmark}, new Long[]{entireLengthOther, benchmarkOther}};
+        }
+
+    }
+
     public boolean avoidRange(Long avoid, Long[] range) {
         return avoid < range[0] && avoid > range[1];
     }

--
Gitblit v1.9.1