From 233ff9e9e82c67ac33695b479fd31df6ffb77b22 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 02 十二月 2024 15:44:30 +0800
Subject: [PATCH] #
---
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TimeWindowService.java | 84 +++++++++++++++++++++++++++++++++++++----
1 files changed, 75 insertions(+), 9 deletions(-)
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); // 杞崲涓烘绉�
+ }
+
}
--
Gitblit v1.9.1