| | |
| | | |
| | | 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.domain.AgvAction; |
| | | import com.zy.acs.common.domain.AgvActionItem; |
| | | import com.zy.acs.common.domain.AgvProtocol; |
| | | import com.zy.acs.common.domain.BaseResult; |
| | | import com.zy.acs.common.domain.protocol.AGV_11_UP; |
| | | import com.zy.acs.common.domain.protocol.AGV_70_UP; |
| | | import com.zy.acs.common.domain.protocol.IMessageBody; |
| | | 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.utils.GsonUtils; |
| | | import com.zy.acs.common.utils.RedisSupport; |
| | | import com.zy.acs.common.utils.Utils; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.framework.common.SnowflakeIdWorker; |
| | |
| | | @Slf4j |
| | | @Service("mainService") |
| | | public class MainService { |
| | | |
| | | private final RedisSupport redis = RedisSupport.defaultRedisSupport; |
| | | |
| | | @Autowired |
| | | private BusService busService; |
| | |
| | | private ActionSorter actionSorter; |
| | | @Autowired |
| | | private StaReserveService staReserveService; |
| | | @Autowired |
| | | private ConveyorStationService conveyorStationService; |
| | | |
| | | @SuppressWarnings("all") |
| | | @Transactional |
| | |
| | | throw new BusinessException("oriLoc:" + task.getOriLoc$() + " failed to update"); |
| | | } |
| | | |
| | | // reserver station inbound, qty: 1 |
| | | destSta = staService.getById(task.getDestSta()); |
| | | if (null == staReserveService.reserveStaIn(destSta, task, 1)) { |
| | | throw new BusinessException("destSta:" + task.getDestSta$() + " failed to reserve"); |
| | | } |
| | | // if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) { |
| | | // throw new BusinessException("destSta:" + task.getDestSta$() + " is not in IDLE status"); |
| | | // } |
| | | // destSta.setStaSts(StaStsType.READY_RELEASE.val()); |
| | | // destSta.setUpdateTime(now); |
| | | // if (!staService.updateById(destSta)) { |
| | | // throw new BusinessException("destSta:" + task.getDestSta$() + " failed to update"); |
| | | // } |
| | | break; |
| | | case STA_TO_LOC: |
| | | oriSta = staService.getById(task.getOriSta()); |
| | | if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) { |
| | | throw new BusinessException("oriSta:" + task.getOriSta$() + " is not in STOCK status"); |
| | | } |
| | | oriSta.setStaSts(StaStsType.READY_TAKE.val()); |
| | | oriSta.setUpdateTime(now); |
| | | if (!staService.updateById(oriSta)) { |
| | | throw new BusinessException("oriSta:" + task.getOriSta$() + " failed to update"); |
| | | if (null == staReserveService.reserveStaOut(oriSta, task, 1)) { |
| | | throw new BusinessException("oriSta:" + task.getOriSta$() + " failed to reserve"); |
| | | } |
| | | |
| | | destLoc = locService.getById(task.getDestLoc()); |
| | |
| | | break; |
| | | case STA_TO_STA: |
| | | oriSta = staService.getById(task.getOriSta()); |
| | | if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) { |
| | | throw new BusinessException("oriSta:" + task.getOriSta$() + " is not in STOCK status"); |
| | | } |
| | | oriSta.setStaSts(StaStsType.READY_TAKE.val()); |
| | | oriSta.setUpdateTime(now); |
| | | if (!staService.updateById(oriSta)) { |
| | | throw new BusinessException("oriSta:" + task.getOriSta$() + " failed to update"); |
| | | if (null == staReserveService.reserveStaOut(oriSta, task, 1)) { |
| | | throw new BusinessException("oriSta:" + task.getOriSta$() + " failed to reserve"); |
| | | } |
| | | |
| | | destSta = staService.getById(task.getDestSta()); |
| | | if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) { |
| | | throw new BusinessException("destSta:" + task.getDestSta$() + " is not in IDLE status"); |
| | | } |
| | | destSta.setStaSts(StaStsType.READY_RELEASE.val()); |
| | | destSta.setUpdateTime(now); |
| | | if (!staService.updateById(destSta)) { |
| | | throw new BusinessException("destSta:" + task.getDestSta$() + " failed to update"); |
| | | if (null == staReserveService.reserveStaIn(destSta, task, 1)) { |
| | | throw new BusinessException("destSta:" + task.getDestSta$() + " failed to reserve"); |
| | | } |
| | | break; |
| | | default: |
| | |
| | | } |
| | | |
| | | 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"); |
| | | } |
| | | for (Task t : taskList) { |
| | | String resultAgvNo = allocateService.execute(t |
| | | // inbound |
| | | , (task, agvNo) -> { |
| | | |
| | | } |
| | | // normal |
| | | , (task, agvNo) -> { |
| | | if (Cools.isEmpty(agvNo)) { |
| | | return; |
| | | } |
| | | 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"); |
| | | } |
| | | }); |
| | | // 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); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | // 取放货请求包 |
| | | if (msgBody instanceof AGV_06_UP) { |
| | | AGV_06_UP agv_06_up = (AGV_06_UP) msgBody; |
| | | log.info("Agv [{}] 取放货请求包 ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_06_up)); |
| | | |
| | | boolean success = false; |
| | | |
| | | try { |
| | | Code code = codeService.getCacheByData(agv_06_up.getQrCode()); |
| | | |
| | | // query current segment |
| | | Segment currSeg = segmentService.getCurrRunningSeg(agv.getId(), code.getId()); |
| | | if (null == currSeg) { |
| | | log.error("failed to find curr segment [{}]", agv.getUuid()); |
| | | } else { |
| | | |
| | | // query current task |
| | | Task currTask = taskService.getById(currSeg.getTaskId()); |
| | | if (currTask == null || !currTask.getTaskSts().equals(TaskStsType.PROGRESS.val())) { |
| | | |
| | | log.error("agv[{}] task invalid, task={}", protocol.getAgvNo(), currSeg.getTaskId()); |
| | | } else { |
| | | |
| | | Sta sta; |
| | | TaskPosDto.PosType posType = TaskPosDto.PosType.of(currSeg.getPosType()); |
| | | assert null != posType; |
| | | switch (posType) { |
| | | case ORI_LOC: |
| | | case DEST_LOC: |
| | | success = true; |
| | | break; |
| | | case ORI_STA: |
| | | // load from sta |
| | | sta = staService.getById(currTask.getOriSta()); |
| | | // reserve to be waiting |
| | | if (!staReserveService.waitingStaReserve(sta, currTask, 1, StaReserveType.OUT)) { |
| | | break; |
| | | } |
| | | // convey plc valid |
| | | if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.OUT)) { |
| | | // reserve rollback |
| | | staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT); |
| | | break; |
| | | } |
| | | success = true; |
| | | break; |
| | | case DEST_STA: |
| | | // place to sta |
| | | sta = staService.getById(currTask.getDestSta()); |
| | | // reserve to be waiting |
| | | if (!staReserveService.waitingStaReserve(sta, currTask, 1, StaReserveType.IN)) { |
| | | break; |
| | | } |
| | | // convey plc valid |
| | | if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.IN)) { |
| | | // reserve rollback |
| | | staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN); |
| | | break; |
| | | } |
| | | success = true; |
| | | break; |
| | | default: |
| | | log.error("agv[{}] has wrong posType [{}], segment [{}]", protocol.getAgvNo(), posType.toString(), currSeg.getId()); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("agv[{}] failed to deal with action request, qrCode={}", agv.getUuid(), agv_06_up.getVal(), e); |
| | | } |
| | | |
| | | 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); |
| | | |
| | | redis.push(RedisConstant.AGV_PATH_DOWN_FLAG, AgvProtocol.build(protocol.getAgvNo()).setMessageBody(agv_06_down)); |
| | | } |
| | | |
| | | // 料仓信息包 |
| | | if (msgBody instanceof AGV_70_UP) { |
| | | AGV_70_UP agv_70_up = (AGV_70_UP) msgBody; |
| | |
| | | } |
| | | |
| | | if (taskComplete) { |
| | | locService.taskCallBack(task); |
| | | |
| | | task.setTaskSts(TaskStsType.COMPLETE.val()); |
| | | task.setEndTime(now); |
| | | task.setUpdateTime(now); |
| | | if (!taskService.updateById(task)) { |
| | | log.error("Task [{}] 更新失败 !!!", task.getSeqNum()); |
| | | } else { |
| | | taskService.maintainLocAndSta(task); |
| | | log.info("Task [{}] 作业完毕 ==========>> ", task.getSeqNum()); |
| | | } |
| | | |