From 0aec881174d2e6094adb9f173133ffda2da424d5 Mon Sep 17 00:00:00 2001
From: L <L@132>
Date: 星期二, 20 一月 2026 14:46:36 +0800
Subject: [PATCH] *
---
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 80 ++++++++++++++++++-
src/main/java/com/zy/asrs/utils/TrackUtils.java | 127 +++++++++++++++++++++++++++++++
2 files changed, 201 insertions(+), 6 deletions(-)
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 cf2b3a9..52e7a36 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2043,6 +2043,16 @@
}
return null;
}
+ public TaskWrk deviceDetectionGetWrkNo(RgvSlave.RgvStn inSta) {
+
+ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId());
+ StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
+ if (staProtocol == null || Cools.isEmpty(staProtocol.getWorkNo())) {
+ return null;
+ }
+ TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo());
+ return taskWrk;
+ }
public boolean deviceDetection(RgvSlave.RgvStn inSta,Integer rgvNo) {
ArrayList<Integer> arrayList = new ArrayList<Integer>() {{
add(1009);
@@ -2122,10 +2132,12 @@
}
List<TaskWrk> taskWrkList = new ArrayList<>();
List<Integer> staList = new ArrayList<>();
+ List<String> taskNoList = taskStartRepel();
for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()) {
TaskWrk taskWrk = deviceDetection(inSta);
if (taskWrk != null) {
if (taskWrk.getWrkNo().toString().equals(taskNoNow)) continue;
+ if (!taskNoList.contains(taskWrk.getWrkNo().toString())) continue;
taskWrkList.add(taskWrk);
staList.add(inSta.getStaNo());
}
@@ -2157,9 +2169,10 @@
if (rgvOtherIDLEOther(rgvSlave)){
if (!rgvOtherIDLE(rgvSlave,staList.get(0))){
System.out.println("绌洪棽灏辫繎璺宠繃==="+rgvSlave.getId()+"===");
- RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"绌洪棽灏辫繎璺宠繃");
-
- sign=true;
+ if (itSmall){
+ RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"绌洪棽灏辫繎璺宠繃");
+ sign=true;
+ }
}
}
if (sign){
@@ -2238,9 +2251,10 @@
if (rgvOtherIDLEOther2(rgvSlave)){
if (!rgvOtherIDLE2(rgvSlave,staList.get(0))){
System.out.println("杩愯灏辫繎璺宠繃==="+rgvSlave.getId()+"===");
- RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"杩愯灏辫繎璺宠繃");
-
- sign=true;
+ if (itSmall){
+ RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"杩愯灏辫繎璺宠繃");
+ sign=true;
+ }
}
}
if (sign){
@@ -2443,6 +2457,60 @@
}
}
+ public List<String> taskStartRepel() {
+ ArrayList<String> arrayListOld = new ArrayList<>();
+ ArrayList<String> arrayListNew = new ArrayList<>();
+ ArrayList<Integer> arrayListAllP = new ArrayList<>();
+ ArrayList<Long[]> arrayListAll = new ArrayList<>();
+ for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
+ try{
+ String taskNoNow = rgvOtherTaskWrk(rgvSlave);
+ if (!arrayListOld.contains(taskNoNow)){
+ arrayListOld.add(taskNoNow);
+ }
+ } catch (Exception e) {
+ }
+ }
+ for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
+ if (rgvDetection(rgvSlave)) {
+ for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
+ TaskWrk taskWrk = deviceDetectionGetWrkNo(rgvStn);
+ if (taskWrk != null) {
+ if (!arrayListAllP.contains(taskWrk.getWrkNo())) {
+ arrayListAllP.add(taskWrk.getWrkNo());
+ BasDevpPosition basDevpPositionSta = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStn.getStaNo()));
+ BasDevpPosition basDevpPositionEnd = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint())));
+ Long[] longList = {taskWrk.getWrkNo().longValue(),basDevpPositionSta.getPlcPosition(),basDevpPositionEnd.getPlcPosition()};
+ arrayListAll.add(longList);
+ }
+ }
+ }
+ }
+ }
+ List<Long[]> crossingPathsW = TrackUtils.findCrossingPathsW(arrayListAll);
+ List<Long> wrkNoList = new ArrayList<>();
+ List<Long> signWrk = new ArrayList<>();
+ for (Long[] longList : crossingPathsW) {
+ if (!wrkNoList.contains(longList[0]) && !signWrk.contains(longList[0])) {
+ if (!wrkNoList.contains(longList[1]) && !signWrk.contains(longList[1])) {
+ wrkNoList.add(longList[0]);
+ }
+ }
+ signWrk.add(longList[0]);
+ signWrk.add(longList[1]);
+ }
+ for (Integer str : arrayListAllP) {
+ if (!signWrk.contains(str.longValue())) {
+ arrayListNew.add(str.toString());
+ }
+ }
+ for (Long wrk : wrkNoList) {
+ arrayListNew.add(wrk.toString());
+ }
+
+ return arrayListNew;
+ }
+
//鑾峰彇璧风偣涓庣粓鐐瑰璞�
public RgvSlave.RgvStn getRgvStnNow(RgvSlave rgvSlave, Integer staNo) {
for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
diff --git a/src/main/java/com/zy/asrs/utils/TrackUtils.java b/src/main/java/com/zy/asrs/utils/TrackUtils.java
new file mode 100644
index 0000000..39bdb43
--- /dev/null
+++ b/src/main/java/com/zy/asrs/utils/TrackUtils.java
@@ -0,0 +1,127 @@
+package com.zy.asrs.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class TrackUtils {
+
+ public static void main(String[] args) {
+ // 妯℃嫙鏁版嵁
+ ArrayList<Long[]> arrayListAll = new ArrayList<>();
+ arrayListAll.add(new Long[]{999L, 100L, 500L}); // 鏂瑰悜: 100鈫�500
+// arrayListAll.add(new Long[]{998L, 600L, 400L}); // 鏂瑰悜: 600鈫�400 (鍙嶅悜)
+// arrayListAll.add(new Long[]{1000L, 400L, 700L}); // 鏂瑰悜: 600鈫�400 (鍙嶅悜)
+// arrayListAll.add(new Long[]{996L, 10L, 50L}); // 鏂瑰悜: 100鈫�500
+// arrayListAll.add(new Long[]{995L, 15L, 60L}); // 鏂瑰悜: 150鈫�600
+
+ // 鎵惧嚭鎵�鏈変氦鍙夌殑鏁版嵁瀵�
+ List<CrossPair> crossPairs = findCrossingPaths(arrayListAll);
+
+ // 鎵撳嵃缁撴灉
+ System.out.println("浜ゅ弶鐨勮矾寰勫锛�");
+ crossPairs.forEach(pair ->
+ System.out.println(pair.path1[0] + " (" + pair.path1[1] + "鈫�" + pair.path1[2] +
+ ") 涓� " + pair.path2[0] + " (" + pair.path2[1] + "鈫�" + pair.path2[2] + ") 浜ゅ弶"));
+ }
+
+ /**
+ * 鎵惧嚭鎵�鏈変氦鍙夌殑璺緞瀵�
+ * 浜ゅ弶鏉′欢锛�
+ * 1. 鏂瑰悜涓嶅悓 (璧风偣<缁堢偣 vs 璧风偣>缁堢偣)
+ * 2. 璺緞鏈夐噸鍙�
+ */
+ public static List<Long[]> findCrossingPathsW(ArrayList<Long[]> paths) {
+ if (paths == null || paths.size() <2){
+ return new ArrayList<>();
+ }
+ List<CrossPair> crossPairs = findCrossingPaths(paths);
+ List<Long[]> arrayListAll = new ArrayList<>();
+ for (CrossPair crossPair : crossPairs) {
+ arrayListAll.add(new Long[]{crossPair.path1[0], crossPair.path1[1]});
+ }
+ return arrayListAll;
+ }
+ public static List<CrossPair> findCrossingPaths(ArrayList<Long[]> paths) {
+ List<CrossPair> crossPairs = new ArrayList<>();
+
+ // 鑾峰彇鎵�鏈夎矾寰�
+ List<Long[]> pathList = new ArrayList<>(paths);
+
+ // 浣跨敤Java 8 Stream API姣旇緝鎵�鏈夎矾寰勫
+ crossPairs = pathList.stream()
+ .flatMap(path1 ->
+ pathList.stream()
+ .filter(path2 -> !path1[0].equals(path2[0])) // 鎺掗櫎鑷韩
+ .filter(path2 -> isOppositeDirection(path1, path2)) // 鏂瑰悜涓嶅悓
+ .filter(path2 -> isOverlapping(path1, path2)) // 鏈夐噸鍙�
+ .map(path2 -> new CrossPair(path1, path2))
+ )
+ .distinct() // 鍘婚噸 (A-B 鍜� B-A 瑙嗕负鍚屼竴瀵�)
+ .collect(Collectors.toList());
+
+ return crossPairs;
+ }
+
+ /**
+ * 鍒ゆ柇涓ゆ潯璺緞鏂瑰悜鏄惁鐩稿弽
+ */
+ private static boolean isOppositeDirection(Long[] path1, Long[] path2) {
+ long start1 = path1[1];
+ long end1 = path1[2];
+ long start2 = path2[1];
+ long end2 = path2[2];
+
+ // 鍒ゆ柇鏂瑰悜锛歵rue琛ㄧず姝e悜(start<end)锛宖alse琛ㄧず鍙嶅悜(start>end)
+ boolean direction1 = start1 < end1;
+ boolean direction2 = start2 < end2;
+
+ return direction1 != direction2;
+ }
+
+ /**
+ * 鍒ゆ柇涓ゆ潯璺緞鏄惁鏈夐噸鍙�
+ */
+ private static boolean isOverlapping(Long[] path1, Long[] path2) {
+ long start1 = Math.min(path1[1], path1[2]); // 瀹為檯璧风偣(杈冨皬鍊�)
+ long end1 = Math.max(path1[1], path1[2]); // 瀹為檯缁堢偣(杈冨ぇ鍊�)
+ long start2 = Math.min(path2[1], path2[2]);
+ long end2 = Math.max(path2[1], path2[2]);
+
+ // 妫�鏌ュ尯闂存槸鍚︽湁閲嶅彔
+ return !(end1 <= start2 || end2 <= start1);
+ }
+
+ /**
+ * 杈呭姪绫伙紝鐢ㄤ簬琛ㄧず浜ゅ弶鐨勮矾寰勫
+ */
+ static class CrossPair {
+ Long[] path1;
+ Long[] path2;
+
+ CrossPair(Long[] path1, Long[] path2) {
+ // 淇濊瘉瀛樺偍椤哄簭涓�鑷达紝渚夸簬鍘婚噸
+ if (path1[0] < path2[0]) {
+ this.path1 = path1;
+ this.path2 = path2;
+ } else {
+ this.path1 = path2;
+ this.path2 = path1;
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (!(obj instanceof CrossPair)) return false;
+ CrossPair other = (CrossPair) obj;
+ return this.path1[0].equals(other.path1[0]) &&
+ this.path2[0].equals(other.path2[0]);
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * path1[0].hashCode() + path2[0].hashCode();
+ }
+ }
+}
--
Gitblit v1.9.1