| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | 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.common.R; |
| | | import com.core.common.*; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.AgvTaskAssignmentParam; |
| | |
| | | //mark - 3 - .... |
| | | this.locToLoc(crn, crnProtocol,mark); |
| | | //预调度 |
| | | // this.crnRebackHp(crnProtocol, crnThread); |
| | | this.crnRebackHp(crnProtocol, crnThread); |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); |
| | |
| | | } |
| | | int x=1; |
| | | switch (crnProtocol.getCrnNo()){ |
| | | case 1: x =1; break; |
| | | case 2: x =3; break; |
| | | case 3: x =5; break; |
| | | case 4: x =7; break; |
| | | case 5: x =9; break; |
| | | case 1: x =2; break; |
| | | case 2: x =6; break; |
| | | case 3: x =11; break; |
| | | case 4: x =14; break; |
| | | case 5: x =18; break; |
| | | } |
| | | |
| | | // 已经存在吊车执行任务时,则过滤3,12 |
| | |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.X_MOVE); // 任务模式: 回原点 |
| | | crnCommand.setSourcePosX((short) x); // 源库位排 |
| | | crnCommand.setSourcePosY((short) 1); // 源库位列 |
| | | crnCommand.setSourcePosY((short) 52); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) 1); // 源库位层 |
| | | crnCommand.setDestinationPosX((short) 0); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) 0); // 目标库位列 |
| | |
| | | News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo()); |
| | | crnThread.setResetFlag(true); |
| | | } |
| | | } else if (crnProtocol.getTaskNo() == 9996) {//盘点入库衔接 |
| | | // 状态:等待确认 并且 任务完成位 = 1 |
| | | if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { |
| | | News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo()); |
| | | |
| | | // 获取入库待确认工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); |
| | | // 入库 + 库位转移 ==> 4.入库完成 |
| | | if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) { |
| | | wrkMast.setWrkSts(4L); |
| | | } else { |
| | | continue; |
| | | } |
| | | Date now = new Date(); |
| | | wrkMast.setCrnEndTime(now); |
| | | wrkMast.setModiTime(now); |
| | | // 修改成功后复位堆垛机 |
| | | if (wrkMastMapper.updateById(wrkMast) > 0) { |
| | | // 堆垛机复位 |
| | | log.error(wrkMast.getWrkNo() + "任务修改状态4成功,复位堆垛机={}", crnThread.getCrnProtocol().getCrnNo()); |
| | | News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo()); |
| | | crnThread.setResetFlag(true); |
| | | } |
| | | } |
| | | }else{ |
| | | } |
| | | // else if (crnProtocol.getTaskNo() == 9996) {//盘点入库衔接 |
| | | // // 状态:等待确认 并且 任务完成位 = 1 |
| | | // if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { |
| | | // News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo()); |
| | | // |
| | | // // 获取入库待确认工作档 |
| | | // WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); |
| | | // // 入库 + 库位转移 ==> 4.入库完成 |
| | | // if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) { |
| | | // wrkMast.setWrkSts(4L); |
| | | // } else { |
| | | // continue; |
| | | // } |
| | | // Date now = new Date(); |
| | | // wrkMast.setCrnEndTime(now); |
| | | // wrkMast.setModiTime(now); |
| | | // // 修改成功后复位堆垛机 |
| | | // if (wrkMastMapper.updateById(wrkMast) > 0) { |
| | | // // 堆垛机复位 |
| | | // log.error(wrkMast.getWrkNo() + "任务修改状态4成功,复位堆垛机={}", crnThread.getCrnProtocol().getCrnNo()); |
| | | // News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo()); |
| | | // crnThread.setResetFlag(true); |
| | | // } |
| | | // } |
| | | // } |
| | | else{ |
| | | // 状态:等待确认 并且 任务完成位 = 1 |
| | | if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { |
| | | News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo()); |
| | |
| | | } |
| | | // 获取工作档数据 |
| | | WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); |
| | | if (null == wrkMast) { continue; } |
| | | if (null == wrkMast) { |
| | | if(staProtocol.getWorkNo() > 9999){ //异常退出 |
| | | MessageQueue.offer(SlaveType.Led, 2, new Task(3, "异常退出")); |
| | | } |
| | | continue; |
| | | } |
| | | wrkMasts.add(wrkMast); |
| | | // 组装命令 |
| | | LedCommand ledCommand = new LedCommand(); |
| | |
| | | total = locDetl.getAnfme(); |
| | | } |
| | | if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | } |
| | | if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | } |
| | | if (wrkMast.getIoType() == 107) { |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | } |
| | | }); |
| | | } |
| | |
| | | continue; |
| | | } |
| | | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | Integer workNo = 0; |
| | | if(rgvProtocol.getTaskNo2() > 9999|| rgvProtocol.getTaskNo1() > 9999){ |
| | | workNo = rgvProtocol.getTaskNo1() !=0 ? rgvProtocol.getTaskNo1() : rgvProtocol.getTaskNo2(); |
| | |
| | | continue; |
| | | } |
| | | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | Integer workNo = 0; |
| | | if(basRgv.getPakToCrn().equals("1")){ |
| | | workNo = rgvProtocol.getTaskNo1() !=0 ? rgvProtocol.getTaskNo1():rgvProtocol.getTaskNo2(); //正常情况出库放货优先工位1放 |
| | |
| | | case 1: route = RouteUtils.getRouteOne();break; |
| | | case 2: route = RouteUtils.getRouteTwo();break; |
| | | } |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | basRgvMapService.updateById(basRgvMap); |
| | | WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 |
| | | if( null == wrkMastSta ) { |
| | |
| | | case 1: route = RouteUtils.getRouteOne();break; |
| | | case 2: route = RouteUtils.getRouteTwo();break; |
| | | } |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | basRgvMapService.updateById(basRgvMap); |
| | | WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 |
| | | if( null == wrkMastSta ) { |
| | |
| | | case 1: route = RouteUtils.getRouteOne();break; |
| | | case 2: route = RouteUtils.getRouteTwo();break; |
| | | } |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | basRgvMapService.updateById(basRgvMap); |
| | | WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 |
| | | if( null == wrkMastSta ) { |
| | |
| | | response, bool); |
| | | } |
| | | |
| | | /* |
| | | * agv任务生成 Full |
| | | * */ |
| | | public synchronized void agvTaskCreateFull() { |
| | | // 根据输送线plc遍历 |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历出库口 |
| | | for (DevpSlave.Sta outStaAgv : devp.getOutStaAgvFull()) { |
| | | // 获取入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(outStaAgv.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | if (staProtocol.isAutoing() ) { |
| | | WrkMast wrkMast = wrkMastService.selectByWrkNo(staProtocol.getWorkNo()); |
| | | if (Cools.isEmpty(wrkMast) || Cools.isEmpty(wrkMast.getTakeNone()) || !wrkMast.getTakeNone().equals("1")){ |
| | | continue; |
| | | } |
| | | |
| | | // 判断重复工作档 |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("task_no", staProtocol.getWorkNo())); |
| | | if (!basAgvMastList.isEmpty()) { |
| | | wrkMast.setTakeNone("2"); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | continue; |
| | | } |
| | | |
| | | // 任务生成区 -------------------------------------------------------------------------- |
| | | |
| | | BasAgvMast basAgvMast = new BasAgvMast(); |
| | | |
| | | |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setBarcode(wrkMast.getBarcode()); |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(outStaAgv.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/agv/loc/v1") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | |
| | | basAgvMast.setTaskNo(wrkMast.getWrkNo()); |
| | | basAgvMast.setSourceStaNo(outStaAgv.getStaNo()); |
| | | basAgvMast.setLocNo(dto.getLocNo()); |
| | | basAgvMast.setSourceLocNo(wrkMast.getSourceLocNo()); |
| | | basAgvMast.setDevpId(devp.getId()); |
| | | basAgvMast.setIoType(2); |
| | | |
| | | basAgvMastService.insert(basAgvMast); |
| | | |
| | | |
| | | wrkMast.setTakeNone("2"); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | } else { |
| | | News.error(JSON.toJSONString(staProtocol)); |
| | | } |
| | | } catch (Exception e) { |
| | | News.error(JSON.toJSONString(e.getMessage())); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * agv任务生成 Empty |
| | | * */ |
| | | public synchronized void agvTaskCreateEmpty() { |
| | | // 根据输送线plc遍历 |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历出库口 |
| | | for (DevpSlave.Sta outStaAgv : devp.getOutStaAgvEmpty()) { |
| | | // 获取入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(outStaAgv.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | |
| | | String barcode = staProtocol.getBarcode(); |
| | | if(!Cools.isEmpty(barcode)) { |
| | | if("NG".endsWith(barcode) || "NoRead".equals(barcode)) { |
| | | News.info("{}号站点扫描器检测条码信息:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | } else { |
| | | News.info("{}号站点扫描器检测条码信息:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | if (staProtocol.isAutoing()) { |
| | | |
| | | // 判断重复工作档 |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("source_sta_no", outStaAgv.getStaNo())); |
| | | if (!basAgvMastList.isEmpty()) { |
| | | News.info("{}号站点存在任务执行中,请等待任务执行完毕:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | |
| | | List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().eq("barcode", barcode)); |
| | | if (!locMastList.isEmpty()) { |
| | | News.info("{}号站点条码信息重复:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | // 任务生成区 -------------------------------------------------------------------------- |
| | | |
| | | BasAgvMast basAgvMast = new BasAgvMast(); |
| | | |
| | | |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setBarcode(barcode); |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(outStaAgv.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/agv/loc/v1") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | |
| | | basAgvMast.setTaskNo(outStaAgv.getStaNo()); |
| | | basAgvMast.setSourceStaNo(outStaAgv.getStaNo()); |
| | | basAgvMast.setLocNo(dto.getLocNo()); |
| | | basAgvMast.setDevpId(devp.getId()); |
| | | basAgvMast.setIoType(2); |
| | | |
| | | basAgvMastService.insert(basAgvMast); |
| | | } else { |
| | | News.error(JSON.toJSONString(staProtocol)); |
| | | } |
| | | } catch (Exception e) { |
| | | News.error(JSON.toJSONString(e.getMessage())); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * agv任务生成 Empty |
| | | * */ |
| | | public synchronized void agvTaskCreateR() { |
| | | // 根据输送线plc遍历 |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历出库口 |
| | | for (DevpSlave.Sta inStaAgv : devp.getInStaAgv()) { |
| | | // 获取入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(inStaAgv.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | | if (staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | |
| | | if (staProtocol.isAutoing()) { |
| | | |
| | | // 判断重复工作档 |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("sta_no", inStaAgv.getStaNo())); |
| | | if (!basAgvMastList.isEmpty()) { |
| | | News.info("{}号站点存在任务执行中,等待任务执行完毕!!!", inStaAgv.getStaNo()); |
| | | continue; |
| | | } |
| | | // 任务生成区 -------------------------------------------------------------------------- |
| | | |
| | | BasAgvMast basAgvMast = new BasAgvMast(); |
| | | try { |
| | | List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "R") |
| | | .ge("row1", 23) |
| | | .le("row1", 32) |
| | | .orderBy("io_time",true) |
| | | ); |
| | | |
| | | for (LocMast locMast : locMastList){ |
| | | basAgvMast.setTaskNo(inStaAgv.getStaNo()); |
| | | basAgvMast.setSourceLocNo(locMast.getLocNo()); |
| | | basAgvMast.setStaNo(inStaAgv.getStaNo()); |
| | | basAgvMast.setDevpId(devp.getId()); |
| | | basAgvMast.setIoType(0);//AGV库位==》输送线站点 0 |
| | | basAgvMastService.insert(basAgvMast); |
| | | break; |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | News.error(JSON.toJSONString(e.getMessage())); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /* |
| | | * agv任务下发:AGV库位==》输送线站点 |
| | |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | if (!Cools.isEmpty(staProtocol.getWorkNo()) && staProtocol.getWorkNo().equals(basAgvMast.getTaskNo())){ |
| | | if ((!Cools.isEmpty(staProtocol.getWorkNo()) && staProtocol.getWorkNo().equals(basAgvMast.getTaskNo())) |
| | | || |
| | | (basAgvMast.getSourceStaNo().equals(2033))){ |
| | | |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(basAgvMast); |
| | | |