|  |  | 
 |  |  |     /** | 
 |  |  |      * 入库  ===>>  堆垛机站到库位 | 
 |  |  |      */ | 
 |  |  |     public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  |     public boolean crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) { | 
 |  |  |             boolean flag = false; | 
 |  |  |             // 获取堆垛机入库站信息 | 
 |  |  | 
 |  |  |             if (!flag) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // 获取工作状态为2(设备上走)的入库工作档 | 
 |  |  |             WrkMast wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo()); | 
 |  |  |             // 获取工作状态为 2,3,4,5,6 的入库工作档 | 
 |  |  |             WrkMast wrkMast = wrkMastMapper.selectPakInStep23456(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo()); | 
 |  |  |             if(null == wrkMast) { | 
 |  |  | //                log.error("查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo()); | 
 |  |  |                 continue; | 
 |  |  | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 堆垛机控制过滤 | 
 |  |  |             if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // todo:小车迁入出 | 
 |  |  |             // 目标库位 ===>> 最外层库位 | 
 |  |  |             if (locMastService.isOutMost(wrkMast.getLocNo())) { | 
 |  |  | 
 |  |  |                     } | 
 |  |  |                     // 小车搬走 | 
 |  |  |                     if (wrkMast.getWrkSts() == 3L) { | 
 |  |  |                         this.carMoveOut(wrkMast, steNo); | 
 |  |  |                         this.carMoveOut(wrkMast, steNo, crnProtocol); | 
 |  |  |                     } | 
 |  |  |                 // 没有小车 | 
 |  |  |                 } else { | 
 |  |  | 
 |  |  |                     if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                         log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                     } else { | 
 |  |  |  | 
 |  |  |                         // 修改工作档状态 2.设备上走 => 7.吊车入库中 | 
 |  |  |                         // 修改工作档状态  7.吊车入库中 | 
 |  |  |                         Date now = new Date(); | 
 |  |  |                         wrkMast.setWrkSts(7L); | 
 |  |  |                         wrkMast.setCrnStrTime(now); | 
 |  |  |                         wrkMast.setModiTime(now); | 
 |  |  |                         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                             log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                             log.error("修改工作档状态 {} => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkSts$(), wrkMast.getWrkNo()); | 
 |  |  |                         } | 
 |  |  |                         return true; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             // 目标库位 ===>> 非最外层库位 | 
 |  |  |             } else { | 
 |  |  |                 // 判断小车是否在当前组库位,如果是则堆垛机将货物放置小车上,如果不是,则直接堆垛机搬移小车至当前组的最外层库位 | 
 |  |  |                 Integer steNo = this.hasCarOfIdle(wrkMast.getLocNo()); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //            this.carMoveIn(wrkMast); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             // 已经存在吊车执行任务时,则过滤 | 
 |  |  |             if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  |                 return; | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 入库  ===>>  堆垛机搬出小车 | 
 |  |  |      */ | 
 |  |  |     public void carMoveOut(WrkMast wrkMast, Integer steNo) { | 
 |  |  |     public void carMoveOut(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) { | 
 |  |  |         // 获取穿梭车信息 | 
 |  |  |         SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); | 
 |  |  |         SteProtocol steProtocol = steThread.getSteProtocol(); | 
 |  |  |         if (steProtocol == null) { return; } | 
 |  |  |         // 穿梭车空闲 | 
 |  |  |         if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) { | 
 |  |  |             // 堆垛机空闲 | 
 |  |  |             if (crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() == 0) { | 
 |  |  |                 // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                 CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                 crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
 |  |  |                 crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                 crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排 | 
 |  |  |                 crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
 |  |  |                 crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
 |  |  |                 crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排 | 
 |  |  |                 crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
 |  |  |                 crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                     log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                 } else { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                     // 修改工作档状态 3.小车待搬 => 5.迁出小车 | 
 |  |  |                     Date now = new Date(); | 
 |  |  |                     wrkMast.setWrkSts(5L); | 
 |  |  |                     wrkMast.setCrnStrTime(now); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                         log.error("修改工作档状态 3.小车待搬 => 5.迁出小车 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机针对于小车迁移工作的完成 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void carMoveFinished() { | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { continue; } | 
 |  |  |             //  状态:等待确认 并且  任务完成位 = 1 | 
 |  |  |             if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { | 
 |  |  |                 // 获取入库待确认工作档 | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectPakInStep56(crnProtocol.getTaskNo().intValue()); | 
 |  |  |                 if (wrkMast == null) { | 
 |  |  |                     log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 入库 + 库位转移  ==> 4.入库完成 | 
 |  |  |                 if ((wrkMast.getWrkSts() == 5 || wrkMast.getWrkSts() == 6) || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)){ | 
 |  |  |                     wrkMast.setWrkSts(9L); | 
 |  |  |                 } else  { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 Date now = new Date(); | 
 |  |  |                 wrkMast.setCrnEndTime(now); | 
 |  |  |                 wrkMast.setModiTime(now); | 
 |  |  |                 // 修改成功后复位堆垛机 | 
 |  |  |                 if (wrkMastMapper.updateById(wrkMast) > 0) { | 
 |  |  |                     // 堆垛机复位 | 
 |  |  |                     crnThread.setResetFlag(true); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 执行对工作档的完成操作 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  | 
 |  |  |             //  状态:等待确认 并且  任务完成位 = 1 | 
 |  |  |             if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { | 
 |  |  |                 // 获取入库待确认工作档 | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectPakInStep7(crnProtocol.getTaskNo().intValue()); | 
 |  |  |                 if (wrkMast == null) { | 
 |  |  |                     log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 入库 + 库位转移  ==> 4.入库完成 | 
 |  |  |                 if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)){ | 
 |  |  |                     wrkMast.setWrkSts(4L); | 
 |  |  |                 // 入库 + 库位转移  ==> 9.入库完成 | 
 |  |  |                 if (wrkMast.getWrkSts() == 7 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)){ | 
 |  |  |                     wrkMast.setWrkSts(9L); | 
 |  |  |                 } else  { | 
 |  |  |                     continue; | 
 |  |  |                 } |