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/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