| | |
| | | |
| | | // 成品库堆垛机出库站点到rgv接驳点 |
| | | public static final Map<Integer,Short> crnOutSiteToRgvSite = new HashMap<>(); |
| | | public static final Map<Integer,Short> crnOutSiteToRgvSite2 = new HashMap<>(); |
| | | |
| | | static { |
| | | emptyPalletSiteMap.put(1001,"M"); // emptyPalletSiteMap.put(1002,"M"); |
| | |
| | | outGzxSiteList.add(1081);outGzxSiteList.add(1084);outGzxSiteList.add(1087); |
| | | |
| | | crnOutSiteToRgvSite.put(1093, (short) 1091);crnOutSiteToRgvSite.put(1099, (short) 1097);crnOutSiteToRgvSite.put(1107, (short) 1105); |
| | | |
| | | crnOutSiteToRgvSite2.put(1087, (short) 1089);crnOutSiteToRgvSite2.put(1084, (short) 1086);crnOutSiteToRgvSite2.put(1081, (short) 1083); |
| | | crnOutSiteToRgvSite2.put(1043, (short) 1041);crnOutSiteToRgvSite2.put(1016, (short) 1018); |
| | | } |
| | | |
| | | @Autowired |
| | |
| | | private WaitPakinMapper waitPakinMapper; |
| | | @Autowired |
| | | private LocMastService locMastService; |
| | | |
| | | @Resource |
| | | private LocMastMapper locMastMapper; |
| | | @Autowired |
| | | private StaDescService staDescService; |
| | | @Autowired |
| | |
| | | |
| | | @Resource |
| | | private ConfigService configService; |
| | | |
| | | @Resource |
| | | private BasDevpErrLogService basDevpErrLogService; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | |
| | | barcodeThread.setBarcode(""); |
| | | staProtocol.setWorkNo(dto.getWorkNo()); |
| | | staProtocol.setStaNo(dto.getStaNo().shortValue()); |
| | | if (dto.getStaNo() == 1071 || dto.getStaNo() == 1064 || dto.getStaNo() == 1078) { |
| | | decreaseWantBucketCount(dto.getStaNo(),1); |
| | | } |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发2:"+dto.getWorkNo()+","+dto.getStaNo()); |
| | | log.info("输送线下发2:"+dto.getWorkNo()+","+dto.getStaNo()); |
| | | if (!result) { |
| | | News.error(methodName + ":更新plc站点信息失败"); |
| | | throw new CoolException("更新plc站点信息失败"); |
| | |
| | | StaProtocol staProtocol1084 = devpThread.getStation().get(1084); |
| | | StaProtocol staProtocol1087 = devpThread.getStation().get(1087); |
| | | List<SearchLocParam.WantBucket> wantBucketList = new ArrayList<>(); |
| | | wantBucketList.add(new SearchLocParam.WantBucket(1064,staProtocol1084.getWantBucketFlag())); |
| | | wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag())); |
| | | wantBucketList.add(new SearchLocParam.WantBucket(1078,staProtocol1087.getWantBucketFlag())); |
| | | wantBucketList.add(new SearchLocParam.WantBucket(1064,staProtocol1084.getWantBucketFlag(),staProtocol1084.getWantBucketCount())); |
| | | wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag(),staProtocol1081.getWantBucketCount())); |
| | | wantBucketList.add(new SearchLocParam.WantBucket(1078,staProtocol1087.getWantBucketFlag(),staProtocol1087.getWantBucketCount())); |
| | | return wantBucketList; |
| | | } |
| | | |
| | | /** |
| | | * 罐装线要桶数量减少 |
| | | */ |
| | | private void decreaseWantBucketCount(int site, int decrease) throws InterruptedException { |
| | | |
| | | int siteNew; |
| | | switch (site) { |
| | | case 1071: siteNew = 1081;break; |
| | | case 1064: siteNew = 1084;break; |
| | | case 1078: siteNew = 1087;break; |
| | | default: |
| | | return; |
| | | } |
| | | |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2); |
| | | StaProtocol staProtocol = devpThread.getStation().get(siteNew); |
| | | if(staProtocol == null) { |
| | | return; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | int count = staProtocol.getWantBucketCount(); |
| | | |
| | | int remaining = count - decrease; |
| | | if ( remaining < 0) { |
| | | log.error("自动出空桶减少罐装线要桶数异常,站点:{},减少前:{},减少数:{},剩余要桶数:{}", site, count, decrease, remaining); |
| | | return; |
| | | } |
| | | |
| | | staProtocol.setWantBucketCount(remaining); |
| | | |
| | | boolean offer = MessageQueue.offer(SlaveType.Devp, inGzxSiteList.indexOf(site) + 4, new Task(6, staProtocol)); |
| | | if (offer) { |
| | | log.info("自动出空桶减少罐装线要桶数命令推送队列成功:站点:{},剩余要桶数:{}" ,site, remaining); |
| | | } else { |
| | | log.error("自动出空桶减少罐装线要桶数命令推送队列失败:站点:{},剩余要桶数:{}" ,site, remaining); |
| | | } |
| | | |
| | | log.info("自动出空桶减少罐装线要桶数成功,站点:{},减少前:{},减少数:{},剩余要桶数:{}", site, count, decrease, remaining); |
| | | } |
| | | |
| | | /** |
| | |
| | | continue; |
| | | } |
| | | |
| | | } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { |
| | | } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("M")|| shallowLoc.getLocSts().equals("Z")) { |
| | | News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F、D 库位状态={}",shallowLoc.getLocSts()); |
| | | // 此标记避免多次执行移库任务 |
| | | if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { |
| | |
| | | */ |
| | | public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) { |
| | | News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库"); |
| | | boolean crnAvailableOut = false; |
| | | Config config = configService.selectOne(new EntityWrapper<Config>().eq("code","removeCrnAvailableOut")); |
| | | if (config != null && config.getStatus() == 1) { |
| | | crnAvailableOut = true; |
| | | } |
| | | // 限制去捆绑机器任务数 |
| | | int kbWrks = wrkMastMapper.selectCountByKb(); |
| | | for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { |
| | | // 获取工作状态为11(生成出库ID)的出库工作档 |
| | | List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | if (wrkMast == null) { |
| | | continue; |
| | | } |
| | | if (wrkMast.getStaNo() == 1031) { |
| | | // 获取1033无状态时任务数+1 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); |
| | | StaProtocol staProtocol = devpThread.getStation().get(1033); |
| | | if (staProtocol.isLoading() && staProtocol.getWorkNo() == 0) { |
| | | kbWrks ++; |
| | | } |
| | | if (kbWrks > 2) { |
| | | continue; |
| | | } |
| | | } |
| | | // 工作档状态判断 |
| | | if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) { |
| | |
| | | } |
| | | |
| | | // 判断堆垛机出库站状态 |
| | | if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") |
| | | && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { |
| | | if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") && |
| | | (crnAvailableOut || !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable())) { |
| | | // 堆垛机控制过滤 |
| | | if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { |
| | | break; |
| | |
| | | |
| | | } |
| | | } |
| | | } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { |
| | | } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("M")|| shallowLoc.getLocSts().equals("Z")) { |
| | | News.warnNoLog(""+mark+" - 2"+" - 9"+" - // F、D 库位状态={}",shallowLoc.getLocSts()); |
| | | // WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); |
| | | //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务 |
| | |
| | | // 空桶入库完成,先完成对应库位组任务 |
| | | if(wrkMast.getWorkNoOther() != 0 ){ |
| | | WrkMast wrkMast1 = wrkMastService.selectByWrkNo(wrkMast.getWorkNoOther()); |
| | | // 交换库位号 |
| | | String locNo = wrkMast.getLocNo(); |
| | | wrkMast.setLocNo(wrkMast1.getLocNo()); |
| | | wrkMast1.setLocNo(locNo); |
| | | wrkMast1.setCrnEndTime(now); |
| | | wrkMast1.setModiTime(now); |
| | | wrkMast1.setWrkSts(4L); |
| | | wrkMast1.setWorkNoOther(0); |
| | | wrkMastMapper.updateById(wrkMast1); |
| | | if (wrkMast1 != null) { |
| | | // 交换库位号 |
| | | String locNo = wrkMast.getLocNo(); |
| | | wrkMast.setLocNo(wrkMast1.getLocNo()); |
| | | // 交换入库时间,提取库存时按顺序先浅后深 |
| | | Date ioTime = wrkMast.getIoTime(); |
| | | if(locNo.startsWith("10")) { |
| | | wrkMast.setIoTime(wrkMast1.getIoTime()); |
| | | wrkMast1.setIoTime(ioTime); |
| | | } |
| | | wrkMast1.setLocNo(locNo); |
| | | wrkMast1.setCrnEndTime(now); |
| | | wrkMast1.setModiTime(now); |
| | | wrkMast1.setWrkSts(4L); |
| | | wrkMast1.setWorkNoOther(0); |
| | | wrkMastMapper.updateById(wrkMast1); |
| | | } |
| | | } |
| | | wrkMast.setCrnEndTime(now); |
| | | wrkMast.setModiTime(now); |
| | |
| | | /** |
| | | * 堆垛机回原点 |
| | | */ |
| | | public synchronized void originGo() { |
| | | public synchronized void originGo() throws InterruptedException { |
| | | |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol == null) { |
| | | if(crnProtocol == null) { |
| | | continue; |
| | | } |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO |
| | |
| | | } |
| | | // 判断是不是空闲三分钟 |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | if (basCrnp.getWrkNo() != 0) { |
| | | continue; |
| | | } |
| | | Date now = new Date(); |
| | | Date modiTime = basCrnp.getModiTime(); |
| | | long diffInMillis = now.getTime()-modiTime.getTime(); |
| | | if(diffInMillis < 3 * 60 * 1000) { |
| | | if(diffInMillis < 10 * 1000) { // 空闲小于10秒则跳过 |
| | | continue; |
| | | } else { // 有入库任务或大于2分钟,回原点 |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1).eq("crn_no", crn.getId()).in("wrk_sts", 2, 9, 10)); |
| | | if(count == 0 && diffInMillis < 2 * 60 * 1000) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | // 有吊车入库或吊车出库任务 |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnProtocol.getCrnNo()).in("wrk_sts", 3, 12)); |
| | | if(count != 0) { |
| | | continue; |
| | | } |
| | | |
| | |
| | | if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) { |
| | | News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand)); |
| | | } else { |
| | | basCrnp.setModiTime(new Date()); |
| | | basCrnpService.updateById(basCrnp); // 设置更新时间,避免重复下发回原点 |
| | | log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand)); |
| | | } |
| | | Thread.sleep(3000); |
| | | } |
| | | } |
| | | } |
| | |
| | | if (crnProtocol == null) { |
| | | continue; |
| | | } |
| | | if (true) { |
| | | // if (crnProtocol.getModeType() != CrnModeType.STOP) { |
| | | // if (true) { |
| | | if (crnProtocol.getModeType() != CrnModeType.STOP) { |
| | | // 有任务 |
| | | if (crnProtocol.getTaskNo() != 0) { |
| | | |
| | | BasErrLog latest = basErrLogService.findLatestByTaskNo(crn.getId(), crnProtocol.getTaskNo().intValue()); |
| | | // 有异常 |
| | | if (latest == null) { |
| | | News.warnNoLog(""+mark+" - 1"+" - 开始执行:堆垛机异常信息记录 : 有任务,有异常"); |
| | | // News.warnNoLog(""+mark+" - 1"+" - 开始执行:堆垛机异常信息记录 : 有任务,有异常"); |
| | | if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { |
| | | WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo()); |
| | | if (wrkMast == null) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 输送线异常 |
| | | */ |
| | | public synchronized void recDevpErr() { |
| | | Date now = new Date(); |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | Integer devpId = devp.getId(); |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpId); |
| | | Map<Integer, StaProtocol> station = devpThread.getStation(); |
| | | for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) { |
| | | Integer siteNo = entry.getKey(); |
| | | StaProtocol staProtocol = entry.getValue(); |
| | | Integer workNo = staProtocol.getWorkNo(); |
| | | // 输送线报警 |
| | | String plcErr = staPlcErr(staProtocol); |
| | | if (staProtocol.isAutoing()) { |
| | | // 有任务 |
| | | if (staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() <= 9000) { |
| | | |
| | | // 获取输送线报警信息 |
| | | BasDevpErrLog latestByTaskNo = basDevpErrLogService.findLatestByTaskNo(siteNo, workNo); |
| | | |
| | | // 有异常 |
| | | if (latestByTaskNo == null) { |
| | | if (!plcErr.equals("")) { |
| | | WrkMast wrkMast = wrkMastMapper.selectById(workNo); |
| | | if (wrkMast == null) { |
| | | continue; |
| | | } |
| | | |
| | | BasDevpErrLog basErrLog = new BasDevpErrLog( |
| | | null, // 编号 |
| | | wrkMast.getWrkNo(), // 工作号 |
| | | now, // 发生时间 |
| | | null, // 结束时间 |
| | | wrkMast.getWrkSts(), // 工作状态 |
| | | wrkMast.getIoType(), // 入出库类型 |
| | | wrkMast.getCrnNo(), // 堆垛机 |
| | | devpId, // plc |
| | | wrkMast.getLocNo(), // 目标库位 |
| | | wrkMast.getStaNo(), // 目标站 |
| | | siteNo, // 源站 |
| | | wrkMast.getSourceLocNo(), // 源库位 |
| | | wrkMast.getBarcode(), // 条码 |
| | | 0, // 异常码 |
| | | plcErr, // 异常 |
| | | 1, // 异常情况 |
| | | now, // 添加时间 |
| | | null, // 添加人员 |
| | | now, // 修改时间 |
| | | null, // 修改人员 |
| | | "任务中异常" // 备注 |
| | | ); |
| | | if (!basDevpErrLogService.insert(basErrLog)) { |
| | | log.error("输送线异常信息插入表asr_bas_devp_err_log异常:{}", basErrLog); |
| | | } |
| | | } |
| | | } else { |
| | | // 异常修复 |
| | | if (plcErr.equals("")) { |
| | | latestByTaskNo.setEndTime(now); |
| | | latestByTaskNo.setUpdateTime(now); |
| | | latestByTaskNo.setStatus(2); |
| | | if (!basDevpErrLogService.updateById(latestByTaskNo)) { |
| | | log.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latestByTaskNo); |
| | | } |
| | | } |
| | | } |
| | | // 无任务 |
| | | } else { |
| | | BasDevpErrLog latest = basDevpErrLogService.findLatest(siteNo); |
| | | // 有异常 |
| | | if (!plcErr.equals("")) { |
| | | // 记录新异常 |
| | | if (latest == null || !latest.getError().equals(plcErr) || latest.getStatus() == 2 ) { |
| | | BasDevpErrLog basErrLog = new BasDevpErrLog( |
| | | null, // 编号 |
| | | null, // 工作号 |
| | | now, // 发生时间 |
| | | null, // 结束时间 |
| | | null, // 工作状态 |
| | | null, // 入出库类型 |
| | | 0, // 堆垛机 |
| | | devpId, // plc |
| | | null, // 目标库位 |
| | | null, // 目标站 |
| | | siteNo, // 源站 |
| | | null, // 源库位 |
| | | null, // 条码 |
| | | 0, // 异常码 |
| | | plcErr, // 异常 |
| | | 1, // 异常情况 |
| | | now, // 添加时间 |
| | | null, // 添加人员 |
| | | now, // 修改时间 |
| | | null, // 修改人员 |
| | | "无任务异常" // 备注 |
| | | ); |
| | | if (!basDevpErrLogService.insert(basErrLog)) { |
| | | log.error("输送线异常记录asr_bas_devp_err_log异常:{}", basErrLog); |
| | | } |
| | | } |
| | | // 无异常 |
| | | } else { |
| | | // 异常修复 |
| | | if (latest != null && latest.getStatus() == 1) { |
| | | latest.setEndTime(now); |
| | | latest.setUpdateTime(now); |
| | | latest.setStatus(2); |
| | | if (!basDevpErrLogService.updateById(latest)) { |
| | | log.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latest); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 获取输送线报警 |
| | | public String staPlcErr(StaProtocol staProtocol){ |
| | | Integer siteId = staProtocol.getSiteId(); |
| | | if (staProtocol.getBreakerErr()){ |
| | | return "断路器故障"; |
| | | } |
| | | if (staProtocol.getInfraredErr()){ |
| | | return "光电异常"; |
| | | } |
| | | if (staProtocol.getOutTimeErr()){ |
| | | return "运行超时"; |
| | | } |
| | | if (staProtocol.getSeizeSeatErr()){ |
| | | return "占位超时"; |
| | | } |
| | | if (staProtocol.getWrkYgoodsN()){ |
| | | return "有任务无货故障"; |
| | | } |
| | | if (staProtocol.getInverterErr()){ |
| | | return "变频器故障"; |
| | | } |
| | | if (staProtocol.getContactErr()){ |
| | | return "电机接触器故障"; |
| | | } |
| | | if (staProtocol.getUpcontactErr()){ |
| | | return "顶升电机接触器故障"; |
| | | } |
| | | if (staProtocol.isFrontErr()){ |
| | | return "前超限"; |
| | | } |
| | | if (staProtocol.isBackErr()){ |
| | | return "后超限"; |
| | | } |
| | | if (staProtocol.isHighErr()){ |
| | | return "高超限"; |
| | | } |
| | | if (staProtocol.isLeftErr()){ |
| | | return "左超限"; |
| | | } |
| | | if (staProtocol.isRightErr()){ |
| | | return "右超限"; |
| | | } |
| | | if (staProtocol.isBarcodeErr() && siteId != 1083 && siteId != 1086 && siteId != 1089 ){ |
| | | return "扫码失败"; |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | /** |
| | | * 出库 ===>> 工作档信息写入led显示器 |
| | | */ |
| | | public synchronized void ledExecute(Integer mark) { |
| | |
| | | case 110: |
| | | ledCommand.setTitle("空板出库"); |
| | | ledCommand.setEmptyMk(true); |
| | | break; |
| | | case 120: |
| | | ledCommand.setTitle("手动转移"); |
| | | break; |
| | | default: |
| | | News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); |
| | |
| | | */ |
| | | private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc,Integer mark) { |
| | | |
| | | // 只有208L能放11层 |
| | | String model = null; |
| | | if(shallowLoc.getLocSts().equals("F")) { |
| | | LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo())); |
| | | if(locDetl != null && locDetl.getModel() != null) { |
| | | String matModel = locMastMapper.selectMatMatnrByMaktx(locDetl.getModel()); |
| | | if(matModel != null && matModel.equals("208L")) { |
| | | model = "208L"; |
| | | } |
| | | } |
| | | } |
| | | try { |
| | | News.warnNoLog(""+mark+"moveLocForDeepLoc"+" - 0"+" - 开始执行:因双深库位阻塞,对浅库位进行移转(立即执行版)"); |
| | | List<Integer> rows = locMastService.queryDistinctRow(crn.getId()); |
| | | LocMast loc = null; |
| | | for (Integer row : rows) { |
| | | if (Utils.isDeepLoc(slaveProperties, row)) { |
| | | loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType2()); |
| | | // loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType2()); |
| | | loc = locMastMapper.queryFreeLocMastNew(row,model); |
| | | |
| | | if (loc != null) { |
| | | if (Utils.isDeepLoc(slaveProperties, loc.getLocNo())) { |
| | |
| | | if (null == loc) { |
| | | for (Integer row : rows) { |
| | | if (Utils.isShallowLoc(slaveProperties, row)) { |
| | | loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType2()); |
| | | |
| | | // loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType2()); |
| | | loc = locMastMapper.queryFreeLocMastNew(row,model); |
| | | if (null != loc) {//对应深库位非在库状态,不能移库 |
| | | String deepLoc = Utils.getDeepLoc(slaveProperties, loc.getLocNo()); |
| | | LocMast deepLoc1 = locMastService.selectById(deepLoc); |
| | | if (!deepLoc1.getLocSts().equals("F") && !deepLoc1.getLocSts().equals("D")) { |
| | | if (!deepLoc1.getLocSts().equals("F") && !deepLoc1.getLocSts().equals("M")&& !deepLoc1.getLocSts().equals("Z")) { |
| | | loc = null; |
| | | } |
| | | } |
| | |
| | | wrkMast.setFullPlt(shallowLoc.getLocSts().equals("F") ? "Y" : "N"); // 满板 |
| | | wrkMast.setPicking("N"); // 拣料 |
| | | wrkMast.setExitMk("N"); // 退出 |
| | | wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板 |
| | | wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("M") ? "M" : shallowLoc.getLocSts().equals("Z") ? "Z" : "N"); // 空板 |
| | | wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码 |
| | | wrkMast.setLinkMis("N"); |
| | | wrkMast.setAppeTime(new Date()); |
| | |
| | | } |
| | | } |
| | | // 修改源库位状态 |
| | | if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) { |
| | | if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("M") || shallowLoc.getLocSts().equals("Z")) { |
| | | shallowLoc.setLocSts("R"); // R.出库预约 |
| | | shallowLoc.setModiTime(new Date()); |
| | | if (!locMastService.updateById(shallowLoc)) { |
| | |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.isInEnable() || staProtocol.isOutEnable() && site == 1090) && staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() < 9000) { |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.isInEnable() || staProtocol.isOutEnable() && site == 1090) && staProtocol.getWorkNo() != 0 && (staProtocol.getWorkNo() <= 9000 || staProtocol.getWorkNo()>=30000)) { |
| | | if (staProtocol.getSiteId() == 1034 && !staProtocol.isHigh()) { // 1034空母拖回流任务需要高信号 |
| | | continue; |
| | | } |
| | | // 查询工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo()); |
| | | if (wrkMast == null) { |
| | |
| | | if (staProtocol.getSiteId() == 1090 && wrkMast.getStaNo() == 1090) { |
| | | continue; |
| | | } |
| | | if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && (wrkMast.getRgvNo() == null || wrkMast.getRgvDstaNo() == 1090)) { |
| | | if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15 || (wrkMast.getIoType() == 120 && wrkMast.getWrkSts() == 52)) && (wrkMast.getRgvNo() == null || wrkMast.getRgvDstaNo() == 1090)) { |
| | | // 有1090的任务跳过rgv分配 |
| | | if(wrkMast.getStaNo() == 1090) { |
| | | DevpThread devpThread2 = (DevpThread) SlaveConnection.get(SlaveType.Devp, 2); |
| | | StaProtocol staProtocol2 = devpThread2.getStation().get(1090); |
| | | if(!staProtocol2.isAutoing() || staProtocol2.isLoading() || staProtocol2.getWorkNo() != 0) { |
| | | log.info("去异常口目标站点,非自动,有物,工作号为:{}",staProtocol2.getWorkNo()); |
| | | log.info("{}去异常口目标站点,自动:{},有物:{},工作号为:{}",wrkMast.getWrkNo(),staProtocol2.isAutoing(),staProtocol2.isLoading(),staProtocol2.getWorkNo()); |
| | | continue; |
| | | } |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().where("sta_no = 1090 and wrk_sts in (9,10)")); |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().where("sta_no = 1090 AND (wrk_sts IN (9,10) OR (wrk_sts = 2 AND rgv_finish_time IS NOT NULL))")); |
| | | if (count > 0) { |
| | | log.info("去异常口,但是前面有去异常口任务数:{}",count); |
| | | log.info("{}去异常口,但是前面有去异常口任务数:{}",wrkMast.getWrkNo(),count); |
| | | continue; |
| | | } |
| | | } |
| | |
| | | /** |
| | | * rgv放货完成,给输送线下发任务 |
| | | */ |
| | | public synchronized void rgvToDev() { |
| | | public synchronized void rgvToDev() throws InterruptedException { |
| | | for (Integer site : rgvConnectionSiteList) { |
| | | // 输送线plc编号 |
| | | Integer devpPlcId = site < 1044 ? 1 : site <= 1090 ? 2 : 3; |
| | |
| | | // } |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } else if(wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) { |
| | | } else if(wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1031 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) { |
| | | if(wrkMast.getWrkSts() != 2 ) { |
| | | log.warn("rgv放货完成101,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts()); |
| | | continue; |
| | |
| | | wrkMast.setWrkSts(15L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } else if(wrkMast.getIoType() == 110 && (wrkMast.getStaNo() == 1002 || wrkMast.getStaNo() == 1020 ||wrkMast.getStaNo() == 1035)) { |
| | | } else if(wrkMast.getIoType() == 110 && (wrkMast.getStaNo() == 1002 || wrkMast.getStaNo() == 1020 ||wrkMast.getStaNo() == 1035 || wrkMast.getStaNo() == 1024)) { |
| | | if(wrkMast.getWrkSts() != 2 ){ |
| | | log.warn("rgv放货完成110,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts()); |
| | | continue; |
| | | } |
| | | wrkMast.setWrkSts(15L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } else if(wrkMast.getIoType() == 120) { |
| | | if(wrkMast.getWrkSts() != 53 ){ |
| | | log.warn("rgv放货完成120,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts()); |
| | | continue; |
| | | } |
| | | wrkMast.setWrkSts(54L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | |
| | | staProtocol.setWorkNo(staProtocol.getHideWorkNo()); |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); |
| | | if (!MessageQueue.offer(SlaveType.Devp, devpPlcId, new Task(2, staProtocol))) { |
| | | log.info("rgv搬运完成给输送线下发命令失败!,plc id:{},站点{},任务号:{},目标站:{}", devpPlcId,staProtocol.getStaNo(), staProtocol.getWorkNo(), staProtocol.getStaNo()); |
| | | log.info("rgv搬运完成给输送线下发命令失败!,plc id:{},站点{},任务号:{},目标站:{}", devpPlcId,staProtocol.getSiteId(), staProtocol.getWorkNo(), staProtocol.getStaNo()); |
| | | } else { |
| | | log.info("rgv搬运完成给输送线下发命令成功plc id:{}!,站点{},任务号:{},目标站:{}", devpPlcId,staProtocol.getStaNo(), staProtocol.getWorkNo(), staProtocol.getStaNo()); |
| | | log.info("rgv搬运完成给输送线下发命令成功plc id:{}!,站点{},任务号:{},目标站:{}", devpPlcId,staProtocol.getSiteId(), staProtocol.getWorkNo(), staProtocol.getStaNo()); |
| | | } |
| | | Thread.sleep(300); |
| | | } |
| | | } |
| | | } |
| | |
| | | if (wrkMast == null) { |
| | | log.error("异常口入库任务号无任务:{}", staProtocol.getWorkNo()); |
| | | return; |
| | | } else if (wrkMast.getLocNo() != null) { |
| | | } else if (wrkMast.getLocNo() != null && wrkMast.getLocNo().length() == 7) { |
| | | // log.info("异常口入库库位已分配:{}", wrkMast.getLocNo()); |
| | | return; |
| | | } else if(wrkMast.getStaNo() != 1090) { |
| | |
| | | } |
| | | |
| | | public synchronized void autoOutEmptyBucket() { |
| | | Config config = configService.selectOne(new EntityWrapper<Config>().eq("code","autoOutEmptyBucket").eq("status",1)); |
| | | Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "autoOutEmptyBucket").eq("status", 1)); |
| | | if (config == null || Cools.isEmpty(config.getValue())) { |
| | | return; |
| | | } |
| | |
| | | String[] split = config.getValue().split("="); |
| | | |
| | | for (SearchLocParam.WantBucket wantBucket : getWantBucketFlag()) { |
| | | if (wantBucket.getBucketType() != 0) { // 罐装线有要桶信号 |
| | | if (wantBucket.getBucketType() != 0 && wantBucket.getWantBucketCount() > 0) { // 罐装线有要桶信号+要托数不为0 |
| | | boolean flag = true; // 是否需要自动补,true不需要,false需要 |
| | | for(String item: split) { |
| | | if(String.valueOf(wantBucket.getSite()).equals(item)) { |
| | | for (String item : split) { |
| | | if (String.valueOf(wantBucket.getSite()).equals(item)) { |
| | | flag = false; |
| | | break; |
| | | } |
| | | } |
| | | if(flag) { |
| | | if (flag) { |
| | | return; |
| | | } |
| | | // <4 < 2 < 4 |
| | | int count = wrkMastMapper.selectInGzxCount(wantBucket.getSite()); |
| | | if (wantBucket.getSite() == 1071 && count <= 2 || wantBucket.getSite() == 1064 && count == 0 || wantBucket.getSite() == 1078 && count <= 2) { |
| | | |
| | | if (wantBucket.getWantBucketCount() == 1) { // 最后剩一拖的时候 |
| | | log.info("{}自动补空桶剩最后一托,罐装线要桶型信息:{},正在执行任务数:{}", wantBucket.getSite(), wantBucket.getBucketType(), count); |
| | | if (wantBucket.getSite() == 1071 && count <= 3 || wantBucket.getSite() == 1064 && count <= 1 || wantBucket.getSite() == 1078 && count <= 3) { // 可以出一个 |
| | | List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType()); |
| | | if (locDetlList.size() == 0) { |
| | | log.warn("自动出空桶最后一个,库存无数据"); |
| | | break; |
| | | } |
| | | Map<String, LocDetl> locDetlMap = locDetlList.stream().collect(Collectors.toMap(LocDetl::getLocNo, locDetl -> locDetl)); |
| | | LocDetl locDetlSta = null; |
| | | for (LocDetl locDetl : locDetlList) { |
| | | String loc1 = locDetl.getLocNo(); // 当前库位 |
| | | String row = loc1.substring(0, 2); |
| | | String rowNew = ""; // 对应库位 |
| | | switch (row) { |
| | | case "09": |
| | | rowNew = "10"; |
| | | break; |
| | | case "10": |
| | | rowNew = "09"; |
| | | break; |
| | | case "11": |
| | | rowNew = "12"; |
| | | break; |
| | | case "12": |
| | | rowNew = "11"; |
| | | break; |
| | | default: |
| | | } |
| | | String locNoNew = rowNew + loc1.substring(2); |
| | | LocDetl locDetl1 = locDetlMap.get(locNoNew); |
| | | if (locDetl1 == null) { |
| | | locDetlSta = locDetl; |
| | | break; |
| | | } |
| | | } |
| | | // 没有单的,深浅库位都有,先取浅库位 |
| | | if (locDetlSta == null) { |
| | | Optional<LocDetl> first = locDetlList.stream().filter(locDetl -> locDetl.getLocNo().startsWith("10") || locDetl.getLocNo().startsWith("11")).findFirst(); |
| | | if (first.isPresent()) { |
| | | locDetlSta = first.get(); |
| | | } |
| | | } |
| | | if (locDetlSta != null) { |
| | | try { |
| | | StockOutParam param = new StockOutParam(); |
| | | param.setOutSite(wantBucket.getSite()); |
| | | List<StockOutParam.LocDetl> locDetls = new ArrayList<>(); |
| | | StockOutParam.LocDetl locDetl2 = new StockOutParam.LocDetl(); |
| | | locDetl2.setLocNo(locDetlSta.getLocNo()); |
| | | locDetl2.setMatnr(locDetlSta.getMatnr()); |
| | | locDetl2.setBatch(locDetlSta.getBatch()); |
| | | locDetl2.setBrand(locDetlSta.getBrand()); |
| | | locDetl2.setCount(locDetlSta.getAnfme()); |
| | | locDetl2.setBoxType1(locDetlSta.getBoxType1()); |
| | | locDetl2.setBoxType2(locDetlSta.getBoxType2()); |
| | | locDetl2.setBoxType3(locDetlSta.getBoxType3()); |
| | | locDetl2.setStandby1(locDetlSta.getStandby1()); |
| | | locDetl2.setStandby2(locDetlSta.getStandby2()); |
| | | locDetl2.setStandby3(locDetlSta.getStandby3()); |
| | | locDetls.add(locDetl2); |
| | | param.setLocDetls(locDetls); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/autoOutEmptyBucket") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | log.info("最后一个自动出空桶请求wms原始返回:" + response); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | decreaseWantBucketCount(wantBucket.getSite(), 1); |
| | | log.info("最后一个自动出空桶成功:{}", wantBucket.getSite()); |
| | | return; |
| | | } else { |
| | | News.error("最后一个自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } else if (wantBucket.getSite() == 1071 && count <= 2 || wantBucket.getSite() == 1064 && count == 0 || wantBucket.getSite() == 1078 && count <= 2) { // 可以出两个 |
| | | log.info("{}自动补空桶,罐装线要桶型信息:{},正在执行任务数:{}", wantBucket.getSite(), wantBucket.getBucketType(), count); |
| | | // 判断库里有无空桶组 |
| | | List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType()); |
| | | for (int i = 0; i < locDetlList.size(); i++) { |
| | |
| | | log.info("自动出空桶请求wms原始返回:" + response); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | log.info("自动出空桶成功:{}",wantBucket.getSite()); |
| | | decreaseWantBucketCount(wantBucket.getSite(), 2); |
| | | log.info("自动出空桶成功:{}", wantBucket.getSite()); |
| | | return; |
| | | } else { |
| | | News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (locDetlList.size() > 0) { |
| | | log.info("没有成对的空桶组,只能一个一个出"); |
| | | try { |
| | | LocDetl locDetl = locDetlList.get(0); |
| | | StockOutParam param = new StockOutParam(); |
| | | param.setOutSite(wantBucket.getSite()); |
| | | List<StockOutParam.LocDetl> locDetls = new ArrayList<>(); |
| | | StockOutParam.LocDetl locDetl2 = new StockOutParam.LocDetl(); |
| | | locDetl2.setLocNo(locDetl.getLocNo()); |
| | | locDetl2.setMatnr(locDetl.getMatnr()); |
| | | locDetl2.setBatch(locDetl.getBatch()); |
| | | locDetl2.setBrand(locDetl.getBrand()); |
| | | locDetl2.setCount(locDetl.getAnfme()); |
| | | locDetl2.setBoxType1(locDetl.getBoxType1()); |
| | | locDetl2.setBoxType2(locDetl.getBoxType2()); |
| | | locDetl2.setBoxType3(locDetl.getBoxType3()); |
| | | locDetl2.setStandby1(locDetl.getStandby1()); |
| | | locDetl2.setStandby2(locDetl.getStandby2()); |
| | | locDetl2.setStandby3(locDetl.getStandby3()); |
| | | locDetls.add(locDetl2); |
| | | param.setLocDetls(locDetls); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/autoOutEmptyBucket") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | log.info("自动出空桶请求wms原始返回:" + response); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | decreaseWantBucketCount(wantBucket.getSite(), 1); |
| | | log.info("自动出空桶成功:{}", wantBucket.getSite()); |
| | | return; |
| | | } else { |
| | | News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 手动站位转移 |
| | | */ |
| | | public synchronized void manualStationTransfer() { |
| | | WrkMast wrkMast = wrkMastMapper.selectByIoTypeAndWrkSts(120, 51L); |
| | | |
| | | if (Cools.isEmpty(wrkMast)) { |
| | | return; |
| | | } |
| | | int devpId; |
| | | if (wrkMast.getSourceStaNo() < 1044) { |
| | | devpId = 1; |
| | | } else if (wrkMast.getSourceStaNo() < 1091) { |
| | | devpId = 2; |
| | | } else { |
| | | devpId = 3; |
| | | } |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devpId); |
| | | try { |
| | | StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getSourceStaNo()); |
| | | |
| | | if (staProtocol == null) { |
| | | wrkMast.setIoTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | return; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // 站点条件判断 |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isPakMk()) { |
| | | // 更新站点信息 且 下发plc命令 |
| | | StaProtocol staProtocolNew = new StaProtocol(); |
| | | staProtocolNew.setSiteId(staProtocol.getSiteId()); |
| | | staProtocolNew.setWorkNo(wrkMast.getWrkNo()); |
| | | staProtocolNew.setStaNo(crnOutSiteToRgvSite2.get(wrkMast.getSourceStaNo())); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devpId, new Task(2, staProtocolNew)); |
| | | log.info("手动站位转移输送线下发:" + staProtocolNew.getWrkNo() + "," + staProtocolNew.getSiteId()); |
| | | if (!result) { |
| | | News.errorNoLog("" + " - 1" + " - 更新plc站点信息失败"); |
| | | throw new CoolException("更新plc站点信息失败"); |
| | | } |
| | | |
| | | wrkMast.setIoTime(new Date()); |
| | | wrkMast.setWrkSts(52L); |
| | | wrkMastService.updateById(wrkMast); |
| | | } else { |
| | | wrkMast.setIoTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |