| | |
| | | import com.zy.acs.common.domain.BaseResult; |
| | | import com.zy.acs.common.domain.protocol.*; |
| | | import com.zy.acs.common.domain.protocol.action.*; |
| | | import com.zy.acs.common.enums.AgvBackpackType; |
| | | import com.zy.acs.common.enums.AgvCompleteType; |
| | | import com.zy.acs.common.enums.AgvDirectionType; |
| | | import com.zy.acs.common.enums.AgvSpeedType; |
| | | import com.zy.acs.common.enums.*; |
| | | import com.zy.acs.common.utils.GsonUtils; |
| | | import com.zy.acs.common.utils.RedisSupport; |
| | | import com.zy.acs.common.utils.Utils; |
| | |
| | | import com.zy.acs.manager.core.domain.AgvBackpackDto; |
| | | import com.zy.acs.manager.core.domain.Lane; |
| | | import com.zy.acs.manager.core.domain.TaskPosDto; |
| | | import com.zy.acs.manager.core.integrate.conveyor.ConveyorStationService; |
| | | import com.zy.acs.manager.core.service.astart.MapDataDispatcher; |
| | | import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam; |
| | | import com.zy.acs.manager.manager.entity.*; |
| | |
| | | @Autowired |
| | | private AgvModelService agvModelService; |
| | | @Autowired |
| | | private LaneService laneService; |
| | | private LaneBuilder laneBuilder; |
| | | @Autowired |
| | | private ActionSorter actionSorter; |
| | | @Autowired |
| | |
| | | int backpackLev = 0; |
| | | int backpack = agvService.getBackpack(agvId); |
| | | List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId); |
| | | if (usedBackpacks.size() >= backpack) { |
| | | throw new CoolException("[Agv:" + agvNo + "] allocate inbound segment failed: no idle backpack to use"); |
| | | } |
| | | for (int lev = 1; lev <= backpack; lev++) { |
| | | if (!usedBackpacks.contains(lev)) { |
| | | backpackLev = lev; |
| | |
| | | currSeg.setState(SegmentStateType.INIT.toString()); |
| | | currSeg.setUpdateTime(now); |
| | | if (!segmentService.updateById(currSeg)) { |
| | | log.error("Segment [{}] failed to update !!!", currSeg.getGroupId() + " - " + currSeg.getSerial()); |
| | | // log.error("Segment [{}] failed to update !!!", currSeg.getGroupId() + " - " + currSeg.getSerial()); |
| | | throw new CoolException("failed to update segment [" + currSeg.getGroupId() + "-" + currSeg.getSerial() + "] failed"); |
| | | } |
| | | |
| | | // new oriSta seg |
| | |
| | | loadSeg.setCreateTime(now); |
| | | loadSeg.setUpdateTime(now); |
| | | if (!segmentService.save(loadSeg)) { |
| | | log.error("Segment [{}] failed to save !!!", loadSeg.getTravelId() + " - " + loadSeg.getSerial()); |
| | | // log.error("Segment [{}] failed to save !!!", loadSeg.getTravelId() + " - " + loadSeg.getSerial()); |
| | | throw new CoolException("failed to save segment [" + loadSeg.getGroupId() + "-" + loadSeg.getSerial() + "] failed"); |
| | | } |
| | | |
| | | // place segment |
| | | TaskTypeType taskType = Objects.requireNonNull(TaskTypeType.get(task.getTaskTypeEl())); |
| | | TaskPosDto.PosType posType; |
| | | Long endCodeId; |
| | | Code endCode; |
| | | switch (taskType) { |
| | | case STA_TO_LOC: |
| | | posType = TaskPosDto.PosType.DEST_LOC; |
| | | Loc destLoc = locService.getById(task.getDestLoc()); |
| | | endCodeId = destLoc.getCode(); |
| | | endCode = codeService.getCacheById(destLoc.getCode()); |
| | | break; |
| | | case STA_TO_STA: |
| | | posType = TaskPosDto.PosType.DEST_STA; |
| | | Sta destSta = staService.getById(task.getDestSta()); |
| | | endCodeId = destSta.getCode(); |
| | | endCode = codeService.getCacheById(destSta.getCode()); |
| | | break; |
| | | default: |
| | | throw new BusinessException("[Agv:" + agvNo + "] allocate inbound only supports STA_TO_LOC/STA_TO_STA"); |
| | | } |
| | | |
| | | // calc placeSeg serial, through code position |
| | | List<Segment> destSegList = segmentService.list(new LambdaQueryWrapper<Segment>() |
| | | .eq(Segment::getAgvId, agvId) |
| | | .eq(Segment::getTravelId, currSeg.getTravelId()) |
| | | .ne(Segment::getState, SegmentStateType.FINISH.toString()) |
| | | .in(Segment::getPosType, |
| | | TaskPosDto.PosType.DEST_LOC.toString(), |
| | | TaskPosDto.PosType.DEST_STA.toString()) |
| | | .orderByAsc(Segment::getSerial) |
| | | ); |
| | | |
| | | // build destPosList and sort |
| | | List<TaskPosDto> destPosList = new ArrayList<>(); |
| | | for (Segment destSeg : destSegList) { |
| | | Code code = codeService.getCacheById(destSeg.getEndNode()); |
| | | if (code == null) continue; |
| | | |
| | | TaskPosDto dto = new TaskPosDto(destSeg.getTaskId(), new Double[]{code.getX(), code.getY()}, TaskPosDto.PosType.DEST_LOC); |
| | | dto.setCodeId(code.getId()); |
| | | dto.setSegId(destSeg.getId()); |
| | | destPosList.add(dto); |
| | | } |
| | | TaskPosDto newDto = new TaskPosDto(task.getId(), new Double[]{endCode.getX(), endCode.getY()}, TaskPosDto.PosType.DEST_LOC); |
| | | newDto.setCodeId(endCode.getId()); |
| | | destPosList.add(newDto); |
| | | |
| | | // sort - reference to buildMarjoTask |
| | | final String sameGroupXy = configService.getVal("sameGroupXy", String.class); |
| | | |
| | | // DEST-only sort |
| | | destPosList.sort((a, b) -> { |
| | | |
| | | // 主轴 |
| | | double aFirst = a.getFirstWeight(sameGroupXy); |
| | | double bFirst = b.getFirstWeight(sameGroupXy); |
| | | int c = Double.compare(aFirst, bFirst); |
| | | if (c != 0) return c; |
| | | |
| | | // 副轴 |
| | | double aSecond = a.getSecondWeight(sameGroupXy); |
| | | double bSecond = b.getSecondWeight(sameGroupXy); |
| | | c = Double.compare(aSecond, bSecond); |
| | | if (c != 0) return c; |
| | | |
| | | return Long.compare(a.getTaskId(), b.getTaskId()); |
| | | }); |
| | | |
| | | // 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())) { |
| | | idx = i; |
| | | break; |
| | | } |
| | | } |
| | | if (idx < 0) { |
| | | throw new BusinessException("failed to locate new destination in sorted list"); |
| | | } |
| | | |
| | | // 后继点 |
| | | if (idx + 1 == destPosList.size()) { |
| | | placeSegSerial = destSegList.get(destSegList.size() - 1).getSerial() + 1; |
| | | } else { |
| | | TaskPosDto afterTaskPos = destPosList.get(idx + 1); |
| | | Segment afterSeg = destSegList.stream() |
| | | .filter(destSeg -> Objects.equals(destSeg.getId(), afterTaskPos.getSegId())) |
| | | .findFirst() |
| | | .orElse(null); |
| | | if (null == afterSeg) { |
| | | placeSegSerial = destSegList.get(destSegList.size() - 1).getSerial() + 1; |
| | | } else { |
| | | placeSegSerial = afterSeg.getSerial(); |
| | | } |
| | | } |
| | | // placeSegSerial = Math.max(placeSegSerial, currSeg.getSerial() + 1); |
| | | |
| | | // shift serial after |
| | | segmentService.update(new LambdaUpdateWrapper<Segment>() |
| | | .eq(Segment::getAgvId, agvId) |
| | | .eq(Segment::getTravelId, currSeg.getTravelId()) |
| | | .ge(Segment::getSerial, placeSegSerial) |
| | | .ne(Segment::getState, SegmentStateType.FINISH.toString()) |
| | | .setSql("serial = serial + 1") |
| | | .set(Segment::getUpdateTime, now) |
| | | ); |
| | | |
| | | // save place segment |
| | | Segment placeSeg = new Segment(); |
| | | placeSeg.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | | placeSeg.setTravelId(currSeg.getTravelId()); |
| | | placeSeg.setAgvId(agvId); |
| | | placeSeg.setTaskId(task.getId()); |
| | | placeSeg.setSerial(); |
| | | placeSeg.setEndNode(endCodeId); |
| | | placeSeg.setSerial(placeSegSerial); |
| | | placeSeg.setEndNode(endCode.getId()); |
| | | placeSeg.setPosType(posType.toString()); |
| | | placeSeg.setState(SegmentStateType.INIT.toString()); |
| | | placeSeg.setBackpack(backpackLev); |
| | | placeSeg.setCreateTime(now); |
| | | placeSeg.setUpdateTime(now); |
| | | if (!segmentService.save(placeSeg)) { |
| | | log.error("Segment [{}] failed to save !!!", placeSeg.getTravelId() + " - " + placeSeg.getSerial()); |
| | | // log.error("Segment [{}] failed to save !!!", placeSeg.getTravelId() + " - " + placeSeg.getSerial()); |
| | | throw new CoolException("failed to save segment [" + placeSeg.getGroupId() + "-" + placeSeg.getSerial() + "] failed"); |
| | | } |
| | | |
| | | // update task |
| | |
| | | if (!taskService.updateById(task)) { |
| | | throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); |
| | | } |
| | | // update reserve |
| | | staReserveService.allocateCallBack(task, agvId); |
| | | } |
| | | // normal |
| | | , (task, agvNo, sta) -> { |
| | | Long agvId = agvService.getAgvId(agvNo); |
| | | // update task |
| | | task.setAgvId(agvId); |
| | | task.setTaskSts(TaskStsType.WAITING.val()); |
| | | task.setIoTime(now); |
| | |
| | | if (!taskService.updateById(task)) { |
| | | throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); |
| | | } |
| | | // update reserve |
| | | staReserveService.allocateCallBack(task, agvId); |
| | | }); |
| | | // if (Cools.isEmpty(agvNo)) { |
| | | //// log.warn("Task[{}] has an issue, because it failed to check out agv which is idle...", task.getSeqNum()); |
| | |
| | | * val: new TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType) |
| | | */ |
| | | Map<String, List<TaskPosDto>> groups = new HashMap<>(); |
| | | final String sameGroupXy = configService.getVal( "sameGroupXy", String.class); |
| | | final String sameGroupXy = configService.getVal("sameGroupXy", String.class); |
| | | |
| | | int backpackLev = 0; |
| | | for (Task task : taskList) { |
| | |
| | | |
| | | |
| | | // generate travel |
| | | travelService.finishAll(agvId); |
| | | Travel travel = new Travel(); |
| | | travel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | | travel.setTravelId(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | |
| | | task.setOriCode(agvDetail.getCode()); |
| | | task.setDestCode(endCode.getId()); |
| | | // lane |
| | | Lane destLane = laneService.search(endCode.getData()); |
| | | Lane destLane = laneBuilder.search(endCode.getData()); |
| | | if (null != destLane) { |
| | | task.setDestLaneHash(destLane.getHashCode()); |
| | | } |
| | |
| | | } |
| | | |
| | | // generate travel |
| | | travelService.finishAll(agvId); |
| | | Travel travel = new Travel(); |
| | | travel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | | travel.setTravelId(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | |
| | | |
| | | AgvModel agvModel = agvModelService.getByAgvId(agvId); |
| | | Double workDirection = agvModel.getWorkDirection(); |
| | | boolean backupAction = null != agvModel.getBackupAction() && agvModel.getBackupActionBool(); |
| | | boolean needUndocking = null != agvModel.getNeedUndocking() && agvModel.getNeedUndockingBool(); |
| | | AgvSpeedType agvSpeedType = AgvSpeedType.query(agvModel.getTravelSpeed()); |
| | | assert agvSpeedType != null; |
| | | |
| | |
| | | if (!lastCode.getCornerBool()) { |
| | | // 如果是作业方向,但是小车在巷道内方向错误,则停止 |
| | | if (reverse && !lastDirection.equals(nextDirection)) { |
| | | // throw new CoolException(agvNo + "号小车方向错误,请推至转弯点手动调整"); |
| | | throw new CoolException(agvNo + "号小车方向错误,请推至转弯点手动调整"); |
| | | } |
| | | // 如果不是作业方向,判断是否相反方向,如果反方向则倒退行走 |
| | | if (nextDirection.equals((lastDirection + 180) % 360)) { |
| | |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.TurnCorner.desc, // 名称 |
| | | mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 属性值 |
| | | (double) mapService.spinDirection(lastCode).val, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(nextDirection), // 动作参数 |
| | | ActionTypeType.TurnCorner.val(), // 动作类型 |
| | |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.TurnCorner.desc, // 名称 |
| | | mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 属性值 |
| | | (double) mapService.spinDirection(lastCode).val, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(nextDirection), // 动作参数 |
| | | ActionTypeType.TurnCorner.val(), // 动作类型 |
| | |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.TurnCorner.desc, // 名称 |
| | | mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 属性值 |
| | | (double) mapService.spinDirection(lastCode).val, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(workDirection), // 动作参数 |
| | | ActionTypeType.TurnCorner.val(), // 动作类型 |
| | |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | // 暂存点放货 |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyReleaseToAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyReleaseToAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | // 背篓放货 |
| | | if (backupAction) { |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyReleaseToAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyReleaseToAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | } |
| | | break; |
| | | case DEST_LOC: |
| | | assert backpackType != null; |
| | |
| | | if (!lastDirection.equals(workDirection)) { |
| | | throw new CoolException(agvNo + "号小车方向错误,请推至转弯点手动调整"); |
| | | } |
| | | // 暂存点取货货 |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyTakeFromAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyTakeFromAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | // 背篓取货 |
| | | if (backupAction) { |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyTakeFromAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyTakeFromAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | } |
| | | |
| | | // 货架放货 |
| | | Loc destLoc = locService.getById(task.getDestLoc()); |
| | |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.TurnCorner.desc, // 名称 |
| | | mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 属性值 |
| | | (double) mapService.spinDirection(lastCode).val, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(oriStaWorkDirection), // 动作参数 |
| | | ActionTypeType.TurnCorner.val(), // 动作类型 |
| | |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | // 暂存点放货 |
| | | assert backpackType != null; |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyReleaseToAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyReleaseToAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | // 背篓放货 |
| | | if (backupAction) { |
| | | assert backpackType != null; |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyReleaseToAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyReleaseToAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | } |
| | | break; |
| | | case DEST_STA: |
| | | // 站点放货 |
| | |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.TurnCorner.desc, // 名称 |
| | | mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 属性值 |
| | | (double) mapService.spinDirection(lastCode).val, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(destStaWorkDirection), // 动作参数 |
| | | ActionTypeType.TurnCorner.val(), // 动作类型 |
| | |
| | | )); |
| | | lastDirection = destStaWorkDirection; |
| | | } |
| | | // 暂存点取货 |
| | | assert backpackType != null; |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyTakeFromAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyTakeFromAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | // 背篓取货 |
| | | if (backupAction) { |
| | | assert backpackType != null; |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | | task.getBusId(), // 总线 |
| | | task.getId(), // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.ReadyTakeFromAgvSite.desc, // 名称 |
| | | (double) backpackType.lev, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(backpackType.height), // 动作参数 |
| | | ActionTypeType.ReadyTakeFromAgvSite.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | } |
| | | // 计算货叉工作方向 |
| | | staWorkDirection = mapService.calculateAgvWorkDirectionByStation(destStaWorkDirection, lastDirection); |
| | | actionList.add(new Action( |
| | |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.TurnCorner.desc, // 名称 |
| | | mapService.isTurnCorner(lastCode.getData()) ? 1D : 0D, // 属性值 |
| | | (double) mapService.spinDirection(lastCode).val, // 属性值 |
| | | lastCode.getData(), // 地面码 |
| | | String.valueOf(chargeDirection), // 动作参数 |
| | | ActionTypeType.TurnCorner.val(), // 动作类型 |
| | |
| | | |
| | | } |
| | | |
| | | // 如果充电中,则先断开充电 |
| | | if (needUndocking && agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) { |
| | | String undockingCode = Cools.isEmpty(actionList) ? lastCode.getData() : actionList.get(0).getCode(); |
| | | // undocking charge |
| | | actionList.add(0, new Action( |
| | | null, // 编号 |
| | | null, // 总线 |
| | | null, // 任务 |
| | | null, // 动作号 |
| | | null, // 优先级 |
| | | ActionTypeType.UndockingCharge.desc, // 名称 |
| | | null, // 属性值 |
| | | undockingCode, // 地面码 |
| | | null, // 动作参数 |
| | | ActionTypeType.UndockingCharge.val(), // 动作类型 |
| | | actionPrepareSts, // 动作进度 |
| | | agvId, // AGV |
| | | now // 工作时间 |
| | | )); |
| | | } |
| | | |
| | | // finish |
| | | actionList.add(new Action( |
| | | null, // 编号 |
| | |
| | | now // 工作时间 |
| | | )); |
| | | |
| | | List<Action> newActionList = actionSorter.optimizeSort(actionList); |
| | | String groupId = String.valueOf(snowflakeIdWorker.nextId()).substring(3); |
| | | |
| | | // update segment |
| | |
| | | // throw new CoolException("更新Segment失败"); |
| | | // } |
| | | // } |
| | | |
| | | // optimize action list, must have backpack |
| | | List<Action> newActionList = backupAction ? actionSorter.optimizeSort(actionList) : actionList; |
| | | |
| | | // save action |
| | | int i = newActionList.size(); |
| | |
| | | .setQrCode(action.getCode()) |
| | | ); |
| | | break; |
| | | case UndockingCharge: |
| | | agvAction.add(new AgvActionItem<>(UndockingChargeAction.class) |
| | | .setQrCode(action.getCode()) |
| | | ); |
| | | break; |
| | | default: |
| | | break; |
| | | } |