|  |  | 
 |  |  |  | 
 |  |  |             if (!locMastService.isShuttle(wrkMast.getLocNo())) { | 
 |  |  |  | 
 |  |  |                 // 非穿梭库入库 【 堆垛机直接入库 】 | 
 |  |  |                 if (wrkMast.getWrkSts() == 2) { | 
 |  |  |  | 
 |  |  |                     // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                     if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  |                         continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |                     // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  |                     if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) { | 
 |  |  |                         String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo()); | 
 |  |  |                         LocMast shallowLoc = locMastService.selectById(shallowLocNo); | 
 |  |  |                         // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! | 
 |  |  |                         switch (shallowLoc.getLocSts()) { | 
 |  |  |                             case "P": | 
 |  |  |                             case "R": { | 
 |  |  |                                 WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                                 if (null == waitWrkMast || (waitWrkMast.getIoType() == 101 && waitWrkMast.getWrkSts() >= 14L)) { | 
 |  |  |                                     log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); | 
 |  |  |                                 } else { | 
 |  |  |                                     waitWrkMast.setIoPri(15D); | 
 |  |  |                                     waitWrkMast.setModiTime(new Date()); | 
 |  |  |                                     if (wrkMastMapper.updateById(waitWrkMast) == 0) { | 
 |  |  |                                         log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); | 
 |  |  |                                     } | 
 |  |  |                                     //20220719 Add,如果浅库位状态为P/R,工作状态为14/15,说明浅库位已经空了,可以执行入库任务 | 
 |  |  |                                     if (waitWrkMast.getWrkSts() < 14L) { | 
 |  |  |                                         continue; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 break; | 
 |  |  |                             } | 
 |  |  |                             case "F": | 
 |  |  |                             case "D": | 
 |  |  |                                 // 此标记避免多次执行移库任务 | 
 |  |  |                                 if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { | 
 |  |  |                                     wrkMast.setUpdMk("Y"); | 
 |  |  |                                     wrkMast.setIoPri(14D); | 
 |  |  |                                     wrkMastMapper.updateById(wrkMast); | 
 |  |  |                                     // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行) | 
 |  |  |                                     moveLocForDeepLoc(slave, shallowLoc); | 
 |  |  |                                 } | 
 |  |  |                                 continue; | 
 |  |  |                             case "Q": { | 
 |  |  |                                 WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                                 if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { | 
 |  |  |                                     continue; | 
 |  |  |                                 } | 
 |  |  |                                 break; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 堆垛机入库 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                     CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                     crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                     crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                     crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                     crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                     crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排 | 
 |  |  |                     crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列 | 
 |  |  |                     crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层 | 
 |  |  |                     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 { | 
 |  |  |                         // 修改工作档状态  7.吊车入库中 | 
 |  |  |                         Date now = new Date(); | 
 |  |  |                         wrkMast.setWrkSts(7L); | 
 |  |  |                         wrkMast.setCrnStrTime(now); | 
 |  |  |                         wrkMast.setModiTime(now); | 
 |  |  |                         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                             log.error("修改工作档状态 {} => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkSts$(), wrkMast.getWrkNo()); | 
 |  |  |                         } | 
 |  |  |                         return true; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |             // 目标库位 ===>> 最外层库位 | 
 |  |  |             if (locMastService.isOutMost(wrkMast.getLocNo())) { | 
 |  |  |                 // 判断小车是否在最外层库位,如果是则搬走,如果不是,则直接堆垛机入库 | 
 |  |  | 
 |  |  |                     // 堆垛机搬运小车 | 
 |  |  |                     if (wrkMast.getWrkSts() == 3L) { | 
 |  |  |                         this.carMoveIn(wrkMast, wrkMast.getSteNo(), crnProtocol); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 因双深库位阻塞,对浅库位进行移转(出库版) | 
 |  |  |      * tip:同步 | 
 |  |  |      */ | 
 |  |  |     private void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc){ | 
 |  |  |         try { | 
 |  |  |             List<Integer> rows = locMastService.queryDistinctRow(crn.getId()); | 
 |  |  |             LocMast loc = null; | 
 |  |  |             for (Integer row : rows) { | 
 |  |  |                 if (Utils.isDeepLoc(slaveProperties, row)) { | 
 |  |  |                     loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1()); | 
 |  |  |  | 
 |  |  |                     if (loc != null) { | 
 |  |  |                         if (Utils.isDeepLoc(slaveProperties, loc.getLocNo())) { | 
 |  |  |                             String shallowLocNo = Utils.getShallowLoc(slaveProperties, loc.getLocNo()); | 
 |  |  |                             LocMast shallowLoc1 = locMastService.selectById(shallowLocNo); | 
 |  |  |                             if (!shallowLoc1.getLocSts().equals("O")) { | 
 |  |  |                                 loc = null; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                     if (null != loc) { | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (null == loc) { | 
 |  |  |                 for (Integer row : rows) { | 
 |  |  |                     if (Utils.isShallowLoc(slaveProperties, row)) { | 
 |  |  |                         loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1()); | 
 |  |  |  | 
 |  |  |                         if (null != loc) {//对应深库位非在库状态,不能移库 | 
 |  |  |                             String deepLoc = Utils.getDeepLoc(slaveProperties, loc.getLocNo()); | 
 |  |  |                             LocMast deepLoc1 = locMastService.selectById(deepLoc); | 
 |  |  |                             if (!deepLoc1.getLocSts().equals("F") && !deepLoc1.getLocSts().equals("D")) { | 
 |  |  |                                 loc = null; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         if (null != loc) { | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (null == loc) { | 
 |  |  |                 log.error("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                 throw new CoolException("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 获取工作号 | 
 |  |  |             int workNo = commonService.getWorkNo(0); | 
 |  |  |             // 保存工作档 | 
 |  |  |             WrkMast wrkMast = new WrkMast(); | 
 |  |  |             wrkMast.setWrkNo(workNo); | 
 |  |  |             wrkMast.setIoTime(new Date()); | 
 |  |  |             wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID | 
 |  |  |             wrkMast.setIoType(11); // 入出库状态: 11.库格移载 | 
 |  |  |             wrkMast.setIoPri(13D); | 
 |  |  |             wrkMast.setCrnNo(crn.getId()); | 
 |  |  |             wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 源库位 | 
 |  |  |             wrkMast.setLocNo(loc.getLocNo()); // 目标库位 | 
 |  |  |             wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 满板 | 
 |  |  |             wrkMast.setPicking("N"); // 拣料 | 
 |  |  |             wrkMast.setExitMk("N"); // 退出 | 
 |  |  |             wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板 | 
 |  |  |             wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码 | 
 |  |  |             wrkMast.setLinkMis("N"); | 
 |  |  |             wrkMast.setAppeTime(new Date()); | 
 |  |  |             wrkMast.setModiTime(new Date()); | 
 |  |  |             int res = wrkMastMapper.insert(wrkMast); | 
 |  |  |             if (res == 0) { | 
 |  |  |                 log.error("双深库位 --- 保存工作档失败! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                 throw new CoolException("保存工作档失败"); | 
 |  |  |             } | 
 |  |  |             // 工作档明细保存 | 
 |  |  |             if (shallowLoc.getLocSts().equals("F")) { | 
 |  |  |                 List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo())); | 
 |  |  |                 for (LocDetl locDetl : locDetls) { | 
 |  |  |                     WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |                     wrkDetl.sync(locDetl); | 
 |  |  |                     wrkDetl.setWrkNo(workNo); | 
 |  |  |                     wrkDetl.setIoTime(new Date()); | 
 |  |  |                     wrkDetl.setAnfme(locDetl.getAnfme()); | 
 |  |  |                     wrkDetl.setAppeTime(new Date()); | 
 |  |  |                     wrkDetl.setModiTime(new Date()); | 
 |  |  |                     if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                         log.error("双深库位 --- 保存工作档明细失败! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                         throw new CoolException("保存工作档明细失败"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             // 修改源库位状态 | 
 |  |  |             if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) { | 
 |  |  |                 shallowLoc.setLocSts("R"); // R.出库预约 | 
 |  |  |                 shallowLoc.setModiTime(new Date()); | 
 |  |  |                 if (!locMastService.updateById(shallowLoc)) { | 
 |  |  |                     log.error("双深库位 --- 更新源库位状态失败! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                     throw new CoolException("更新源库位状态失败"); | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 log.error("双深库位 --- 源库位出库失败! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                 throw new CoolException("源库位出库失败"); | 
 |  |  |             } | 
 |  |  |             // 修改目标库位状态 | 
 |  |  |             if (loc.getLocSts().equals("O")) { | 
 |  |  |                 loc.setLocSts("S"); // S.入库预约 | 
 |  |  |                 loc.setModiTime(new Date()); | 
 |  |  |                 if (!locMastService.updateById(loc)) { | 
 |  |  |                     log.error("双深库位 --- 更新目标库位状态失败! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                     throw new CoolException("更新目标库位状态失败"); | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 log.error("双深库位 --- 移转失败! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                 throw new CoolException("移转失败"); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("双深库位阻塞,对浅库位进行移转失败", e); | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |