From 1313906bb1eb983d3beece810035e7fc28d6a92f Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期二, 20 五月 2025 16:57:11 +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