#
luxiaotao1123
2024-11-29 ab886689e2c4ef8db2b0767717d69ebbaf10326c
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -2,15 +2,16 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.acs.common.utils.GsonUtils;
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.constant.MapDataConstant;
import com.zy.acs.manager.core.domain.BlockVehicleDto;
import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.core.domain.type.BlockSeverityType;
import com.zy.acs.manager.core.service.astart.MapDataDispatcher;
import com.zy.acs.manager.core.service.astart.NavigateNode;
import com.zy.acs.manager.core.service.astart.RetreatNavigateNode;
import com.zy.acs.manager.core.service.astart.WaveNodeType;
import com.zy.acs.manager.manager.entity.*;
@@ -38,12 +39,6 @@
@Component
public class TrafficService {
    public static final Integer MIN_SLICE_PATH_LENGTH = 3;
    public static final Integer MAX_JAM_TIMEOUT = 5 * 1000;
    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
    @Autowired
    private AgvService agvService;
    @Autowired
@@ -65,7 +60,7 @@
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private ActionService actionService;
    private AgvModelService agvModelService;
    @Autowired
    private RetreatNavigateService retreatNavigateService;
    @Autowired
@@ -209,9 +204,9 @@
        List<String> pathList = new ArrayList<>();
        // 无障碍解
        List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath, segment, null);
        List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath, segment);
        // 避让解
        List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true, blackPath, segment, null);
        List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true, blackPath, segment);
        if (!Cools.isEmpty(lockPathList) && // 存在避让解
            Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10
@@ -225,8 +220,10 @@
            if (blockSeverity.equals(BlockSeverityType.SEVERE)) {
                unlockPathList.remove(endCode.getData());
                blackPath.addAll(unlockPathList);
                List<String> list = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath, segment, blockSeverity);
                System.out.println(list.size());
                List<String> newUnlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath, segment);
                if (!Cools.isEmpty(newUnlockPathList)) {
                    draftPath = newUnlockPathList;
                }
            }
            // 可走行路径集合计算
            List<BlockVehicleDto> blockVehicleList = this.slicePathAndReturnBlockVehicleList(lev, draftPath, agvNo, pathList);    // jamAgvNo may was wave
@@ -237,7 +234,7 @@
                    assert !Cools.isEmpty(blockVehicleList);
                    boolean hasUnavoidableBlocks = blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable());
                    if (hasUnavoidableBlocks && pathList.size() <= MIN_SLICE_PATH_LENGTH) {
                    if (hasUnavoidableBlocks && pathList.size() <= MapDataConstant.MIN_SLICE_PATH_LENGTH) {
                        log.info("AGV[{}] waiting in place, because the path list is too short...", agvNo);
                        pathList.clear();
                    }
@@ -275,7 +272,7 @@
                        if (!Cools.isEmpty(jam.getAvoAgv())
                                && BlockVehicleDto.customContain(blockVehicleList, agvService.getById(jam.getAvoAgv()).getUuid())) {
                            maxJamTimeoutFactor = 10;
                            maxJamTimeoutFactor = 5;
                        } else {
@@ -334,7 +331,7 @@
                    // handle jam timeout
                    if (null != maxJamTimeoutFactor) {
                        if (System.currentTimeMillis() - jam.getStartTime().getTime() > MAX_JAM_TIMEOUT * maxJamTimeoutFactor) {
                        if (System.currentTimeMillis() - jam.getStartTime().getTime() > MapDataConstant.MAX_JAM_TIMEOUT * maxJamTimeoutFactor) {
                            if (!Cools.isEmpty(lockPathList)) {
@@ -517,6 +514,7 @@
    private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) {
        List<String> blackPathList = new ArrayList<>();
        Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV;
        if (!Cools.isEmpty(unfinishedOriginJamByCurrAgv)) {
            for (Jam jam : unfinishedOriginJamByCurrAgv) {
                if (!Cools.isEmpty(jam.getJamPath())) {
@@ -524,7 +522,7 @@
                    List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class);
                    Agv jamAgv = agvService.getById(jam.getJamAgv());
                    List<String> jamDynamicNodes = mapDataDispatcher.queryCodeListFromDynamicNode(null, jamAgv.getUuid());
                    List<String> jamDynamicNodes = mapDataDispatcher.queryCodeListFromDynamicNode(lev, jamAgv.getUuid());
                    // jamDynamicNodes has sorted
                    String firstCodeNode = jamDynamicNodes.stream().findFirst().orElse(null);
@@ -533,6 +531,15 @@
                        if (idx != -1) {
                            list = new ArrayList<>(list.subList(idx, list.size()));
                        }
                        // the wave of first node
                        Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(
                                agvModelService.getById(jamAgv.getAgvModel()).getDiameter(),
                                MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR
                        );
                        List<String> waveCodeList = mapService.getWaveScopeByCode(lev, firstCodeNode, avoidDistance)
                                .stream().map(NavigateNode::getCodeData).distinct().collect(Collectors.toList());
                        list.addAll(waveCodeList);
                    }
                    blackPathList.addAll(list);