hdy
3 天以前 51eb318f6df9ebc7d1ff47522e33b2ee7cea1ba8
billion-main/src/main/java/com/billion/main/plcServer/sub/OPCUaSubscription.java
@@ -1,7 +1,6 @@
package com.billion.main.plcServer.sub;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.billion.common.utils.StringUtils;
import com.billion.main.bs.domain.BsBomChildInfo;
import com.billion.main.bs.service.IBsBomChildInfoService;
import com.billion.main.constant.Constants;
@@ -24,7 +23,9 @@
import com.kangaroohy.milo.service.MiloService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import com.billion.main.plcServer.util.TimeUtil;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@@ -33,6 +34,8 @@
@Slf4j
@Component
public class OPCUaSubscription implements SubscriptionCallback {
    public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static MiloService miloService;
    public IDaParamCollectionService daParamCollectionService;
    public IDaStationCollectionService daStationCollectionService;
@@ -89,23 +92,26 @@
            if (Constants.RecordData.equals(tab)){
                //工站交互初始化
                if (Constants.ZERO.equals(valueString)){
                    miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("0").build());
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(0).build());
                //请求进站
                } else if (Constants.ONE.equals(valueString)){
                    //1.1//首工站
                    if(Constants.C005.equals(device) || Constants.OP005.equals(device) || Constants.P010.equals(device)){
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("11").build());
                    if(Constants.ONLINE.contains(device)){
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(11).build());
                    }
                    ///////除首工站所有工站
                    else if(Constants.PLC1.contains(device) && Constants.OP310.contains(device)){
                    //除首工站所有工站
                    else if(Constants.PLC1.contains(device) ||
                            Constants.PLC2.contains(device) ||
                            Constants.PLC3.contains(device) ||
                            Constants.PLC4.contains(device) ||
                            Constants.OFFLINE.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());
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(23).build());
                        } else {
                            OmOrderScheduling omOrderScheduling = new OmOrderScheduling();
                            omOrderScheduling.setRemarks(PalletID.toString());
                            List<OmOrderScheduling> resultList = omOrderSchedulingService.selectOmOrderSchedulingList(omOrderScheduling);
                            log.info("查询结果数量: {}", resultList);
                            BsBomChildInfo bsbomChildInfo= new BsBomChildInfo();
@@ -113,8 +119,7 @@
                            bsbomChildInfo.setBomCode(resultList.get(0).getWorkOrderNo());
                            //下发配方
                            formula(thoroughfare, device, bsbomChildInfo);
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("11").build());
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(11).build());
                        }
                    }
                //出站保存数据
@@ -127,7 +132,7 @@
                        Object workOrderNumber = miloService.readFromOpcUa(thoroughfare + "." + device + ".WorkOrderNumber").getValue();
                        Object nowQty = miloService.readFromOpcUa(thoroughfare + "." + device + ".PalletID").getValue();
                        omOrderScheduling.setWorkOrderNo(workOrderNumber.toString());
                        omOrderScheduling.setNowQty((Long) nowQty);
                        omOrderScheduling.setNowQty(nowQty.toString());
                        omOrderScheduling.setSfcCode(SFCCode.toString());
                        //托盘绑定SFCCode和工单和产线
                        if(Constants.OP005.equals(device)){
@@ -138,7 +143,7 @@
                        }
                        omOrderSchedulingService.insertOmOrderScheduling(omOrderScheduling);
                    }else if(Constants.OFFLINE.contains(device)){
                        if(Constants.C070.equals(device)){
                        if(Constants.C060.equals(device)){
                            omOrderScheduling.setRemarks("Head");
                            omOrderScheduling.setSfcCode(SFCCode.toString());
                            List<OmOrderScheduling> omOrderSchedulingList = omOrderSchedulingService.selectOmOrderSchedulingList(omOrderScheduling);
@@ -148,12 +153,9 @@
                            List<OmProductionOrderInfo> omProductionOrderInfoList = omProductionOrderInfoService.selectOmProductionOrderInfoList(omProductionOrderInfo);
                            Object headQty = omProductionOrderInfoList.get(0).getHeadQty();
                            if (nowQty == headQty){
//                                omProductionOrderInfoList.get(0).setHeadStatus("3");
//                                omProductionOrderInfoService.updateOmProductionOrderInfo(omProductionOrderInfoList.get(0));
                                UpdateWrapper<OmProductionOrderInfo> updateWrapper = new UpdateWrapper<>();
                                updateWrapper.eq("work_order_no", omProductionOrderInfoList.get(0).getWorkOrderNo());
                                updateWrapper.set("body_status", "3");
                                updateWrapper.set("head_status", "3");
                                omProductionOrderInfoService.update(new OmProductionOrderInfo(),updateWrapper);
                            }
                        } else if (Constants.OP310.equals(device)) {
@@ -166,17 +168,17 @@
                            List<OmProductionOrderInfo> omProductionOrderInfoList = omProductionOrderInfoService.selectOmProductionOrderInfoList(omProductionOrderInfo);
                            Object bodyQty = omProductionOrderInfoList.get(0).getBodyQty();
                            if (nowQty == bodyQty){
                                omProductionOrderInfoList.get(0).setBodyStatus("3");
                                omProductionOrderInfoService.updateOmProductionOrderInfo(omProductionOrderInfoList.get(0));
                                UpdateWrapper<OmProductionOrderInfo> updateWrapper = new UpdateWrapper<>();
                                updateWrapper.eq("work_order_no", omProductionOrderInfoList.get(0).getWorkOrderNo());
                                updateWrapper.set("body_status", "3");
                                omProductionOrderInfoService.update(new OmProductionOrderInfo(),updateWrapper);
                            }
                        }
                    } else if (Constants.P010.equals(device)) {
                        Object workOrderNumber = miloService.readFromOpcUa(thoroughfare + "." + device + ".WorkOrderNumber").getValue();
                        Object nowQty = miloService.readFromOpcUa(thoroughfare + "." + device + ".PalletID").getValue();
                        omOrderScheduling.setWorkOrderNo(workOrderNumber.toString());
                        omOrderScheduling.setNowQty((Long) nowQty);
                        omOrderScheduling.setNowQty(nowQty.toString());
                        omOrderScheduling.setSfcCode(SFCCode.toString());
                        omOrderScheduling.setRemarks("Pre");
                        omOrderSchedulingService.insertOmOrderScheduling(omOrderScheduling);
@@ -186,60 +188,63 @@
                        List<OmProductionOrderInfo> omProductionOrderInfoList = omProductionOrderInfoService.selectOmProductionOrderInfoList(omProductionOrderInfo);
                        Object preQty = omProductionOrderInfoList.get(0).getPreQty();
                        if (nowQty == preQty){
                            omProductionOrderInfoList.get(0).setPreStatus("3");
                            omProductionOrderInfoService.updateOmProductionOrderInfo(omProductionOrderInfoList.get(0));
                            UpdateWrapper<OmProductionOrderInfo> updateWrapper = new UpdateWrapper<>();
                            updateWrapper.eq("work_order_no", omProductionOrderInfoList.get(0).getWorkOrderNo());
                            updateWrapper.set("pre_status", "3");
                            omProductionOrderInfoService.update(new OmProductionOrderInfo(),updateWrapper);
                        }
                    }
                    //查询descriptive字段等于1的采集项保存到扫码保存到da_material_collection表里
                    DaCollectionParamConf daCollectionParamConf1 = new DaCollectionParamConf();
                    daCollectionParamConf1.setProcessesCode(device);
                    daCollectionParamConf1.setDescriptive("1");
                    daCollectionParamConf1.setDescriptive("3");
                    List<DaCollectionParamConf> daCollectionParamConfList1 = daCollectionParamConfService.selectDaCollectionParamConfList(daCollectionParamConf1);
                    for (DaCollectionParamConf conf : daCollectionParamConfList1) {
                        String gatherAddress = conf.getGatherAddress();
                        Object valueObj = miloService.readFromOpcUa(gatherAddress).getValue(); // 获取原始值对象‌:ml-citation{ref="4" data="citationList"}
                        if (valueObj == null || StringUtils.isEmpty(valueObj.toString())) {
                            log.warn("采集地址{}返回空值,跳过存储", gatherAddress);
                            continue; // 终止当前循环迭代‌:ml-citation{ref="1,2" data="citationList"}
                        if (valueObj != null ) {
                            DaMaterialCollection materialCollection = new DaMaterialCollection();
                            materialCollection.setSfcCode(SFCCode.toString());
                            materialCollection.setLocationCode(device);
                            materialCollection.setParamName(conf.getParameterSetName());
                            materialCollection.setParamValue((String) miloService.readFromOpcUa(gatherAddress).getValue());
                            materialCollection.setCollectTime(new Date());
                            daMaterialCollectionService.insertDaMaterialCollection(materialCollection);
                        }
                        DaMaterialCollection materialCollection = new DaMaterialCollection();
                        materialCollection.setSfcCode(SFCCode.toString());
                        materialCollection.setLocationCode(device);
                        materialCollection.setParamName(conf.getParameterSetName());
                        materialCollection.setParamValue((String) miloService.readFromOpcUa(gatherAddress).getValue());
                        materialCollection.setCollectTime(new Date());
                        daMaterialCollectionService.insertDaMaterialCollection(materialCollection);
                    }
                    //查询descriptive字段等于2的采集项保存到扫码保存到da_param_collection表里
                    DaCollectionParamConf daCollectionParamConf2 = new DaCollectionParamConf();
                    daCollectionParamConf2.setProcessesCode(device);
                    daCollectionParamConf2.setDescriptive("2");
                    daCollectionParamConf2.setDescriptive("4");
                    List<DaCollectionParamConf> daCollectionParamConfList2 = daCollectionParamConfService.selectDaCollectionParamConfList(daCollectionParamConf2);
                    for (DaCollectionParamConf conf : daCollectionParamConfList2) {
                        String gatherAddress = conf.getGatherAddress();
                        Object valueObj = miloService.readFromOpcUa(gatherAddress).getValue(); // 获取原始值对象‌:ml-citation{ref="4" data="citationList"}
                        if (valueObj == null || StringUtils.isEmpty(valueObj.toString())) {
                            log.warn("采集地址{}返回空值,跳过存储", gatherAddress);
                            continue; // 终止当前循环迭代‌:ml-citation{ref="1,2" data="citationList"}
                        if (valueObj != null ) {
                            DaParamCollection paramCollection = new DaParamCollection();
                            paramCollection.setSfcCode(SFCCode.toString());
                            paramCollection.setLocationCode(device);
                            paramCollection.setParamName(conf.getParameterSetName());
                            paramCollection.setParamValue((String) miloService.readFromOpcUa(gatherAddress).getValue());
                            paramCollection.setCollectionTime(new Date());
                            daParamCollectionService.insertDaParamCollection(paramCollection);
                        }
                        DaParamCollection paramCollection = new DaParamCollection();
                        paramCollection.setSfcCode(SFCCode.toString());
                        paramCollection.setLocationCode(device);
                        paramCollection.setParamName(conf.getParameterSetName());
                        paramCollection.setParamValue((String) miloService.readFromOpcUa(gatherAddress).getValue());
                        paramCollection.setCollectionTime(new Date());
                        daParamCollectionService.insertDaParamCollection(paramCollection);
                    }
                    DaStationCollection daStationCollection = new DaStationCollection();
                    daStationCollection.setLocationCode(device);
                    daStationCollection.setSfcCode(SFCCode.toString());
                    daStationCollection.setInboundTime((Date) miloService.readFromOpcUa(thoroughfare + "." + device + ".StartTime").getValue());
                    daStationCollection.setOutboundTime((Date) miloService.readFromOpcUa(thoroughfare + "." + device + ".StopTime").getValue());
                    Object StationStatus = miloService.readFromOpcUa(thoroughfare + "." + device + ".StationStatus").getValue();
                    Date startTime = new Date();
                    ReadWriteEntity startTimeRead = miloService.readFromOpcUa(thoroughfare + "." + device + ".StartTime");//进站时间
                    startTime = format.parse(TimeUtil.test(TimeUtil.stringProcessing(startTimeRead.getValue().toString())));
                    daStationCollection.setInboundTime( startTime);
                    Date stopTime = new Date();
                    ReadWriteEntity stopTimeRead = miloService.readFromOpcUa(thoroughfare + "." + device + ".StopTime");//进站时间
                    stopTime = format.parse(TimeUtil.test(TimeUtil.stringProcessing(stopTimeRead.getValue().toString())));
                    daStationCollection.setOutboundTime( stopTime);
                    daStationCollection.setStatus(StationStatus.toString());
                    daStationCollectionService.insertDaStationCollection(daStationCollection);
                    miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value("21").build());
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(21).build());
                }
            }
        }
@@ -253,7 +258,7 @@
    try {
        if (Constants.WorkOrderRequest.equals(tab)) {
            if (Constants.ZERO.equals(valueString)) {
                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value("0").build());
                miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value(0).build());
            }else if (Constants.ONE.equals(valueString)){
                if (Constants.OP005.equals(device)){
                    // 查询数据库获取符合条件的订单信息
@@ -262,7 +267,6 @@
                        //判断当前下发数量是否满足计划数量
                            //更新工单状态
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderNumber").value(getBodyOrder.getWorkOrderNo()).build());
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ProductionPlan").value(String.valueOf(getBodyOrder.getPlanQty())).build());
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".EngineType").value(getBodyOrder.getEngineType()).build());
                            //生成sn码
                            SysCount serialNumber = sysCountService.getSerialNumber();
@@ -302,9 +306,12 @@
                            if (Objects.equals(getBodyOrder2.getBodyQty(), getBodyOrder2.getPlanQty())){
                                omProductionOrderInfoService.updateBodyStatus2();
                            }
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".PalletID").value(getBodyOrder2.getBodyQty()).build());
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value("11").build());
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".PalletID").value(getBodyOrder2.getBodyQty()).build());
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value(11).build());
                    }
                    else{
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value(12).build());
                        }
                } else if (Constants.C005.equals(device)) {
                    // 查询数据库获取符合条件的订单信息
                    OmProductionOrderInfo getHeadOrder = omProductionOrderInfoService.getHeadOrder();
@@ -312,7 +319,6 @@
                        //判断当前下发数量是否满足计划数量
                        //更新工单状态
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderNumber").value(getHeadOrder.getWorkOrderNo()).build());
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ProductionPlan").value(String.valueOf(getHeadOrder.getPlanQty())).build());
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".EngineType").value(getHeadOrder.getEngineType()).build());
                        //生成sn码
                        SysCount headNumber = sysCountService.getHeadNumber();
@@ -352,8 +358,11 @@
                        if (Objects.equals(getHeadOrder2.getHeadQty(), getHeadOrder2.getPlanQty())){
                            omProductionOrderInfoService.updateHeadStatus2();
                        }
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".PalletID").value(getHeadOrder2.getHeadQty()).build());
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value("11").build());
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".PalletID").value(getHeadOrder2.getHeadQty()).build());
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value(11).build());
                    }
                    else{
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value(12).build());
                    }
                } else if (Constants.P010.equals(device)) {
                    // 查询数据库获取符合条件的订单信息
@@ -362,7 +371,6 @@
                        //判断当前下发数量是否满足计划数量
                        //更新工单状态
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderNumber").value(getPreOrder.getWorkOrderNo()).build());
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ProductionPlan").value(String.valueOf(getPreOrder.getPlanQty())).build());
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".EngineType").value(getPreOrder.getEngineType()).build());
                        //生成sn码
                        SysCount preNumber = sysCountService.getPreNumber();
@@ -389,7 +397,6 @@
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".MESSFCCode").value(SFCCode).build());
                            sysCountService.updateHeadNumber();
                        }
                        // 更新 WorkOrderRequestDone 地址块
                        BsBomChildInfo bsbomChildInfo= new BsBomChildInfo();
                        bsbomChildInfo.setLocationCode(device);
@@ -402,8 +409,11 @@
                        if (Objects.equals(getPreOrder2.getPreQty(), getPreOrder2.getPlanQty())){
                            omProductionOrderInfoService.updatePreStatus2();
                        }
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".PalletID").value(getPreOrder2.getPreQty()).build());
                        miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value("11").build());
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".PalletID").value(getPreOrder2.getPreQty()).build());
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value(11).build());
                    }
                    else{
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderRequestDone").value(12).build());
                    }
                }
            }
@@ -418,9 +428,9 @@
        List<BsBomChildInfo> bomChildList = bsBomChildInfoService.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());
            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".Material"+ i +"Code").value(bomChildList.get(i-1).getMaterialCode()).build());
            // 生成 MaterialNumber 节点
            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".Material1Number"+ i).value(bomChildList.get(i-1).getCostQty()).build());
            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".Material"+ i +"Number").value(Integer.parseInt(bomChildList.get(i-1).getCostQty())).build());
        }
    }