diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/AgvPathProcessor.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/AgvPathProcessor.java deleted file mode 100644 index f236619..0000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/srgvmap/service/impl/AgvPathProcessor.java +++ /dev/null @@ -1,570 +0,0 @@ -package com.ruoyi.bas.srgvmap.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; -import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService; -import com.ruoyi.bas.srgvmap.service.RoadCacheService; -import com.ruoyi.device.srgv.domain.DeviceSrgv; -import com.ruoyi.device.srgv.service.IDeviceSrgvService; -import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; -import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; -import com.ruoyi.schedule.plcRead.srgv.PlcSrgvRead; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -@Component -public class AgvPathProcessor { - - @Autowired - private IDeviceSrgvService plcService; - - @Autowired - private IWcsSrgvQueueService wcsSagvQueueMapper; - - - @Autowired - private RoadCacheService roadCacheService; - - public void processNoSites(int[][] roadCache, int floor, List noSite) { - } - - public void processAgvPathInfo(Map maps,Integer agvId) { - List wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(new WcsSrgvQueue()); - if (CollUtil.isNotEmpty(wcsSrgvQueues)) { - //筛选其他小车队列 - wcsSrgvQueues = wcsSrgvQueues.stream().filter(x -> x.getAgvId().equals(Convert.toStr(agvId))).collect(Collectors.toList()); - - //获取其他小车占用点位列表 - HashSet siteList = new HashSet<>(); - for (WcsSrgvQueue wcsSrgvQueue : wcsSrgvQueues) { - String[] split = wcsSrgvQueue.getPathInfo().split(","); - siteList.addAll(Arrays.asList(split)); - } - - //设置其他小车占用点位 - for (String site : siteList) { - if (maps.containsKey(site)){ - maps.get(site).setValue(0); - } - } - } - - } - - /** - * 更新AGV路径映射,只保留当前站点及以后的路径 - */ - private void updateAgvPathMap(Map agvPathMap, List srgvPlcs) { - for (SRGVPlc plc : srgvPlcs) { - com.ruoyi.plc.sagv.SRGVData agvData = plc.getAgvData(); - if (agvData != null && agvData.getAgvId() != null) { - String agvId = agvData.getAgvId(); - String currSite = agvData.getCurrSite(); - - // 如果这个agvId在agvPathMap中存在,且currSite不为空 - if (agvPathMap.containsKey(agvId) && currSite != null) { - String pathInfo = agvPathMap.get(agvId); - - // 处理路径信息,只保留当前站点及以后的路径 - if (pathInfo != null && !pathInfo.isEmpty()) { - String[] pathArray = pathInfo.split(","); - StringBuilder newPathBuilder = new StringBuilder(); - - boolean foundCurrentSite = false; - for (String site : pathArray) { - if (site.trim().equals(currSite.trim())) { - foundCurrentSite = true; - } - - if (foundCurrentSite) { - if (newPathBuilder.length() > 0) { - newPathBuilder.append(","); - } - newPathBuilder.append(site); - } - } - - // 如果找到了当前站点,更新路径信息 - if (foundCurrentSite) { - agvPathMap.put(agvId, newPathBuilder.toString()); - } - } - } - } - } - } - - public void processOnlineAgvSites(Map maps) { - } - - public void processOfflineAgvSites(Map maps) { - } - - /** - * 处理AGV路径信息和地图障碍 - *//* - public void processAgvPathInfo(int floor, List slots, IWcsSrgvMapService service) { - WcsSagvQueue wcsSagvQueue = new WcsSagvQueue(); - wcsSagvQueue.setTheFloor(floor + ""); - List wcsSagvQueues = wcsSagvQueueMapper.selectWcsSagvQueueList(wcsSagvQueue); - - if (wcsSagvQueues.isEmpty()) { - return; - } - - // 转为map,key为agvId ,value为pathInfo - Map agvPathMap = new HashMap<>(); - for (WcsSagvQueue queue : wcsSagvQueues) { - if (queue.getAgvId() != null && queue.getPathInfo() != null) { - agvPathMap.put(queue.getAgvId(), queue.getPathInfo()); - } - } - - if (agvPathMap.isEmpty()) { - return; - } - - // 获取Sagv位置 - List srgvPlcs = plcService.listSRGVPlcData(); - - // 处理路径信息,只保留当前站点及以后的路径 - updateAgvPathMap(agvPathMap, srgvPlcs); - - // 将路径拆分成站点,更新对应slot的value值 - updateSlotsWithValueFromPath(slots, agvPathMap); - } - - *//** - * 更新AGV路径映射,只保留当前站点及以后的路径 - *//* - private void updateAgvPathMap(Map agvPathMap, List srgvPlcs) { - for (SRGVPlc plc : srgvPlcs) { - com.ruoyi.plc.sagv.SRGVData agvData = plc.getAgvData(); - if (agvData != null && agvData.getAgvId() != null) { - String agvId = agvData.getAgvId(); - String currSite = agvData.getCurrSite(); - - // 如果这个agvId在agvPathMap中存在,且currSite不为空 - if (agvPathMap.containsKey(agvId) && currSite != null) { - String pathInfo = agvPathMap.get(agvId); - - // 处理路径信息,只保留当前站点及以后的路径 - if (pathInfo != null && !pathInfo.isEmpty()) { - String[] pathArray = pathInfo.split(","); - StringBuilder newPathBuilder = new StringBuilder(); - - boolean foundCurrentSite = false; - for (String site : pathArray) { - if (site.trim().equals(currSite.trim())) { - foundCurrentSite = true; - } - - if (foundCurrentSite) { - if (newPathBuilder.length() > 0) { - newPathBuilder.append(","); - } - newPathBuilder.append(site); - } - } - - // 如果找到了当前站点,更新路径信息 - if (foundCurrentSite) { - agvPathMap.put(agvId, newPathBuilder.toString()); - } - } - } - } - } - } - - *//** - * 根据路径信息更新slots的value值 - *//* - private void updateSlotsWithValueFromPath(List slots, Map agvPathMap) { - // 创建一个站点到AGV ID的映射 - Map siteToAgvMap = new HashMap<>(); - - for (Map.Entry entry : agvPathMap.entrySet()) { - String agvId = entry.getKey(); - String pathInfo = entry.getValue(); - - if (pathInfo != null && !pathInfo.isEmpty()) { - String[] sites = pathInfo.split(","); - for (String site : sites) { - String trimmedSite = site.trim(); - if (!trimmedSite.isEmpty()) { - siteToAgvMap.put(trimmedSite, agvId); - } - } - } - } - - // 遍历slots,更新匹配的元素 - for (WcsSrgvMap slot : slots) { - String siteId = slot.getSiteId(); - if (siteId != null && siteToAgvMap.containsKey(siteId)) { - String agvId = siteToAgvMap.get(siteId); - updateSlotValue(slot, agvId); - } - } - } - - *//** - * 处理在线AGV站点 - *//* - public void processOnlineAgvSites(List slots) { - List srgvPlcs = plcService.listSRGVPlcData(); - - // 创建siteId到slot的映射以提高查找性能 - Map siteSlotMap = new HashMap<>(); - for (WcsSrgvMap slot : slots) { - if (slot.getSiteId() != null) { - siteSlotMap.put(slot.getSiteId(), slot); - } - } - - for (SRGVPlc plc : srgvPlcs) { - com.ruoyi.plc.sagv.SRGVData agvData = plc.getAgvData(); - if (agvData != null) { - String currSite = agvData.getCurrSite(); - String agvId = agvData.getAgvId(); - - if (currSite != null && agvId != null && siteSlotMap.containsKey(currSite)) { - WcsSrgvMap slot = siteSlotMap.get(currSite); - updateSlotValue2(slot, agvId); - } - } - } - } - - *//** - * 处理离线AGV站点 - *//* - public void processOfflineAgvSites(int floor, List slots) { - WcsAgv wcsAgv = new WcsAgv(); - wcsAgv.setDefault01(floor + ""); - List wcsAgvs = wcsAgvMapper.selectWcsAgvList(wcsAgv); - - // 创建siteId到slot的映射以提高查找性能 - Map siteSlotMap = new HashMap<>(); - for (WcsSrgvMap slot : slots) { - if (slot.getSiteId() != null) { - siteSlotMap.put(slot.getSiteId(), slot); - } - } - - // 处理离线站点 - for (WcsAgv agv : wcsAgvs) { - String default02 = agv.getDefault02(); // 离线站点 - String agvId = String.valueOf(wcsAgv.getAgvId()); - - if (default02 != null && agvId != null && siteSlotMap.containsKey(default02)) { - WcsSrgvMap slot = siteSlotMap.get(default02); - updateSlotValue2(slot, agvId); - } - } - } - - *//** - * 更新slot的value值为(agvId + 100) - *//* - private void updateSlotValue(WcsSrgvMap slot, String agvId) { - try { - int agvIdNum = Integer.parseInt(agvId); - slot.setValue(agvIdNum + 100); - } catch (NumberFormatException e) { - // 如果agvId不是数字,设置默认值100 - // slot.setValue(100); - } - } - private void updateSlotValue2(WcsSrgvMap slot, String agvId) { - try { - int agvIdNum = Integer.parseInt(agvId); - slot.setValue(agvIdNum + 200); - } catch (NumberFormatException e) { - // 如果agvId不是数字,设置默认值100 - // slot.setValue(100); - } - } - - - *//* - * - * 剔除二维数组地图中不允许的站点 - * - * *//* - public void processAgvPathInfo(int[][] ints, int floor) { - - WcsSagvQueue wcsSagvQueue = new WcsSagvQueue(); - wcsSagvQueue.setTheFloor(floor + ""); - List wcsSagvQueues = wcsSagvQueueMapper.selectWcsSagvQueueList(wcsSagvQueue); - - if (wcsSagvQueues.isEmpty()) { - return; - } - - // 转为map,key为agvId ,value为pathInfo - Map agvPathMap = new HashMap<>(); - for (WcsSagvQueue queue : wcsSagvQueues) { - if (queue.getAgvId() != null && queue.getPathInfo() != null) { - agvPathMap.put(queue.getAgvId(), queue.getPathInfo()); - } - } - - if (agvPathMap.isEmpty()) { - return; - } - - // 获取Sagv位置 - List srgvPlcs = plcService.listSRGVPlcData(); - - // 处理路径信息,只保留当前站点及以后的路径 - updateAgvPathMap(agvPathMap, srgvPlcs); - // 将路径拆分成站点,更新对应slot的value值 - updateSlotsWithValueFromPath2(ints,agvPathMap,floor); - - - } - - public void processAgvPathInfo(int[][] ints, int floor,String agvId) { - - WcsSagvQueue wcsSagvQueue = new WcsSagvQueue(); - wcsSagvQueue.setTheFloor(floor + ""); - List wcsSagvQueueList = wcsSagvQueueMapper.selectWcsSagvQueueList(wcsSagvQueue); - - List wcsSagvQueues = wcsSagvQueueList.stream().filter(queue -> !Objects.equals(queue.getAgvId(), agvId)).collect(Collectors.toList()); - - if (wcsSagvQueues.isEmpty()) { - return; - } - - // 转为map,key为agvId ,value为pathInfo - Map agvPathMap = new HashMap<>(); - for (WcsSagvQueue queue : wcsSagvQueues) { - if (queue.getAgvId() != null && queue.getPathInfo() != null) { - agvPathMap.put(queue.getAgvId(), queue.getPathInfo()); - } - } - - if (agvPathMap.isEmpty()) { - return; - } - - // 获取Sagv位置 - List srgvPlcs = plcService.listSRGVPlcData(); - - // 处理路径信息,只保留当前站点及以后的路径 - updateAgvPathMap(agvPathMap, srgvPlcs); - // 将路径拆分成站点,更新对应slot的value值 - updateSlotsWithValueFromPath2(ints,agvPathMap,floor); - - - } - - private void updateSlotsWithValueFromPath2(int[][] arrMap, Map agvPathMap, int floor) { - // 在循环前获取一次站点坐标映射 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - - for (Map.Entry entry : agvPathMap.entrySet()) { - String agvId = entry.getKey(); - String pathInfo = entry.getValue(); - - if (pathInfo != null && !pathInfo.isEmpty()) { - String[] sites = pathInfo.split(","); - for (String site : sites) { - String trimmedSite = site.trim(); - if (!trimmedSite.isEmpty()) { - int[] siteArr = arrByRoadSite.get(trimmedSite); // 格式{1,2,3}代表排列层 - - // 添加空值检查 - if (siteArr != null && siteArr.length >= 2) { - arrMap[siteArr[0]][siteArr[1]] = 0; // 建对应坐标更新为0,代表障碍物 - } - } - } - } - } - } - - *//** - * 处理在线AGV站点 - *//* - public void processOnlineAgvSites(int[][] arrMap, int floor) { - List srgvPlcs = plcService.listSRGVPlcData(); - - // 过滤出同层的当前站点,并处理空值情况 - List collect = srgvPlcs.stream() - .filter(plc -> plc.getAgvData() != null && plc.getAgvData().getCurrSite() != null) - .filter(plc -> floor == plc.getLayer()) - .map(plc -> plc.getAgvData().getCurrSite()) - .collect(Collectors.toList()); - - if (!collect.isEmpty()) { - // 在循环前获取一次站点坐标映射 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - - for (String site : collect) { - String trimmedSite = site.trim(); - if (!trimmedSite.isEmpty()) { - int[] siteArr = arrByRoadSite.get(trimmedSite); // 格式{1,2,3}代表排列层 - - // 添加空值检查 - if (siteArr != null && siteArr.length >= 2) { - arrMap[siteArr[0]][siteArr[1]] = 0; // 对应坐标更新为0,代表障碍物 - } - } - } - } - } - - public void processOnlineAgvSites(int[][] arrMap, int floor,String selfSite) { - List srgvPlcs = plcService.listSRGVPlcData(); - - // 过滤出同层的当前站点,并处理空值情况 - List collect = srgvPlcs.stream() - .filter(plc -> plc.getAgvData() != null && plc.getAgvData().getCurrSite() != null) - .filter(plc -> floor == plc.getLayer()) - .filter(p ->!Objects.equals(p.getAgvData().getCurrSite(),selfSite)) - .map(plc -> plc.getAgvData().getCurrSite()) - .collect(Collectors.toList()); - - if (!collect.isEmpty()) { - // 在循环前获取一次站点坐标映射 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - - for (String site : collect) { - String trimmedSite = site.trim(); - if (!trimmedSite.isEmpty()) { - int[] siteArr = arrByRoadSite.get(trimmedSite); // 格式{1,2,3}代表排列层 - - // 添加空值检查 - if (siteArr != null && siteArr.length >= 2) { - arrMap[siteArr[0]][siteArr[1]] = 0; // 对应坐标更新为0,代表障碍物 - } - } - } - } - } - - *//* - * - * 处理在线AGV站点,不包含自己 - * *//* - public void processOnlineAgvSitesNoSelf(int[][] arrMap, Integer floor, String srcSite) { - - List srgvPlcs = plcService.listSRGVPlcData(); - - // 过滤出同层的当前站点,并处理空值情况 - List collect = srgvPlcs.stream() - .filter(plc -> plc.getAgvData() != null && plc.getAgvData().getCurrSite() != null) - .filter(plc -> floor == plc.getLayer()) - .map(plc -> plc.getAgvData().getCurrSite()) - .collect(Collectors.toList()); - - if (!collect.isEmpty()) { - // 在循环前获取一次站点坐标映射 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - - for (String site : collect) { - String trimmedSite = site.trim(); - if (!trimmedSite.isEmpty() && !Objects.equals(srcSite, trimmedSite)) { - int[] siteArr = arrByRoadSite.get(trimmedSite); // 格式{1,2,3}代表排列层 - - // 添加空值检查 - if (siteArr != null && siteArr.length >= 2) { - arrMap[siteArr[0]][siteArr[1]] = 0; // 对应坐标更新为0,代表障碍物 - } - } - } - } - } - - - - *//** - * 处理离线AGV站点 - *//* - public void processOfflineAgvSites(int[][] arrMap, int floor) { - WcsAgv wcsAgv = new WcsAgv(); - wcsAgv.setDefault01(floor + ""); - List wcsAgvs = wcsAgvMapper.selectWcsAgvList(wcsAgv); - // 根据站点获取二维数组坐标 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - // 处理离线站点 - for (WcsAgv agv : wcsAgvs) { - // 添加空值检查 - if (agv != null && agv.getDefault02() != null && agv.getAgvId() != null) { - String default02 = agv.getDefault02(); // 离线站点 - String agvId = String.valueOf(wcsAgv.getAgvId()); - - - String trimmedSite = default02.trim(); - - if (!trimmedSite.isEmpty()) { - int[] siteArr = arrByRoadSite.get(trimmedSite); - - // 添加空值检查 - if (siteArr != null && siteArr.length >= 2) { - arrMap[siteArr[0]][siteArr[1]] = 0; // 对应坐标更新为0,代表障碍物 - } - } - } - } - } - - - *//* - * 离线站点占用目标的也排除 - * *//* - public void processOfflineAgvSites(int[][] arrMap, int floor,List tarSite) { - WcsAgv wcsAgv = new WcsAgv(); - wcsAgv.setDefault01(floor + ""); - List wcsAgvs = wcsAgvMapper.selectWcsAgvList(wcsAgv); - // 根据站点获取二维数组坐标 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - // 处理离线站点 - for (WcsAgv agv : wcsAgvs) { - // 添加空值检查 - if (agv != null && agv.getDefault02() != null && agv.getAgvId() != null) { - String default02 = agv.getDefault02(); // 离线站点 - String agvId = String.valueOf(wcsAgv.getAgvId()); - - - String trimmedSite = default02.trim(); - - if (!trimmedSite.isEmpty()) { - int[] siteArr = arrByRoadSite.get(trimmedSite); - - // 添加空值检查 - if (siteArr != null && siteArr.length >= 2) { - arrMap[siteArr[0]][siteArr[1]] = 0; // 对应坐标更新为0,代表障碍物 - } - - //排除目标 - tarSite.remove(trimmedSite); - } - } - } - } - - - public void processNoSites(int[][] roadCache, int floor,List sites) { - // 根据站点获取二维数组坐标 - Map arrByRoadSite = roadCacheService.getArrByRoadSite(floor); - - for (String site : sites) { - if (!site.isEmpty()) { - int[] siteArr = arrByRoadSite.get(site); - - // 添加空值检查 - if (siteArr != null && siteArr.length >= 2) { - roadCache[siteArr[0]][siteArr[1]] = 0; // 对应坐标更新为0,代表障碍物 - } - } - } - }*/ -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java index d3e394c..59658d5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/srgv/roadUtil/PathFinder.java @@ -528,7 +528,7 @@ public class PathFinder { } // 计算拐点 - List inflectionPoints = extractInflectionPoints2(path, grid); + List inflectionPoints = extractInflectionPoints2(path); return new PathInfo(path, inflectionPoints.size()); } )); @@ -585,7 +585,7 @@ public class PathFinder { } // 计算拐点 - List inflectionPoints = extractInflectionPoints2(path, grid); + List inflectionPoints = extractInflectionPoints2(path); return new PathInfo(path, inflectionPoints.size()); } )); @@ -647,7 +647,7 @@ public class PathFinder { } // 计算拐点 - List inflectionPoints = extractInflectionPoints2(path, grid); + List inflectionPoints = extractInflectionPoints2(path); return new PathInfo(path, inflectionPoints.size()); } )); @@ -719,7 +719,7 @@ public class PathFinder { } // 计算拐点 - List inflectionPoints = extractInflectionPoints2(path, tempGrid); + List inflectionPoints = extractInflectionPoints2(path); return new PathInfo(path, inflectionPoints.size()); }, (existing, replacement) -> existing // 合并函数:如果键冲突,保留现有的值 @@ -780,7 +780,7 @@ public class PathFinder { } // 计算拐点 - List inflectionPoints = extractInflectionPoints2(path, tempGrid); + List inflectionPoints = extractInflectionPoints2(path); return new PathInfo(path, inflectionPoints.size()); } ));