| | |
| | | */ |
| | | @Slf4j |
| | | @Service("mainService") |
| | | @Transactional |
| | | public class MainServiceImpl { |
| | | |
| | | @Autowired |
| | |
| | | * 组托 |
| | | * 入库站,根据条码扫描生成入库工作档,工作状态 2 |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized void generateStoreWrkFile() { |
| | | String methodName = Thread.currentThread().getStackTrace()[1].getMethodName(); |
| | | // 根据输送线plc遍历 |
| | |
| | | ledThread.errorReset(); |
| | | } |
| | | } else { |
| | | // WMS返回错误时,先检查是否是拣料入库,如果是则跳过回退,让拣料入库流程处理 |
| | | WrkMast pickWrkMast = wrkMastMapper.selectPickStep(barcode); |
| | | if (pickWrkMast != null) { |
| | | // 是拣料入库,跳过回退,让拣料入库流程处理 |
| | | News.info("条码{}是拣料入库(工作号:{},工作状态:{},入出库类型:{}),跳过普通入库回退,交由拣料入库流程处理", |
| | | barcode, pickWrkMast.getWrkNo(), pickWrkMast.getWrkSts(), pickWrkMast.getIoType()); |
| | | continue; |
| | | } |
| | | |
| | | // 不是拣料入库,执行回退 |
| | | staProtocol.setWorkNo(wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | |
| | | /** |
| | | * 拣料、并板、盘点再入库 |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized void stnToCrnStnPick(Integer mark) { |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历拣料入库口 |
| | |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | if (staProtocol.isAutoing() //自动 |
| | | && staProtocol.isLoading() //有物 |
| | | && staProtocol.isInEnable() //可入 |
| | | && staProtocol.isPakMk() //锁定标记 |
| | | // && staProtocol.getWorkNo() == 9999 |
| | | |
| | | ) { |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) { |
| | | News.warnNoLog(""+mark+" - 0"+" - 开始执行"); |
| | | WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode); |
| | | if (wrkMast == null) { |
| | | // 无拣料数据 |
| | | continue; |
| | | } |
| | | // 判断工作档类型:未转换状态(103/104/107)或已转换状态(53/54/57) |
| | | boolean isValidIoType = (wrkMast.getIoType() == 103 || wrkMast.getIoType() == 104 || wrkMast.getIoType() == 107) |
| | | || (wrkMast.getIoType() == 53 || wrkMast.getIoType() == 54 || wrkMast.getIoType() == 57); |
| | | if (!isValidIoType || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) { |
| | | if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) |
| | | || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) { |
| | | continue; |
| | | } |
| | | |
| | | // 判断工作档是否已转换:已转换状态(53/54/57)或未转换状态(103/104/107) |
| | | boolean isConverted = (wrkMast.getIoType() == 53 || wrkMast.getIoType() == 54 || wrkMast.getIoType() == 57); |
| | | |
| | | // 对于已转换状态的工作档,检查是否已经下发过(避免重复处理) |
| | | if (isConverted && staProtocol.getWorkNo() != null && staProtocol.getWorkNo().equals(wrkMast.getWrkNo())) { |
| | | // 工作号已匹配,说明已经下发过,跳过 |
| | | News.info("拣料入库工作档{}已下发,跳过重复处理", wrkMast.getWrkNo()); |
| | | continue; |
| | | } |
| | | |
| | | Integer typeNo = isConverted ? wrkMast.getIoType() : (wrkMast.getIoType() - 50); |
| | | |
| | | // 获取目标站 |
| | | Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() |
| | | .eq("type_no", typeNo) |
| | | .eq("type_no", wrkMast.getIoType() - 50) |
| | | .eq("stn_no", pickSta.getStaNo()) // 作业站点 = 拣料出库的目标站 |
| | | .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 |
| | | StaDesc staDesc = staDescService.selectOne(wrapper); |
| | | if (Cools.isEmpty(staDesc)) { |
| | | News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", typeNo, pickSta.getStaNo(), wrkMast.getCrnNo()); |
| | | News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo()); |
| | | staProtocol.setWorkNo(wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1)); |
| | |
| | | continue; |
| | | } |
| | | |
| | | // 堆垛机站点(目标站) |
| | | Integer staNo = staDesc.getCrnStn(); |
| | | |
| | | try { |
| | | // 保存工作明细档历史档 |
| | | if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) { |
| | |
| | | } |
| | | |
| | | Date now = new Date(); |
| | | // 堆垛机站点(目标站) |
| | | Integer staNo = staDesc.getCrnStn(); |
| | | // 更新工作档数据状态 |
| | | wrkMast.setIoTime(now); |
| | | // 如果未转换,则转换为入库类型;如果已转换,则保持不变 |
| | | if (!isConverted) { |
| | | wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 |
| | | wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走 |
| | | wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 |
| | | wrkMast.setStaNo(staNo); // 目标站 |
| | | wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 |
| | | wrkMast.setSourceLocNo(""); // 源库位清空 |
| | | } |
| | | // 对于已转换状态,只更新时间,不修改其他字段(避免覆盖已有信息) |
| | | wrkMast.setModiTime(now); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | throw new CoolException("更新工作档数据状态失败"); |
| | | } |
| | | // 更新明细档io_time (历史档关联使用) |
| | | wrkDetlService.updateIoTime(wrkMast.getWrkNo(), now); |
| | | // 修改库位状态 Q.拣料/盘点/并板再入库(如果库位状态不是Q) |
| | | // 修改库位状态 Q.拣料/盘点/并板再入库 |
| | | LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); |
| | | if (locMast != null && !"Q".equals(locMast.getLocSts())) { |
| | | locMast.setLocSts("Q"); |
| | | locMast.setModiTime(new Date()); |
| | | if (!locMastService.updateById(locMast)) { |
| | | throw new CoolException("修改库位状态失败"); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | continue; |
| | | } |
| | | |
| | | // 更新站点信息 且 下发plc命令(参考全版入库的方式) |
| | | // 更新站点信息 且 下发plc命令 |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo()); |
| | | // 对于已转换状态,使用工作档中已有的目标站;对于未转换状态,使用新计算的目标站 |
| | | Integer targetStaNo = isConverted ? wrkMast.getStaNo() : staNo; |
| | | staProtocol.setStaNo(targetStaNo.shortValue()); // 目标站:堆垛机站点号 |
| | | staProtocol.setStaNo(staDesc.getCrnStn().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发5:"+wrkMast.getWrkNo()+","+targetStaNo); |
| | | log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo()); |
| | | if (!result) { |
| | | News.error(""+mark+" - 3"+" - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId()); |
| | | } |
| | |
| | | continue; |
| | | } |
| | | |
| | | // //堆垛机回原点任务中 |
| | | // if(crnThread.isBackHpFlag()){ |
| | | // continue; |
| | | // } |
| | | |
| | | // 只有当堆垛机空闲 并且 无任务时才继续执行 |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO |
| | | && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { |
| | |
| | | // 库位移转 |
| | | //mark - 3 - .... |
| | | this.locToLoc(crn, crnProtocol,mark); |
| | | // this.crnRebackHp(crnProtocol, crnThread); |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); |
| | | } |
| | | |
| | | /** |
| | |
| | | News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F、D 库位状态={}",shallowLoc.getLocSts()); |
| | | // 此标记避免多次执行移库任务 |
| | | if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { |
| | | |
| | | if (moveLocForDeepLoc(slave, shallowLoc,mark)){ |
| | | wrkMast.setUpdMk("Y"); |
| | | wrkMast.setIoPri(14D); |
| | |
| | | continue; |
| | | } |
| | | // 入库 + 库位转移 ==> 4.入库完成 |
| | | // 支持普通入库(io_type=1/10)和拣料入库(io_type=53/54/57)的状态3完成确认 |
| | | // 支持库位移转(io_type=11)的状态12完成确认 |
| | | boolean canFinish = (wrkMast.getWrkSts() == 3) || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11); |
| | | if (canFinish) { |
| | | News.info(""+mark+" - 1"+" - 入库任务完成确认:工作号={},工作状态={},入出库类型={},单据编号={},托盘码={}", |
| | | wrkMast.getWrkNo(), wrkMast.getWrkSts(), wrkMast.getIoType(), wrkMast.getSheetNo(), wrkMast.getBarcode()); |
| | | if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) { |
| | | wrkMast.setWrkSts(4L); |
| | | } else { |
| | | News.warn(""+mark+" - 1"+" - 入库任务状态不符合完成条件:工作号={},工作状态={},入出库类型={},单据编号={},跳过", |
| | | wrkMast.getWrkNo(), wrkMast.getWrkSts(), wrkMast.getIoType(), wrkMast.getSheetNo()); |
| | | continue; |
| | | } |
| | | Date now = new Date(); |
| | |
| | | // 堆垛机复位 |
| | | News.warnNoLog(""+mark+" - 2"+" - 修改成功后复位堆垛机 : 堆垛机号={}",crnThread.getCrnProtocol().getCrnNo()); |
| | | crnThread.setResetFlag(true); |
| | | |
| | | // 对于拣料入库(io_type=53/54/57),记录完成信息,方便WMS系统查询订单状态 |
| | | if (wrkMast.getIoType() == 53 || wrkMast.getIoType() == 54 || wrkMast.getIoType() == 57) { |
| | | News.info(""+mark+" - 2"+" - 【拣料入库完成】工作号={},入出库类型={},工作状态={},单据编号={},托盘码={},库位号={},完成时间={}", |
| | | wrkMast.getWrkNo(), wrkMast.getIoType(), wrkMast.getWrkSts(), |
| | | wrkMast.getSheetNo(), wrkMast.getBarcode(), wrkMast.getLocNo(), now); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | /** |
| | | * 空栈板初始化入库,叉车入库站放货 |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized void storeEmptyPlt(Integer mark) { |
| | | |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | |
| | | /** |
| | | * 出库 ===>> 工作档信息写入led显示器 |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public synchronized void ledExecute() { |
| | | for (LedSlave led : slaveProperties.getLed()) { |
| | | // 获取输送线plc线程 |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 因双深库位阻塞,对浅库位进行移转(立即执行版) |
| | | * tip:同步 |
| | | */ |
| | | /** |
| | | * 因双深库位阻塞,对浅库位进行移转(立即执行版) |
| | | * tip:同步 |
| | | */ |
| | | private synchronized boolean moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc,Integer mark) { |
| | | |
| | | try { |