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 | 146 +++++++++++++++++++++++++++---------------------
1 files changed, 82 insertions(+), 64 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 8de616a..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;
@@ -142,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;
// }
//
@@ -165,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;
@@ -180,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;
}
}
@@ -201,8 +203,8 @@
// 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;
}
@@ -232,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();
@@ -247,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);
@@ -264,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;
}
@@ -274,16 +279,17 @@
}
}
- mapService.lockPath(null, pathList, agv.getUuid());
-
// startTime = System.currentTimeMillis();
- mainService.generateAction(segment.getAgvId(), segmentList, pathList, now);
+ 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);
}
}
@@ -295,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<>();
@@ -332,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();
}
@@ -340,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();
}
}
@@ -349,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);
@@ -439,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()
+// );
}
}
@@ -479,12 +485,12 @@
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
@@ -496,7 +502,7 @@
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