From 8819606b0442ca27731b07aa4f8b93715a0da8fe Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期日, 01 十二月 2024 19:51:24 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java |  120 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 101 insertions(+), 19 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 11d5fb2..b1afab4 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
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.acs.common.utils.GsonUtils;
+import com.zy.acs.common.utils.Utils;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.framework.common.SnowflakeIdWorker;
 import com.zy.acs.framework.exception.CoolException;
@@ -107,6 +108,13 @@
                 return;
             }
 
+            // deprecate jam
+            if (this.isJamBeDeprecatedByAvo(segment.getId())) {
+                if (this.skipCurrSegment(segment)) {
+                    return;
+                }
+            }
+
             // execute -----------------------------------------------
             //        ArrayList<List<TaskPosDto>> list = JSON.parseObject(travel.getTaskContent(), new TypeReference<ArrayList<List<TaskPosDto>>>() {});
 
@@ -196,7 +204,7 @@
         Date now = new Date();
         Jam jam = jamService.getJam(agv.getId(), startCode.getId(), segment.getId());
         BlockSeverityType blockSeverity = BlockSeverityType.query(null == jam ? null : jam.getDuration());
-        // judge avoid of jam
+        // judge avoid of jam 濡傛灉宸茬粡鍦ㄩ伩璁╃偣锛堝洜涓哄綋鍓嶈溅鎵ц浜嗛伩璁╀换鍔★級锛岄偅涔堝垯涓嶈兘鍐嶅幓妫�绱箣鍓嶇殑闃诲璺緞
         List<Jam> unfinishedOriginJamByCurrAgv = jamService.getUnfinishedOriginJamByAvo(agv.getId(), startCode.getId(), segment.getId());
         List<String> blackPath = this.getBlackPathList(unfinishedOriginJamByCurrAgv);
 
@@ -277,7 +285,7 @@
                         } else {
 
                             // select optimal block vehicle
-                            String blockAgvNo = this.checkoutBestSolutionOfBlocks(blockVehicleList);
+                            String blockAgvNo = this.checkoutBestSolutionOfBlocks(blockVehicleList, segment);
                             if (Cools.isEmpty(blockAgvNo)) {
 
                                 maxJamTimeoutFactor = 2;
@@ -287,6 +295,11 @@
                                 // block vehicle info
                                 Agv blockAgv = agvService.selectByUuid(blockAgvNo);
                                 String blockAgvCode = codeService.getById(agvDetailService.selectByAgvId(blockAgv.getId()).getRecentCode()).getData();
+
+                                // create new jam if already notify the avoid vehicle
+                                if (!Cools.isEmpty(jam.getAvoAgv(), jam.getAvoSeg()) && !blockAgv.getId().equals(jam.getAvoAgv())) {
+                                    jam = this.setupNewJam(jam, agv, startCode, segment, draftPath);
+                                }
 
                                 do {
 
@@ -356,10 +369,32 @@
         if (!Cools.isEmpty(pathList)) {
 
             if (null != jam) {
+                boolean beDeprecate = false;
+                if (blockSeverity.equals(BlockSeverityType.SEVERE) && !Cools.isEmpty(jam.getJamPath())) {
+                    List<String> jamPath = GsonUtils.fromJsonToList(jam.getJamPath(), String.class);
+                    if (!this.comparePathLists(jamPath, pathList)) {    // jamPath >= pathList
+                        beDeprecate = true;
+                    }
+                }
                 jam.setEndTime(now);
                 jam.setUpdateTime(now);
-                jam.setState(JamStateType.FINISH.toString());
-                if (!jamService.updateById(jam)) {
+                jam.setState(beDeprecate ? JamStateType.DEPRECATED.toString() : JamStateType.FINISH.toString());
+                if (jamService.updateById(jam)) {
+                    if (beDeprecate) {
+                        // search previous jam that jamSeg from this segment
+                        List<Jam> previousJams = jamService.list(new LambdaQueryWrapper<Jam>()
+                                .eq(Jam::getJamSeg, segment.getId())
+                                .eq(Jam::getState, JamStateType.FINISH.toString())
+                        );
+                        for (Jam previousJam : previousJams) {
+                            previousJam.setState(JamStateType.DEPRECATED.toString());
+                            previousJam.setUpdateTime(now);
+                            if (!jamService.updateById(previousJam)) {
+                                log.error("Jam[{}] failed to update锛侊紒锛�", previousJam.getUuid());
+                            }
+                        }
+                    }
+                } else {
                     log.error("Jam[{}] failed to update锛侊紒锛�", jam.getUuid());
                 }
             }
@@ -369,7 +404,7 @@
                     .eq(Jam::getState, JamStateType.RUNNING.toString()))) {
                 expiredJam.setEndTime(now);
                 expiredJam.setUpdateTime(now);
-                expiredJam.setState(JamStateType.FINISH.toString());
+                expiredJam.setState(JamStateType.DEPRECATED.toString());
                 if (!jamService.updateById(expiredJam)) {
                     log.error("Jam[{}] failed to update锛侊紒锛�", expiredJam.getUuid());
                 }
@@ -445,7 +480,6 @@
 
         String endCodeData = finalNode.getCodeData();
         Code endCode = codeService.selectByData(endCodeData);
-        jam.setAvoCode(endCode.getId());
 
         List<Segment> waitingSegList = segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString());
         if (!Cools.isEmpty(waitingSegList)) {
@@ -479,6 +513,7 @@
                 return false;
             } else {
                 jam.setAvoSeg(insertSeg.getId());
+                jam.setAvoCode(endCode.getId());
             }
 
         } else {
@@ -512,6 +547,23 @@
         return jam;
     }
 
+    private Jam setupNewJam(Jam originJam, Agv agv, Code startCode, Segment segment, List<String> draftPath) {
+        originJam.setUpdateTime(new Date());
+        originJam.setState(JamStateType.FINISH.toString());
+        if (!jamService.updateById(originJam)) {
+            log.error("Jam[{}] failed to update", originJam.getUuid());
+            return originJam;
+        } else {
+            return this.createOrUpdateJam(
+                    agv
+                    , startCode
+                    , segment
+                    , null
+                    , draftPath
+            );
+        }
+    }
+
     private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) {
         List<String> blackPathList = new ArrayList<>();
         Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV;
@@ -530,16 +582,16 @@
                         int idx = list.indexOf(firstCodeNode);
                         if (idx != -1) {
                             list = new ArrayList<>(list.subList(idx, list.size()));
-                        }
 
-                        // 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);
+                            // 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);
+                        }
                     }
 
                     blackPathList.addAll(list);
@@ -549,18 +601,48 @@
         return blackPathList.stream().distinct().collect(Collectors.toList());
     }
 
-    private String checkoutBestSolutionOfBlocks(List<BlockVehicleDto> blockVehicleList) {
+    private String checkoutBestSolutionOfBlocks(List<BlockVehicleDto> blockVehicleList, Segment segment) {
         assert !Cools.isEmpty(blockVehicleList);
         for (BlockVehicleDto blockVehicleDto : blockVehicleList) {
             if (!blockVehicleDto.isAvoidable()) {
                 continue;
             }
-            // 娌℃湁閬胯涓殑浠诲姟
-            if (Cools.isEmpty(jamService.getUnfinishedAvoSegByAvo(blockVehicleDto.getVehicle(), null))) {
-                return blockVehicleDto.getVehicle();
+            // 褰撳墠vehicle姝e湪杩涜閬胯浣滀笟
+            if (!Cools.isEmpty(jamService.getUnfinishedAvoSegByAvo(blockVehicleDto.getVehicle(), null))) {
+                continue;
             }
+            return blockVehicleDto.getVehicle();
         }
         return null;
     }
 
+    public boolean comparePathLists(List<String> list1, List<String> list2) {
+        if (list1.equals(list2)) {
+            return true;
+        }
+        if (list1.containsAll(list2)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean isJamBeDeprecatedByAvo(Long avoSeg) {
+        return 0 < jamService.count(new LambdaQueryWrapper<Jam>()
+//                .eq(Jam::getAvoAgv, avoAgv)
+                .eq(Jam::getAvoSeg, avoSeg)
+                .eq(Jam::getState, JamStateType.DEPRECATED.toString())
+        );
+    }
+
+    private boolean skipCurrSegment(Segment currSegment) {
+        currSegment.setState(SegmentStateType.FINISH.toString());
+        currSegment.setUpdateTime(new Date());
+        if (!segmentService.updateById(currSegment)) {
+            log.error("Segment [{}] failed to update 锛侊紒锛�", currSegment.getTravelId() + " - " + currSegment.getSerial());
+            return false;
+        }
+        segmentService.processNext(Utils.singletonList(currSegment));
+        return true;
+    }
+
 }

--
Gitblit v1.9.1