| | |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.zy.acs.common.constant.RedisConstant; |
| | | import com.zy.acs.common.domain.AgvAction; |
| | | import com.zy.acs.common.domain.AgvActionItem; |
| | |
| | | return; |
| | | } |
| | | |
| | | List<Long> taskIds = taskList.stream().map(Task::getId).distinct().collect(Collectors.toList()); |
| | | for (Task task : taskList) { |
| | | Agv agv = allocateService.execute(task); |
| | | if (null == agv) { |
| | | // log.warn("Task[{}] has an issue, because it failed to check out agv which is idle...", task.getSeqNum()); |
| | | continue; |
| | | } |
| | | task.setAgvId(agv.getId()); |
| | | task.setTaskSts(TaskStsType.WAITING.val()); |
| | | task.setIoTime(now); |
| | | task.setUpdateTime(now); |
| | | if (!taskService.updateById(task)) { |
| | | throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); |
| | | } |
| | | // List<Long> taskIds = taskList.stream().map(Task::getId).distinct().collect(Collectors.toList()); |
| | | for (Task t : taskList) { |
| | | String resultAgvNo = allocateService.execute(t |
| | | // inbound |
| | | , (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 = 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"); |
| | | } |
| | | |
| | | // get backpack lev |
| | | int backpackLev = 0; |
| | | int backpack = agvService.getBackpack(agvId); |
| | | List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId); |
| | | for (int lev = 1; lev <= backpack; lev++) { |
| | | if (!usedBackpacks.contains(lev)) { |
| | | backpackLev = lev; |
| | | break; |
| | | } |
| | | } |
| | | if (backpackLev == 0) { |
| | | throw new BusinessException("[Agv:" + agvNo + "] backpack full, can't allocate inbound"); |
| | | } |
| | | |
| | | // update curr seg |
| | | currSeg.setState(SegmentStateType.INIT.toString()); |
| | | currSeg.setUpdateTime(now); |
| | | if (!segmentService.updateById(currSeg)) { |
| | | log.error("Segment [{}] failed to update !!!", currSeg.getGroupId() + " - " + currSeg.getSerial()); |
| | | } |
| | | |
| | | // new oriSta seg |
| | | Segment loadSeg = new Segment(); |
| | | loadSeg.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | | loadSeg.setTravelId(currSeg.getTravelId()); |
| | | loadSeg.setAgvId(agvId); |
| | | loadSeg.setTaskId(task.getId()); |
| | | loadSeg.setSerial(currSeg.getSerial() - 1); |
| | | loadSeg.setEndNode(sta.getCode()); |
| | | loadSeg.setPosType(TaskPosDto.PosType.ORI_STA.toString()); |
| | | loadSeg.setState(SegmentStateType.WAITING.toString()); |
| | | loadSeg.setBackpack(backpackLev); |
| | | loadSeg.setCreateTime(now); |
| | | loadSeg.setUpdateTime(now); |
| | | if (!segmentService.save(loadSeg)) { |
| | | log.error("Segment [{}] failed to save !!!", loadSeg.getTravelId() + " - " + loadSeg.getSerial()); |
| | | } |
| | | |
| | | // place segment |
| | | TaskTypeType taskType = Objects.requireNonNull(TaskTypeType.get(task.getTaskTypeEl())); |
| | | TaskPosDto.PosType posType; |
| | | Long endCodeId; |
| | | switch (taskType) { |
| | | case STA_TO_LOC: |
| | | posType = TaskPosDto.PosType.DEST_LOC; |
| | | Loc destLoc = locService.getById(task.getDestLoc()); |
| | | endCodeId = destLoc.getCode(); |
| | | break; |
| | | case STA_TO_STA: |
| | | posType = TaskPosDto.PosType.DEST_STA; |
| | | Sta destSta = staService.getById(task.getDestSta()); |
| | | endCodeId = destSta.getCode(); |
| | | break; |
| | | default: |
| | | throw new BusinessException("[Agv:" + agvNo + "] allocate inbound only supports STA_TO_LOC/STA_TO_STA"); |
| | | } |
| | | |
| | | 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.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()); |
| | | } |
| | | |
| | | // update task |
| | | task.setAgvId(agvId); |
| | | task.setTaskSts(TaskStsType.ASSIGN.val()); |
| | | task.setIoTime(now); |
| | | task.setUpdateTime(now); |
| | | if (!taskService.updateById(task)) { |
| | | throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); |
| | | } |
| | | } |
| | | // normal |
| | | , (task, agvNo, sta) -> { |
| | | Long agvId = agvService.getAgvId(agvNo); |
| | | task.setAgvId(agvId); |
| | | task.setTaskSts(TaskStsType.WAITING.val()); |
| | | task.setIoTime(now); |
| | | task.setUpdateTime(now); |
| | | if (!taskService.updateById(task)) { |
| | | throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); |
| | | } |
| | | }); |
| | | // if (Cools.isEmpty(agvNo)) { |
| | | //// log.warn("Task[{}] has an issue, because it failed to check out agv which is idle...", task.getSeqNum()); |
| | | // continue; |
| | | // } |
| | | // task.setAgvId(agvService.getAgvId(agvNo)); |
| | | // task.setTaskSts(TaskStsType.WAITING.val()); |
| | | // task.setIoTime(now); |
| | | // task.setUpdateTime(now); |
| | | // if (!taskService.updateById(task)) { |
| | | // throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update"); |
| | | // } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("mainService.infuseAgvForTask", e); |
| | |
| | | return o2.getPriority() - o1.getPriority(); |
| | | } |
| | | }); |
| | | Integer backpack = agvService.getBackpack(agv); |
| | | Integer backpack = agvService.getBackpack(agvId); |
| | | if (taskList.size() > backpack) { |
| | | taskList = taskList.subList(0, backpack); |
| | | } |
| | |
| | | travel.setTaskContent(JSON.toJSONString(list)); |
| | | travel.setTaskIds(JSON.toJSONString(taskList.stream().map(Task::getId).collect(Collectors.toList()))); |
| | | travel.setState(TravelStateType.RUNNING.toString()); |
| | | travel.setCreateTime(now); |
| | | travel.setUpdateTime(now); |
| | | if (!travelService.save(travel)) { |
| | | throw new BusinessException("任务组保存失败"); |
| | | } |
| | |
| | | segment.setPosType(taskPosDto.getPosType().toString()); |
| | | segment.setBackpack(backpackType.lev); |
| | | segment.setState(SegmentStateType.INIT.toString()); |
| | | segment.setCreateTime(now); |
| | | segment.setUpdateTime(now); |
| | | segmentList.add(segment); |
| | | } |
| | | } |
| | |
| | | List<Action> newActionList = actionSorter.optimizeSort(actionList); |
| | | String groupId = String.valueOf(snowflakeIdWorker.nextId()).substring(3); |
| | | |
| | | // update segment |
| | | for (Segment item : segmentList) { |
| | | LambdaUpdateWrapper<Segment> uw = new LambdaUpdateWrapper<Segment>() |
| | | .eq(Segment::getId, item.getId()) |
| | | .eq(Segment::getState, item.getState()) |
| | | .set(Segment::getGroupId, groupId) |
| | | .set(Segment::getState, SegmentStateType.RUNNING.toString()) |
| | | .set(Segment::getStartTime, now) |
| | | .set(Segment::getUpdateTime, now); |
| | | if (algoStartTime != null) { |
| | | uw.set(Segment::getAlgoTime, (int) (now.getTime() - algoStartTime.getTime())); |
| | | } |
| | | if (!segmentService.update(uw)) { |
| | | // segment 原子性保证 |
| | | throw new CoolException("更新Segment失败: segmentId=" + item.getId() + " state not WAITING"); |
| | | } |
| | | } |
| | | |
| | | // update segment |
| | | // for (Segment item : segmentList) { |
| | | // item.setGroupId(groupId); |
| | | // item.setState(SegmentStateType.RUNNING.toString()); |
| | | // item.setStartTime(now); |
| | | // item.setUpdateTime(now); |
| | | // if (null != algoStartTime) { |
| | | // item.setAlgoTime((int) (now.getTime() - algoStartTime.getTime())); |
| | | // } |
| | | // if (!segmentService.updateById(item)) { |
| | | // throw new CoolException("更新Segment失败"); |
| | | // } |
| | | // } |
| | | |
| | | // save action |
| | | int i = newActionList.size(); |
| | | for (Action action : newActionList) { |
| | |
| | | } |
| | | if (!actionService.saveBatch(newActionList)) { |
| | | throw new BusinessException("group[" + groupId + "] 动作保存失败"); |
| | | } |
| | | |
| | | // update segment |
| | | for (Segment item : segmentList) { |
| | | item.setGroupId(groupId); |
| | | item.setState(SegmentStateType.RUNNING.toString()); |
| | | item.setStartTime(now); |
| | | item.setUpdateTime(now); |
| | | if (null != algoStartTime) { |
| | | item.setAlgoTime((int) (now.getTime() - algoStartTime.getTime())); |
| | | } |
| | | if (!segmentService.updateById(item)) { |
| | | throw new CoolException("更新Segment失败"); |
| | | } |
| | | } |
| | | |
| | | log.info("{}号Agv动作组装完成,指令数量:{}", agvNo, newActionList.size()); |
| | |
| | | break; |
| | | } |
| | | // convey plc valid |
| | | if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.OUT)) { |
| | | if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.IN)) { |
| | | // reserve rollback |
| | | staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT); |
| | | staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN); |
| | | break; |
| | | } |
| | | success = true; |
| | |
| | | } |
| | | |
| | | if (taskComplete) { |
| | | // locService.taskCallBack(task); |
| | | |
| | | task.setTaskSts(TaskStsType.COMPLETE.val()); |
| | | task.setEndTime(now); |
| | | task.setUpdateTime(now); |