| | |
| | | import com.zy.core.thread.LedThread; |
| | | import com.zy.core.thread.SiemensDevpThread; |
| | | import com.zy.entity.*; |
| | | import com.zy.entity.param.StockOutParam; |
| | | import com.zy.mapper.*; |
| | | import com.zy.service.*; |
| | | import com.zy.system.entity.Config; |
| | | import com.zy.system.service.ConfigService; |
| | | import com.zy.utils.*; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.transaction.interceptor.TransactionAspectSupport; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private BasRgvMapService basRgvMapService; |
| | | |
| | | @Resource |
| | | private ConfigService configService; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | |
| | | } |
| | | newLocNo = newLocNo + locNo.substring(2); |
| | | // 对应库位有无任务 |
| | | WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo)); |
| | | WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo).eq("wrk_sts",11)); |
| | | if(wrkMast1 == null) { |
| | | if(locNo.startsWith("10") || locNo.startsWith("11")){ // 浅库位 |
| | | |
| | |
| | | // 状态:等待确认 并且 任务完成位 = 1 |
| | | if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { |
| | | News.warnNoLog(""+mark+" - 0"+" - 开始执行对工作档的完成操作"); |
| | | if (crnProtocol.getTaskNo() == 9999) { |
| | | if (crnProtocol.getTaskNo() == 9999) { // 回原点任务号 |
| | | // 堆垛机复位 |
| | | crnThread.setResetFlag(true); |
| | | } else { |
| | |
| | | // News.infoNoLog(""+mark+" - 0"+" - 对工作档的完成操作执行完成"); |
| | | } |
| | | |
| | | /** |
| | | * 堆垛机回原点 |
| | | */ |
| | | public synchronized void originGo() { |
| | | |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | // 获取堆垛机信息 |
| | | 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 |
| | | && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { |
| | | // 判断是不是已在原点 |
| | | if(crnProtocol.getBay() == 0 && crnProtocol.getLevel() == 1) { |
| | | continue; |
| | | } |
| | | // 判断是不是空闲三分钟 |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | Date now = new Date(); |
| | | Date modiTime = basCrnp.getModiTime(); |
| | | long diffInMillis = now.getTime()-modiTime.getTime(); |
| | | if(diffInMillis < 3 * 60 * 1000) { |
| | | continue; |
| | | } |
| | | |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(crn.getId()); // 堆垛机编号 |
| | | crnCommand.setTaskNo((short) 9999); // 工作号 |
| | | crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式: 回原点 |
| | | crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 4 : crn.getId() == 2 ? 6 : crn.getId() == 3 ? 7 : 11)); // 源库位排 |
| | | crnCommand.setSourcePosY((short) 0); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) 1); // 源库位层 |
| | | crnCommand.setDestinationPosX((short) 0); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) 0); // 目标库位列 |
| | | crnCommand.setDestinationPosZ((short) 0); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) { |
| | | News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand)); |
| | | } else { |
| | | log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * 堆垛机异常信息记录 |
| | | */ |
| | |
| | | case 1019:dismantlingMachine = 1020;break; |
| | | case 1034:dismantlingMachine = 1035;break; |
| | | } |
| | | if(staProtocol.getSiteId() == 1034 && staProtocol.isHigh()) { |
| | | continue; |
| | | } |
| | | if (wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 110).eq("sta_no", dismantlingMachine)).size() > 0) { |
| | | // log.warn("{}站点已经存在两个空板出库任务", entry.getKey()); |
| | | continue; |
| | |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | log.info("空托出库请求成功:请求参数{},返回值:{}", map, response); |
| | | } else { |
| | | log.error("空拖出库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response); |
| | | // log.error("空拖出库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("空拖出库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response); |
| | |
| | | log.error("呼叫rgv,任务号不存在:{}",staProtocol.getWorkNo()); |
| | | continue; |
| | | } |
| | | if (staProtocol.getSiteId() == 1090 && wrkMast.getLocNo() == null) { |
| | | if (staProtocol.getSiteId() == 1090 && wrkMast.getStaNo() == 1090) { |
| | | continue; |
| | | } |
| | | if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && wrkMast.getRgvNo() == null) { |
| | | if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && (wrkMast.getRgvNo() == null || wrkMast.getRgvDstaNo() == 1090)) { |
| | | // 有1090的任务跳过rgv分配 |
| | | if(wrkMast.getStaNo() == 1090) { |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().where("sta_no = 1090 or source_sta_no = 1090 ")); |
| | | if (count > 1) { |
| | | continue; |
| | | } |
| | | } |
| | | wrkMast.setRgvNo(0); |
| | | wrkMast.setRgvSstaNo(site); |
| | | wrkMast.setRgvDstaNo(taskStaNoToRgvStaNoMap.get(wrkMast.getStaNo())); |
| | |
| | | |
| | | if(wrkMast.getIoType() == 3 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) { // 到1024出库口,放到输送线后任务完成 |
| | | if(wrkMast.getWrkSts() != 2 ){ |
| | | log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts()); |
| | | log.warn("rgv放货完成3,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts()); |
| | | continue; |
| | | } |
| | | wrkMast.setWrkSts(5L); |
| | | // if(wrkMast.getStaNo() == 1090) { |
| | | // wrkMast.setWrkSts(3L); |
| | | // } |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } else if(wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) { |
| | | if(wrkMast.getWrkSts() != 2 ) { |
| | | log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts()); |
| | | log.warn("rgv放货完成101,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts()); |
| | | continue; |
| | | } |
| | | wrkMast.setWrkSts(15L); |
| | |
| | | wrkMastService.updateById(wrkMast); |
| | | } else if(wrkMast.getIoType() == 110 && (wrkMast.getStaNo() == 1002 || wrkMast.getStaNo() == 1020 ||wrkMast.getStaNo() == 1035)) { |
| | | if(wrkMast.getWrkSts() != 2 ){ |
| | | log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts()); |
| | | log.warn("rgv放货完成110,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts()); |
| | | continue; |
| | | } |
| | | wrkMast.setWrkSts(15L); |
| | |
| | | log.error("异常口入库任务号无任务:{}", staProtocol.getWorkNo()); |
| | | return; |
| | | } else if (wrkMast.getLocNo() != null) { |
| | | log.info("异常口入库库位已分配:{}", wrkMast.getLocNo()); |
| | | // log.info("异常口入库库位已分配:{}", wrkMast.getLocNo()); |
| | | return; |
| | | } else if(wrkMast.getStaNo() != 1090) { |
| | | log.info("异常口入库入库目标站点已分配:{}", wrkMast.getStaNo()); |
| | | // log.info("异常口入库入库目标站点已分配:{}", wrkMast.getStaNo()); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | CanningLineInLocParam param = new CanningLineInLocParam(); |
| | | param.setWrkNo(staProtocol.getWrkNo()); |
| | | param.setWrkNo(staProtocol.getWorkNo()); |
| | | param.setSourceStaNo(1090); |
| | | param.setTbFlag(staProtocol.isInEnable()); // true入成品库,false入空桶库 |
| | | |
| | |
| | | log.info("异常口入库请求wms原始返回:" + response); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | // StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | // staProtocol.setWorkNo(dto.getWorkNo()); |
| | | // staProtocol.setStaNo(dto.getStaNo().shortValue()); |
| | | // devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | // boolean result = MessageQueue.offer(SlaveType.Devp, 2, new Task(2, staProtocol)); |
| | | // if (result) { |
| | | // log.info("异常口入库推送输送线命令成功:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo()); |
| | | // News.info("异常口入库推送输送线命令成功:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo()); |
| | | // } else { |
| | | // log.error("异常口入库推送输送线命令失败:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo()); |
| | | // News.error("异常口入库推送输送线命令失败:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo()); |
| | | // throw new CoolException("异常口入库推送输送线命令失败:" + 1090); |
| | | // } |
| | | log.error("异常口入库请求接口成功常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response); |
| | | } else { |
| | | log.error("异常口入库请求接口异常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response); |
| | | News.error("异常口入库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response); |
| | |
| | | } |
| | | |
| | | // 站点条件判断 |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWrkNo() == 0) { |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() |
| | | && staProtocol.getWorkNo() == 0 && staProtocol.isHigh()) { |
| | | WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 3).eq("source_sta_no", 1034).eq("sta_no", 1024)); |
| | | if (wrkMast1 != null) { |
| | | return; |
| | | } |
| | | |
| | | Date now = new Date(); |
| | | // 保存工作档 |
| | |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setWrkSts(2L); |
| | | wrkMast.setIoType(3); |
| | | wrkMast.setIoPri(15D); |
| | | wrkMast.setSourceStaNo(1034); // 源站 |
| | | wrkMast.setStaNo(1024); // 目标站 |
| | | wrkMast.setAppeTime(now); |
| | |
| | | log.error("子托盘底座母托盘回流命令推送队列失败:" + wrkMast.getWrkNo() + "," + staProtocol.getSiteId()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public synchronized void autoOutEmptyBucket() { |
| | | 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) { // 罐装线有要桶信号 |
| | | boolean flag = true; // 是否需要自动补,true不需要,false需要 |
| | | for(String item: split) { |
| | | if(String.valueOf(wantBucket.getSite()).equals(item)) { |
| | | flag = false; |
| | | break; |
| | | } |
| | | } |
| | | 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) { |
| | | // 判断库里有无空桶组 |
| | | List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType()); |
| | | for (int i = 0; i < locDetlList.size(); i++) { |
| | | LocDetl locDetl = locDetlList.get(i); |
| | | String loc1 = locDetl.getLocNo(); |
| | | String aisle1 = loc1.substring(0, 2); |
| | | String column1 = loc1.substring(2, 5); |
| | | String level1 = loc1.substring(5, 7); |
| | | |
| | | for (int j = i + 1; j < locDetlList.size(); j++) { |
| | | LocDetl locDetl1 = locDetlList.get(j); |
| | | String loc2 = locDetl1.getLocNo(); |
| | | String aisle2 = loc2.substring(0, 2); |
| | | String column2 = loc2.substring(2, 5); |
| | | String level2 = loc2.substring(5, 7); |
| | | |
| | | // 检查是否满足组队条件 |
| | | if (isSameAisleGroup(aisle1, aisle2) && column1.equals(column2) && level1.equals(level2)) { |
| | | // 创建空桶出库任务 |
| | | try { |
| | | 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); |
| | | |
| | | StockOutParam.LocDetl locDetl3 = new StockOutParam.LocDetl(); |
| | | locDetl3.setLocNo(locDetl1.getLocNo()); |
| | | locDetl3.setMatnr(locDetl1.getMatnr()); |
| | | locDetl3.setBatch(locDetl1.getBatch()); |
| | | locDetl3.setBrand(locDetl1.getBrand()); |
| | | locDetl3.setCount(locDetl1.getAnfme()); |
| | | locDetl3.setBoxType1(locDetl1.getBoxType1()); |
| | | locDetl3.setBoxType2(locDetl1.getBoxType2()); |
| | | locDetl3.setBoxType3(locDetl1.getBoxType3()); |
| | | locDetl3.setStandby1(locDetl1.getStandby1()); |
| | | locDetl3.setStandby2(locDetl1.getStandby2()); |
| | | locDetl3.setStandby3(locDetl1.getStandby3()); |
| | | locDetls.add(locDetl3); |
| | | 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)) { |
| | | log.info("自动出空桶成功:{}",wantBucket.getSite()); |
| | | return; |
| | | } else { |
| | | News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 判断两个排是否属于同一组 |
| | | private static boolean isSameAisleGroup(String aisle1, String aisle2) { |
| | | return (aisle1.equals("09") && aisle2.equals("10")) || |
| | | (aisle1.equals("10") && aisle2.equals("09")) || |
| | | (aisle1.equals("11") && aisle2.equals("12")) || |
| | | (aisle1.equals("12") && aisle2.equals("11")); |
| | | } |
| | | |
| | | /** |
| | |
| | | param.setMatnr(staProtocol.getMatnr().trim()); |
| | | param.setBatch(staProtocol.getBatch().trim()); |
| | | param.setManuDate(staProtocol.getManuDate()); |
| | | param.setWeight(staProtocol.getWeight()); |
| | | param.setGrossWeight(staProtocol.getGrossWeight()); |
| | | param.setWeight(Math.round(staProtocol.getWeight() * 100.0) / 100.0); |
| | | param.setGrossWeight(Math.round(staProtocol.getGrossWeight() * 100.0) / 100.0); |
| | | param.setReinspection(staProtocol.isReinspection()); |
| | | param.setSourceStaNo(site + 2); |
| | | param.setTbFlag(staProtocol2.isBarcodeErr()); |
| | | |
| | | param.setCannedVolume(Math.round(staProtocol.getCannedVolume() * 100.0) / 100.0); |
| | | // param.setWrkNo(57); |
| | | // param.setMatnr("101"); |
| | | // param.setBatch("tt1"); |