From f6df128b575bdb9d0f2512b5fa5a126edfce2799 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期二, 05 五月 2026 09:38:27 +0800
Subject: [PATCH] 算法集成

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java |  143 +++++++++++++++++++++++------------------------
 1 files changed, 71 insertions(+), 72 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
index d47d5a2..994eb74 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -9,7 +9,6 @@
 import com.zy.acs.manager.common.utils.MapDataUtils;
 import com.zy.acs.manager.core.constant.MapDataConstant;
 import com.zy.acs.manager.core.domain.BlockVehicleDto;
-import com.zy.acs.manager.core.domain.PathDto;
 import com.zy.acs.manager.core.domain.TaskPosDto;
 import com.zy.acs.manager.core.domain.type.BlockSeverityType;
 import com.zy.acs.manager.core.service.astart.MapDataDispatcher;
@@ -27,7 +26,6 @@
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
-import com.zy.acs.common.utils.News;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -144,14 +142,14 @@
 //                            }
 //                        }
 //                        if (null == endCode) {
-//                            News.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", segment.getAgvId(), FuncStaType.STANDBY);
+//                            log.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", segment.getAgvId(), FuncStaType.STANDBY);
 //                            return;
 //                        }
 //
 //                        segment.setState(SegmentStateType.INIT.toString());
 //                        segment.setUpdateTime(now);
 //                        if (!segmentService.updateById(segment)) {
-//                            News.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
+//                            log.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
 //                            return;
 //                        }
 //
@@ -167,7 +165,7 @@
 //                        insertSeg.setState(SegmentStateType.WAITING.toString());
 //                        insertSeg.setMemo(MapDataConstant.RESOLVE_DEADLOCK);
 //                        if (!segmentService.save(insertSeg)) {
-//                            News.error("Segment [{}] failed to save 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
+//                            log.error("Segment [{}] failed to save 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
 //                            return;
 //                        }
 //                        return;
@@ -182,7 +180,7 @@
             if (!Cools.isEmpty(waitingSegList)) {
                 for (Segment waitingSeg : waitingSegList) {
                     if (!waitingSeg.getId().equals(segment.getId())) {
-//                        News.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid());
+//                        log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid());
                         return;
                     }
                 }
@@ -203,16 +201,21 @@
             //        ArrayList<List<TaskPosDto>> list = JSON.parseObject(travel.getTaskContent(), new TypeReference<ArrayList<List<TaskPosDto>>>() {});
 
             // * sync wave scope
-            if (!avoidWaveCalculator.calcWaveScope(agvModelService.getByAgvId(agv.getId()))) {
-                News.error("failed to calculate avoid wave matrix ...");
-                return;
-            }
+//            if (!avoidWaveCalculator.calcWaveScope(agvModelService.getByAgvId(agv.getId()))) {
+//                log.error("failed to calculate avoid wave matrix ...");
+//                return;
+//            }
 
             // checkout path
             Code startCode = agvDetailService.getCurrentCode(travel.getAgvId());
             Code endCode = codeService.getCacheById(endNode);
 //            long startTime = System.currentTimeMillis();
-            List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment);
+            List<Jam> unfinishedOriginJamByCurrAgv = jamService.getUnfinishedOriginJamByAvo(agv.getId(), startCode.getId(), segment.getId());
+            List<String> blackPath = this.getBlackPathList(unfinishedOriginJamByCurrAgv);
+            List<String> pathList = mapService.checkoutPath(agv.getUuid(), startCode, endCode, false, blackPath, segment);
+
+
+            //List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment);
 //            System.out.println("checkoutPath: " + (System.currentTimeMillis() - startTime));
             if (Cools.isEmpty(pathList)) {
                 return;
@@ -234,7 +237,7 @@
                 segment.setState(SegmentStateType.INIT.toString());
                 segment.setUpdateTime(now);
                 if (!segmentService.updateById(segment)) {
-                    News.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
+                    log.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
                 }
                 segmentList.clear();
 
@@ -249,7 +252,7 @@
                 insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString());
                 insertSeg.setState(SegmentStateType.WAITING.toString());
                 if (!segmentService.save(insertSeg)) {
-                    News.error("Segment [{}] failed to save 锛侊紒锛�", insertSeg.getTravelId() + " - " + insertSeg.getSerial());
+                    log.error("Segment [{}] failed to save 锛侊紒锛�", insertSeg.getTravelId() + " - " + insertSeg.getSerial());
                 }
                 segmentList.add(insertSeg);
 
@@ -279,14 +282,14 @@
                 }
             }
 
+            //mapService.lockPath(null, pathList, agv.getUuid());
+
 //            startTime = System.currentTimeMillis();
-            List<PathDto> pathDtoList = mainService.generateAction(segment.getAgvId(), segmentList, pathList, now);
+            mainService.generateAction(segment.getAgvId(), segmentList, pathList, now);
 //            System.out.println("generateAction: " + (System.currentTimeMillis() - startTime));
 
-            mapService.lockPath(null, pathDtoList, agv.getUuid());
-
         } catch (Exception e) {
-            News.error("TrafficService.trigger", e);
+            log.error("TrafficService.trigger", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 
             throw new RuntimeException("trigger method caught an exception", e);
@@ -301,7 +304,7 @@
         BlockSeverityType blockSeverity = BlockSeverityType.query(null == jam ? null : jam.getDuration());
         // judge avoid of jam 濡傛灉宸茬粡鍦ㄩ伩璁╃偣锛堝洜涓哄綋鍓嶈溅鎵ц浜嗛伩璁╀换鍔★級锛岄偅涔堝垯涓嶈兘鍐嶅幓妫�绱箣鍓嶇殑闃诲璺緞
         List<Jam> unfinishedOriginJamByCurrAgv = jamService.getUnfinishedOriginJamByAvo(agv.getId(), startCode.getId(), segment.getId());
-        List<String> blackPath = this.getBlackPathList(agvNo, unfinishedOriginJamByCurrAgv);
+        List<String> blackPath = this.getBlackPathList(unfinishedOriginJamByCurrAgv);
 
         // 缁撴灉闆�
         List<String> pathList = new ArrayList<>();
@@ -312,7 +315,7 @@
         List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true, blackPath, segment);
 
         if (!Cools.isEmpty(lockPathList) && // 瀛樺湪閬胯瑙�
-            Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10
+                Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10
         ) {
 
             pathList = lockPathList;
@@ -338,7 +341,7 @@
 
                     boolean hasUnavoidableBlocks = blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable());
                     if (hasUnavoidableBlocks && pathList.size() <= MapDataConstant.MIN_SLICE_PATH_LENGTH) {
-//                        News.info("AGV[{}] waiting in place, because the path list is too short...", agvNo);
+                        log.info("AGV[{}] waiting in place, because the path list is too short...", agvNo);
                         pathList.clear();
                     }
 
@@ -346,16 +349,16 @@
                             blockVehicleDto -> null != jamService.getCycleJam(agv.getId(), segment.getId(), blockVehicleDto.getVehicle())
                     );
                     if (hasCycleJam) {
-                        News.info("AGV[{}] waiting in place, because has cycle jam...", agvNo);
+                        log.info("AGV[{}] waiting in place, because has cycle jam...", agvNo);
                         pathList.clear();
                     }
                 }
 
-            // 鏃犲彲璧拌璺緞
+                // 鏃犲彲璧拌璺緞
             } else {
 
                 if (Cools.isEmpty(blockVehicleList)) {
-                    News.warn("AGV[{}] can't reach to code: {}, because there is too many vehicle in the lane...", agvNo, endCode.getData());
+                    log.warn("AGV[{}] can't reach to code: {}, because there is too many vehicle in the lane...", agvNo, endCode.getData());
                 } else {
 
                     assert !Cools.isEmpty(blockVehicleList);
@@ -445,14 +448,14 @@
 
                                 pathList = lockPathList;
                             } else {
-                                News.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}"
+                                log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}"
                                         , agvNo, startCode.getData(), endCode.getData(), "璺緞闃诲瓒呮椂");
                             }
                         } else {
-//                            News.warn("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�"
-//                                    , agvNo
-//                                    , blockVehicleList.stream().map(BlockVehicleDto::getVehicle).collect(Collectors.toList()).toString()
-//                            );
+                            log.warn("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�"
+                                    , agvNo
+                                    , blockVehicleList.stream().map(BlockVehicleDto::getVehicle).collect(Collectors.toList()).toString()
+                            );
                         }
                     }
 
@@ -485,12 +488,12 @@
                             previousJam.setState(JamStateType.DEPRECATED.toString());
                             previousJam.setUpdateTime(now);
                             if (!jamService.updateById(previousJam)) {
-                                News.error("Jam[{}] failed to update锛侊紒锛�", previousJam.getUuid());
+                                log.error("Jam[{}] failed to update锛侊紒锛�", previousJam.getUuid());
                             }
                         }
                     }
                 } else {
-                    News.error("Jam[{}] failed to update锛侊紒锛�", jam.getUuid());
+                    log.error("Jam[{}] failed to update锛侊紒锛�", jam.getUuid());
                 }
             }
             // deal expired jam
@@ -502,7 +505,7 @@
                 expiredJam.setUpdateTime(now);
                 expiredJam.setState(JamStateType.DEPRECATED.toString());
                 if (!jamService.updateById(expiredJam)) {
-                    News.error("Jam[{}] failed to update锛侊紒锛�", expiredJam.getUuid());
+                    log.error("Jam[{}] failed to update锛侊紒锛�", expiredJam.getUuid());
                 }
             }
 
@@ -553,7 +556,7 @@
     private boolean notifyVehicleAvoid(String agvNo, String agvPosCode, List<String> avoidPathList, String sponsor, Jam jam) {
         Long agvId = agvService.getAgvId(agvNo);
         if (!Cools.isEmpty(segmentService.getByAgvAndState(agvId, SegmentStateType.RUNNING.toString()))) {
-            News.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝瀛樺湪杩涜涓换鍔★紒锛侊紒", agvNo);
+            log.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝瀛樺湪杩涜涓换鍔★紒锛侊紒", agvNo);
             return false;
         }
 
@@ -563,7 +566,7 @@
         assert avoidPathList.size() >= 2;
         RetreatNavigateNode finalNode = retreatNavigateService.execute(agvNo, startNode, avoidPathList, sponsor, jam);
         if (null == finalNode) {
-            News.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝妫�绱㈤伩璁╃偣澶辫触锛侊紒锛�", agvNo);
+            log.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝妫�绱㈤伩璁╃偣澶辫触锛侊紒锛�", agvNo);
             return false;
         }
 
@@ -574,7 +577,7 @@
         if (!Cools.isEmpty(waitingSegList)) {
 
             if (waitingSegList.size() > 1) {
-                News.error("閬胯閫氱煡澶辫触锛寋}鍙疯溅杈嗗瓨鍦ㄥ涓瓑寰呬腑鐨凷egment锛侊紒锛�", agvNo);
+                log.error("閬胯閫氱煡澶辫触锛寋}鍙疯溅杈嗗瓨鍦ㄥ涓瓑寰呬腑鐨凷egment锛侊紒锛�", agvNo);
                 return false;
             }
             // revert
@@ -583,7 +586,7 @@
                 seg.setState(SegmentStateType.INIT.toString());
                 seg.setUpdateTime(now);
                 if (!segmentService.updateById(seg)) {
-                    News.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", seg.getTravelId() + " - " + seg.getSerial());
+                    log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", seg.getTravelId() + " - " + seg.getSerial());
                 }
             }
             Segment segment = waitingSegList.get(0);
@@ -598,7 +601,7 @@
             insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString());
             insertSeg.setState(SegmentStateType.WAITING.toString());
             if (!segmentService.save(insertSeg)) {
-                News.error("Segment [{}] 淇濆瓨澶辫触 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
+                log.error("Segment [{}] 淇濆瓨澶辫触 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
                 return false;
             } else {
                 jam.setAvoSeg(insertSeg.getId());
@@ -624,13 +627,13 @@
             jam.setStartTime(new Date());
             jam.setState(JamStateType.RUNNING.toString());
             if (!jamService.save(jam)) {
-                News.error("AGV[{}] failed to save jam", agv.getUuid());
+                log.error("AGV[{}] failed to save jam", agv.getUuid());
                 throw new CoolException("failed to save jam");
             }
         } else {
             jam.setDuration(System.currentTimeMillis() - jam.getStartTime().getTime());
             if (!jamService.updateById(jam)) {
-                News.error("AGV[{}] failed to update jam", agv.getUuid());
+                log.error("AGV[{}] failed to update jam", agv.getUuid());
             }
         }
         return jam;
@@ -640,7 +643,7 @@
         originJam.setUpdateTime(new Date());
         originJam.setState(JamStateType.FINISH.toString());
         if (!jamService.updateById(originJam)) {
-            News.error("Jam[{}] failed to update", originJam.getUuid());
+            log.error("Jam[{}] failed to update", originJam.getUuid());
             return originJam;
         } else {
             return this.createOrUpdateJam(
@@ -653,47 +656,43 @@
         }
     }
 
-    private List<String> getBlackPathList(String agvNo, List<Jam> unfinishedOriginJamByCurrAgv) {
+    private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) {
         List<String> blackPathList = new ArrayList<>();
         Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV;
-        if (Cools.isEmpty(unfinishedOriginJamByCurrAgv)) {
-            return blackPathList;
-        }
+        if (!Cools.isEmpty(unfinishedOriginJamByCurrAgv)) {
+            for (Jam jam : unfinishedOriginJamByCurrAgv) {
+                if (!Cools.isEmpty(jam.getJamPath())) {
 
-        AgvModel agvModel = agvModelService.getByAgvNo(agvNo);
-        double bufferRadius = MapDataUtils.buildFootprint(agvModel).maxExtent();
+                    List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class);
 
-        for (Jam jam : unfinishedOriginJamByCurrAgv) {
-            if (!Cools.isEmpty(jam.getJamPath())) {
+                    Agv jamAgv = agvService.getById(jam.getJamAgv());
+                    List<String> jamDynamicNodes = mapService.queryCodeListFromDynamicNode(lev, jamAgv.getUuid());
+                    // jamDynamicNodes has sorted
+                    String firstCodeNode = jamDynamicNodes.stream().findFirst().orElse(null);
 
-                List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class);
+                    if (!Cools.isEmpty(firstCodeNode)) {
+                        int idx = list.indexOf(firstCodeNode);
+                        if (idx != -1) {
+                            list = new ArrayList<>(list.subList(idx, list.size()));
 
-                String jamAgvNo = agvService.getAgvNo(jam.getJamAgv());
-                List<String> jamDynamicNodes = mapService.queryCodeListFromDynamicNode(lev, jamAgvNo);
-                // jamDynamicNodes has sorted
-                String firstCodeNode = jamDynamicNodes.stream().findFirst().orElse(null);
-
-                if (!Cools.isEmpty(firstCodeNode)) {
-                    int idx = list.indexOf(firstCodeNode);
-                    if (idx != -1) {
-                        list = new ArrayList<>(list.subList(idx, list.size()));
-
-                        // the wave of first node
-                        AgvModel jamAgvModel = agvModelService.getByAgvNo(jamAgvNo);
-                        Double avoidDistance = MapDataUtils.buildFootprint(jamAgvModel).maxExtent() + bufferRadius;
-                        List<String> waveCodeList = mapService.getWaveScopeByCode(lev, firstCodeNode, avoidDistance)
-                                .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList());
-                        list.addAll(waveCodeList);
-                    } else {
-                        // 濡傛灉琚樆濉炶溅杈嗗凡缁忎笉鍦ㄥ師鏉ョ殑闃诲璺緞涓紝鑰冭檻閬胯杞﹁蛋琛屾椂涓嶉渶瑕佹妸涔嬪墠鐨勯樆濉炶矾寰勫姞鍏ラ粦鍚嶅崟
-                        list = new ArrayList<>();
+                            // the wave of first node
+                            Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(
+                                    agvModelService.getByAgvId(jamAgv.getId()).getDiameter(),
+                                    MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR
+                            );
+                            List<String> waveCodeList = mapService.getWaveScopeByCode(lev, firstCodeNode, avoidDistance)
+                                    .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList());
+                            list.addAll(waveCodeList);
+                        } else {
+                            // 濡傛灉琚樆濉炶溅杈嗗凡缁忎笉鍦ㄥ師鏉ョ殑闃诲璺緞涓紝鑰冭檻閬胯杞﹁蛋琛屾椂涓嶉渶瑕佹妸涔嬪墠鐨勯樆濉炶矾寰勫姞鍏ラ粦鍚嶅崟
+                            list = new ArrayList<>();
+                        }
                     }
-                }
 
-                blackPathList.addAll(list);
+                    blackPathList.addAll(list);
+                }
             }
         }
-
         return blackPathList.stream().distinct().collect(Collectors.toList());
     }
 
@@ -744,7 +743,7 @@
             return false;
         }
         if (jamList.size() > 1) {
-            News.error("AvoSeg[id = {}] seg data has exception, result in two jams", avoSeg);
+            log.error("AvoSeg[id = {}] seg data has exception, result in two jams", avoSeg);
         }
         Jam jam = jamList.get(0);
         if (jam.getState().equals(JamStateType.DEPRECATED.toString())) {
@@ -757,4 +756,4 @@
         return false;
     }
 
-}
\ No newline at end of file
+}

--
Gitblit v1.9.1