|  |  | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.baomidou.mybatisplus.mapper.Wrapper; | 
 |  |  | import com.core.common.Cools; | 
 |  |  | import com.core.common.DateUtils; | 
 |  |  | import com.core.exception.CoolException; | 
 |  |  | import com.zy.asrs.entity.*; | 
 |  |  | import com.zy.asrs.mapper.BasCrnErrorMapper; | 
 |  |  | 
 |  |  | import com.zy.asrs.mapper.WrkMastMapper; | 
 |  |  | import com.zy.asrs.service.*; | 
 |  |  | import com.zy.asrs.utils.Utils; | 
 |  |  | import com.zy.asrs.utils.VersionUtils; | 
 |  |  | import com.zy.common.model.LocTypeDto; | 
 |  |  | import com.zy.common.model.MatDto; | 
 |  |  | import com.zy.common.model.SearchLocParam; | 
 |  |  | 
 |  |  |                             log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl+"/rpc/pakin/loc/v1", JSON.toJSONString(param), response); | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //                        // 检索库位 | 
 |  |  | //                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol); | 
 |  |  | //                        List<String> matNos = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList()); | 
 |  |  | //                        StartupDto startupDto = commonService.getLocNo(1, 1, inSta.getStaNo(), matNos, locTypeDto, 0); | 
 |  |  | //                        // 工作号 | 
 |  |  | //                        int workNo = startupDto.getWorkNo(); | 
 |  |  | //                        // 插入工作明细档 | 
 |  |  | //                        wrkDetlService.createWorkDetail(workNo, waitPakins, barcode); | 
 |  |  | // | 
 |  |  | //                        // 插入工作主档 | 
 |  |  | //                        wrkMast = new WrkMast(); | 
 |  |  | //                        wrkMast.setWrkNo(workNo); | 
 |  |  | //                        wrkMast.setIoTime(new Date()); | 
 |  |  | //                        wrkMast.setWrkSts(2L); // 工作状态:2.设备上走 | 
 |  |  | //                        wrkMast.setIoType(1); // 入出库状态:1.入库 | 
 |  |  | //                        wrkMast.setIoPri(10D); // 优先级:10 | 
 |  |  | //                        wrkMast.setCrnNo(startupDto.getCrnNo()); | 
 |  |  | //                        wrkMast.setSourceStaNo(startupDto.getSourceStaNo()); | 
 |  |  | //                        wrkMast.setStaNo(startupDto.getStaNo()); | 
 |  |  | //                        wrkMast.setLocNo(startupDto.getLocNo()); | 
 |  |  | //                        wrkMast.setBarcode(barcode); // 托盘码 | 
 |  |  | //                        wrkMast.setFullPlt("Y"); // 满板:Y | 
 |  |  | //                        wrkMast.setPicking("N"); // 拣料 | 
 |  |  | //                        wrkMast.setExitMk("N"); // 退出 | 
 |  |  | //                        wrkMast.setEmptyMk("N"); // 空板 | 
 |  |  | //                        wrkMast.setLinkMis("N"); | 
 |  |  | //                        // 操作人员数据 | 
 |  |  | //                        wrkMast.setAppeTime(new Date()); | 
 |  |  | //                        wrkMast.setModiTime(new Date()); | 
 |  |  | //                        Integer insert = wrkMastMapper.insert(wrkMast); | 
 |  |  | //                        if (insert == 0) { | 
 |  |  | //                            throw new CoolException("保存工作档失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 更新目标库位状态 | 
 |  |  | //                        LocMast locMast = locMastService.selectById(startupDto.getLocNo()); | 
 |  |  | //                        locMast.setLocSts("S"); // S.入库预约 | 
 |  |  | //                        locMast.setModiTime(new Date()); | 
 |  |  | //                        if (!locMastService.updateById(locMast)){ | 
 |  |  | //                            throw new CoolException("改变库位状态失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 将入库通知档修改为已启动 | 
 |  |  | //                        if (wrkMastMapper.updateWaitPakInStep1(barcode) == 0) { | 
 |  |  | //                            throw new CoolException("修改入库通知档状态为已启动失败"); | 
 |  |  | //                        } | 
 |  |  | // | 
 |  |  | //                        // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  | // | 
 |  |  | //                        // 更新站点信息 且 下发plc命令 | 
 |  |  | //                        barcodeThread.setBarcode(""); | 
 |  |  | //                        staProtocol.setWorkNo((short) workNo); | 
 |  |  | //                        staProtocol.setStaNo(startupDto.getStaNo().shortValue()); | 
 |  |  | //                        devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  | //                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  | //                        if (!result) { | 
 |  |  | //                            throw new CoolException("更新plc站点信息失败"); | 
 |  |  | //                        } | 
 |  |  |  | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         e.printStackTrace(); | 
 |  |  |                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 拣、盘、并 作业站转换 | 
 |  |  | //                    int stnNo = 0; | 
 |  |  | //                    if (wrkMast.getStaNo() == 109) { | 
 |  |  | //                        stnNo = 127; | 
 |  |  | //                    } else if (wrkMast.getStaNo() == 113) { | 
 |  |  | //                        stnNo = 128; | 
 |  |  | //                    } else { | 
 |  |  | //                        log.error("{}号任务数据异常!", wrkMast.getWrkNo()); | 
 |  |  | //                    } | 
 |  |  |                     // 获取目标站 | 
 |  |  |                     Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() | 
 |  |  |                             .eq("type_no", wrkMast.getIoType() - 50) | 
 |  |  | 
 |  |  |                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //                    // 检索库位 | 
 |  |  | //                    LocTypeDto locTypeDto = new LocTypeDto(staProtocol); | 
 |  |  | //                    StartupDto startupDto = commonService.getLocNo(1, 10, emptyInSta.getStaNo(), null, locTypeDto, 0); | 
 |  |  | //                    // 工作号 | 
 |  |  | //                    int workNo = startupDto.getWorkNo(); | 
 |  |  | // | 
 |  |  | //                    try { | 
 |  |  | //                        // 插入工作主档 | 
 |  |  | //                        WrkMast wrkMast = new WrkMast(); | 
 |  |  | //                        wrkMast.setWrkNo(workNo); | 
 |  |  | //                        wrkMast.setIoTime(new Date()); | 
 |  |  | //                        wrkMast.setWrkSts(2L); // 工作状态:2.设备上走 | 
 |  |  | //                        wrkMast.setIoType(10); // 入出库状态:10.空板入库 | 
 |  |  | //                        wrkMast.setIoPri(10D); // 优先级:10 | 
 |  |  | //                        wrkMast.setCrnNo(startupDto.getCrnNo()); | 
 |  |  | //                        wrkMast.setSourceStaNo(startupDto.getSourceStaNo()); | 
 |  |  | //                        wrkMast.setStaNo(startupDto.getStaNo()); | 
 |  |  | //                        wrkMast.setLocNo(startupDto.getLocNo()); | 
 |  |  | //                        wrkMast.setFullPlt("N"); // 满板 | 
 |  |  | //                        wrkMast.setPicking("N"); // 拣料 | 
 |  |  | //                        wrkMast.setExitMk("N"); // 退出 | 
 |  |  | //                        wrkMast.setEmptyMk("Y"); // 空板 | 
 |  |  | //                        wrkMast.setLinkMis("N"); | 
 |  |  | ////                    wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 | 
 |  |  | //                        // 操作人员数据 | 
 |  |  | //                        wrkMast.setAppeTime(new Date()); | 
 |  |  | //                        wrkMast.setModiTime(new Date()); | 
 |  |  | //                        Integer insert = wrkMastMapper.insert(wrkMast); | 
 |  |  | //                        if (insert == 0) { | 
 |  |  | //                            throw new CoolException("保存工作档失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 更新目标库位状态 | 
 |  |  | //                        LocMast locMast = locMastService.selectById(startupDto.getLocNo()); | 
 |  |  | //                        locMast.setLocSts("S"); // S.入库预约 | 
 |  |  | //                        locMast.setModiTime(new Date()); | 
 |  |  | //                        if (!locMastService.updateById(locMast)){ | 
 |  |  | //                            throw new CoolException("改变库位状态失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  | // | 
 |  |  | //                        // 更新站点信息 且 下发plc命令 | 
 |  |  | //                        staProtocol.setWorkNo((short) workNo); | 
 |  |  | //                        staProtocol.setStaNo(startupDto.getStaNo().shortValue()); | 
 |  |  | //                        devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  | //                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  | //                        if (!result) { | 
 |  |  | //                            throw new CoolException("更新plc站点信息失败"); | 
 |  |  | //                        } | 
 |  |  | //                    } catch (Exception e) { | 
 |  |  | //                        e.printStackTrace(); | 
 |  |  | //                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  | //                    } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void ledReset() { | 
 |  |  | //        for (LedSlave led : slaveProperties.getLed()) { | 
 |  |  | //            // 获取输送线plc线程 | 
 |  |  | //            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); | 
 |  |  | //            // 命令集合 | 
 |  |  | //            boolean reset = true; | 
 |  |  | //            for (Integer staNo : led.getStaArr()) { | 
 |  |  | //                // 获取叉车站点 | 
 |  |  | //                StaProtocol staProtocol = devpThread.getStation().get(staNo); | 
 |  |  | //                if (staProtocol == null) { | 
 |  |  | //                    continue; | 
 |  |  | //                } else { | 
 |  |  | //                    staProtocol = staProtocol.clone(); | 
 |  |  | //                } | 
 |  |  | //                if (staProtocol.getWorkNo() != 0) { | 
 |  |  | //                    reset = false; | 
 |  |  | //                    break; | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | //            // 获取led线程 | 
 |  |  | //            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getDevpPlcId()); | 
 |  |  | //            // led显示默认内容 | 
 |  |  | //            if (reset) { | 
 |  |  | //                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) { | 
 |  |  | //                    log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  |         for (LedSlave led : slaveProperties.getLed()) { | 
 |  |  |             // 获取输送线plc线程 | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 因双深库位阻塞,对浅库位进行移转(入库版) | 
 |  |  |      * tip:同步 | 
 |  |  |      */ | 
 |  |  |     @Transactional | 
 |  |  |     public synchronized void moveLocForDeepLocPakin(CrnSlave crn, LocMast shallowLoc, WrkMast pakinWrkMast){ | 
 |  |  |         LocMast loc = locMastService.selectById(pakinWrkMast.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(15D); | 
 |  |  |         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.setCtnNo("Y");  // 入库阻塞库位移转标记 | 
 |  |  |         wrkMast.setAppeTime(new Date()); | 
 |  |  |         wrkMast.setModiTime(new Date()); | 
 |  |  |         int res = wrkMastMapper.insert(wrkMast); | 
 |  |  |         if (res == 0) { | 
 |  |  |             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.setWrkNo(workNo); | 
 |  |  |                 wrkDetl.setIoTime(new Date()); | 
 |  |  |                 wrkDetl.setQty(locDetl.getQty()); | 
 |  |  |                 VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制 | 
 |  |  |                 wrkDetl.setAppeTime(new Date()); | 
 |  |  |                 wrkDetl.setModiTime(new Date()); | 
 |  |  |                 if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                     throw new CoolException("保存工作档明细失败"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         // 修改源库位状态 | 
 |  |  |         if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) { | 
 |  |  |             shallowLoc.setLocSts("S"); // S.入库预约,入库阻塞库位移转 | 
 |  |  |             shallowLoc.setModiTime(new Date()); | 
 |  |  |             if (!locMastService.updateById(shallowLoc)){ | 
 |  |  |                 throw new CoolException("更新源库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("源库位出库失败"); | 
 |  |  |         } | 
 |  |  | //        // 修改目标库位状态 | 
 |  |  | //        if (loc.getLocSts().equals("O")) { | 
 |  |  | //            loc.setLocSts("S"); // S.入库预约 | 
 |  |  | //            loc.setModiTime(new Date()); | 
 |  |  | //            if (!locMastService.updateById(loc)) { | 
 |  |  | //                throw new CoolException("更新目标库位状态失败"); | 
 |  |  | //            } | 
 |  |  | //        } else { | 
 |  |  | //            throw new CoolException("移转失败"); | 
 |  |  | //        } | 
 |  |  |         wrkMast.setLocNo(shallowLoc.getLocNo()); | 
 |  |  |         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |             throw new CoolException("修改阻塞入库任务失败"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 因双深库位阻塞,对浅库位进行移转(立即执行版) | 
 |  |  |      * tip:同步 | 
 |  |  |      */ | 
 |  |  |     private void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc){ | 
 |  |  |         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 (null != loc) { break; } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (null == loc) { | 
 |  |  |             for (Integer row : rows) { | 
 |  |  |                 if (Utils.isShallowLoc(slaveProperties, row)) { | 
 |  |  |                     loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1()); | 
 |  |  |                     if (null != loc) { break; } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (null == loc) { | 
 |  |  |             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) { | 
 |  |  |             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.setWrkNo(workNo); | 
 |  |  |                 wrkDetl.setIoTime(new Date()); | 
 |  |  |                 wrkDetl.setQty(locDetl.getQty()); | 
 |  |  |                 VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制 | 
 |  |  |                 wrkDetl.setAppeTime(new Date()); | 
 |  |  |                 wrkDetl.setModiTime(new Date()); | 
 |  |  |                 if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                     throw new CoolException("保存工作档明细失败"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         // 修改源库位状态 | 
 |  |  |         if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) { | 
 |  |  |             shallowLoc.setLocSts("R"); // R.出库预约 | 
 |  |  |             shallowLoc.setModiTime(new Date()); | 
 |  |  |             if (!locMastService.updateById(shallowLoc)){ | 
 |  |  |                 throw new CoolException("更新源库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("源库位出库失败"); | 
 |  |  |         } | 
 |  |  |         // 修改目标库位状态 | 
 |  |  |         if (loc.getLocSts().equals("O")) { | 
 |  |  |             loc.setLocSts("S"); // S.入库预约 | 
 |  |  |             loc.setModiTime(new Date()); | 
 |  |  |             if (!locMastService.updateById(loc)) { | 
 |  |  |                 throw new CoolException("更新目标库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("移转失败"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机演示  ===>> 库位移转 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnDemoOfLocMove1(){ | 
 |  |  |         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) { | 
 |  |  |                 // 获取移库工作档信息 | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectLocMove(crn.getId()); | 
 |  |  |                 if (null != wrkMast) { continue; } | 
 |  |  |  | 
 |  |  |                 LocMast sourceLoc = locMastService.queryDemoSourceLoc(crn.getId()); | 
 |  |  |                 LocMast loc = locMastService.queryDemoLoc(crn.getId()); | 
 |  |  |                 if (null == sourceLoc || null == loc) { continue; } | 
 |  |  |  | 
 |  |  |                 String sourceLocNo = sourceLoc.getLocNo(); | 
 |  |  |                 String locNo = loc.getLocNo(); | 
 |  |  |  | 
 |  |  |                 // 获取工作号 | 
 |  |  |                 int workNo = commonService.getWorkNo(0); | 
 |  |  |                 // 保存工作档 | 
 |  |  |                 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(sourceLocNo); // 源库位 | 
 |  |  |                 wrkMast.setLocNo(locNo); // 目标库位 | 
 |  |  |                 wrkMast.setFullPlt("N"); // 满板:Y | 
 |  |  |                 wrkMast.setPicking("N"); // 拣料 | 
 |  |  |                 wrkMast.setExitMk("N"); // 退出 | 
 |  |  |                 wrkMast.setEmptyMk(sourceLoc.getLocSts().equals("D")?"Y":"N"); // 空板 | 
 |  |  |                 wrkMast.setBarcode(sourceLoc.getBarcode()); // 托盘码 | 
 |  |  |                 wrkMast.setLinkMis("N"); | 
 |  |  |                 wrkMast.setAppeTime(new Date()); | 
 |  |  |                 wrkMast.setModiTime(new Date()); | 
 |  |  |                 int res = wrkMastMapper.insert(wrkMast); | 
 |  |  |                 if (res == 0) { | 
 |  |  |                     throw new CoolException("保存工作档失败"); | 
 |  |  |                 } | 
 |  |  |                 // 工作档明细保存 | 
 |  |  | //                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLocNo)); | 
 |  |  | //                for (LocDetl locDetl : locDetls) { | 
 |  |  | //                    WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  | //                    wrkDetl.setWrkNo(workNo); | 
 |  |  | //                    wrkDetl.setIoTime(new Date()); | 
 |  |  | //                    wrkDetl.setAnfme(locDetl.getAnfme()); | 
 |  |  | //                    VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制 | 
 |  |  | //                    wrkDetl.setAppeTime(new Date()); | 
 |  |  | //                    wrkDetl.setModiTime(new Date()); | 
 |  |  | //                    if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  | //                        throw new CoolException("保存工作档明细失败"); | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  |                 // 修改源库位状态 | 
 |  |  |                 if (sourceLoc.getLocSts().equals("D")) { | 
 |  |  |                     sourceLoc.setLocSts("R"); // R.出库预约 | 
 |  |  |                     sourceLoc.setModiTime(new Date()); | 
 |  |  |                     if (!locMastService.updateById(sourceLoc)){ | 
 |  |  |                         throw new CoolException("更新源库位状态失败"); | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     throw new CoolException("源库位出库失败"); | 
 |  |  |                 } | 
 |  |  |                 // 修改目标库位状态 | 
 |  |  |                 if (loc.getLocSts().equals("O")) { | 
 |  |  |                     loc.setLocSts("S"); // S.入库预约 | 
 |  |  |                     loc.setModiTime(new Date()); | 
 |  |  |                     if (!locMastService.updateById(loc)) { | 
 |  |  |                         throw new CoolException("更新目标库位状态失败"); | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     throw new CoolException("移转失败"); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机命令下发后,异步修改工作档状态 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnIoWrkMast(){ | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             Date now = new Date(); | 
 |  |  |             // 堆垛机正在运行 | 
 |  |  |             if (crnProtocol.getStatusType() != CrnStatusType.IDLE && crnProtocol.getTaskNo() != 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
 |  |  |                 // 获取工作档 | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo()); | 
 |  |  |                 if (wrkMast == null) { continue; } | 
 |  |  |                 // 入库 | 
 |  |  |                 if (wrkMast.getWrkSts() == 1 || wrkMast.getWrkSts() == 2) { | 
 |  |  |                     log.warn("堆垛机非空闲情况下,开始修改工作档状态。[id:{},时间:{}] >>>>> 堆垛机当前状态为:{}。任务号:{}", crn.getId(), DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), crnProtocol.getStatusType().desc, crnProtocol.getTaskNo()); | 
 |  |  |                     // 修改工作档状态 2.设备上走 => 3.吊车入库中 | 
 |  |  |                     wrkMast.setWrkSts(3L); | 
 |  |  |                     wrkMast.setCrnStrTime(now); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                         log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                     log.warn("修改工作档状态成功。[时间:{}] >>>>> 任务号:{}",  DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F),  wrkMast.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |                 // 出库、移库 | 
 |  |  |                 if (wrkMast.getWrkSts() == 11) { | 
 |  |  |                     log.warn("堆垛机非空闲情况下,开始修改工作档状态。[id:{},时间:{}] >>>>> 堆垛机当前状态为:{}。任务号:{}", crn.getId(), DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), crnProtocol.getStatusType().desc, crnProtocol.getTaskNo()); | 
 |  |  |                     // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                     wrkMast.setWrkSts(12L); | 
 |  |  |                     wrkMast.setCrnStrTime(now); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                         log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                     log.warn("修改工作档状态成功。[时间:{}] >>>>> 任务号:{}",  DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F),  wrkMast.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |