|  |  | 
 |  |  |      * 组托 | 
 |  |  |      * 入库站,根据条码扫描生成入库工作档,工作状态 2 | 
 |  |  |      */ | 
 |  |  |     public void generateStoreWrkFile() { | 
 |  |  |     public synchronized void generateStoreWrkFile() { | 
 |  |  |         // 根据输送线plc遍历 | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历入库口 | 
 |  |  | 
 |  |  |      * wms入库 | 
 |  |  |      * 入库站,根据条码扫描生成入库工作档,工作状态 1 ==>> 2 | 
 |  |  |      */ | 
 |  |  |     public void generateStoreWrkFile0() { | 
 |  |  |     public synchronized void generateStoreWrkFile0() { | 
 |  |  |         // 根据输送线plc遍历 | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历入库口 | 
 |  |  | 
 |  |  |                 // 如果最近一次是入库模式 | 
 |  |  |                 if (crnProtocol.getLastIo().equals("I")) { | 
 |  |  |                     if (basCrnp.getInEnable().equals("Y")) { | 
 |  |  |                         this.crnStnToLoc(crn, crnProtocol); //  入库 | 
 |  |  |                         this.crnStnToLoc1(crn, crnProtocol); //  入库 | 
 |  |  |                         crnProtocol.setLastIo("O"); | 
 |  |  |                     } else if (basCrnp.getOutEnable().equals("Y")) { | 
 |  |  |                         this.locToCrnStn(crn, crnProtocol); //  出库 | 
 |  |  |                         this.locToCrnStn1(crn, crnProtocol); //  出库 | 
 |  |  |                         crnProtocol.setLastIo("I"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 // 如果最近一次是出库模式 | 
 |  |  |                 else if (crnProtocol.getLastIo().equals("O")) { | 
 |  |  |                     if (basCrnp.getOutEnable().equals("Y")) { | 
 |  |  |                         this.locToCrnStn(crn, crnProtocol); //  出库 | 
 |  |  |                         this.locToCrnStn1(crn, crnProtocol); //  出库 | 
 |  |  |                         crnProtocol.setLastIo("I"); | 
 |  |  |                     } else if (basCrnp.getInEnable().equals("Y")) { | 
 |  |  |                         this.crnStnToLoc(crn, crnProtocol); //  入库 | 
 |  |  |                         this.crnStnToLoc1(crn, crnProtocol); //  入库 | 
 |  |  |                         crnProtocol.setLastIo("O"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  | 
 |  |  |                     } | 
 |  |  |                     continue; | 
 |  |  |                 } else if (shallowLoc.getLocSts().equals("Q")) { | 
 |  |  |                     WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                     WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); | 
 |  |  |                     if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入库  ===>>  堆垛机站到库位 | 
 |  |  |      * 2022-12-03 TQS修改,先遍历查询同台堆垛机工作档所有站点入库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnStnToLoc1(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         List<WrkMast> wrkMasts = wrkMastMapper.selectPakInStep12(slave.getId()); | 
 |  |  |         for(WrkMast wrkMast : wrkMasts){ | 
 |  |  |             if (wrkMast == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             CrnSlave.CrnStn crnStn = null; | 
 |  |  |             for (CrnSlave.CrnStn crnStn1 : slave.getCrnInStn()){ | 
 |  |  |                 if(crnStn1.getStaNo() == wrkMast.getStaNo()){ | 
 |  |  |                     crnStn = crnStn1; | 
 |  |  |                     break; | 
 |  |  |                 } else { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if(Cools.isEmpty(crnStn)){ | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             boolean flag = false; | 
 |  |  |             // 获取堆垛机入库站信息 | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |             StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |             if (staProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } else { | 
 |  |  |                 staProtocol = staProtocol.clone(); | 
 |  |  |             } | 
 |  |  |             // 查询站点详细信息 | 
 |  |  |             BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |             if (staDetl == null) { | 
 |  |  |                 log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable() | 
 |  |  |                     && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) { | 
 |  |  |                 flag = true; | 
 |  |  |             } | 
 |  |  |             if (!flag) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 获取库位信息 | 
 |  |  |             LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  |             if (locMast == null) { | 
 |  |  |                 log.error("查询库存无数据--库位号{}", wrkMast.getLocNo()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             if (!locMast.getLocSts().equals("S") && !locMast.getLocSts().equals("Q")) { | 
 |  |  |                 log.error("入库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), locMast.getLocSts()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 堆垛机控制过滤 | 
 |  |  |             if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 已经存在吊车执行任务时,则过滤 | 
 |  |  |             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.禁用 直接搬! | 
 |  |  |                 if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { | 
 |  |  |                     WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                     if (null == waitWrkMast) { | 
 |  |  |                         log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); | 
 |  |  |                     } else { | 
 |  |  |                         waitWrkMast.setIoPri(15D); | 
 |  |  |                         waitWrkMast.setModiTime(new Date()); | 
 |  |  |                         if (wrkMastMapper.updateById(waitWrkMast) == 0) { | 
 |  |  |                             log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); | 
 |  |  |                         } | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { | 
 |  |  |                     // 此标记避免多次执行移库任务 | 
 |  |  |                     if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { | 
 |  |  |                         wrkMast.setUpdMk("Y"); | 
 |  |  |                         wrkMast.setIoPri(14D); | 
 |  |  |                         wrkMastMapper.updateById(wrkMast); | 
 |  |  |                         // 生成工作档,将浅库位移转到新的库位中 | 
 |  |  |                         moveLocForDeepLoc(slave, shallowLoc); | 
 |  |  |                         // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行) | 
 |  |  | //                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast); | 
 |  |  |                     } | 
 |  |  |                     continue; | 
 |  |  |                 } else if (shallowLoc.getLocSts().equals("Q")) { | 
 |  |  |                     WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); | 
 |  |  |                     if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |             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 { | 
 |  |  |                 // 修改工作档状态 2.设备上走 => 3.吊车入库中 | 
 |  |  |                 Date now = new Date(); | 
 |  |  |                 wrkMast.setWrkSts(3L); | 
 |  |  |                 wrkMast.setCrnStrTime(now); | 
 |  |  |                 wrkMast.setModiTime(now); | 
 |  |  |                 if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                     log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 出库  ===>>  库位到堆垛机站 | 
 |  |  |      * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 | 
 |  |  |      */ | 
 |  |  |     public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |     public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { | 
 |  |  |             // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  | //            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); | 
 |  |  | 
 |  |  |                             log.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo); | 
 |  |  |                             continue; | 
 |  |  |                         } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) { | 
 |  |  |                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); | 
 |  |  |                             if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | //    /** | 
 |  |  | //     * 出库  ===>>  库位到堆垛机站 | 
 |  |  | //     */ | 
 |  |  | //    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  | //        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { | 
 |  |  | //            // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  | //            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); | 
 |  |  | //            if (wrkMast == null) { | 
 |  |  |     /** | 
 |  |  |      * 出库  ===>>  库位到堆垛机站 | 
 |  |  |      * 2022-12-03 TQS修改,先遍历查询工作档所有站点出库任务LIST,根据工作档任务排序优先级高于 根据堆垛机入库站点排序 | 
 |  |  |      */ | 
 |  |  |     public synchronized void locToCrnStn1(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep12(slave.getId()); | 
 |  |  |         for (WrkMast wrkMast : wrkMasts) { | 
 |  |  |             if (wrkMast == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             CrnSlave.CrnStn crnStn = null; | 
 |  |  |             for (CrnSlave.CrnStn crnStn1 : slave.getCrnOutStn()){ | 
 |  |  |                 if(crnStn1.getStaNo() == wrkMast.getSourceStaNo()){ | 
 |  |  |                     crnStn = crnStn1; | 
 |  |  |                     break; | 
 |  |  |                 } else { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if(Cools.isEmpty(crnStn)){ | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 工作档状态判断 | 
 |  |  |             if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) { | 
 |  |  |                 log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // 获取源库位信息 | 
 |  |  |             LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  |             if (!sourceSta.getLocSts().equals("R") && !sourceSta.getLocSts().equals("P")) { | 
 |  |  |                 log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), sourceSta.getLocSts()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // 获取堆垛机出库站信息 | 
 |  |  |             SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |             StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |             if (staProtocol == null) { | 
 |  |  |                 break; | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 工作档状态判断 | 
 |  |  | //            if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null){ | 
 |  |  | //                log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType()); | 
 |  |  |             } else { | 
 |  |  |                 staProtocol = staProtocol.clone(); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  | //            // 入出库模式判断 | 
 |  |  | //            if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; } | 
 |  |  |             if (wrkMast.getStaNo() == 204 && devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 查询站点详细信息 | 
 |  |  |             BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |             if (staDetl == null) { | 
 |  |  |                 log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                 break; | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 获取源库位信息 | 
 |  |  | //            LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  | //            if (!sourceSta.getLocSts().equals("R") &&!sourceSta.getLocSts().equals("P")) { | 
 |  |  | //                log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), sourceSta.getLocSts()); | 
 |  |  |             } | 
 |  |  |             // 判断堆垛机出库站状态 | 
 |  |  |             if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") | 
 |  |  |                     && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  |                 // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |                 // 堆垛机控制过滤 | 
 |  |  |                 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 获取堆垛机出库站信息 | 
 |  |  | //            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  | //            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  | //            if (staProtocol == null) { | 
 |  |  | //                continue; | 
 |  |  | //            } else { | 
 |  |  | //                staProtocol = staProtocol.clone(); | 
 |  |  | //            } | 
 |  |  | // | 
 |  |  | ////            // 入出库模式判断 | 
 |  |  | ////            if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; } | 
 |  |  | // | 
 |  |  | // | 
 |  |  | //            // 查询站点详细信息 | 
 |  |  | //            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  | //            if (staDetl == null) { | 
 |  |  | //                log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 判断堆垛机出库站状态 | 
 |  |  | //            if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y") | 
 |  |  | //                    && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  | //                // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  | // | 
 |  |  | //                // 堆垛机控制过滤 | 
 |  |  | //                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  | //                    continue; | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //                // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  | //                if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) { | 
 |  |  | //                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo()); | 
 |  |  | //                    LocMast shallowLoc = locMastService.selectById(shallowLocNo); | 
 |  |  | //                    // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! | 
 |  |  | //                    if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  |                 if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) { | 
 |  |  |                     String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo()); | 
 |  |  |                     LocMast shallowLoc = locMastService.selectById(shallowLocNo); | 
 |  |  |                     // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! | 
 |  |  |                     if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { | 
 |  |  |                         WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                         if (null == waitWrkMast) { | 
 |  |  |                             log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); | 
 |  |  |                         } else { | 
 |  |  |                             if (waitWrkMast.getWrkSts() == 11) { | 
 |  |  |                                 waitWrkMast.setIoPri(15D); | 
 |  |  |                                 waitWrkMast.setModiTime(new Date()); | 
 |  |  |                                 if (wrkMastMapper.updateById(waitWrkMast) == 0) { | 
 |  |  |                                     log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); | 
 |  |  |                                 } | 
 |  |  |                                 continue; | 
 |  |  |                             } else { | 
 |  |  |  | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { | 
 |  |  | //                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  | //                        if (null == waitWrkMast) { | 
 |  |  | //                            log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); | 
 |  |  | //                        } else { | 
 |  |  | //                            if(waitWrkMast.getWrkSts() == 11) { | 
 |  |  | //                                waitWrkMast.setIoPri(15D); | 
 |  |  | //                                waitWrkMast.setModiTime(new Date()); | 
 |  |  | //                                if (wrkMastMapper.updateById(waitWrkMast) == 0) { | 
 |  |  | //                                    log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); | 
 |  |  | //                                } | 
 |  |  | //                                continue; | 
 |  |  | //                            } else { | 
 |  |  | // | 
 |  |  | //                            } | 
 |  |  | //                        } | 
 |  |  | //                    } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { | 
 |  |  | //                        // 此标记避免多次执行移库任务 | 
 |  |  | //                        if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { | 
 |  |  | //                            wrkMast.setUpdMk("Y"); | 
 |  |  | //                            wrkMastMapper.updateById(wrkMast); | 
 |  |  | //                            // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行) | 
 |  |  | //                            moveLocForDeepLoc(slave, shallowLoc); | 
 |  |  | //                        } | 
 |  |  | //                        log.error("{}任务出库失败,浅库位堵塞!", wrkMast.getWrkNo()); | 
 |  |  | //                        continue; | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //                // 已经存在吊车执行任务时,则过滤 | 
 |  |  | //                if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  |                         //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务 | 
 |  |  |                         WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); | 
 |  |  |                         // 此标记避免多次执行移库任务 | 
 |  |  | //                            if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk()) | 
 |  |  | //                                || Cools.isEmpty(waitWrkMast)) { | 
 |  |  |                         if (Cools.isEmpty(waitWrkMast)) { | 
 |  |  |                             wrkMast.setUpdMk("Y"); | 
 |  |  |                             wrkMastMapper.updateById(wrkMast); | 
 |  |  |                             // 生成工作档,将浅库位移转到新的库位中 | 
 |  |  |                             moveLocForDeepLoc(slave, shallowLoc); | 
 |  |  |                         } | 
 |  |  |                         log.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo); | 
 |  |  |                         continue; | 
 |  |  |                     } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) { | 
 |  |  |                         WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); | 
 |  |  |                         if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                 if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  |                     break; | 
 |  |  | //                    return; | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //                // 1.堆垛机开始移动 | 
 |  |  | //                CrnCommand crnCommand = new CrnCommand(); | 
 |  |  | //                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  | //                crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
 |  |  | //                crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  | //                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  | //                crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排 | 
 |  |  | //                crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列 | 
 |  |  | //                crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue());     // 源库位层 | 
 |  |  | //                crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排 | 
 |  |  | //                crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列 | 
 |  |  | //                crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层 | 
 |  |  | //                if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  | //                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  | //                } else { | 
 |  |  | //                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  | //                    Date now = new Date(); | 
 |  |  | //                    wrkMast.setWrkSts(12L); | 
 |  |  | //                    wrkMast.setCrnStrTime(now); | 
 |  |  | //                    wrkMast.setModiTime(now); | 
 |  |  | //                    if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  | //                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  | //    } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 1.堆垛机开始移动 | 
 |  |  |                 CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                 crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                 crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                 crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排 | 
 |  |  |                 crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列 | 
 |  |  |                 crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue());     // 源库位层 | 
 |  |  |                 crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排 | 
 |  |  |                 crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列 | 
 |  |  |                 crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层 | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                     log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                 } else { | 
 |  |  |                     // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                     Date now = new Date(); | 
 |  |  |                     wrkMast.setWrkSts(12L); | 
 |  |  |                     wrkMast.setCrnStrTime(now); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                         log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 查找工作状态为2(设备上走),且RGV入库接驳站符合的的入库工作档,提取出最多2笔 | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 库位移转 | 
 |  |  |      */ | 
 |  |  |     public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |     public synchronized void locToLoc(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         // 获取工作档信息 | 
 |  |  |         WrkMast wrkMast = wrkMastMapper.selectLocMove(slave.getId()); | 
 |  |  |         if (null == wrkMast) { | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 入出库模式切换函数 | 
 |  |  |      */ | 
 |  |  |     public void ioConvert() { | 
 |  |  |     public synchronized void ioConvert() { | 
 |  |  |         try { | 
 |  |  |             // 根据输送线plc遍历 | 
 |  |  |             for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void outOfDevp() { | 
 |  |  |     public synchronized void outOfDevp() { | 
 |  |  |         List<WrkMast> wrkMasts = wrkMastMapper.selectPick(); | 
 |  |  |         for (WrkMast wrkMast : wrkMasts) { | 
 |  |  |             if (basDevpService.selectCount(new EntityWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo())) == 0) { | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public void autoEmptyOut() { | 
 |  |  |     public synchronized void autoEmptyOut() { | 
 |  |  |         DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); | 
 |  |  |         Integer autoOutSite = 12; | 
 |  |  |         //如果站点可出禁用,则不生成空盘出库任务 | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void autoEmptyIn() { | 
 |  |  |     public synchronized void autoEmptyIn() { | 
 |  |  |         DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); | 
 |  |  |         Integer autoInSite = 12; | 
 |  |  |         StaProtocol staProtocol = devpThread.getStation().get(autoInSite); |