From a681fcad83bfcaec7c79a273659c53ba9c5502ae Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期五, 01 十一月 2024 13:37:14 +0800
Subject: [PATCH] #
---
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/ReservedTimeWindow.java | 23 +++++
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java | 83 +++++++++-----------
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java | 15 +++
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java | 84 ++++++++++++++++++--
4 files changed, 149 insertions(+), 56 deletions(-)
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/ReservedTimeWindow.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/ReservedTimeWindow.java
new file mode 100644
index 0000000..b2c751f
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/ReservedTimeWindow.java
@@ -0,0 +1,23 @@
+package com.zy.acs.manager.core.domain;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 11/1/2024
+ */
+@Data
+public class ReservedTimeWindow {
+
+ private String twKey;
+
+ private TimeWindow timeWindow;
+
+ public ReservedTimeWindow() {
+ }
+
+ public ReservedTimeWindow(String twKey, TimeWindow timeWindow) {
+ this.twKey = twKey;
+ this.timeWindow = timeWindow;
+ }
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java
index f03fa9d..b61e105 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TimeWindow.java
@@ -8,11 +8,20 @@
@Data
public class TimeWindow {
- private long startTime; // 寮�濮嬫椂闂�
+ private long startTime;
- private long endTime; // 缁撴潫鏃堕棿
+ private long endTime;
- private String agvId; // 棰勫畾鐨凙GV
+ private String agvNo;
+
+ public TimeWindow() {
+ }
+
+ public TimeWindow(long startTime, long endTime, String agvNo) {
+ this.startTime = startTime;
+ this.endTime = endTime;
+ this.agvNo = agvNo;
+ }
public boolean isConflict(TimeWindow other) {
return this.endTime > other.startTime && this.startTime < other.endTime;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java
index 4d114e6..1e3a852 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java
@@ -1,5 +1,7 @@
package com.zy.acs.manager.core.service;
+import com.zy.acs.framework.common.Cools;
+import com.zy.acs.manager.core.domain.ReservedTimeWindow;
import com.zy.acs.manager.core.domain.TimeWindow;
import org.springframework.stereotype.Service;
@@ -17,10 +19,46 @@
public static final Map<String, List<TimeWindow>> TIME_WINDOW_MAP = new ConcurrentHashMap<>();
- // 棰勫畾鏃堕棿绐楀彛
- public synchronized boolean reserve(String key, TimeWindow window, String vehicle) {
+ // reserve --------------------------------------------------------------------
- List<TimeWindow> windows = TIME_WINDOW_MAP.getOrDefault(key, new ArrayList<>());
+ public synchronized boolean reserveTimeWindows(String agvNo, List<String> pathList) {
+ if (Cools.isEmpty(agvNo, pathList)) {
+ return false;
+ }
+
+ long estimatedTime = System.currentTimeMillis();
+
+ List<ReservedTimeWindow> reservedWindows = new ArrayList<>();
+
+ for (int i = 0; i < pathList.size() - 1; i++) {
+ String fromCode = pathList.get(i);
+ String toCode = pathList.get(i + 1);
+ String twKey = fromCode + "_" + toCode;
+
+ long twStartTime = estimatedTime;
+ long twEndTime = estimatedTime + estimateTravelTime(fromCode, toCode, agvNo);
+
+ TimeWindow timeWindow = new TimeWindow(twStartTime, twEndTime, agvNo);
+
+ boolean success = reserveTimeWindow(twKey, timeWindow);
+ if (!success) {
+ // 棰勫畾澶辫触锛岄噴鏀惧凡棰勫畾鐨勬椂闂寸獥鍙�
+ releaseReservedTimeWindows(reservedWindows);
+ return false;
+ }
+
+ reservedWindows.add(new ReservedTimeWindow(twKey, timeWindow));
+
+ estimatedTime = twEndTime;
+ }
+
+ return true;
+ }
+
+ // 棰勫畾鏃堕棿绐楀彛
+ public synchronized boolean reserveTimeWindow(String twKey, TimeWindow window) {
+
+ List<TimeWindow> windows = TIME_WINDOW_MAP.getOrDefault(twKey, new ArrayList<>());
for (TimeWindow reservedWindow : windows) {
if (reservedWindow.isConflict(window)) {
@@ -29,19 +67,47 @@
}
windows.add(window);
- TIME_WINDOW_MAP.put(key, windows);
+ TIME_WINDOW_MAP.put(twKey, windows);
return true;
}
- // 閲婃斁鏃堕棿绐楀彛
- public synchronized void release(String key, TimeWindow window, String vehicle) {
- List<TimeWindow> windows = TIME_WINDOW_MAP.get(key);
+
+ // release ------------------------------------------------------------------
+
+ public synchronized void releasePathTimeWindows(String agvNo, List<String> pathList) {
+ for (int i = 0; i < pathList.size() - 1; i++) {
+ String fromCode = pathList.get(i);
+ String toCode = pathList.get(i + 1);
+ String twKey = fromCode + "_" + toCode;
+
+ // 鏌ユ壘骞堕噴鏀炬椂闂寸獥鍙�
+ releaseTimeWindow(twKey, agvNo);
+ }
+ }
+
+ public synchronized void releaseTimeWindow(String twKey, String agvNo) {
+ List<TimeWindow> windows = TIME_WINDOW_MAP.get(twKey);
if (windows != null) {
- windows.remove(window);
+ windows.removeIf(window -> window.getAgvNo().equals(agvNo));
if (windows.isEmpty()) {
- TIME_WINDOW_MAP.remove(key);
+ TIME_WINDOW_MAP.remove(twKey);
}
}
}
+ private void releaseReservedTimeWindows(List<ReservedTimeWindow> reservedWindows) {
+ for (ReservedTimeWindow reserved : reservedWindows) {
+ releaseTimeWindow(reserved.getTwKey(), reserved.getTimeWindow().getAgvNo());
+ }
+ }
+
+ // util --------------------------------------------------------------------------------------
+
+ private long estimateTravelTime(String fromCode, String toCode, String agvNo) {
+ // 鏍规嵁璺濈鍜孉GV閫熷害浼扮畻琛岄┒鏃堕棿
+ double distance = 1000;
+ double speed = 2; // 鑾峰彇AGV閫熷害锛屽崟浣嶏細绫�/绉�
+ return (long) (distance / speed * 1000); // 杞崲涓烘绉�
+ }
+
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java
index 9e5701e..dbad95f 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TwTrafficService.java
@@ -1,15 +1,12 @@
package com.zy.acs.manager.core.service;
-import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.zy.acs.common.constant.RedisConstant;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.common.SnowflakeIdWorker;
import com.zy.acs.framework.exception.CoolException;
import com.zy.acs.manager.common.utils.MapDataUtils;
import com.zy.acs.manager.core.domain.TaskPosDto;
-import com.zy.acs.manager.core.domain.TrafficJamDto;
import com.zy.acs.manager.core.service.astart.DynamicNodeType;
import com.zy.acs.manager.core.service.astart.MapDataDispatcher;
import com.zy.acs.manager.core.service.astart.RetreatNavigateNode;
@@ -26,7 +23,10 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
/**
* Wavefront
@@ -188,28 +188,6 @@
}
}
- public void callback(List<Segment> segmentList) {
- Date now = new Date();
-
- segmentList.stream().max(Comparator.comparingInt(Segment::getSerial)).ifPresent(segment -> {
- Segment nextSegment = segmentService.getNextStepOfInit(segment.getTravelId(), segment.getSerial());
-
- if (null != nextSegment) {
-
- nextSegment.setState(SegmentStateType.WAITING.toString());
- nextSegment.setUpdateTime(now);
- if (!segmentService.updateById(nextSegment)) {
- log.error("Segment [{}] 鏇存柊澶辫触 锛侊紒锛�", nextSegment.getGroupId() + " - " + nextSegment.getSerial());
- }
-
- } else {
-
- travelService.checkFinish(segment.getTravelId());
- }
- });
-
- }
-
private List<String> checkoutPath(Agv agv, Code startCode, Code endCode, Segment segment) {
Integer lev = null;
String agvNo = agv.getUuid();
@@ -223,6 +201,41 @@
List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false);
// 閬胯瑙�
List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true);
+
+ if (Cools.isEmpty(lockPathList)) {
+ return pathList;
+ }
+
+ pathList = lockPathList;
+
+
+ long currentTime = System.currentTimeMillis();
+ long estimatedTime = currentTime;
+
+ for (int i = 0; i < pathList.size() - 1; i++) {
+ String fromCode = pathList.get(i);
+ String toCode = pathList.get(i + 1);
+ String key = fromCode + "_" + toCode;
+
+
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
if (!Cools.isEmpty(lockPathList) && // 瀛樺湪閬胯瑙�
Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10
@@ -451,24 +464,6 @@
}
return jamVehicleList;
- }
-
- private String hasEvent(String agvNo) {
- List<Agv> agvList = agvService.list(new LambdaQueryWrapper<>());
- for (Agv agv : agvList) {
- if (agvNo.equals(agv.getUuid())) {
- continue;
- }
- String jamStr = redis.getValue(RedisConstant.AGV_TRAFFIC_JAM_FLAG, agv.getUuid());
- if (!Cools.isEmpty(jamStr)) {
-
- TrafficJamDto jamDto = JSON.parseObject(jamStr, TrafficJamDto.class);
-
-
-
- }
- }
- return null;
}
/**
--
Gitblit v1.9.1