| | |
| | | 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()); |
| | |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk() && staProtocol.getWorkNo() == 9999) { |
| | | if (staProtocol.isAutoing() //自动 |
| | | && staProtocol.isLoading() //有物 |
| | | && staProtocol.isInEnable() //可入 |
| | | && staProtocol.isPakMk() //锁定标记 |
| | | // && staProtocol.getWorkNo() == 9999 |
| | | |
| | | ) { |
| | | News.warnNoLog(""+mark+" - 0"+" - 开始执行"); |
| | | WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode); |
| | | if (wrkMast == null) { |
| | | // 无拣料数据 |
| | | continue; |
| | | } |
| | | if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) |
| | | || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) { |
| | | // 判断工作档类型:未转换状态(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())) { |
| | | 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", wrkMast.getIoType() - 50) |
| | | .eq("type_no", typeNo) |
| | | .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={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo()); |
| | | News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", typeNo, 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); |
| | | 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(""); // 源库位清空 |
| | | // 如果未转换,则转换为入库类型;如果已转换,则保持不变 |
| | | 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()); |
| | | locMast.setLocSts("Q"); |
| | | locMast.setModiTime(new Date()); |
| | | if (!locMastService.updateById(locMast)) { |
| | | throw new CoolException("修改库位状态失败"); |
| | | 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()); |
| | | staProtocol.setStaNo(staProtocol.getSiteId().shortValue()); |
| | | // 对于已转换状态,使用工作档中已有的目标站;对于未转换状态,使用新计算的目标站 |
| | | Integer targetStaNo = isConverted ? wrkMast.getStaNo() : staNo; |
| | | staProtocol.setStaNo(targetStaNo.shortValue()); // 目标站:堆垛机站点号 |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo()); |
| | | log.error("输送线下发5:"+wrkMast.getWrkNo()+","+targetStaNo); |
| | | if (!result) { |
| | | News.error(""+mark+" - 3"+" - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId()); |
| | | } |
| | |
| | | for (CrnSlave crnSlave : slaveProperties.getCrn()) { |
| | | try { |
| | | // 每台堆垛机的所有出库站处理在同一个事务中执行,快速提交释放锁 |
| | | processCrnStnToOutStnForCrn(crnSlave, mark); |
| | | mainService.processCrnStnToOutStnForCrn(crnSlave, mark); |
| | | } catch (Exception e) { |
| | | News.error(""+mark+" - crnStnToOutStn"+" - 处理堆垛机{}时发生异常", crnSlave.getId(), e); |
| | | // 继续处理下一台堆垛机,不中断整个流程 |
| | |
| | | |
| | | /** |
| | | * 处理单台堆垛机的所有出库站操作(使用独立事务,快速提交释放锁) |
| | | * 注意:必须是public方法,Spring AOP才能代理事务 |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) |
| | | public void processCrnStnToOutStnForCrn(CrnSlave crnSlave, Integer mark) { |
| | | // 遍历堆垛机出库站 |
| | | for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { |
| | | processCrnStnToOutStn(crnStn, mark); |
| | | mainService.processCrnStnToOutStn(crnStn, mark); |
| | | } |
| | | } |
| | | |
| | |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | try { |
| | | // 每个堆垛机的处理在独立事务中执行,快速提交释放锁 |
| | | processCrnIo(crn, mark); |
| | | mainService.processCrnIo(crn, mark); |
| | | } catch (Exception e) { |
| | | News.error(""+mark+" - crnIoExecute"+" - 处理堆垛机{}时发生异常", crn.getId(), e); |
| | | // 继续处理下一个堆垛机,不中断整个流程 |
| | |
| | | continue; |
| | | } |
| | | // 入库 + 库位转移 ==> 4.入库完成 |
| | | if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) { |
| | | // 支持普通入库(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()); |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |