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