#
vincentlu
23 小时以前 f81c0ff58a4f5df9a62703c4361d1a5adc63570f
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -11,6 +11,7 @@
import com.zy.acs.common.domain.protocol.*;
import com.zy.acs.common.domain.protocol.action.*;
import com.zy.acs.common.enums.*;
import com.zy.acs.common.utils.Base62;
import com.zy.acs.common.utils.GsonUtils;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.common.utils.Utils;
@@ -251,33 +252,28 @@
                        , (task, agvNo, sta) -> {
                            Long agvId = agvService.getAgvId(agvNo);
//                            List<Travel> travelList = travelService.list(new LambdaQueryWrapper<Travel>()
//                                    .eq(Travel::getAgvId, agvId)
//                                    .eq(Travel::getState, TravelStateType.RUNNING.toString())
//                                    .orderByDesc(Travel::getCreateTime));
//                            if (Cools.isEmpty(travelList)) {
//                                throw new BusinessException("[Agv: " + agvNo + "]allocate inbound failed to find travel");
                            Travel travel = travelService.findRunningTravel(agvId);
                            if (null == travel) {
                                throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting travel");
                            }
                            // curr segment
                            Segment currSeg = segmentService.getCurrWaitingSeg(travel.getId(), agvId);
//                            if (null == currSeg) {
//                                currSeg = segmentService.getCurrRunningSeg(travel.getId(), agvId, null);
//                            }
//                            Travel travel = travelList.get(0);
//
//                            List<Segment> currSegments = segmentService.list(new LambdaQueryWrapper<Segment>()
//                                    .eq(Segment::getAgvId, agvId)
//                                    .eq(Segment::getTravelId, travel.getId())
//                            );
                            // load segment
                            Segment currSeg = segmentService.getRollerWaiting(agvId, sta.getCode(), TaskPosDto.PosType.ORI_STA);
                            if (null == currSeg) {
                                throw new BusinessException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting segment");
                                throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no waiting segment");
                            }
                            // get backpack lev
                            int backpackLev = 0;
                            int backpack = agvService.getBackpack(agvId);
                            int backpackCap = agvService.getBackpack(agvId);
                            List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
                            if (usedBackpacks.size() >= backpack) {
                            if (usedBackpacks.size() >= backpackCap) {
                                throw new CoolException("[Agv:" + agvNo + "] allocate inbound segment failed: no idle backpack to use");
                            }
                            for (int lev = 1; lev <= backpack; lev++) {
                            for (int lev = 1; lev <= backpackCap; lev++) {
                                if (!usedBackpacks.contains(lev)) {
                                    backpackLev = lev;
                                    break;
@@ -363,7 +359,6 @@
                            // DEST-only sort
                            destPosList.sort((a, b) -> {
                                // 主轴
                                double aFirst = a.getFirstWeight(sameGroupXy);
                                double bFirst = b.getFirstWeight(sameGroupXy);
@@ -381,11 +376,10 @@
                            // get placeSeg serial
                            int placeSegSerial;
                            // query placeSeg idx
                            int idx = -1;
                            for (int i = 0; i < destPosList.size(); i++) {
                                if (Objects.equals(destPosList.get(i).getCodeId(), newDto.getCodeId())
                                        && Objects.equals(destPosList.get(i).getTaskId(), newDto.getTaskId())) {
                                if (Objects.equals(destPosList.get(i).getTaskId(), newDto.getTaskId())
                                 && Objects.equals(destPosList.get(i).getCodeId(), newDto.getCodeId())) {
                                    idx = i;
                                    break;
                                }
@@ -512,9 +506,9 @@
                    return o2.getPriority() - o1.getPriority();
                }
            });
            Integer backpack = agvService.getBackpack(agvId);
            if (taskList.size() > backpack) {
                taskList = taskList.subList(0, backpack);
            Integer backpackCap = agvService.getBackpack(agvId);
            if (taskList.size() > backpackCap) {
                taskList = taskList.subList(0, backpackCap);
            }
            AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId);
@@ -584,7 +578,7 @@
                }
                if (backpackLev > backpack) {
                if (backpackLev > backpackCap) {
                    throw new BusinessException("解析Task失败,AGV背篓已满......");
                }
@@ -788,7 +782,8 @@
            task.setAgvId(agvId);
            task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
            List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
            task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
//            task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
            task.setSeqNum(Base62.encode(snowflakeIdWorker.nextId()));
            task.setOriCode(agvDetail.getCode());
            task.setDestCode(endCode.getId());
            // lane
@@ -993,7 +988,7 @@
                                reverse = true;
                            }
                            nextDirection = nextLaneDir; // 防止 第一个动作一定是 turn 出问题
                        } else if (null != lastLaneDir) { // todo turn 环形直角
                        } else if (null != lastLaneDir) { // turn 环形直角不应该存在于lane中
                            final double oppLastLaneDir = (lastLaneDir + 180) % 360;
                            if (!lastDirection.equals(lastLaneDir)) {
@@ -1835,7 +1830,7 @@
                Code code = codeService.getCacheByData(agv_06_up.getQrCode());
                // query current segment
                Segment currSeg = segmentService.getCurrRunningSeg(agv.getId(), code.getId());
                Segment currSeg = segmentService.getCurrRunningSeg(null, agv.getId(), code.getId());
                if (null == currSeg) {
                    log.error("failed to find curr segment [{}]", agv.getUuid());
                } else {
@@ -1868,6 +1863,7 @@
                                    staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT);
                                    break;
                                }
                                log.info("AGV[{}] load permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
                                success = true;
                                break;
                            case DEST_STA:
@@ -1883,6 +1879,7 @@
                                    staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN);
                                    break;
                                }
                                log.info("AGV[{}] unload permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
                                success = true;
                                break;
                            default:
@@ -1899,8 +1896,7 @@
            AGV_06_DOWN agv_06_down = new AGV_06_DOWN();
            agv_06_down.setSerialNo(agv_06_up.getSerialNo());
            agv_06_down.setActionCode(agv_06_up.getActionCode());
            //agv_06_down.setResult(success ? 1 : 0);
            agv_06_down.setResult(1);
            agv_06_down.setResult(success ? 1 : 0);
            redis.push(RedisConstant.AGV_PATH_DOWN_FLAG, AgvProtocol.build(protocol.getAgvNo()).setMessageBody(agv_06_down));
        }