From fa565c2d9dd77f4d5ccea1a8fb56feb1b864e2a7 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期四, 09 一月 2025 13:20:17 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 8 ++ zy-acs-manager/src/main/java/com/zy/acs/manager/manager/utils/ActionSorter.java | 135 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 2 deletions(-) diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java index b1652e5..6dd57dd 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java @@ -31,6 +31,7 @@ import com.zy.acs.manager.manager.enums.*; import com.zy.acs.manager.manager.service.*; import com.zy.acs.manager.manager.service.impl.WebsocketServiceImpl; +import com.zy.acs.manager.manager.utils.ActionSorter; import com.zy.acs.manager.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -93,6 +94,8 @@ private AgvModelService agvModelService; @Autowired private LaneService laneService; + @Autowired + private ActionSorter actionSorter; @SuppressWarnings("all") @@ -985,11 +988,12 @@ now // 宸ヤ綔鏃堕棿 )); - List<Action> newActionList = new ArrayList<>(actionList); +// List<Action> newActionList = new ArrayList<>(actionList); // List<Action> optimizeList = actionService.optimizeSort(actionList); -// List<Action> newActionList = new ArrayList<>(optimizeList); + List<Action> optimizeList = actionSorter.optimizeSort(actionList); + List<Action> newActionList = new ArrayList<>(optimizeList); String groupId = String.valueOf(snowflakeIdWorker.nextId()).substring(3); diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/utils/ActionSorter.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/utils/ActionSorter.java new file mode 100644 index 0000000..896dac7 --- /dev/null +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/utils/ActionSorter.java @@ -0,0 +1,135 @@ +package com.zy.acs.manager.manager.utils; + +import com.zy.acs.manager.manager.entity.Action; +import com.zy.acs.manager.manager.enums.ActionTypeType; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ActionSorter { + + /** + * 瀵逛紶鍏ョ殑 actionList 杩涜鎺掑簭鎴栭噸鏂版帓鍒� + * 瑙勫垯锛� + * 1. 瀵绘壘绗竴涓� ReadyTakeFromAgvSite 鐨勫姩浣滐紙鍙栬揣鍔ㄤ綔锛夈�� + * 2. 濡傛灉鎵惧埌锛屽垯瀵绘壘鏈�鍚庝竴涓� TurnCorner 鐨勫姩浣溿�� + * - 鑻ユ壘鍒� TurnCorner锛屽垯鍦ㄥ叾鍚庢彃鍏ュ彇璐у姩浣滐紙骞跺皢鍙栬揣鍔ㄤ綔鐨� code 鏇挎崲涓� TurnCorner 鍔ㄤ綔鐨� code锛夈�� + * - 鑻ユ病鎵惧埌 TurnCorner锛屽垯灏嗗彇璐у姩浣滄斁鍦ㄥ垪琛ㄦ渶鍓嶉潰锛堝悓鏃舵浛鎹负绗竴涓姩浣滅殑 code锛夈�� + * 3. 濡傛灉娌℃湁 ReadyTakeFromAgvSite锛屽垯鐩存帴杩斿洖鍘熷垪琛ㄣ�� + * + * @param actionList 鍘熷鍔ㄤ綔鍒楄〃 + * @return 鎺掑簭鍚庣殑鍔ㄤ綔鍒楄〃 + */ + public List<Action> optimizeSort(List<Action> actionList) { + if (actionList == null || actionList.isEmpty()) { + return actionList; + } + + // 鑾峰彇鍏抽敭淇℃伅 + final long readyTakeFromAgvSite = ActionTypeType.ReadyTakeFromAgvSite.val(); + final long readyReleaseToAgvSite = ActionTypeType.ReadyReleaseToAgvSite.val(); + final long turnCorner = ActionTypeType.TurnCorner.val(); + + // 鎵惧埌绗竴涓� readyTakeFromAgvSite 鍔ㄤ綔鐨勪笅鏍� + int takeFromIdx = findFirstActionIndex(actionList, readyTakeFromAgvSite); + if (takeFromIdx == -1) { + // 濡傛灉娌℃湁鍙栬揣鍔ㄤ綔锛岀洿鎺ヨ繑鍥炲師鍒楄〃 + return actionList; + } + + // 鎵惧埌鏈�鍚庝竴涓� readyReleaseToAgvSite 鍔ㄤ綔鐨勪笅鏍� + int releaseToAgvSiteIdx = findLastActionIndex(actionList, readyReleaseToAgvSite); + // 濡傛灉鍚屾椂瀛樺湪 readyTakeFromAgvSite 鍜� readyReleaseToAgvSite锛岃鏄� 鍙栬揣 - 鏀捐揣 鑲畾鏄湪涓�涓湴闈㈢爜涓婏紝杩欐椂鍊欐病蹇呰鍐嶈皟鏁翠綅缃� + if (releaseToAgvSiteIdx != -1) { + return actionList; + } + + // 鎵惧埌鏈�鍚庝竴涓� turnCorner 鍔ㄤ綔鐨勪笅鏍� + int turnCornerIdx = findLastActionIndex(actionList, turnCorner); + + // 鏍规嵁鏄惁鎵惧埌 turnCorner 鏉ラ�夋嫨涓嶅悓鐨勯噸鏂版帓搴忛�昏緫 + if (turnCornerIdx == -1) { + return reorderWithoutTurnCorner(actionList, takeFromIdx); + } else { + return reorderWithTurnCorner(actionList, takeFromIdx, turnCornerIdx); + } + } + + /** + * 濡傛灉娌℃湁鎵惧埌 TurnCorner锛屽垯灏嗗彇璐у姩浣滄斁鍒板垪琛ㄦ渶鍓嶉潰锛堝苟浣跨敤鍘熸潵绗竴涓姩浣滅殑 code锛� + */ + private List<Action> reorderWithoutTurnCorner(List<Action> actionList, int takeFromIdx) { + List<Action> sortedList = new ArrayList<>(actionList.size()); + Action takeFromAction = actionList.get(takeFromIdx); + + for (int i = 0; i < actionList.size(); i++) { + // 鍦ㄥ鐞嗙涓�涓厓绱犱箣鍓嶏紝鍏堟妸鍙栬揣鍔ㄤ綔鍔犺繘鍘� + if (i == 0) { + // 鐢ㄧ涓�涓姩浣滅殑 code 鏇挎崲鍙栬揣鍔ㄤ綔 + takeFromAction.setCode(actionList.get(0).getCode()); + sortedList.add(takeFromAction); + } + // 璺宠繃鍙栬揣鍔ㄤ綔鏈韩 + if (i == takeFromIdx) { + continue; + } + // 鍔犲叆鍘熷姩浣� + sortedList.add(actionList.get(i)); + } + return sortedList; + } + + /** + * 濡傛灉鎵惧埌 TurnCorner锛屽垯鍦� turnCorner 鍔ㄤ綔鍚庢彃鍏ュ彇璐у姩浣滐紙骞朵娇鐢� turnCorner 鐨� code锛� + */ + private List<Action> reorderWithTurnCorner(List<Action> actionList, int takeFromIdx, int turnCornerIdx) { + // 鎷疯礉涓�浠斤紝鍑嗗閲嶆帓 + List<Action> sortedList = new ArrayList<>(actionList.size()); + Action takeFromAction = actionList.get(takeFromIdx); + + for (int i = 0; i < actionList.size(); i++) { + // 璺宠繃鍘熷厛鐨勫彇璐у姩浣� + if (i == takeFromIdx) { + continue; + } + // 鍏堝皢褰撳墠鍔ㄤ綔鍔犲埌鍒楄〃 + Action curr = actionList.get(i); + sortedList.add(curr); + + // 鑻ュ綋鍓嶅姩浣滄槸 turnCorner 鍔ㄤ綔锛屽垯鏇挎崲鍙栬揣鍔ㄤ綔 code 骞舵彃鍏� + if (i == turnCornerIdx) { + takeFromAction.setCode(curr.getCode()); + sortedList.add(takeFromAction); + } + } + return sortedList; + } + + /** + * 鍦� actionList 涓壘鍒扮涓�涓寚瀹� actionType 鐨勪笅鏍� + */ + private int findFirstActionIndex(List<Action> actionList, long actionType) { + for (int i = 0; i < actionList.size(); i++) { + if (actionList.get(i).getActionType().equals(actionType)) { + return i; + } + } + return -1; + } + + /** + * 鍦� actionList 涓壘鍒版渶鍚庝竴涓寚瀹� actionType 鐨勪笅鏍� + */ + private int findLastActionIndex(List<Action> actionList, long actionType) { + int index = -1; + for (int i = 0; i < actionList.size(); i++) { + if (actionList.get(i).getActionType().equals(actionType)) { + index = i; + } + } + return index; + } + +} -- Gitblit v1.9.1