|  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //四向穿梭车状态为等待确认 | 
 |  |  |             if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id && shuttleProtocol.getTaskNo() != 0) { | 
 |  |  |             if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id  //任务完成等待确认 | 
 |  |  |                     && shuttleProtocol.getTaskNo() != 0) { | 
 |  |  |                 //将任务档标记为完成 | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue()); | 
 |  |  |                 if (wrkMast != null) { | 
 |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //四向穿梭车状态为充电状态 | 
 |  |  |             if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id  //充电标识 | 
 |  |  |                     && shuttleProtocol.getTaskNo() != 0) { | 
 |  |  |                 //查询是否有充电任务 | 
 |  |  |                 WrkCharge wrkCharge = wrkChargeMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue()); | 
 |  |  |                 if (wrkCharge != null) { | 
 |  |  |                     switch (wrkCharge.getWrkSts().intValue()) { | 
 |  |  |                         case 52://四向穿梭车迁移到提升机口 | 
 |  |  |                             wrkCharge.setWrkSts(53L);//迁移完成 | 
 |  |  |                             shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING); | 
 |  |  |                             break; | 
 |  |  |                         case 56: | 
 |  |  |                             if (shuttleProtocol.getBatteryPower() == 1000) { | 
 |  |  |                                 wrkCharge.setWrkSts(60L);//充电完成 | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                         default: | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     if (wrkChargeMapper.updateById(wrkCharge) > 0) { | 
 |  |  |                         if (wrkCharge.getWrkSts() == 60) { | 
 |  |  |                             //设置四向穿梭车为空闲状态 | 
 |  |  |                             shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); | 
 |  |  |                         } | 
 |  |  |                         //任务号清零 | 
 |  |  |                         shuttleProtocol.setTaskNo((short) 0); | 
 |  |  |                         //源库位清零 | 
 |  |  |                         shuttleProtocol.setSourceLocNo(null); | 
 |  |  |                         //目标库位清零 | 
 |  |  |                         shuttleProtocol.setLocNo(null); | 
 |  |  |                         //标记复位 | 
 |  |  |                         shuttleProtocol.setPakMk(true); | 
 |  |  |                         //任务指令清零 | 
 |  |  |                         shuttleProtocol.setAssignCommand(null); | 
 |  |  |                         News.info("四向穿梭车已确认且任务完成状态,复位。四向穿梭车号={}", shuttleProtocol.getShuttleNo()); | 
 |  |  |                     } else { | 
 |  |  |                         News.error("四向穿梭车已确认且任务完成状态,复位失败,但未找到工作档。四向穿梭车号={},工作号={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |  | 
 |  |  |             commands.add(command2);//将命令添加进list | 
 |  |  |  | 
 |  |  |             //提升机搬运四向穿梭车 | 
 |  |  |             //提升机前往目标楼层 | 
 |  |  |             LiftCommand command3 = new LiftCommand(); | 
 |  |  |             command3.setLiftNo(liftProtocol.getLiftNo());//提升机号 | 
 |  |  |             command3.setTaskNo(liftProtocol.getTaskNo());//任务号 | 
 |  |  | 
 |  |  |             commands.add(command3);//将命令添加进list | 
 |  |  |  | 
 |  |  |             //提升机到达指定楼层,输送线将四向穿梭车移出去 | 
 |  |  |             //输送线将四向穿梭车移动进来 | 
 |  |  |             //输送线将四向穿梭车移动出去 | 
 |  |  |             LiftCommand command4 = new LiftCommand(); | 
 |  |  |             command4.setLiftNo(liftProtocol.getLiftNo());//提升机号 | 
 |  |  |             command4.setTaskNo(liftProtocol.getTaskNo());//任务号 | 
 |  |  | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) > 0) { | 
 |  |  |                         //设置提升机为空闲状态 | 
 |  |  |                         liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE); | 
 |  |  |                         //任务号清零 | 
 |  |  |                         liftProtocol.setTaskNo((short) 0); | 
 |  |  |                         //标记复位 | 
 |  |  |                         liftProtocol.setPakMk(true); | 
 |  |  |                         //任务指令清零 | 
 |  |  |                         liftProtocol.setAssignCommand(null); | 
 |  |  |                         //提升机解锁 | 
 |  |  |                         liftProtocol.setLiftLock(false); | 
 |  |  |                         News.info("提升机已确认且任务完成状态,复位。提升机号={}", liftProtocol.getLiftNo()); | 
 |  |  |                     } else { | 
 |  |  |                         News.error("提升机已确认且任务完成状态,复位失败,但未找到工作档。提升机号={},工作号={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //查询是否有充电任务 | 
 |  |  |                 WrkCharge wrkCharge = wrkChargeMapper.selectByWorkNo(liftProtocol.getTaskNo().intValue()); | 
 |  |  |                 if (wrkCharge != null) { | 
 |  |  |                     switch (wrkCharge.getWrkSts().intValue()) { | 
 |  |  |                         case 54://提升机搬运中 | 
 |  |  |                             wrkCharge.setWrkSts(55L);//提升机搬运完成 | 
 |  |  |                             break; | 
 |  |  |                         default: | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     if (wrkChargeMapper.updateById(wrkCharge) > 0) { | 
 |  |  |                         //设置提升机为空闲状态 | 
 |  |  |                         liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE); | 
 |  |  |                         //任务号清零 | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 四向穿梭车电量检测 ===>> 发起充电 | 
 |  |  |      */ | 
 |  |  |     public synchronized void loopShuttleCharge() { | 
 |  |  |         for (DevpSlave devpSlave : slaveProperties.getDevp()) { | 
 |  |  |             SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devpSlave.getId()); | 
 |  |  |             for (ShuttleSlave shuttle : slaveProperties.getShuttle()) { | 
 |  |  |                 //获取四向穿梭车线程 | 
 |  |  |                 ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId()); | 
 |  |  |                 ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); | 
 |  |  |                 if (shuttleProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //判断当前小车是否满足需要充电要求 | 
 |  |  |                 if (!shuttleProtocol.isRequireCharge()) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 WrkCharge wrkCharge = wrkChargeService.selectWorking(null, WrkChargeType.charge); | 
 |  |  |                 if (wrkCharge != null) {//已有充电任务 | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 ShuttleChargeType shuttleCharge = null; | 
 |  |  |                 String locNo; | 
 |  |  |                 for (ShuttleChargeType chargeType : ShuttleChargeType.values()) { | 
 |  |  |                     switch (chargeType.id) { | 
 |  |  |                         case 1: | 
 |  |  |                             if (devpThread.charge0 == false) { | 
 |  |  |                                 ShuttleChargeType first = ShuttleChargeType.FIRST; | 
 |  |  |                                 locNo = first.locNo; | 
 |  |  |                                 if (wrkChargeService.selectWorkingOfCharge(first.id) == null) { | 
 |  |  |                                     shuttleCharge = first; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                         default: | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (shuttleCharge == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 String chargeLocNo = shuttleCharge.locNo; | 
 |  |  |                 wrkCharge = new WrkCharge(); | 
 |  |  |                 wrkCharge.setShuttleNo(shuttle.getId()); | 
 |  |  |                 wrkCharge.setCharge(shuttleCharge.id); | 
 |  |  |                 wrkCharge.setWrkNo(commonService.getChargeWorkNo(4)); | 
 |  |  |                 wrkCharge.setWrkSts(51L);   // 21.准备充电 | 
 |  |  |                 wrkCharge.setIoPri((double) 10); | 
 |  |  |                 wrkCharge.setLocNo(chargeLocNo); | 
 |  |  |                 wrkCharge.setMemo("charge"); | 
 |  |  |                 wrkCharge.setAppeTime(new Date()); | 
 |  |  |                 if (!wrkChargeService.insert(wrkCharge)) { | 
 |  |  |                     News.error("保存{}号四向穿梭车充电任务失败!!!", shuttle.getId()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING);//充电中 | 
 |  |  |                 News.info("保存{}号四向穿梭车充电任务成功!!!", shuttle.getId()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 执行四向穿梭车充电任务 | 
 |  |  |      */ | 
 |  |  |     public synchronized void executeShuttleCharge() { | 
 |  |  |         WrkCharge wrkCharge = wrkChargeService.selectWorking(null, WrkChargeType.charge); | 
 |  |  |         if (wrkCharge == null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkCharge.getShuttleNo()); | 
 |  |  |         if (shuttleThread == null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); | 
 |  |  |         if (shuttleProtocol == null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //当前穿梭车库位号 | 
 |  |  |         String currentLocNo = shuttleProtocol.getCurrentLocNo(); | 
 |  |  |         //小车当前层高 | 
 |  |  |         Integer currentLev = Integer.parseInt(currentLocNo.substring(currentLocNo.length() - 2, currentLocNo.length())); | 
 |  |  |         //获取提升机 | 
 |  |  |         LiftSlave liftSlave = slaveProperties.getLift().get(0); | 
 |  |  |         //提升机库位号 | 
 |  |  |         String liftLocNo = liftSlave.getLiftLocNo(currentLev); | 
 |  |  |         //充电库位号 | 
 |  |  |         String chargeLocNo = wrkCharge.getLocNo(); | 
 |  |  |         //充电库位层高 | 
 |  |  |         Integer chargeLocNoLev = Integer.parseInt(chargeLocNo.substring(chargeLocNo.length() - 2, chargeLocNo.length())); | 
 |  |  |  | 
 |  |  |         if (wrkCharge.getWrkSts() == 51 || wrkCharge.getWrkSts() == 55) { | 
 |  |  |             if (currentLev == chargeLocNoLev) { | 
 |  |  |                 //同一层无需经过提升机 | 
 |  |  |                 //直接计算车到充电库位 | 
 |  |  |                 //获取小车到充电库位路径指令 | 
 |  |  |                 List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, chargeLocNo, ShuttleTaskModeType.PAK_IN.id); | 
 |  |  |                 //进行充电中 | 
 |  |  |                 shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING); | 
 |  |  |                 ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); | 
 |  |  |                 assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); | 
 |  |  |                 assignCommand.setTaskMode((short) 9);//充电 | 
 |  |  |                 assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); | 
 |  |  |                 assignCommand.setCharge(true);//充电任务 | 
 |  |  |  | 
 |  |  |                 //创建充电指令 | 
 |  |  |                 ShuttleCommand command = new ShuttleCommand(); | 
 |  |  |                 command.setCommandWord((short) 5);//充电 | 
 |  |  |                 command.setShuttleNo(shuttleProtocol.getShuttleNo()); | 
 |  |  |                 command.setChargeSwitch((short) 1);//开始充电 | 
 |  |  |                 command.setCommandEnd((short) 1); | 
 |  |  |                 commands.add(command); | 
 |  |  |  | 
 |  |  |                 //指令集分配 | 
 |  |  |                 assignCommand.setCommands(commands); | 
 |  |  |  | 
 |  |  |                 wrkCharge.setWrkSts(56L);//充电中状态 | 
 |  |  |                 if (wrkChargeMapper.updateById(wrkCharge) > 0) { | 
 |  |  |                     //下发任务 | 
 |  |  |                     MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); | 
 |  |  |                 } | 
 |  |  |             }else { | 
 |  |  |                 //不同层,将目标库位分配成提升机库位号 | 
 |  |  |  | 
 |  |  |                 //小车移动到提升机口,计算路径 | 
 |  |  |                 List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, ShuttleTaskModeType.PAK_IN.id); | 
 |  |  |                 //分配目标库位 | 
 |  |  |                 shuttleProtocol.setLocNo(liftLocNo); | 
 |  |  |  | 
 |  |  |                 ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); | 
 |  |  |                 assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); | 
 |  |  |                 assignCommand.setTaskMode((short) 9);//充电 | 
 |  |  |                 assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); | 
 |  |  |                 assignCommand.setCharge(true);//充电任务 | 
 |  |  |                 //目标库位 | 
 |  |  |                 assignCommand.setLocNo(liftLocNo); | 
 |  |  |                 //源库位 | 
 |  |  |                 assignCommand.setSourceLocNo(currentLocNo); | 
 |  |  |                 assignCommand.setCommands(commands); | 
 |  |  |                 wrkCharge.setWrkSts(52L);//小车迁移状态 | 
 |  |  |                 if (wrkChargeMapper.updateById(wrkCharge) > 0) { | 
 |  |  |                     //下发任务 | 
 |  |  |                     MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         }else if(wrkCharge.getWrkSts() == 53){ | 
 |  |  |             //小车已经达到提升机口 | 
 |  |  |             LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId()); | 
 |  |  |             if (liftThread == null) { | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |             LiftProtocol liftProtocol = liftThread.getLiftProtocol(); | 
 |  |  |             if (liftProtocol == null) { | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //判断提升机是否处于空闲状态 | 
 |  |  |             if (!liftProtocol.isIdle()) { | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //给提升机分配任务 | 
 |  |  |             liftProtocol.setLiftLock(true);//锁定提升机 | 
 |  |  |             liftProtocol.setTaskNo(wrkCharge.getWrkNo().shortValue());//设置任务号 | 
 |  |  |             liftProtocol.setShuttleNo(wrkCharge.getShuttleNo().shortValue());//设置四向穿梭车号 | 
 |  |  |             liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);//设置提升机状态为工作中 | 
 |  |  |  | 
 |  |  |             //命令list | 
 |  |  |             ArrayList<LiftCommand> commands = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |             //提升机当前楼层 | 
 |  |  |             int liftLev = liftProtocol.getLev().intValue(); | 
 |  |  |             if (liftLev != currentLev) { | 
 |  |  |                 //穿梭车和提升机处于不同楼层 | 
 |  |  |                 LiftCommand command1 = new LiftCommand(); | 
 |  |  |                 command1.setLiftNo(liftProtocol.getLiftNo());//提升机号 | 
 |  |  |                 command1.setTaskNo(liftProtocol.getTaskNo());//任务号 | 
 |  |  |                 command1.setRun((short) 1);//升降 | 
 |  |  |                 command1.setDistPosition(currentLev.shortValue());//目标楼层(穿梭车所在楼层) | 
 |  |  |                 command1.setLiftLock(true);//锁定提升机 | 
 |  |  |                 commands.add(command1);//将命令添加进list | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //输送线将四向穿梭车移动进来 | 
 |  |  |             LiftCommand command2 = new LiftCommand(); | 
 |  |  |             command2.setLiftNo(liftProtocol.getLiftNo());//提升机号 | 
 |  |  |             command2.setTaskNo(liftProtocol.getTaskNo());//任务号 | 
 |  |  |             command2.setRun((short) 6);//输送线运作 | 
 |  |  |             command2.setLiftLock(true);//锁定提升机 | 
 |  |  |  | 
 |  |  |             commands.add(command2);//将命令添加进list | 
 |  |  |  | 
 |  |  |             //提升机前往目标楼层 | 
 |  |  |             LiftCommand command3 = new LiftCommand(); | 
 |  |  |             command3.setLiftNo(liftProtocol.getLiftNo());//提升机号 | 
 |  |  |             command3.setTaskNo(liftProtocol.getTaskNo());//任务号 | 
 |  |  |             command3.setRun((short) 1);//升降 | 
 |  |  |             command3.setDistPosition(chargeLocNoLev.shortValue());//充电库位目标楼层 | 
 |  |  |             command3.setLiftLock(true);//锁定提升机 | 
 |  |  |  | 
 |  |  |             commands.add(command3);//将命令添加进list | 
 |  |  |  | 
 |  |  |             //提升机到达指定楼层,输送线将四向穿梭车移出去 | 
 |  |  |             //输送线将四向穿梭车移动出去 | 
 |  |  |             LiftCommand command4 = new LiftCommand(); | 
 |  |  |             command4.setLiftNo(liftProtocol.getLiftNo());//提升机号 | 
 |  |  |             command4.setTaskNo(liftProtocol.getTaskNo());//任务号 | 
 |  |  |             command4.setRun((short) 3);//输送线运作 | 
 |  |  |             command4.setLiftLock(true);//锁定提升机 | 
 |  |  |  | 
 |  |  |             commands.add(command4);//将命令添加进list | 
 |  |  |  | 
 |  |  |             wrkCharge.setWrkSts(54L);//提升机搬运中 | 
 |  |  |             //所需命令组合完毕,更新数据库,提交到线程去工作 | 
 |  |  |             LiftAssignCommand assignCommand = new LiftAssignCommand(); | 
 |  |  |             assignCommand.setCommands(commands); | 
 |  |  |             assignCommand.setLiftNo(liftProtocol.getLiftNo()); | 
 |  |  |             assignCommand.setTaskNo(liftProtocol.getTaskNo()); | 
 |  |  |             if (wrkChargeMapper.updateById(wrkCharge) > 0) { | 
 |  |  |                 //下发任务 | 
 |  |  |                 MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand)); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } else if (wrkCharge.getWrkSts() == 56) { | 
 |  |  |             //充电中 | 
 |  |  |             //判断小车是否充满电量 | 
 |  |  |             if (shuttleProtocol.getBatteryPower() == 1000) { | 
 |  |  |                 //充满,断开充电 | 
 |  |  |                 List<ShuttleCommand> commands = new ArrayList<>(); | 
 |  |  |                 ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); | 
 |  |  |                 assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); | 
 |  |  |                 assignCommand.setTaskMode((short) 0); | 
 |  |  |                 assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); | 
 |  |  |                 assignCommand.setCharge(true); | 
 |  |  |  | 
 |  |  |                 //创建充电指令 | 
 |  |  |                 ShuttleCommand command = new ShuttleCommand(); | 
 |  |  |                 command.setCommandWord((short) 5);//充电 | 
 |  |  |                 command.setShuttleNo(shuttleProtocol.getShuttleNo()); | 
 |  |  |                 command.setChargeSwitch((short) 2);//断开充电 | 
 |  |  |                 command.setCommandEnd((short) 1); | 
 |  |  |                 commands.add(command); | 
 |  |  |  | 
 |  |  |                 //指令集分配 | 
 |  |  |                 assignCommand.setCommands(commands); | 
 |  |  |  | 
 |  |  |                 shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); | 
 |  |  |                 //下发任务 | 
 |  |  |                 MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id) { | 
 |  |  |                 shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 小车电量检测 ===>> 发起充电 | 
 |  |  |      */ | 
 |  |  |     @SuppressWarnings("serial") |