小车下发任务,生成最短路径修改
This commit is contained in:
@@ -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<String> noSite) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void processAgvPathInfo(Map<String, WcsSrgvMap> maps,Integer agvId) {
|
|
||||||
List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(new WcsSrgvQueue());
|
|
||||||
if (CollUtil.isNotEmpty(wcsSrgvQueues)) {
|
|
||||||
//筛选其他小车队列
|
|
||||||
wcsSrgvQueues = wcsSrgvQueues.stream().filter(x -> x.getAgvId().equals(Convert.toStr(agvId))).collect(Collectors.toList());
|
|
||||||
|
|
||||||
//获取其他小车占用点位列表
|
|
||||||
HashSet<String> 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<String, String> agvPathMap, List<SRGVPlc> 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<String, WcsSrgvMap> maps) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void processOfflineAgvSites(Map<String, WcsSrgvMap> maps) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理AGV路径信息和地图障碍
|
|
||||||
*//*
|
|
||||||
public void processAgvPathInfo(int floor, List<WcsSrgvMap> slots, IWcsSrgvMapService service) {
|
|
||||||
WcsSagvQueue wcsSagvQueue = new WcsSagvQueue();
|
|
||||||
wcsSagvQueue.setTheFloor(floor + "");
|
|
||||||
List<WcsSagvQueue> wcsSagvQueues = wcsSagvQueueMapper.selectWcsSagvQueueList(wcsSagvQueue);
|
|
||||||
|
|
||||||
if (wcsSagvQueues.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 转为map,key为agvId ,value为pathInfo
|
|
||||||
Map<String, String> 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<SRGVPlc> srgvPlcs = plcService.listSRGVPlcData();
|
|
||||||
|
|
||||||
// 处理路径信息,只保留当前站点及以后的路径
|
|
||||||
updateAgvPathMap(agvPathMap, srgvPlcs);
|
|
||||||
|
|
||||||
// 将路径拆分成站点,更新对应slot的value值
|
|
||||||
updateSlotsWithValueFromPath(slots, agvPathMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
*//**
|
|
||||||
* 更新AGV路径映射,只保留当前站点及以后的路径
|
|
||||||
*//*
|
|
||||||
private void updateAgvPathMap(Map<String, String> agvPathMap, List<SRGVPlc> 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<WcsSrgvMap> slots, Map<String, String> agvPathMap) {
|
|
||||||
// 创建一个站点到AGV ID的映射
|
|
||||||
Map<String, String> siteToAgvMap = new HashMap<>();
|
|
||||||
|
|
||||||
for (Map.Entry<String, String> 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<WcsSrgvMap> slots) {
|
|
||||||
List<SRGVPlc> srgvPlcs = plcService.listSRGVPlcData();
|
|
||||||
|
|
||||||
// 创建siteId到slot的映射以提高查找性能
|
|
||||||
Map<String, WcsSrgvMap> 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<WcsSrgvMap> slots) {
|
|
||||||
WcsAgv wcsAgv = new WcsAgv();
|
|
||||||
wcsAgv.setDefault01(floor + "");
|
|
||||||
List<WcsAgv> wcsAgvs = wcsAgvMapper.selectWcsAgvList(wcsAgv);
|
|
||||||
|
|
||||||
// 创建siteId到slot的映射以提高查找性能
|
|
||||||
Map<String, WcsSrgvMap> 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<WcsSagvQueue> wcsSagvQueues = wcsSagvQueueMapper.selectWcsSagvQueueList(wcsSagvQueue);
|
|
||||||
|
|
||||||
if (wcsSagvQueues.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 转为map,key为agvId ,value为pathInfo
|
|
||||||
Map<String, String> 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<SRGVPlc> 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<WcsSagvQueue> wcsSagvQueueList = wcsSagvQueueMapper.selectWcsSagvQueueList(wcsSagvQueue);
|
|
||||||
|
|
||||||
List<WcsSagvQueue> wcsSagvQueues = wcsSagvQueueList.stream().filter(queue -> !Objects.equals(queue.getAgvId(), agvId)).collect(Collectors.toList());
|
|
||||||
|
|
||||||
if (wcsSagvQueues.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 转为map,key为agvId ,value为pathInfo
|
|
||||||
Map<String, String> 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<SRGVPlc> srgvPlcs = plcService.listSRGVPlcData();
|
|
||||||
|
|
||||||
// 处理路径信息,只保留当前站点及以后的路径
|
|
||||||
updateAgvPathMap(agvPathMap, srgvPlcs);
|
|
||||||
// 将路径拆分成站点,更新对应slot的value值
|
|
||||||
updateSlotsWithValueFromPath2(ints,agvPathMap,floor);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateSlotsWithValueFromPath2(int[][] arrMap, Map<String, String> agvPathMap, int floor) {
|
|
||||||
// 在循环前获取一次站点坐标映射
|
|
||||||
Map<String, int[]> arrByRoadSite = roadCacheService.getArrByRoadSite(floor);
|
|
||||||
|
|
||||||
for (Map.Entry<String, String> 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<SRGVPlc> srgvPlcs = plcService.listSRGVPlcData();
|
|
||||||
|
|
||||||
// 过滤出同层的当前站点,并处理空值情况
|
|
||||||
List<String> 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<String, int[]> 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<SRGVPlc> srgvPlcs = plcService.listSRGVPlcData();
|
|
||||||
|
|
||||||
// 过滤出同层的当前站点,并处理空值情况
|
|
||||||
List<String> 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<String, int[]> 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<SRGVPlc> srgvPlcs = plcService.listSRGVPlcData();
|
|
||||||
|
|
||||||
// 过滤出同层的当前站点,并处理空值情况
|
|
||||||
List<String> 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<String, int[]> 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<WcsAgv> wcsAgvs = wcsAgvMapper.selectWcsAgvList(wcsAgv);
|
|
||||||
// 根据站点获取二维数组坐标
|
|
||||||
Map<String, int[]> 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<String> tarSite) {
|
|
||||||
WcsAgv wcsAgv = new WcsAgv();
|
|
||||||
wcsAgv.setDefault01(floor + "");
|
|
||||||
List<WcsAgv> wcsAgvs = wcsAgvMapper.selectWcsAgvList(wcsAgv);
|
|
||||||
// 根据站点获取二维数组坐标
|
|
||||||
Map<String, int[]> 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<String> sites) {
|
|
||||||
// 根据站点获取二维数组坐标
|
|
||||||
Map<String, int[]> 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,代表障碍物
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
@@ -528,7 +528,7 @@ public class PathFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 计算拐点
|
// 计算拐点
|
||||||
List<int[]> inflectionPoints = extractInflectionPoints2(path, grid);
|
List<int[]> inflectionPoints = extractInflectionPoints2(path);
|
||||||
return new PathInfo(path, inflectionPoints.size());
|
return new PathInfo(path, inflectionPoints.size());
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
@@ -585,7 +585,7 @@ public class PathFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 计算拐点
|
// 计算拐点
|
||||||
List<int[]> inflectionPoints = extractInflectionPoints2(path, grid);
|
List<int[]> inflectionPoints = extractInflectionPoints2(path);
|
||||||
return new PathInfo(path, inflectionPoints.size());
|
return new PathInfo(path, inflectionPoints.size());
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
@@ -647,7 +647,7 @@ public class PathFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 计算拐点
|
// 计算拐点
|
||||||
List<int[]> inflectionPoints = extractInflectionPoints2(path, grid);
|
List<int[]> inflectionPoints = extractInflectionPoints2(path);
|
||||||
return new PathInfo(path, inflectionPoints.size());
|
return new PathInfo(path, inflectionPoints.size());
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
@@ -719,7 +719,7 @@ public class PathFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 计算拐点
|
// 计算拐点
|
||||||
List<int[]> inflectionPoints = extractInflectionPoints2(path, tempGrid);
|
List<int[]> inflectionPoints = extractInflectionPoints2(path);
|
||||||
return new PathInfo(path, inflectionPoints.size());
|
return new PathInfo(path, inflectionPoints.size());
|
||||||
},
|
},
|
||||||
(existing, replacement) -> existing // 合并函数:如果键冲突,保留现有的值
|
(existing, replacement) -> existing // 合并函数:如果键冲突,保留现有的值
|
||||||
@@ -780,7 +780,7 @@ public class PathFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 计算拐点
|
// 计算拐点
|
||||||
List<int[]> inflectionPoints = extractInflectionPoints2(path, tempGrid);
|
List<int[]> inflectionPoints = extractInflectionPoints2(path);
|
||||||
return new PathInfo(path, inflectionPoints.size());
|
return new PathInfo(path, inflectionPoints.size());
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
|
|||||||
Reference in New Issue
Block a user