|  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.core.annotations.ManagerAuth; | 
 |  |  | import com.core.common.Cools; | 
 |  |  | import com.core.exception.CoolException; | 
 |  |  | import com.zy.asrs.entity.*; | 
 |  |  | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.transaction.interceptor.TransactionAspectSupport; | 
 |  |  |  | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Set; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |                 } | 
 |  |  |                 // 库位移转 | 
 |  |  |                 this.locToLoc(crn, crnProtocol); | 
 |  |  |                 // 演示任务 | 
 |  |  |                 this.steMoveDemo(crn, crnProtocol); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 让小车从 远点 ====>> 移动到近点 | 
 |  |  |      *  等待堆垛机搬运 | 
 |  |  |      */ | 
 |  |  |     public void letCarBeReady(WrkCharge wrkCharge, Integer steNo) { | 
 |  |  |         // 获取穿梭车信息 | 
 |  |  |         SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
 |  |  |         SteProtocol steProtocol = steThread.getSteProtocol(); | 
 |  |  |         if (steProtocol == null) { return; } | 
 |  |  |         if (steProtocol.isIdle()) { | 
 |  |  |  | 
 |  |  |             // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |             SteCommand steCommand = new SteCommand(); | 
 |  |  |             steCommand.setSteNo(steNo); // 穿梭车编号 | 
 |  |  |             steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 | 
 |  |  |             steCommand.setTaskMode(SteTaskModeType.findOriginByLoc(steProtocol)); // 任务模式:  去近点 等待堆垛机叉取 | 
 |  |  |  | 
 |  |  |             steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue()); | 
 |  |  |             steCommand.setBay(steProtocol.getBay()); | 
 |  |  |             steCommand.setLev(steProtocol.getLev()); | 
 |  |  |  | 
 |  |  |             if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { | 
 |  |  |                 log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); | 
 |  |  |             } else { | 
 |  |  |                 // 修改工作档状态 绑定穿梭车 | 
 |  |  |                 wrkCharge.setSteNo(steNo); | 
 |  |  |                 wrkCharge.setModiTime(new Date()); | 
 |  |  |                 if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                     log.error("修改工作档状态 绑定穿梭车 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入出库  ===>>  堆垛机搬入小车 | 
 |  |  |      */ | 
 |  |  |     public void carMoveIn(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) { | 
 |  |  | 
 |  |  |                                 if (!steThread.confirmPos()) { | 
 |  |  |                                     log.error("{}号穿梭车重新定位失败!作业充电任务号:{}", wrkCharge.getSteNo(), wrkCharge.getWrkNo()); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } else if (wrkCharge.getWrkSts() == 27) { | 
 |  |  |                             // 堆垛机复位 | 
 |  |  |                             crnThread.setResetFlag(true); | 
 |  |  |                             // 穿梭车重新定位排列层 | 
 |  |  |                             SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkCharge.getSteNo()); | 
 |  |  |                             if (steThread.confirmPos()) { | 
 |  |  |                                 // 穿梭车下发充电任务 | 
 |  |  |                                 SteCommand steCommand = new SteCommand(); | 
 |  |  |                                 steCommand.setSteNo(wrkCharge.getSteNo()); // 穿梭车编号 | 
 |  |  |                                 steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 | 
 |  |  |                                 steCommand.setTaskMode(SteTaskModeType.CHARGE_LEFT); // 任务模式: 充电 | 
 |  |  |                                 if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) { | 
 |  |  |                                     log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand)); | 
 |  |  |                                 } else { | 
 |  |  |                                     // 27.放至充电位 ===>> 28.开始充电 | 
 |  |  |                                     wrkCharge.setWrkSts(28L); | 
 |  |  |                                     if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                                         log.error("修改充电任务状态 27.放至充电位 ===>> 28.开始充电 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 log.error("{}号穿梭车重新定位失败!作业充电任务号:{}", wrkCharge.getSteNo(), wrkCharge.getWrkNo()); | 
 |  |  |                             } | 
 |  |  |                         } else if (wrkCharge.getWrkSts() == 34) { | 
 |  |  |                             // 34.吊车搬运 ===>> 35.小车就绪 | 
 |  |  | 
 |  |  |                                 } else { | 
 |  |  |                                     steThread.setResetFlag(true); | 
 |  |  |                                 } | 
 |  |  |                             }  else if (wrkCharge.getWrkSts() == 32) { | 
 |  |  |                             } else if (wrkCharge.getWrkSts() == 28) { | 
 |  |  |                                 // 28.开始充电 ===>> 29.完成充电 | 
 |  |  |                                 wrkCharge.setWrkSts(29L); | 
 |  |  |                                 if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                                     log.error("修改充电任务状态 28.开始充电 ===>> 29.完成充电 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
 |  |  |                                 } else { | 
 |  |  |                                     steThread.setResetFlag(true); | 
 |  |  |                                 } | 
 |  |  |                             } else if (wrkCharge.getWrkSts() == 32) { | 
 |  |  |                                 // 32.小车走行 ===>> 33.小车待搬 | 
 |  |  |                                 wrkCharge.setWrkSts(33L); | 
 |  |  |                                 if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  | 
 |  |  |                 if (steProtocol.getCharge() > Float.parseFloat(basSte.getChargeLine())) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  | //                WrkCharge wrkCharge = wrkChargeService.selectWorking(steProtocol.getSteNo().intValue()); | 
 |  |  |                 WrkCharge wrkCharge = wrkChargeService.selectWorking(null); | 
 |  |  |  | 
 |  |  |                 if (wrkCharge == null && steProtocol.getChargeStatus() == 0) { | 
 |  |  | //                    String idleLoc = basSte.getIdleLoc(); | 
 |  |  |                     // 寻找空闲充电桩 | 
 |  |  |                     SteChargeType steCharge = devpThread.getIdleChargeLocNo(); | 
 |  |  |                     if (steCharge == null) { | 
 |  |  | 
 |  |  |                             } else { | 
 |  |  |                                 LocMast channelLoc = locMastService.selectById(channelLocNo); | 
 |  |  |  | 
 |  |  |                                 // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                                 CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                                 crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 堆垛机编号 | 
 |  |  |                                 crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                                 crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转 | 
 |  |  |                                 crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排 | 
 |  |  |                                 crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
 |  |  |                                 crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
 |  |  |                                 crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), true).shortValue());     // 目标库位排 | 
 |  |  |                                 crnCommand.setDestinationPosY(channelLoc.getBay1().shortValue());     // 目标库位列 | 
 |  |  |                                 crnCommand.setDestinationPosZ(channelLoc.getLev1().shortValue());     // 目标库位层 | 
 |  |  |                                 if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                                     log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                                 } else { | 
 |  |  |                                     // 修改穿梭车运行中排列层 | 
 |  |  |                                     steThread.modifyPos(Utils.getGroupRow(channelLoc.getLocNo(), true), channelLoc.getBay1(), channelLoc.getLev1()); | 
 |  |  |                                     // 修改工作档状态 22.小车待搬 => 23.吊车搬运 | 
 |  |  |                                     Date now = new Date(); | 
 |  |  |                                     wrkCharge.setWrkSts(23L); | 
 |  |  |                                     wrkCharge.setCrnStrTime(now); | 
 |  |  |                                     wrkCharge.setModiTime(now); | 
 |  |  |                                     if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                                         log.error("修改工作档状态 22.小车待搬 => 23.吊车搬运 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
 |  |  |                                 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkCharge.getCrnNo()); | 
 |  |  |                                 CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |                                 if (crnProtocol == null) { continue; } | 
 |  |  |                                 // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
 |  |  |                                 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
 |  |  |                                     // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                                     CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                                     crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 堆垛机编号 | 
 |  |  |                                     crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                                     crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                                     crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转 | 
 |  |  |                                     crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排 | 
 |  |  |                                     crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
 |  |  |                                     crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
 |  |  |                                     crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), true).shortValue());     // 目标库位排 | 
 |  |  |                                     crnCommand.setDestinationPosY(channelLoc.getBay1().shortValue());     // 目标库位列 | 
 |  |  |                                     crnCommand.setDestinationPosZ(channelLoc.getLev1().shortValue());     // 目标库位层 | 
 |  |  |                                     if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                                         log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                                     } else { | 
 |  |  |                                         // 修改穿梭车运行中排列层 | 
 |  |  |                                         steThread.modifyPos(Utils.getGroupRow(channelLoc.getLocNo(), true), channelLoc.getBay1(), channelLoc.getLev1()); | 
 |  |  |                                         // 修改工作档状态 22.小车待搬 => 23.吊车搬运 | 
 |  |  |                                         Date now = new Date(); | 
 |  |  |                                         wrkCharge.setWrkSts(23L); | 
 |  |  |                                         wrkCharge.setCrnStrTime(now); | 
 |  |  |                                         wrkCharge.setModiTime(now); | 
 |  |  |                                         if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                                             log.error("修改工作档状态 22.小车待搬 => 23.吊车搬运 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
 |  |  |                                         } | 
 |  |  |                                     } | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                                 break; | 
 |  |  |  | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                     } else if (wrkCharge.getWrkSts() == 24L) { | 
 |  |  |                         // 小车行驶至充电位 | 
 |  |  |                         // 小车行驶通道 | 
 |  |  |                         if (steProtocol.statusType.equals(SteStatusType.IDLE) && steProtocol.getPakMk().equals("N")) { | 
 |  |  |                             if (steProtocol.getChargeStatus() == 1) { continue; } | 
 |  |  |                             // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  | 
 |  |  |                             steCommand.setSteNo(wrkCharge.getSteNo()); // 穿梭车编号 | 
 |  |  |                             steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 | 
 |  |  |                             steCommand.setTaskMode(SteTaskModeType.GO_ORIGIN);  // 去右端 | 
 |  |  |  | 
 |  |  |                             steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue(), false).shortValue()); | 
 |  |  |                             steCommand.setBay(steProtocol.getBay()); | 
 |  |  |                             steCommand.setLev(steProtocol.getLev()); | 
 |  |  |                             if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) { | 
 |  |  |                                 log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand)); | 
 |  |  |                             } else { | 
 |  |  | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } else if (wrkCharge.getWrkSts() == 26) { | 
 |  |  |                         // 27.放至充电位 | 
 |  |  |                         // 固定堆垛机 | 
 |  |  |                         int crnNo = 1; | 
 |  |  |                         // 充电位 | 
 |  |  |                         LocMast chargeLoc = locMastService.selectById(wrkCharge.getLocNo()); | 
 |  |  |  | 
 |  |  |                         // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                         CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                         crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 堆垛机编号 | 
 |  |  |                         crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                         crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                         crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转 | 
 |  |  |                         crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue());     // 源库位排 | 
 |  |  |                         crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
 |  |  |                         crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
 |  |  |                         crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), true).shortValue());     // 目标库位排 | 
 |  |  |                         crnCommand.setDestinationPosY(channelLoc.getBay1().shortValue());     // 目标库位列 | 
 |  |  |                         crnCommand.setDestinationPosZ(channelLoc.getLev1().shortValue());     // 目标库位层 | 
 |  |  |                         if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                             log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                         } else { | 
 |  |  |                             // 修改穿梭车运行中排列层 | 
 |  |  |                             steThread.modifyPos(Utils.getGroupRow(channelLoc.getLocNo(), true), channelLoc.getBay1(), channelLoc.getLev1()); | 
 |  |  |                             // 修改工作档状态 22.小车待搬 => 23.吊车搬运 | 
 |  |  |                             Date now = new Date(); | 
 |  |  |                             wrkCharge.setWrkSts(23L); | 
 |  |  |                             wrkCharge.setCrnStrTime(now); | 
 |  |  |                             wrkCharge.setModiTime(now); | 
 |  |  |                             if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                                 log.error("修改工作档状态 22.小车待搬 => 23.吊车搬运 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
 |  |  |                         CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo); | 
 |  |  |                         CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |                         if (crnProtocol == null) { continue; } | 
 |  |  |                         // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
 |  |  |                         if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
 |  |  |                             // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                             CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                             crnCommand.setCrnNo(crnNo); // 堆垛机编号 | 
 |  |  |                             crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                             crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                             crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转 | 
 |  |  |                             crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), false).shortValue());     // 源库位排 | 
 |  |  |                             crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
 |  |  |                             crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
 |  |  |                             crnCommand.setDestinationPosX(chargeLoc.getRow1().shortValue());     // 目标库位排 | 
 |  |  |                             crnCommand.setDestinationPosY(chargeLoc.getBay1().shortValue());     // 目标库位列 | 
 |  |  |                             crnCommand.setDestinationPosZ(chargeLoc.getLev1().shortValue());     // 目标库位层 | 
 |  |  |                             if (!MessageQueue.offer(SlaveType.Crn, 1, new Task(2, crnCommand))) { | 
 |  |  |                                 log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", crnNo, JSON.toJSON(crnCommand)); | 
 |  |  |                             } else { | 
 |  |  |                                 // 修改穿梭车运行中排列层 | 
 |  |  |                                 steThread.modifyPos(chargeLoc.getRow1(), chargeLoc.getBay1(), chargeLoc.getLev1()); | 
 |  |  |                                 // 修改工作档状态 26.等待充电 => 27.放至充电位 | 
 |  |  |                                 Date now = new Date(); | 
 |  |  |                                 wrkCharge.setWrkSts(27L); | 
 |  |  |                                 wrkCharge.setCrnStrTime(now); | 
 |  |  |                                 wrkCharge.setModiTime(now); | 
 |  |  |                                 if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                                     log.error("修改工作档状态 26.等待充电 => 27.放至充电位 失败!!,工作号={}", wrkCharge.getWrkNo()); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public List<String> crn1DemoLocs = new ArrayList<String>(); public String crn1LastLoc = ""; | 
 |  |  |     public List<String> crn2DemoLocs = new ArrayList<String>(); public String crn2LastLoc = ""; | 
 |  |  |     public List<String> crn3DemoLocs = new ArrayList<String>(); public String crn3LastLoc = ""; | 
 |  |  |     public synchronized void demo() { | 
 |  |  |         if (Cools.isEmpty(crn1DemoLocs)) { | 
 |  |  |             crn1DemoLocs = locMastService.getDemoNextLoc(1); | 
 |  |  |         } | 
 |  |  |         if (Cools.isEmpty(crn2DemoLocs)) { | 
 |  |  |             crn2DemoLocs = locMastService.getDemoNextLoc(2); | 
 |  |  |         } | 
 |  |  |         if (Cools.isEmpty(crn3DemoLocs)) { | 
 |  |  |             crn3DemoLocs = locMastService.getDemoNextLoc(3); | 
 |  |  |         } | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |             if (!crn.getDemo()) { | 
 |  |  |                 continue; | 
 |  |  |             }   // 必须为演示状态 | 
 |  |  |  | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
 |  |  |             if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
 |  |  |  | 
 |  |  |                 // filter | 
 |  |  |                 if (wrkChargeService.selectCount(new EntityWrapper<WrkCharge>() | 
 |  |  |                         .eq("crn_no", crn.getId()).between("wrk_sts", 31, 36)) > 0) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 int steNo = crn.getId(); | 
 |  |  |                 SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
 |  |  |                 SteProtocol steProtocol = steThread.getSteProtocol(); | 
 |  |  |                 BasSte basSte = basSteService.selectById(steNo); | 
 |  |  |                 if (Cools.isEmpty(steProtocol, basSte)) { continue; } | 
 |  |  |  | 
 |  |  |                 // 只有当穿梭车空闲 并且 无任务时才继续执行 | 
 |  |  |                 if (steProtocol.isIdle()) { | 
 |  |  |  | 
 |  |  |                     String locNo = null; | 
 |  |  |                     Iterator<String> iterator = crn1DemoLocs.iterator(); | 
 |  |  |                     if (crn.getId() == 1) { | 
 |  |  |                         iterator = crn1DemoLocs.iterator(); | 
 |  |  |                     } else if (crn.getId() == 2) { | 
 |  |  |                         iterator = crn2DemoLocs.iterator(); | 
 |  |  |                     } else if (crn.getId() == 3) { | 
 |  |  |                         iterator = crn3DemoLocs.iterator(); | 
 |  |  |                     } | 
 |  |  |                     while (iterator.hasNext()) { | 
 |  |  |                         String next = iterator.next(); | 
 |  |  |                         String lastLoc = ""; | 
 |  |  |                         if (crn.getId() == 1) { | 
 |  |  |                             lastLoc = crn1LastLoc; | 
 |  |  |                         } else if (crn.getId() == 2) { | 
 |  |  |                             lastLoc = crn2LastLoc; | 
 |  |  |                         } else if (crn.getId() == 3) { | 
 |  |  |                             lastLoc = crn3LastLoc; | 
 |  |  |                         } | 
 |  |  |                         if (!Cools.isEmpty(lastLoc)) { | 
 |  |  |                             if (!lastLoc.substring(2, 7).equals(next.substring(2, 7)) || !Utils.getGroupRow(lastLoc).equals(Utils.getGroupRow(next))) { | 
 |  |  |                                 locNo = next; | 
 |  |  |                                 iterator.remove(); | 
 |  |  |                                 break; | 
 |  |  |                             } else { | 
 |  |  |                                 iterator.remove(); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             locNo = next; | 
 |  |  |                             iterator.remove(); | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                     } | 
 |  |  |                     if (!Cools.isEmpty(locNo)) { | 
 |  |  |                         if (crn.getId() == 1) { | 
 |  |  |                             crn1LastLoc = locNo; | 
 |  |  |                         } else if (crn.getId() == 2) { | 
 |  |  |                             crn2LastLoc = locNo; | 
 |  |  |                         } else if (crn.getId() == 3) { | 
 |  |  |                             crn3LastLoc = locNo; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     log.info("{}号堆垛机对{}库位进行演示", crn.getId(), locNo); | 
 |  |  |  | 
 |  |  |                     String sourceLocNo = Utils.getLocNo(steProtocol.getRow(), steProtocol.getBay(), steProtocol.getLev()); | 
 |  |  |  | 
 |  |  |                     WrkCharge wrkCharge = new WrkCharge(); | 
 |  |  |                     wrkCharge.setCrnNo(crn.getId()); | 
 |  |  |                     wrkCharge.setSteNo(steNo); | 
 |  |  |                     wrkCharge.setWrkNo(commonService.getChargeWorkNo(5)); | 
 |  |  |                     wrkCharge.setWrkSts(31L);   // 31.生成演示ID | 
 |  |  |                     wrkCharge.setIoPri((double) 10); | 
 |  |  |                     wrkCharge.setSourceLocNo(sourceLocNo); | 
 |  |  |                     wrkCharge.setLocNo(locNo); | 
 |  |  |                     wrkCharge.setMemo("demo"); | 
 |  |  |                     if (!wrkChargeService.insert(wrkCharge)) { | 
 |  |  |                         log.error("生成演示任务失败,堆垛机号:{},小车:{},源库位:{},目标库位:{}", crn.getId(), steNo, sourceLocNo, locNo); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 演示取货 | 
 |  |  |      */ | 
 |  |  |     private void steMoveDemo(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         // 获取工作档信息 | 
 |  |  |         WrkCharge wrkCharge = wrkChargeService.selectOne(new EntityWrapper<WrkCharge>().eq("crn_no", slave.getId()) | 
 |  |  |                 .in("wrk_sts", 31, 33, 35)); | 
 |  |  |         if (null == wrkCharge) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkCharge.getSteNo()); | 
 |  |  |         SteProtocol steProtocol = steThread.getSteProtocol(); | 
 |  |  |         if (null == steProtocol) { return; } | 
 |  |  |         if (steProtocol.isIdle()) { | 
 |  |  |             // 31.生成演示ID | 
 |  |  |             if (wrkCharge.getWrkSts() == 31L) { | 
 |  |  |                 this.letCarBeReady(wrkCharge, steProtocol.getSteNo().intValue()); | 
 |  |  |                 wrkCharge.setWrkSts(32L); | 
 |  |  |                 wrkCharge.setModiTime(new Date()); | 
 |  |  |                 if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                     log.error("修改演示任务{}工作档 31.生成演示ID ==>> 32.小车走行 失败!", wrkCharge.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |             // 33.小车待搬 | 
 |  |  |             } else if (wrkCharge.getWrkSts() == 33L) { | 
 |  |  |                 LocMast locMast = locMastService.selectById(wrkCharge.getLocNo()); | 
 |  |  |                 // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                 CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                 crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
 |  |  |                 crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转 | 
 |  |  |                 crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue());     // 源库位排 | 
 |  |  |                 crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
 |  |  |                 crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
 |  |  |                 crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排 | 
 |  |  |                 crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
 |  |  |                 crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                     log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                 } else { | 
 |  |  |                     // 修改穿梭车运行中排列层 | 
 |  |  |                     steThread.modifyPos(Utils.getGroupRow(locMast.getLocNo()), locMast.getBay1(), locMast.getLev1()); | 
 |  |  |                     // 修改工作档状态 33.小车待搬 => 34.吊车搬运 | 
 |  |  |                     Date now = new Date(); | 
 |  |  |                     wrkCharge.setWrkSts(34L); | 
 |  |  |                     wrkCharge.setCrnStrTime(now); | 
 |  |  |                     wrkCharge.setModiTime(now); | 
 |  |  |                     if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                         log.error("修改演示任务{}工作档 33.小车待搬 => 34.吊车搬运 失败!", wrkCharge.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             // 35.小车就绪 | 
 |  |  |             } else if (wrkCharge.getWrkSts() == 35L) { | 
 |  |  |  | 
 |  |  |                 int steNo = steProtocol.getSteNo().intValue(); | 
 |  |  |                 if (!basSteService.updatePakMk(steNo, "Y")) { | 
 |  |  |                     log.error("修改穿梭车作业状态 失败!!,穿梭车={}", steNo); | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                 SteCommand steCommand = new SteCommand(); | 
 |  |  |                 steCommand.setSteNo(steNo); // 穿梭车编号 | 
 |  |  |                 steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 | 
 |  |  |                 SteTaskModeType originByLoc = SteTaskModeType.findOriginByLoc(steProtocol.getRow().intValue()); | 
 |  |  |                 if (originByLoc.equals(SteTaskModeType.GO_ORIGIN)) { | 
 |  |  |                     originByLoc = SteTaskModeType.BACK_ORIGIN; | 
 |  |  |                 } else if (originByLoc.equals(SteTaskModeType.BACK_ORIGIN)) { | 
 |  |  |                     originByLoc = SteTaskModeType.GO_ORIGIN; | 
 |  |  |                 } else { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |                 steCommand.setTaskMode(originByLoc); | 
 |  |  |  | 
 |  |  |                 steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue()); | 
 |  |  |                 steCommand.setBay(steProtocol.getBay()); | 
 |  |  |                 steCommand.setLev(steProtocol.getLev()); | 
 |  |  |  | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { | 
 |  |  |                     log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); | 
 |  |  |                 } else { | 
 |  |  |                     // 修改工作档状态 35.小车就绪 => 36.小车走行 | 
 |  |  |                     wrkCharge.setWrkSts(36L); | 
 |  |  |                     wrkCharge.setModiTime(new Date()); | 
 |  |  |                     if (!wrkChargeService.updateById(wrkCharge)) { | 
 |  |  |                         log.error("修改演示任务{}工作档 35.小车就绪 => 36.小车走行 失败!", wrkCharge.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 因双深库位阻塞,对浅库位进行移转(出库版) |