#
luxiaotao1123
2024-11-06 337746fee651f91e9c63bd1c33a474c236d51889
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -6,8 +6,8 @@
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.BlockVehicleDto;
import com.zy.acs.manager.core.domain.TaskPosDto;
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;
import com.zy.acs.manager.core.service.astart.WaveNodeType;
@@ -24,6 +24,7 @@
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.*;
import java.util.stream.Collectors;
/**
 * Wavefront
@@ -188,28 +189,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();
@@ -232,13 +211,15 @@
        } else {
            // 可走行路径集合计算
            List<String> blockVehicleList = this.slicePathAndReturnBlockVehicleList(lev, unlockPathList, agvNo, pathList);    // jamAgvNo may was wave
            List<BlockVehicleDto> blockVehicleList = this.slicePathAndReturnBlockVehicleList(lev, unlockPathList, agvNo, pathList);    // jamAgvNo may was wave
            if (!Cools.isEmpty(pathList)) {
                if (!Cools.isEmpty(blockVehicleList) && !pathList.get(pathList.size() - 1).equals(endCode.getData())) {
                    String blockAgvNo = blockVehicleList.get(0);
                    if (mapDataDispatcher.queryCodeListFromDynamicNode(null, blockAgvNo).size() > 1 && pathList.size() <= MIN_SLICE_PATH_LENGTH) {
                if (!pathList.get(pathList.size() - 1).equals(endCode.getData())) {
                    assert !Cools.isEmpty(blockVehicleList);
                    if (blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable())
                            && pathList.size() <= MIN_SLICE_PATH_LENGTH) {
                        pathList.clear();
                    }
                }
@@ -249,9 +230,15 @@
                // 阻塞车辆列表
                assert !Cools.isEmpty(blockVehicleList);
                String blockAgvNo = blockVehicleList.get(0);
                String blockAgvNo = blockVehicleList.stream()
                        .filter(BlockVehicleDto::isAvoidable)
                        .map(BlockVehicleDto::getVehicle)
                        .findFirst().orElse(null);
                // 如果全是运行中的阻塞agv,则不进行避让逻辑  todo
                if (Cools.isEmpty(blockAgvNo)) {
                    return pathList;
                }
                boolean initJamCache = false;
                if (null == jam) {
                    jam = new Jam();
                    jam.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
@@ -264,7 +251,11 @@
                        log.error("{}号车辆在{}定位被阻塞,记录阻塞状态失败!!!", agvNo, startCode.getData());
                        return pathList;
                    }
                    initJamCache = true;
                } else {
                    jam.setDuration(System.currentTimeMillis() - jam.getStartTime().getTime());
                    if (!jamService.updateById(jam)) {
                        log.error("{}编号阻塞记录更新失败!!!", jam.getUuid());
                    }
                }
                long previousTimestamp = jam.getStartTime().getTime();
@@ -378,13 +369,6 @@
                }
                if (!initJamCache) {
                    jam.setDuration(System.currentTimeMillis() - jam.getStartTime().getTime());
                    if (!jamService.updateById(jam)) {
                        log.error("{}编号阻塞记录更新失败!!!", jam.getUuid());
                    }
                }
            }
        }
@@ -399,7 +383,7 @@
                    log.error("{}编号阻塞记录完成修改失败!!!", jam.getUuid());
                }
            }
            // expired jam
            // deal expired jam
            for (Jam expiredJam : jamService.list(new LambdaQueryWrapper<Jam>()
                    .eq(Jam::getJamAgv, agv.getId())
                    .eq(Jam::getState, JamStateType.RUNNING.toString()))) {
@@ -416,8 +400,8 @@
        return pathList;
    }
    private List<String> slicePathAndReturnBlockVehicleList(Integer lev, List<String> fullPathList, String agvNo, List<String> pathList) {
        List<String> blockVehicleList = new ArrayList<>();
    private List<BlockVehicleDto> slicePathAndReturnBlockVehicleList(Integer lev, List<String> fullPathList, String agvNo, List<String> pathList) {
        List<BlockVehicleDto> blockVehicleList = new ArrayList<>();
        DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev);
        String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev);
@@ -430,18 +414,24 @@
                List<String> waveNodeList = MapDataUtils.parseWaveNode(waveNode);
                List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo);
                if (!Cools.isEmpty(otherWaveList)) {
                    blockVehicleList.addAll(otherWaveList);
                    for (String otherWave : otherWaveList) {
                        if (1 < mapDataDispatcher.queryCodeListFromDynamicNode(lev, otherWave).size()) {
                            blockVehicleList.add(new BlockVehicleDto(otherWave, false));
                        } else {
                            blockVehicleList.add(new BlockVehicleDto(otherWave, true));
                        }
                    }
                    break;
                }
            }
            DynamicNode dynamicNode = dynamicMatrix[node[0]][node[1]];
            String vehicle = dynamicNode.getVehicle();
            assert !vehicle.equals(DynamicNodeType.BLOCK.val);
            if (!vehicle.equals(DynamicNodeType.ACCESS.val) && !vehicle.equals(agvNo)) {
                blockVehicleList.add(vehicle);
                break;
            }
//            DynamicNode dynamicNode = dynamicMatrix[node[0]][node[1]];
//            String vehicle = dynamicNode.getVehicle();
//            assert !vehicle.equals(DynamicNodeType.BLOCK.val);
//            if (!vehicle.equals(DynamicNodeType.ACCESS.val) && !vehicle.equals(agvNo)) {
//                blockVehicleList.add(vehicle);
//                break;
//            }
            pathList.add(code);
        }
@@ -450,7 +440,7 @@
            pathList.clear();
        }
        return blockVehicleList;
        return blockVehicleList.stream().distinct().collect(Collectors.toList());
    }
    /**