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