|  |  | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.transaction.interceptor.TransactionAspectSupport; | 
 |  |  |  | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Set; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |                 } | 
 |  |  |                 // 库位移转 | 
 |  |  | //                this.locToLoc(crn, crnProtocol); | 
 |  |  |                 // 演示 | 
 |  |  |                 this.steMoveDemo(crn, crnProtocol); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | 
 |  |  |             LocMast locMast = locMastService.selectById(locNo); | 
 |  |  |             int lev = locMast.getLev1(); | 
 |  |  |             int bay = locMast.getBay1(); | 
 |  |  |             int levAbs = Math.abs(lev - steProtocol.getLev()); | 
 |  |  |             int bayAbs = Math.abs(bay - steProtocol.getBay()); | 
 |  |  |             if (val == 0) { | 
 |  |  |                 val = levAbs + bayAbs; | 
 |  |  |                 result = steThread; | 
 |  |  |             } else { | 
 |  |  |                 if ((levAbs + bayAbs) < val) { | 
 |  |  |                     val = levAbs + bayAbs; | 
 |  |  |                     result = steThread; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public SteThread queryIdleCar(CrnProtocol crnProtocol) { | 
 |  |  |         List<BasSte> basStes = basSteService.selectList(new EntityWrapper<>()); | 
 |  |  |         int val = 0; | 
 |  |  |         SteThread result = null; | 
 |  |  |         for (BasSte basSte : basStes) { | 
 |  |  |             // 获取穿梭车信息 | 
 |  |  |             SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, basSte.getSteNo()); | 
 |  |  |             SteProtocol steProtocol = steThread.getSteProtocol(); | 
 |  |  |             if (steProtocol == null) { continue; } | 
 |  |  |             if (!steProtocol.isIdle()) { continue; } | 
 |  |  |             if (steProtocol.getRow() == 1) { continue;} | 
 |  |  |             int lev = crnProtocol.getLevel(); | 
 |  |  |             int bay = crnProtocol.getBay(); | 
 |  |  |             int levAbs = Math.abs(lev - steProtocol.getLev()); | 
 |  |  |             int bayAbs = Math.abs(bay - steProtocol.getBay()); | 
 |  |  |             if (val == 0) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<String> crn2DemoLocs = new ArrayList<String>(); public String crn2LastLoc = ""; | 
 |  |  |     public synchronized void demo() { | 
 |  |  |         if (Cools.isEmpty(crn2DemoLocs)) { | 
 |  |  |             crn2DemoLocs = locMastService.getDemoNextLoc(2); | 
 |  |  |         } | 
 |  |  |         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; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 SteThread steThread = queryIdleCar(crnProtocol); | 
 |  |  |                 if (Cools.isEmpty(steThread)) { | 
 |  |  |                     log.warn("没有空闲的小车进行演示功能"); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 int steNo = steThread.getSlave().getId(); | 
 |  |  |                 SteProtocol steProtocol = steThread.getSteProtocol(); | 
 |  |  |                 BasSte basSte = basSteService.selectById(steNo); | 
 |  |  |                 if (Cools.isEmpty(steProtocol, basSte)) { continue; } | 
 |  |  |  | 
 |  |  |                 // 只有当穿梭车空闲 并且 无任务时才继续执行 | 
 |  |  |                 if (steProtocol.isIdle()) { | 
 |  |  |  | 
 |  |  |                     String locNo = null; | 
 |  |  |                     Iterator<String> iterator = crn2DemoLocs.iterator(); | 
 |  |  |                     while (iterator.hasNext()) { | 
 |  |  |                         String next = iterator.next(); | 
 |  |  |                         String lastLoc = crn2LastLoc; | 
 |  |  |                         if (!Cools.isEmpty(lastLoc)) { | 
 |  |  |                             if (!lastLoc.substring(2, 7).equals(next.substring(2, 7)) | 
 |  |  |                                     || !Utils.getGroupRow(lastLoc, true).equals(Utils.getGroupRow(next, true))) { | 
 |  |  |                                 locNo = next; | 
 |  |  |                                 iterator.remove(); | 
 |  |  |                                 break; | 
 |  |  |                             } else { | 
 |  |  |                                 iterator.remove(); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             locNo = next; | 
 |  |  |                             iterator.remove(); | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                     } | 
 |  |  |                     if (!Cools.isEmpty(locNo)) { | 
 |  |  |                         crn2LastLoc = 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) { | 
 |  |  |                 if (steProtocol.isLoading()) { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |                 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()); | 
 |  |  |                 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()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |