#
luxiaotao1123
2024-11-04 1fd685f39652223583e7f1a7044b8b7d6fb7f799
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -2,11 +2,11 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.acs.common.constant.RedisConstant;
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.common.constant.RedisConstant;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.manager.common.utils.MapDataUtils;
import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.core.domain.TrafficJamDto;
@@ -26,10 +26,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.*;
/**
 * Wavefront
@@ -84,24 +81,23 @@
            Travel travel = travelService.getById(segment.getTravelId());
            Agv agv = agvService.getById(travel.getAgvId());
            AgvDetail agvDetail = agvDetailService.selectByAgvId(travel.getAgvId());
            long endNode = segment.getEndNode();
            Code startCode = codeService.getById(agvDetail.getRecentCode());
            Code endCode = codeService.getById(endNode);
            // valid ----------------------------------------------------
            if (!agvService.judgeEnable(agv.getId())) {
                return;
            }
            if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) {
                return;
            }
            List<Segment> waitingSegList = segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString());
            if (!Cools.isEmpty(waitingSegList)) {
                for (Segment seg : waitingSegList) {
                    if (!seg.getId().equals(segment.getId())) {
                for (Segment waitingSeg : waitingSegList) {
                    if (!waitingSeg.getId().equals(segment.getId())) {
                        return;
                    }
                }
            }
            if (jamService.count(new LambdaQueryWrapper<Jam>()
                    .eq(Jam::getJamAgv, agv.getId())
                    .eq(Jam::getJamSeg, segment.getId())
@@ -112,23 +108,27 @@
                return;
            }
            // execute -----------------------------------------------
            //        ArrayList<List<TaskPosDto>> list = JSON.parseObject(travel.getTaskContent(), new TypeReference<ArrayList<List<TaskPosDto>>>() {});
            List<Segment> segmentList = new ArrayList<>();
            segmentList.add(segment);
            // get path list
            avoidWaveCalculator.calcWaveScope();    // * sync wave scope
            List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment);
            // checkout path
            Code startCode = codeService.getById(agvDetail.getRecentCode());
            Code endCode = codeService.getById(endNode);
            List<String> pathList = this.checkoutPath(agv, startCode, endCode, segment);
            if (Cools.isEmpty(pathList)) {
                return;
            }
            String lastCodeData = pathList.get(pathList.size() - 1);
            List<Segment> segmentList = new ArrayList<>();
            segmentList.add(segment);
            // slice
            String lastCodeData = pathList.get(pathList.size() - 1);
            if (!endCode.getData().equals(lastCodeData)) {
                // slice
                Code lastCode = codeService.selectByData(lastCodeData);
//                if (pathList.size() <= MIN_SLICE_PATH_LENGTH) {
//                    return;
@@ -138,11 +138,9 @@
                segment.setState(SegmentStateType.INIT.toString());
                segment.setUpdateTime(now);
                if (!segmentService.updateById(segment)) {
                    log.error("Segment [{}] 更新失败 !!!", segment.getTravelId() + " - " + segment.getSerial());
                    log.error("Segment [{}] failed to update !!!", segment.getGroupId() + " - " + segment.getSerial());
                }
                segmentList.clear();
                Code lastCode = codeService.selectByData(lastCodeData);
                // new move seg
                Segment insertSeg = new Segment();
@@ -157,7 +155,6 @@
                if (!segmentService.save(insertSeg)) {
                    log.error("Segment [{}] 保存失败 !!!", segment.getTravelId() + " - " + segment.getSerial());
                }
                segmentList.add(insertSeg);
            } else {
@@ -231,7 +228,8 @@
        List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true);
        if (!Cools.isEmpty(lockPathList) && // 存在避让解
            Math.abs(lockPathList.size() - unlockPathList.size()) <= Math.max((mapDataDispatcher.getCodeMatrix(lev)[0].length / 2), 5)) {
            Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10
        ) {
            pathList = lockPathList;
        } else {
@@ -245,7 +243,6 @@
                    String jamAgvNo = jamVehicleList.get(0);
                    if (mapDataDispatcher.queryCodeListFromDynamicNode(null, jamAgvNo).size() > 1 && pathList.size() <= MIN_SLICE_PATH_LENGTH) {
                        pathList.clear();
//                        return pathList;
                    }
                }
@@ -481,35 +478,31 @@
     * avoidPathList include wave node and dynamic node
     */
    private boolean notifyVehicleAvoid(String agvNo, String agvPosCode, List<String> avoidPathList, String sponsor, Jam jam) {
        assert avoidPathList.size() >= 2;
        Agv agv = agvService.selectByUuid(agvNo);
        if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) {
            log.warn("{}号车辆避让失败,存在进行中任务!!!", agvNo);
            return false;
        }
        int[] startMapIdx = mapDataDispatcher.getCodeMatrixIdx(null, agvPosCode);
        RetreatNavigateNode startNode = new RetreatNavigateNode(startMapIdx[0], startMapIdx[1], agvPosCode);
        assert avoidPathList.size() >= 2;
        RetreatNavigateNode finalNode = retreatNavigateService.execute(agvNo, startNode, avoidPathList, sponsor, jam);
        if (null == finalNode) {
            log.warn("{}号车辆避让失败,检索避让点失败!!!", agvNo);
            return false;
        }
        Date now = new Date();
        String endCodeData = finalNode.getCodeData();
        Agv agv = agvService.selectByUuid(agvNo);
        Code endCode = codeService.selectByData(endCodeData);
        jam.setAvoCode(endCode.getId());
        if (!Cools.isEmpty(segmentService.getByAgvAndState(agv.getId(), SegmentStateType.RUNNING.toString()))) {
            log.warn("{}号车辆避让失败,存在进行中任务!!!", agvNo);
            return false;
        }
        List<Segment> waitingSegList = segmentService.getByAgvAndState(agv.getId(), SegmentStateType.WAITING.toString());
        if (!Cools.isEmpty(waitingSegList)) {
            // revert
            Date now = new Date();
            for (Segment seg : waitingSegList) {
                seg.setState(SegmentStateType.INIT.toString());
                seg.setUpdateTime(now);