package com.billion.main.plcServer.sub; import com.billion.main.bs.domain.BsBomChildInfo; import com.billion.main.bs.service.IBsBomChildInfoService; import com.billion.main.constant.Constants; import com.billion.main.da.service.IDaParamCollectionService; import com.billion.main.da.service.IDaStationCollectionService; import com.billion.main.om.domain.OmOrderScheduling; import com.billion.main.om.domain.OmProductionOrderInfo; import com.billion.main.om.service.IOmOrderSchedulingService; import com.billion.main.om.service.IOmProductionOrderInfoService; import com.kangaroohy.milo.model.ReadWriteEntity; import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; import com.kangaroohy.milo.service.MiloService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @Slf4j @Component public class OPCUaSubscription implements SubscriptionCallback { public static MiloService miloService; public IDaParamCollectionService daParamCollectionService; public IDaStationCollectionService daStationCollectionService; public IOmProductionOrderInfoService omProductionOrderInfoService; public IOmOrderSchedulingService omOrderSchedulingService; public IBsBomChildInfoService bomChildInfoService; public OPCUaSubscription(MiloService miloService, IDaParamCollectionService daParamCollectionService, IDaStationCollectionService daStationCollectionService, IOmProductionOrderInfoService omProductionOrderInfoService, IOmOrderSchedulingService omOrderSchedulingService, IBsBomChildInfoService bomChildInfoService ) { OPCUaSubscription.miloService = miloService; this.daParamCollectionService = daParamCollectionService; this.daStationCollectionService = daStationCollectionService; this.omProductionOrderInfoService = omProductionOrderInfoService; this.omOrderSchedulingService = omOrderSchedulingService; this.bomChildInfoService = bomChildInfoService; } @Override public void onSubscribe(String identifier, Object value) { log.info("地址:"+identifier+"值:"+value); try { if(null != value ) { String[] nodes = identifier.split("[.]"); String thoroughfare = nodes[0];//通道 String device = nodes[1];//设备 String tab = nodes[2];//标记 String valueString = value.toString();//地址值 CompletableFuture cp1 = CompletableFuture.runAsync(() -> { onSubscribe(thoroughfare,device,tab,valueString); plackWorkOrder(thoroughfare,device,tab,valueString); }); } } catch (Exception e) { log.error(e.getMessage()); } } public void onSubscribe(String thoroughfare,String device,String tab,String valueString) { try { if (Constants.RecordData.equals(tab)){ //工站交互初始化 if (Constants.ZERO.equals(valueString)){ miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("0").build()); //请求进站 } else if (Constants.ONE.equals(valueString)){ //首工站 if(Constants.C005.equals(device)){ miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("11").build()); } //除首工站所有工站 else if(Constants.PLC.contains(device) && Constants.OP310.contains(device)){ //校验SFCCode是否存在 Object SFCCode = miloService.readFromOpcUa(thoroughfare + "." + device + ".SFCCode").getValue(); Object PalletID = miloService.readFromOpcUa(thoroughfare + "." + device + ".PalletID").getValue(); if (SFCCode == null ) { miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("23").build()); } else { OmOrderScheduling omOrderScheduling = new OmOrderScheduling(); omOrderScheduling.setRemarks(PalletID.toString()); List resultList = omOrderSchedulingService.selectOmOrderSchedulingList(omOrderScheduling); log.info("查询结果数量: {}", resultList); BsBomChildInfo bsbomChildInfo= new BsBomChildInfo(); bsbomChildInfo.setLocationCode(device); bsbomChildInfo.setBomCode(resultList.get(0).getWorkOrderNo()); //下发配方 formula(thoroughfare, device, bsbomChildInfo); miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("11").build()); } } // // //出站保存数据 } else if (Constants.TWO.equals(valueString)) { //首功站 if(Constants.C005.equals(device)){ // 判断接单是否成功 OmOrderScheduling omOrderScheduling = new OmOrderScheduling(); List omOrderSchedulinglist = new ArrayList<>(); Object workOrderNumber = miloService.readFromOpcUa(thoroughfare + "." + device + ".WorkOrderNumber").getValue(); Object PalletID = miloService.readFromOpcUa(thoroughfare + "." + device + ".PalletID").getValue(); Object SFCCode = miloService.readFromOpcUa(thoroughfare + "." + device + ".SFCCode").getValue(); //托盘绑定SFCCode和工单 omOrderScheduling.setWorkOrderNo(workOrderNumber.toString()); omOrderScheduling.setRemarks(PalletID.toString()); omOrderScheduling.setSfcCode(SFCCode.toString()); omOrderSchedulinglist.add(omOrderScheduling); omOrderSchedulingService.saveBatch(omOrderSchedulinglist); // 缺少保存数据的方法 miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("21").build()); }else if(Constants.PLC.contains(device) && Constants.OP310.contains(device)){ } } } } catch (Exception e) { log.error(e.getMessage()); } } //首工站下发工单,并生成SN码 private static final String[] MONTH = {"A","B","C","D","E","F","G","H","I","J","K","L"}; public void plackWorkOrder(String thoroughfare, String device, String tab, String valueString) { try { if (Constants.WorkOrderRequest.equals(tab)) { if (Constants.ZERO.equals(valueString)) { miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value("0").build()); } else if (Constants.ONE.equals(valueString)) { // 查询数据库获取符合条件的订单信息 OmProductionOrderInfo getEarliestOrder = omProductionOrderInfoService.getEarliestOrder(); if (getEarliestOrder != null) { //判断当前下发数量 if(getEarliestOrder.getRemarks() >= getEarliestOrder.getPlanQty()){ //更新工单状态 omProductionOrderInfoService.updateOrderStatus5(); //查询新满足的工单 OmProductionOrderInfo getEarliestOrder2 = omProductionOrderInfoService.getEarliestOrder(); if (getEarliestOrder2 != null) { // 将数据写入到地址块中 miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderNumber").value(getEarliestOrder2.getWorkOrderNo()).build()); miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ProductionPlan").value(String.valueOf(getEarliestOrder2.getPlanQty())).build()); miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".EngineType").value(getEarliestOrder2.getEngineType()).build()); //生成sn码 OmProductionOrderInfo serialNumber = omProductionOrderInfoService.getSerialNumber(); String A3 = String.valueOf(LocalDateTime.now().getYear()).substring(2); if(A3.equals(String.valueOf(serialNumber.getRemarks()))){ String A1 = getEarliestOrder2.getEngineType();//获取产品型号 String A2 = "3"; String A4 = MONTH[LocalDateTime.now().getMonthValue() - 1];// 获取当前月份(1-12) String A5 = String.format("%05d", serialNumber.getPlanQty()); String SFCCode = A1 + A2 + A3+ A4 + A5; miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".SFCCode").value(SFCCode).build()); omProductionOrderInfoService.updateSerialNumber(); }else{ OmProductionOrderInfo newNumber = omProductionOrderInfoService.updateYear(); String A1 = getEarliestOrder2.getEngineType();//获取产品型号 String A2 = "3"; String A4 = MONTH[LocalDateTime.now().getMonthValue() - 1];// 获取当前月份(1-12) String A5 = String.format("%05d", newNumber.getPlanQty()); String SFCCode = A1 + A2 + A3+ A4 + A5; miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".SFCCode").value(SFCCode).build()); omProductionOrderInfoService.updateSerialNumber(); } // 更新 WorkOrderRequestDone 地址块 miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value("11").build()); BsBomChildInfo bsbomChildInfo= new BsBomChildInfo(); bsbomChildInfo.setLocationCode(device); bsbomChildInfo.setBomCode(getEarliestOrder2.getWorkOrderNo()); //发下工艺配方 formula(thoroughfare, device, bsbomChildInfo); omProductionOrderInfoService.updateOrderStatus2(); } } else if (getEarliestOrder.getRemarks() < getEarliestOrder.getPlanQty()) { //更新工单状态 miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderNumber").value(getEarliestOrder.getWorkOrderNo()).build()); miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ProductionPlan").value(String.valueOf(getEarliestOrder.getPlanQty())).build()); miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".EngineType").value(getEarliestOrder.getEngineType()).build()); //生成sn码 OmProductionOrderInfo serialNumber = omProductionOrderInfoService.getSerialNumber(); String A3 = String.valueOf(LocalDateTime.now().getYear()).substring(2); if(A3.equals(String.valueOf(serialNumber.getRemarks()))){ String A1 = getEarliestOrder.getEngineType();//获取产品型号 String A2 = "3"; String A4 = MONTH[LocalDateTime.now().getMonthValue() - 1];// 获取当前月份(1-12) String A5 = String.format("%05d", serialNumber.getPlanQty()); String SFCCode = A1 + A2 + A3+ A4 + A5; miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".SFCCode").value(SFCCode).build()); omProductionOrderInfoService.updateSerialNumber(); }else{ OmProductionOrderInfo newNumber = omProductionOrderInfoService.updateYear(); String A1 = getEarliestOrder.getEngineType();//获取产品型号 String A2 = "3"; String A4 = MONTH[LocalDateTime.now().getMonthValue() - 1];// 获取当前月份(1-12) String A5 = String.format("%05d", newNumber.getPlanQty()); String SFCCode = A1 + A2 + A3+ A4 + A5; miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".SFCCode").value(SFCCode).build()); omProductionOrderInfoService.updateSerialNumber(); } // 更新 WorkOrderRequestDone 地址块 miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value("11").build()); BsBomChildInfo bsbomChildInfo= new BsBomChildInfo(); bsbomChildInfo.setLocationCode(device); bsbomChildInfo.setBomCode(getEarliestOrder.getWorkOrderNo()); //发下工艺配方 formula(thoroughfare, device, bsbomChildInfo); omProductionOrderInfoService.updateOrderStatus2(); } } } } } catch (Exception e) { log.error(e.getMessage()); } } //发下工艺配方方法 private void formula(String thoroughfare, String device, BsBomChildInfo bsbomChildInfo) throws Exception { List bomChildList = bomChildInfoService.selectBsBomChildInfoList(bsbomChildInfo); for (int i = 1; i <= bomChildList.size(); i++) { // 生成 MaterialCode 节点 miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".Material1Code"+ i).value(bomChildList.get(i-1).getMaterialCode()).build()); // 生成 MaterialNumber 节点 miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".Material1Number"+ i).value(bomChildList.get(i-1).getCostQty()).build()); } } } //