From 70930071a49190f414c8d8bc9c9e9795a4096739 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期一, 23 三月 2026 16:08:27 +0800
Subject: [PATCH] Merge branch 'refs/heads/rcs_master' into jdxaj

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java |  154 ++++++++++++++++++++++++++++----------------------
 1 files changed, 86 insertions(+), 68 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 775f301..d47d5a2 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,6 +9,7 @@
 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;
@@ -26,6 +27,7 @@
 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;
@@ -96,7 +98,6 @@
 
             Travel travel = travelService.getById(segment.getTravelId());
             Agv agv = agvService.getById(travel.getAgvId());
-            AgvDetail agvDetail = agvDetailService.selectByAgvId(travel.getAgvId());
             long endNode = segment.getEndNode();
 
             // valid ----------------------------------------------------
@@ -143,14 +144,14 @@
 //                            }
 //                        }
 //                        if (null == endCode) {
-//                            log.warn("AGV[{}] failed to search destination锛宼here hadn't any idle funSta锛孴askTypeType锛歿}", segment.getAgvId(), FuncStaType.STANDBY);
+//                            News.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)) {
-//                            log.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
+//                            News.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
 //                            return;
 //                        }
 //
@@ -166,7 +167,7 @@
 //                        insertSeg.setState(SegmentStateType.WAITING.toString());
 //                        insertSeg.setMemo(MapDataConstant.RESOLVE_DEADLOCK);
 //                        if (!segmentService.save(insertSeg)) {
-//                            log.error("Segment [{}] failed to save 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
+//                            News.error("Segment [{}] failed to save 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
 //                            return;
 //                        }
 //                        return;
@@ -181,7 +182,7 @@
             if (!Cools.isEmpty(waitingSegList)) {
                 for (Segment waitingSeg : waitingSegList) {
                     if (!waitingSeg.getId().equals(segment.getId())) {
-//                        log.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid());
+//                        News.error("AGV[{}] 浠诲姟寮傚父锛屾湇鍔″櫒閿欒锛侊紒锛�", agv.getUuid());
                         return;
                     }
                 }
@@ -202,15 +203,15 @@
             //        ArrayList<List<TaskPosDto>> list = JSON.parseObject(travel.getTaskContent(), new TypeReference<ArrayList<List<TaskPosDto>>>() {});
 
             // * sync wave scope
-            if (!avoidWaveCalculator.calcWaveScope()) {
-                log.error("failed to calculate avoid wave matrix ...");
+            if (!avoidWaveCalculator.calcWaveScope(agvModelService.getByAgvId(agv.getId()))) {
+                News.error("failed to calculate avoid wave matrix ...");
                 return;
             }
 
             // checkout path
-            Code startCode = codeService.getCacheById(agvDetail.getRecentCode());
+            Code startCode = agvDetailService.getCurrentCode(travel.getAgvId());
             Code endCode = codeService.getCacheById(endNode);
-            long startTime = System.currentTimeMillis();
+//            long startTime = System.currentTimeMillis();
             List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment);
 //            System.out.println("checkoutPath: " + (System.currentTimeMillis() - startTime));
             if (Cools.isEmpty(pathList)) {
@@ -233,7 +234,7 @@
                 segment.setState(SegmentStateType.INIT.toString());
                 segment.setUpdateTime(now);
                 if (!segmentService.updateById(segment)) {
-                    log.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
+                    News.error("Segment [{}] failed to update 锛侊紒锛�", segment.getGroupId() + " - " + segment.getSerial());
                 }
                 segmentList.clear();
 
@@ -248,7 +249,7 @@
                 insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString());
                 insertSeg.setState(SegmentStateType.WAITING.toString());
                 if (!segmentService.save(insertSeg)) {
-                    log.error("Segment [{}] failed to save 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
+                    News.error("Segment [{}] failed to save 锛侊紒锛�", insertSeg.getTravelId() + " - " + insertSeg.getSerial());
                 }
                 segmentList.add(insertSeg);
 
@@ -265,8 +266,11 @@
                         interrupt = true;
                     } else {
                         if (nextStep.getEndNode() == endNode) {
-
-                            segmentList.add(nextStep);
+                            // remove sta action seg
+                            if (!nextStep.getPosType().equals(TaskPosDto.PosType.ORI_STA.toString())
+                                    && !nextStep.getPosType().equals(TaskPosDto.PosType.DEST_STA.toString())) {
+                                segmentList.add(nextStep);
+                            }
                         } else {
                             interrupt = true;
                         }
@@ -275,16 +279,17 @@
                 }
             }
 
-            mapService.lockPath(null, pathList, agv.getUuid());
-
-            startTime = System.currentTimeMillis();
-            mainService.generateAction(segment.getAgvId(), segmentList, pathList, now);
+//            startTime = System.currentTimeMillis();
+            List<PathDto> pathDtoList = mainService.generateAction(segment.getAgvId(), segmentList, pathList, now);
 //            System.out.println("generateAction: " + (System.currentTimeMillis() - startTime));
 
+            mapService.lockPath(null, pathDtoList, agv.getUuid());
+
         } catch (Exception e) {
-            log.error("TrafficService.trigger", e);
+            News.error("TrafficService.trigger", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 
+            throw new RuntimeException("trigger method caught an exception", e);
         }
     }
 
@@ -296,7 +301,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(unfinishedOriginJamByCurrAgv);
+        List<String> blackPath = this.getBlackPathList(agvNo, unfinishedOriginJamByCurrAgv);
 
         // 缁撴灉闆�
         List<String> pathList = new ArrayList<>();
@@ -333,7 +338,7 @@
 
                     boolean hasUnavoidableBlocks = blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable());
                     if (hasUnavoidableBlocks && pathList.size() <= MapDataConstant.MIN_SLICE_PATH_LENGTH) {
-                        log.info("AGV[{}] waiting in place, because the path list is too short...", agvNo);
+//                        News.info("AGV[{}] waiting in place, because the path list is too short...", agvNo);
                         pathList.clear();
                     }
 
@@ -341,7 +346,7 @@
                             blockVehicleDto -> null != jamService.getCycleJam(agv.getId(), segment.getId(), blockVehicleDto.getVehicle())
                     );
                     if (hasCycleJam) {
-                        log.info("AGV[{}] waiting in place, because has cycle jam...", agvNo);
+                        News.info("AGV[{}] waiting in place, because has cycle jam...", agvNo);
                         pathList.clear();
                     }
                 }
@@ -350,7 +355,7 @@
             } else {
 
                 if (Cools.isEmpty(blockVehicleList)) {
-                    log.warn("AGV[{}] can't reach to code: {}, because there is too many vehicle in the lane...", agvNo, endCode.getData());
+                    News.warn("AGV[{}] can't reach to code: {}, because there is too many vehicle in the lane...", agvNo, endCode.getData());
                 } else {
 
                     assert !Cools.isEmpty(blockVehicleList);
@@ -440,14 +445,14 @@
 
                                 pathList = lockPathList;
                             } else {
-                                log.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}"
+                                News.error("{}鍙疯溅杈嗘绱{}] ===>> [{}]璺緞澶辫触锛屽師鍥狅細{}"
                                         , agvNo, startCode.getData(), endCode.getData(), "璺緞闃诲瓒呮椂");
                             }
                         } else {
-                            log.warn("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�"
-                                    , agvNo
-                                    , blockVehicleList.stream().map(BlockVehicleDto::getVehicle).collect(Collectors.toList()).toString()
-                            );
+//                            News.warn("{}鍙疯溅杈嗘鍦ㄧ瓑寰呬氦閫氬牭濉烇紝闃诲杞﹁締锛氥�恵}銆�"
+//                                    , agvNo
+//                                    , blockVehicleList.stream().map(BlockVehicleDto::getVehicle).collect(Collectors.toList()).toString()
+//                            );
                         }
                     }
 
@@ -480,23 +485,24 @@
                             previousJam.setState(JamStateType.DEPRECATED.toString());
                             previousJam.setUpdateTime(now);
                             if (!jamService.updateById(previousJam)) {
-                                log.error("Jam[{}] failed to update锛侊紒锛�", previousJam.getUuid());
+                                News.error("Jam[{}] failed to update锛侊紒锛�", previousJam.getUuid());
                             }
                         }
                     }
                 } else {
-                    log.error("Jam[{}] failed to update锛侊紒锛�", jam.getUuid());
+                    News.error("Jam[{}] failed to update锛侊紒锛�", jam.getUuid());
                 }
             }
             // deal expired jam
             for (Jam expiredJam : jamService.list(new LambdaQueryWrapper<Jam>()
                     .eq(Jam::getJamAgv, agv.getId())
+                    .ne(Jam::getCycleAvo, 1)
                     .eq(Jam::getState, JamStateType.RUNNING.toString()))) {
                 expiredJam.setEndTime(now);
                 expiredJam.setUpdateTime(now);
                 expiredJam.setState(JamStateType.DEPRECATED.toString());
                 if (!jamService.updateById(expiredJam)) {
-                    log.error("Jam[{}] failed to update锛侊紒锛�", expiredJam.getUuid());
+                    News.error("Jam[{}] failed to update锛侊紒锛�", expiredJam.getUuid());
                 }
             }
 
@@ -547,7 +553,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()))) {
-            log.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝瀛樺湪杩涜涓换鍔★紒锛侊紒", agvNo);
+            News.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝瀛樺湪杩涜涓换鍔★紒锛侊紒", agvNo);
             return false;
         }
 
@@ -557,7 +563,7 @@
         assert avoidPathList.size() >= 2;
         RetreatNavigateNode finalNode = retreatNavigateService.execute(agvNo, startNode, avoidPathList, sponsor, jam);
         if (null == finalNode) {
-            log.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝妫�绱㈤伩璁╃偣澶辫触锛侊紒锛�", agvNo);
+            News.warn("{}鍙疯溅杈嗛伩璁╁け璐ワ紝妫�绱㈤伩璁╃偣澶辫触锛侊紒锛�", agvNo);
             return false;
         }
 
@@ -568,7 +574,7 @@
         if (!Cools.isEmpty(waitingSegList)) {
 
             if (waitingSegList.size() > 1) {
-                log.error("閬胯閫氱煡澶辫触锛寋}鍙疯溅杈嗗瓨鍦ㄥ涓瓑寰呬腑鐨凷egment锛侊紒锛�", agvNo);
+                News.error("閬胯閫氱煡澶辫触锛寋}鍙疯溅杈嗗瓨鍦ㄥ涓瓑寰呬腑鐨凷egment锛侊紒锛�", agvNo);
                 return false;
             }
             // revert
@@ -577,7 +583,7 @@
                 seg.setState(SegmentStateType.INIT.toString());
                 seg.setUpdateTime(now);
                 if (!segmentService.updateById(seg)) {
-                    log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", seg.getTravelId() + " - " + seg.getSerial());
+                    News.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", seg.getTravelId() + " - " + seg.getSerial());
                 }
             }
             Segment segment = waitingSegList.get(0);
@@ -592,7 +598,7 @@
             insertSeg.setPosType(TaskPosDto.PosType.MOVE.toString());
             insertSeg.setState(SegmentStateType.WAITING.toString());
             if (!segmentService.save(insertSeg)) {
-                log.error("Segment [{}] 淇濆瓨澶辫触 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
+                News.error("Segment [{}] 淇濆瓨澶辫触 锛侊紒锛�", segment.getTravelId() + " - " + segment.getSerial());
                 return false;
             } else {
                 jam.setAvoSeg(insertSeg.getId());
@@ -618,13 +624,13 @@
             jam.setStartTime(new Date());
             jam.setState(JamStateType.RUNNING.toString());
             if (!jamService.save(jam)) {
-                log.error("AGV[{}] failed to save jam", agv.getUuid());
+                News.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)) {
-                log.error("AGV[{}] failed to update jam", agv.getUuid());
+                News.error("AGV[{}] failed to update jam", agv.getUuid());
             }
         }
         return jam;
@@ -634,7 +640,7 @@
         originJam.setUpdateTime(new Date());
         originJam.setState(JamStateType.FINISH.toString());
         if (!jamService.updateById(originJam)) {
-            log.error("Jam[{}] failed to update", originJam.getUuid());
+            News.error("Jam[{}] failed to update", originJam.getUuid());
             return originJam;
         } else {
             return this.createOrUpdateJam(
@@ -647,43 +653,47 @@
         }
     }
 
-    private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) {
+    private List<String> getBlackPathList(String agvNo, List<Jam> unfinishedOriginJamByCurrAgv) {
         List<String> blackPathList = new ArrayList<>();
         Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV;
-        if (!Cools.isEmpty(unfinishedOriginJamByCurrAgv)) {
-            for (Jam jam : unfinishedOriginJamByCurrAgv) {
-                if (!Cools.isEmpty(jam.getJamPath())) {
+        if (Cools.isEmpty(unfinishedOriginJamByCurrAgv)) {
+            return blackPathList;
+        }
 
-                    List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class);
+        AgvModel agvModel = agvModelService.getByAgvNo(agvNo);
+        double bufferRadius = MapDataUtils.buildFootprint(agvModel).maxExtent();
 
-                    Agv jamAgv = agvService.getById(jam.getJamAgv());
-                    List<String> jamDynamicNodes = mapService.queryCodeListFromDynamicNode(lev, jamAgv.getUuid());
-                    // jamDynamicNodes has sorted
-                    String firstCodeNode = jamDynamicNodes.stream().findFirst().orElse(null);
+        for (Jam jam : unfinishedOriginJamByCurrAgv) {
+            if (!Cools.isEmpty(jam.getJamPath())) {
 
-                    if (!Cools.isEmpty(firstCodeNode)) {
-                        int idx = list.indexOf(firstCodeNode);
-                        if (idx != -1) {
-                            list = new ArrayList<>(list.subList(idx, list.size()));
+                List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class);
 
-                            // the wave of first node
-                            Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(
-                                    agvModelService.getById(jamAgv.getAgvModel()).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<>();
-                        }
+                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<>();
                     }
-
-                    blackPathList.addAll(list);
                 }
+
+                blackPathList.addAll(list);
             }
         }
+
         return blackPathList.stream().distinct().collect(Collectors.toList());
     }
 
@@ -693,10 +703,18 @@
             if (!blockVehicleDto.isAvoidable()) {
                 continue;
             }
+            Long agvId = agvService.getAgvId(blockVehicleDto.getVehicle());
             // 褰撳墠vehicle姝e湪杩涜閬胯浣滀笟
-            if (!Cools.isEmpty(jamService.getUnfinishedAvoSegByAvo(blockVehicleDto.getVehicle(), null))) {
+            if (!Cools.isEmpty(jamService.getUnfinishedAvoSegByAvo(agvId, null))) {
                 continue;
             }
+            // 褰撳墠vehicle姝e湪杩涜婊氱瓛杈撻�佺嚎绛夊緟
+            if (travelService.hasRollerWaiting(agvId)) {
+                continue;
+            }
+//            if (segmentService.isRollerWaiting(agvId)) {
+//                continue;
+//            }
             return blockVehicleDto.getVehicle();
         }
         return null;
@@ -726,7 +744,7 @@
             return false;
         }
         if (jamList.size() > 1) {
-            log.error("AvoSeg[id = {}] seg data has exception, result in two jams", avoSeg);
+            News.error("AvoSeg[id = {}] seg data has exception, result in two jams", avoSeg);
         }
         Jam jam = jamList.get(0);
         if (jam.getState().equals(JamStateType.DEPRECATED.toString())) {
@@ -739,4 +757,4 @@
         return false;
     }
 
-}
+}
\ No newline at end of file

--
Gitblit v1.9.1