|  |  | 
 |  |  | package com.zy.asrs.wcs.core.timer; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.zy.asrs.framework.exception.CoolException; | 
 |  |  | import com.zy.asrs.wcs.core.entity.Task; | 
 |  |  | import com.zy.asrs.wcs.core.kernel.command.*; | 
 |  |  | 
 |  |  |     private LiftCommandService liftCommandService; | 
 |  |  |     @Autowired | 
 |  |  |     private ShuttleCommandService shuttleCommandService; | 
 |  |  |     @Autowired | 
 |  |  |     private MapCommandService mapCommandService; | 
 |  |  |  | 
 |  |  | //    @Scheduled(cron = "0/1 * * * * ? ") | 
 |  |  |     @Scheduled(cron = "0/1 * * * * ? ") | 
 |  |  |     public synchronized void executeTask() { | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // ANALYZE_INBOUND | 
 |  |  |         for (Task task : taskService.selectByAnalyzeSts()) { | 
 |  |  |             Motion executingMotion = motionService.selectOfTop1(task.getUuid(), MotionStsType.EXECUTING.val(), task.getHostId()); | 
 |  |  |             if (executingMotion != null) {//存在正在执行的motion | 
 |  |  |                 continue; | 
 |  |  |                 if (executingMotion.getSync() == 1) {//当前执行中的动作是同步动作,等待执行完成后再执行下一个动作 | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //异步动作,只允许下一条动作被执行 | 
 |  |  |                 Motion nextMotion = motionService.getOne(new LambdaQueryWrapper<Motion>().eq(Motion::getUuid, executingMotion.getUuid()).eq(Motion::getPriority, executingMotion.getPriority() - 1)); | 
 |  |  |                 if (nextMotion != null) { | 
 |  |  |                     if (!(nextMotion.getMotionSts() == MotionStsType.INIT.val() || nextMotion.getMotionSts() == MotionStsType.WAITING.val())) { | 
 |  |  |                         continue;//下一条动作已经被执行,不允许再执行后续动作 | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             Motion motion = motionService.selectOfTop1(task.getUuid(), MotionStsType.INIT.val(), task.getHostId()); | 
 |  |  |             if (null != motion) { | 
 |  |  | 
 |  |  |         for (Task taskCharge : taskService.selectChargeByAnalyzeSts()) { | 
 |  |  |             Motion executingMotion = motionService.selectOfTop1(taskCharge.getUuid(), MotionStsType.EXECUTING.val(), taskCharge.getHostId()); | 
 |  |  |             if (executingMotion != null) {//存在正在执行的motion | 
 |  |  |                 continue; | 
 |  |  |                 if (executingMotion.getSync() == 1) {//当前执行中的动作是同步动作,等待执行完成后再执行下一个动作 | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             Motion motion = motionService.selectOfTop1(taskCharge.getUuid(), MotionStsType.INIT.val(), taskCharge.getHostId()); | 
 |  |  | 
 |  |  |         for (Task task : taskService.selectManualByAnalyzeSts()) { | 
 |  |  |             Motion executingMotion = motionService.selectOfTop1(task.getUuid(), MotionStsType.EXECUTING.val(), task.getHostId()); | 
 |  |  |             if (executingMotion != null) {//存在正在执行的motion | 
 |  |  |                 continue; | 
 |  |  |                 if (executingMotion.getSync() == 1) {//当前执行中的动作是同步动作,等待执行完成后再执行下一个动作 | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             Motion motion = motionService.selectOfTop1(task.getUuid(), MotionStsType.INIT.val(), task.getHostId()); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Scheduled(cron = "0/1 * * * * ? ") | 
 |  |  |     public synchronized void executeMoveTask() { | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // ANALYZE_MOVE | 
 |  |  |         for (Task task : taskService.selectMoveByAnalyzeSts()) { | 
 |  |  |             Motion executingMotion = motionService.selectOfTop1(task.getUuid(), MotionStsType.EXECUTING.val(), task.getHostId()); | 
 |  |  |             if (executingMotion != null) {//存在正在执行的motion | 
 |  |  |                 if (executingMotion.getSync() == 1) {//当前执行中的动作是同步动作,等待执行完成后再执行下一个动作 | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             Motion motion = motionService.selectOfTop1(task.getUuid(), MotionStsType.INIT.val(), task.getHostId()); | 
 |  |  |             if (null != motion) { | 
 |  |  |                 boolean result = this.executeMotion(motion); | 
 |  |  |                 if (!result) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 更新Task | 
 |  |  |                 switch (TaskStsType.query(task.getTaskSts())) { | 
 |  |  |                     case ANALYZE_MOVE: | 
 |  |  |                         task.setTaskSts(TaskStsType.EXECUTE_MOVE.sts); | 
 |  |  |                         break; | 
 |  |  |                 } | 
 |  |  |                 task.setUpdateTime(now); | 
 |  |  |                 if (!taskService.updateById(task)) { | 
 |  |  |                     log.error("{}其他工作档更新状态失败!", task.getTaskNo()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         // EXECUTE_MOVE | 
 |  |  |         for (Task task : taskService.selectMoveByExecuteSts()) { | 
 |  |  |             if (!motionService.hasRunningMotion(task.getUuid(), task.getHostId())) { | 
 |  |  |                 Motion motion = motionService.selectOfTop1(task.getUuid(), MotionStsType.WAITING.val(), task.getHostId()); | 
 |  |  |                 if (null != motion) { | 
 |  |  |                     boolean result = this.executeMotion(motion); | 
 |  |  |                     if (!result) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     if (motionService.selectOfTop1(task.getUuid(), MotionStsType.EXECUTING.val(), task.getHostId()) != null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 更新Task | 
 |  |  |                     switch (TaskStsType.query(task.getTaskSts())) { | 
 |  |  |                         case EXECUTE_MOVE: | 
 |  |  |                             task.setTaskSts(TaskStsType.COMPLETE_MOVE.sts); | 
 |  |  |                             break; | 
 |  |  |                     } | 
 |  |  |                     task.setUpdateTime(now); | 
 |  |  |                     if (!taskService.updateById(task)) { | 
 |  |  |                         log.error("{}他工作档更新状态失败!", task.getTaskNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Scheduled(cron = "0/1 * * * * ? ") | 
 |  |  |     public void scanMotionByExecuting() { | 
 |  |  |         List<Motion> motionList = motionService.selectBySts(MotionStsType.EXECUTING.val()); | 
 |  |  |         for (Motion motion : motionList) { | 
 |  |  | 
 |  |  |         Boolean executeRes = Boolean.FALSE; | 
 |  |  |         switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl())).deviceCtg) { | 
 |  |  |             case CONVEYOR: | 
 |  |  | //                executeRes = conveyorCommandService.accept(motion); | 
 |  |  |                 executeRes = conveyorCommandService.accept(motion); | 
 |  |  |                 break; | 
 |  |  |             case CRANE: | 
 |  |  |                 executeRes = craneCommandService.accept(motion); | 
 |  |  | 
 |  |  |                 break; | 
 |  |  |             case AGV: | 
 |  |  |                 executeRes = agvCommandService.accept(motion); | 
 |  |  |                 break; | 
 |  |  |             case MAP: | 
 |  |  |                 executeRes = mapCommandService.accept(motion); | 
 |  |  |                 break; | 
 |  |  |             default: | 
 |  |  |                 break; | 
 |  |  | 
 |  |  |                 executeRes = shuttleCommandService.finish(motion); | 
 |  |  |                 break; | 
 |  |  |             case CONVEYOR: | 
 |  |  | //                executeRes = conveyorCommandService.finish(motion); | 
 |  |  |                 executeRes = conveyorCommandService.finish(motion); | 
 |  |  |                 break; | 
 |  |  |             case MAP: | 
 |  |  |                 executeRes = mapCommandService.finish(motion); | 
 |  |  |                 break; | 
 |  |  |             default: | 
 |  |  |                 break; |