wujian
2024-05-24 09ef66abe6ffc1325c5d23055ed6f3f4cb88b625
jcdm-main/src/main/java/com/jcdm/main/plcserver/sub/OPCUaSubscription.java
@@ -2,12 +2,10 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jcdm.common.utils.StringUtils;
import com.jcdm.framework.websocket.WebSocketUsers;
import com.jcdm.main.constant.Constants;
import com.jcdm.main.da.collectionParamConf.domain.DaCollectionParamConf;
@@ -15,16 +13,23 @@
import com.jcdm.main.da.paramCollection.domain.DaParamCollection;
import com.jcdm.main.da.paramCollection.service.IDaParamCollectionService;
import com.jcdm.main.da.passingStationCollection.domain.DaPassingStationCollection;
import com.jcdm.main.da.passingStationCollection.query.ProductOrderChild;
import com.jcdm.main.da.passingStationCollection.query.ProductOrderQuery;
import com.jcdm.main.da.passingStationCollection.query.ProductOrderVO;
import com.jcdm.main.da.passingStationCollection.service.IDaPassingStationCollectionService;
import com.jcdm.main.om.productionOrde.domain.OmProductionOrdeInfo;
import com.jcdm.main.om.productionOrde.service.IOmProductionOrdeInfoService;
import com.jcdm.main.plcserver.conf.OPCElement;
import com.jcdm.main.plcserver.util.TimeUtil;
import com.jcdm.main.restful.factoryMes.service.RestfulService;
import com.jcdm.main.work.domain.KeyCodeRelation;
import com.jcdm.main.work.domain.WorkOrder;
import com.jcdm.main.work.service.KeyCodeCheckService;
import com.jcdm.main.work.service.KeyCodeRelationService;
import com.jcdm.main.work.service.WorkOrderService;
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
import com.kangaroohy.milo.service.MiloService;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.Session;
@@ -33,6 +38,7 @@
import java.util.stream.Collectors;
@Slf4j
@Component
public class OPCUaSubscription implements SubscriptionCallback {
@@ -73,17 +79,27 @@
    public static IDaParamCollectionService daParamCollectionService;
    public static IOmProductionOrdeInfoService omProductionOrdeInfoService;
    public static WorkOrderService workOrderService;
    public static KeyCodeCheckService keyCodeCheckService;
    public static KeyCodeRelationService keyCodeRelationService;
    public OPCUaSubscription(MiloService miloService,
                             IDaPassingStationCollectionService daPassingStationCollectionService,
                             IDaCollectionParamConfService collectionParamConfService,
                             IDaParamCollectionService daParamCollectionService,
                             IOmProductionOrdeInfoService omProductionOrdeInfoService) {
                             IOmProductionOrdeInfoService omProductionOrdeInfoService,
                             WorkOrderService workOrderService,
                             KeyCodeCheckService keyCodeCheckService,
                             KeyCodeRelationService keyCodeRelationService) {
        OPCUaSubscription.miloService = miloService;
        this.daPassingStationCollectionService = daPassingStationCollectionService;
        OPCUaSubscription.collectionParamConfService = collectionParamConfService;
        OPCUaSubscription.daParamCollectionService = daParamCollectionService;
        OPCUaSubscription.omProductionOrdeInfoService = omProductionOrdeInfoService;
        OPCUaSubscription.workOrderService = workOrderService;
        OPCUaSubscription.keyCodeCheckService = keyCodeCheckService;
        OPCUaSubscription.keyCodeRelationService = keyCodeRelationService;
    }
@@ -91,124 +107,482 @@
    public void onSubscribe(String identifier, Object value) {
        try {
            if(null != value && Integer.valueOf(value.toString())!= 0) {
            if(null != value && !Constants.ZERO.equals(value.toString())) {
                String[] nodes = identifier.split("[.]");
                String thoroughfare = nodes[0];//通道
                String device = nodes[1];//设备
                String tab = nodes[2];//标记
                String tabVlaue = value.toString();//地址值
                if (("RecordData").equals(tab)) {
                    String recordDataDoneValue = "";
                    if("1".equals(tabVlaue)){
                        //请求工单
//                        if(device.equals("OP230")){
//                            getFactoryOrder("OP230");
//                        }
                        //自动工位
                        if(automaticList.stream().anyMatch(s -> s.equals(device))){
                            //plc给我们一个模组码,拿模组码校验出型号
                            if(moduleCodeList.stream().anyMatch(s -> s.equals(device))) {
                                String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone";
                                //读模组码
                                Object moduleCode = miloService.readFromOpcUa(thoroughfare + "." + device + ".ModuleCode").getValue();
                                if(moduleCode!=null){
                                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(11).build());
                                }else {
                                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(12).build());
                                }
                            }else {
                                if(agvId.stream().anyMatch(s -> s.equals(device))){
                                    Object agvIdObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".AGVID").getValue();
                                    //agvId 小车码是否为空
                                    if(agvIdObject!=null){
                                        String PACKCode = thoroughfare + "." + device + ".MPACKCode";
                                        OmProductionOrdeInfo one = omProductionOrdeInfoService.getOne(new LambdaQueryWrapper<OmProductionOrdeInfo>().eq(OmProductionOrdeInfo::getTrolleyYard, agvIdObject.toString()));
                                        //小车码查找工单是否为空
                                        if(one!=null){
                                            String packId = one.getProductNum();
                                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(PACKCode).value(packId).build());
                                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(11).build());
                                        }else {
                                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(12).build());
                                        }
                                    }else {
                                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(12).build());
                                    }
                                }else {
                                    String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone";
                                    Object packCodeObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".PACKCode").getValue();
                                    if(packCodeObject!=null){
                                        //pack 如果区分型号的话就要处理
                                        //记录数据完成
                                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(11).build());
                                    }else {
                                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(12).build());
                                    }
                                }
                            }
                        }else {
                            //手动工位处理逻辑
                            WebSocketUsers.sendMessageToUserByText(map.get(device), "IN");
                            String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone";
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(11).build());
                        }
                    }else if("2".equals(tabVlaue)){
                        if(automaticList.stream().anyMatch(s -> s.equals(device))){
                            //自动工位
                            //出站保存数据
                            recordDataDoneValue = outSaveDate(thoroughfare,device);
                            //记录数据完成
                            String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone";
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(Integer.valueOf(recordDataDoneValue)).build());
                        }else {
                            //手动工位
                            if(device.contains("OP330")){
                                String str = device.substring(0,5);
                                WebSocketUsers.sendMessageToUserByText(map.get(str), "END");
                            }else {
                                WebSocketUsers.sendMessageToUserByText(map.get(device), "END");
                            }
                            if(testList.stream().anyMatch(s -> s.equals(device))){
                                String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone";
                                miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(21).build());
                String valueString = value.toString();//地址值
                if (Constants.RECORD_CHECK_CODE.equals(tab)){
                    if (Constants.ONE.equals(valueString)){
                        Integer scanResult = 11;
                        if (Constants.OP010.equals(device) || Constants.OP030.equals(device)){
                            //OP010工位电芯条码校验||OP030工位电芯条码校验
                            Object value1 = miloService.readFromOpcUa(thoroughfare + "." + device + ".Scaner").getValue();
                            if (ObjectUtil.isNotNull(value1)){
                                String keyCode = value1.toString();
                                log.info("读取到工位{}的Scaner数据:{}",device,keyCode);
                                //仅校验长度是否合格
//                                List<KeyCodeCheck> collect = keyCodeCheckService.list().stream().filter(x -> x.getKeyCode().contains(keyCode)).collect(Collectors.toList());
//                                if (CollUtil.isNotEmpty(collect)){
//                                    scanResult = 11;
//                                }
                            }
                        }
                    }else {
                        System.out.println("^");
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ScanerResult1").value(scanResult).build());
                        log.info("写入到工位{}的ScanerResult1数据:{}",device,scanResult);
                    }
                }
                //保存拧紧数据
                else if (("AngleResult").equals(tab)) {
                    if("1".equals(tabVlaue)||"2".equals(tabVlaue)){
                        List<String> list = new ArrayList<>();
                        String[] suffixes = {"Torque", "Angle", "TorqueResult", "AngleResult"};
                        for (String suffix : suffixes) {
                            String string = thoroughfare + "." + device + "." + suffix;
                            list.add(string);
                }else if (Constants.RECORD_DATA.equals(tab)){
                    if (Constants.ONE.equals(valueString)){
                        //1:告知MES托盘已到站,请求下发进站状态
                        if (Constants.OP030.equals(device)){
                            //反馈电芯ocv检测结果
                            boolean b = OCVResultFeedBack(thoroughfare, device);
                            if (b){
                                miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(11).build());
                                log.info("写入到工位{}的RecordDataDone数据:{}",device,11);
                            }else {
                                miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(12).build());
                                log.info("写入到工位{}的RecordDataDone数据:{}",device,12);
                            }
                        } else {
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(11).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,11);
                        }
                        List<ReadWriteEntity> list1 = miloService.readFromOpcUa(list);
                        List<Object> collect = list1.stream().map(ReadWriteEntity::getValue).collect(Collectors.toList());
                        String joinedString = String.join(",", collect.toString());
                        WebSocketUsers.sendMessageToUserByText(map.get(device), TightenTheConversionOkNg(joinedString));
                    }else if (Constants.TWO.equals(valueString)){
                        //分段010-065段
                        List<String> PART1 = new ArrayList<>();
                        PART1.add(Constants.OP020);
                        PART1.add(Constants.OP030);
                        PART1.add(Constants.OP040);
                        PART1.add(Constants.OP050);
                        PART1.add(Constants.OP060);
                        PART1.add(Constants.OP065);
                        if (Constants.OP010.equals(device)){
                            //010工位无过站记录,只给放行信号
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(21).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,21);
                        }else if (PART1.contains(device)){
                            //020工位保存过站记录+参数数据
                            List<DaPassingStationCollection> passingList = getDaPassingStationCollections(thoroughfare, device);
                            if (CollUtil.isNotEmpty(passingList)){
                                daPassingStationCollectionService.insertBatch(passingList);
                            }
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(21).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,21);
                        } else if (Constants.OP100_1.equals(device) || Constants.OP100_2.equals(device)){
                            //下发刻码信息-为模组码
                            ProductOrderQuery query = new ProductOrderQuery();
                            query.setSiteCode("3983");
                            query.setStationCode(device);
                            List<WorkOrder> collect = workOrderService.list().stream()
                                    .sorted(Comparator.comparing(WorkOrder::getCreateTime).reversed())
                                    .collect(Collectors.toList());
                            if (CollUtil.isNotEmpty(collect)){
                                query.setProductNum(collect.get(0).getProductNum());
                            }
                            ProductOrderVO vo = daPassingStationCollectionService.queryMessFromLine(query);
                            if (Constants.SUCCESS.equals(vo.getCode())){
                                WorkOrder workOrder = new WorkOrder();
                                ProductOrderChild data = vo.getData();
                                workOrder.setProductNum(data.getProductNum());
                                workOrder.setProductionOrderNum(data.getProductionOrderNum());
                                workOrder.setStationCode(data.getStationCode());
                                workOrder.setMaterialCode(data.getMaterialCode());
                                workOrder.setModel(data.getModel());
                                workOrderService.save(workOrder);
                                //写入模组码、工单号、产品型号到plc
                                log.info("写入模组码、工单号、产品型号到plc");
                                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ModuleCode").value(data.getModel()).build());
                                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderNumber").value(data.getProductionOrderNum()).build());
                                //这里plc录入的产品型号类型是int类型,工厂mes返回数据不是int类型,可能会出现问题
                                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ProductType").value(data.getProductNum()).build());
                                //绑定模组码和电芯码数据
                                List<DaCollectionParamConf> list = collectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                                        .eq(DaCollectionParamConf::getProcessesCode, device)
                                        .eq(DaCollectionParamConf::getRemarks,Constants.ONE));
                                List<String> collect3 = list.stream().filter(x -> Constants.INT_ZERO.equals(x.getKeyNum())).map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
                                List<String> collect1 = list.stream().filter(x -> Constants.INT_ONE.equals(x.getKeyNum())|| Constants.INT_TWO.equals(x.getKeyNum()))
                                        .map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
//                                List<String> collect2 = list.stream().filter(x -> Constants.INT_TWO.equals(x.getKeyNum()))
//                                        .map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
                                List<ReadWriteEntity> paramCollectionList1 = miloService.readFromOpcUa(collect1);
                                List<ReadWriteEntity> paramCollectionList3 = miloService.readFromOpcUa(collect3);
                                if (CollUtil.isNotEmpty(paramCollectionList1)){
                                    List<KeyCodeRelation> relationList = new ArrayList<>();
                                    for (ReadWriteEntity readWriteEntity : paramCollectionList1) {
                                        if (ObjectUtil.isNotNull(readWriteEntity.getValue())){
                                            KeyCodeRelation keyCodeRelation = new KeyCodeRelation();
                                            keyCodeRelation.setModuleCode(data.getModel());
                                            keyCodeRelation.setKeyCode(readWriteEntity.getValue().toString());
                                            keyCodeRelation.setProductionOrderNum(data.getProductionOrderNum());
                                            keyCodeRelation.setProductNum(data.getProductNum());
                                            keyCodeRelation.setCreateTime(new Date());
                                            relationList.add(keyCodeRelation);
                                        }
                                    }
                                    if (CollUtil.isNotEmpty(relationList)){
                                        keyCodeRelationService.insertBatch(relationList);
                                    }
                                }
                                if (CollUtil.isNotEmpty(paramCollectionList3)){
                                    QueryPLCData(device,thoroughfare,collect3);
                                }
                                //保存过站记录
                                DaPassingStationCollection passingStationCollection = new DaPassingStationCollection();
                                passingStationCollection.setModuleCode(data.getModel());
                                passingStationCollection.setLocationCode(device);
                                passingStationCollection.setInboundTime(new Date());
                                String stationStatus = Constants.PASS;
                                ReadWriteEntity stationStatusRead = miloService.readFromOpcUa(thoroughfare + "." + device + ".StationStatus");
                                if (ObjectUtil.isNotNull(stationStatusRead.getValue())){
                                    String string = stationStatusRead.getValue().toString();
                                    log.info("读取工位{}StationStatus:{}",device,string);
                                    if (Constants.TWO.equals(string)){
                                        stationStatus = Constants.UN_PASS;
                                    }
                                }
                                passingStationCollection.setOutRsSign(stationStatus);
                                passingStationCollection.setCreateTime(new Date());
                                daPassingStationCollectionService.save(passingStationCollection);
                            }
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(21).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,21);
                        } else {
                            //2:告知MES工位工作完成,请求记录工位数据
                            //保存参数采集记录
                            saveParamPassingData(device,thoroughfare);
                            //保存过站记录
                            DaPassingStationCollection passingStationCollection = new DaPassingStationCollection();
                            Object value1 = miloService.readFromOpcUa(thoroughfare + "." + device + ".ModuleCode").getValue();
                            String moduleCode = null;
                            if (ObjectUtil.isNotNull(value1)){
                                moduleCode = value1.toString();
                                log.info("读取工位{}的ModuleCode数据:{}",device,moduleCode);
                            }
                            passingStationCollection.setModuleCode(moduleCode);
                            passingStationCollection.setLocationCode(device);
                            passingStationCollection.setInboundTime(new Date());
                            String stationStatus = Constants.PASS;
                            ReadWriteEntity stationStatusRead = miloService.readFromOpcUa(thoroughfare + "." + device + ".StationStatus");
                            if (ObjectUtil.isNotNull(stationStatusRead.getValue())){
                                String string = stationStatusRead.getValue().toString();
                                if (Constants.TWO.equals(string)){
                                    stationStatus = Constants.UN_PASS;
                                }
                            }
                            passingStationCollection.setOutRsSign(stationStatus);
                            passingStationCollection.setCreateTime(new Date());
                            daPassingStationCollectionService.save(passingStationCollection);
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(21).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,21);
                        }
                    }
                } else if (Constants.RECORD_SN.equals(tab)){
                    if (Constants.ONE.equals(valueString)){
                        if (Constants.OP070.equals(device)){
                            //OP070下发产品模组码
                            String string = UUID.randomUUID().toString();
                            miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ModuleCode").value(string).build());
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordSNDone").value(1).build());
                        }
                    }
                } else if (Constants.RECORD_CHECK_CODE_1.equals(tab)) {
                    if (Constants.OP100_1.equals(device)){
                        //钢带条码校验--发送给工厂mes
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ScanerResult11").value(11).build());
                    } else if (Constants.OP100_2.equals(device)) {
                        //PET带条码校验--发送给工厂mes
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ScanerResult12").value(11).build());
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            log.info(e.getMessage());
        }
    }
    /**
     * 保存电芯过站记录
     * @param thoroughfare 通道
     * @param device 工位
     * @return list
     * @throws Exception e
     */
    private static List<DaPassingStationCollection> getDaPassingStationCollections(String thoroughfare, String device) throws Exception {
        List<String> readList = new ArrayList<>();
        readList.add(thoroughfare + "." + device +".CellCode_1");
        readList.add(thoroughfare + "." + device +".CellCode_2");
        readList.add(thoroughfare + "." + device +".CellCode_3");
        readList.add(thoroughfare + "." + device +".CellCode_4");
        List<String> keyCodeList = new ArrayList<>();
        List<ReadWriteEntity> readWriteEntityList = miloService.readFromOpcUa(readList);
        List<DaPassingStationCollection> passingList = new ArrayList<>();
        for (ReadWriteEntity readWriteEntity : readWriteEntityList) {
            DaPassingStationCollection passingStationCollection = new DaPassingStationCollection();
            passingStationCollection.setLocationCode(device);
            passingStationCollection.setInboundTime(new Date());
            if (ObjectUtil.isNotNull(readWriteEntity.getValue())){
                passingStationCollection.setKeyCode(readWriteEntity.getValue().toString());
                keyCodeList.add(readWriteEntity.getValue().toString());
            }
            String stationStatus = Constants.PASS;
            ReadWriteEntity stationStatusRead = miloService.readFromOpcUa(thoroughfare + "." + device + ".StationStatus");
            if (ObjectUtil.isNotNull(stationStatusRead.getValue())){
                String string = stationStatusRead.getValue().toString();
                if (Constants.TWO.equals(string)){
                    stationStatus = Constants.UN_PASS;
                }
            }
            passingStationCollection.setOutRsSign(stationStatus);
            passingStationCollection.setCreateTime(new Date());
            passingList.add(passingStationCollection);
        }
        //参数采集
        //保存参数采集数据
        List<DaCollectionParamConf> list = collectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                .eq(DaCollectionParamConf::getProcessesCode, device)
                .eq(DaCollectionParamConf::getRemarks, Constants.ONE));
        if (CollUtil.isNotEmpty(list)){
            List<DaParamCollection> saveParamList = new ArrayList<>();
            List<String> collect1 = list.stream().filter(x -> Constants.INT_ONE.equals(x.getKeyNum()))
                    .map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
            List<ReadWriteEntity> paramCollectionList1 = miloService.readFromOpcUa(collect1);
            List<String> collect2 = list.stream().filter(x -> Constants.INT_TWO.equals(x.getKeyNum()))
                    .map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
            List<ReadWriteEntity> paramCollectionList2 = miloService.readFromOpcUa(collect2);
            List<String> collect3 = list.stream().filter(x -> Constants.INT_THREE.equals(x.getKeyNum()))
                    .map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
            List<ReadWriteEntity> paramCollectionList3 = miloService.readFromOpcUa(collect3);
            List<String> collect4 = list.stream().filter(x -> Constants.INT_FOUR.equals(x.getKeyNum()))
                    .map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
            List<ReadWriteEntity> paramCollectionList4 = miloService.readFromOpcUa(collect4);
            List<String> collect0 = list.stream().filter(x -> Constants.INT_ZERO.equals(x.getKeyNum()))
                    .map(DaCollectionParamConf::getGatherAddress).collect(Collectors.toList());
            List<ReadWriteEntity> paramCollectionList0 = miloService.readFromOpcUa(collect0);
            if (CollUtil.isNotEmpty(paramCollectionList1)){
                for (int i = 0; i < paramCollectionList1.size(); i++) {
                    DaParamCollection daParamCollection = new DaParamCollection();
                    if (CollUtil.isNotEmpty(keyCodeList) && keyCodeList.size() == 4){
                        daParamCollection.setKeyCode(keyCodeList.get(0));
                    }
                    daParamCollection.setParamCode(paramCollectionList1.get(i).getIdentifier());
                    String paramValue = "";
                    if (ObjectUtil.isNotNull(paramCollectionList1.get(i).getValue())){
                        paramValue = paramCollectionList1.get(i).getValue().toString();
                    }
                    daParamCollection.setParamValue(paramValue);
                    daParamCollection.setLocationCode(device);
                    daParamCollection.setCollectionTime(new Date());
                    saveParamList.add(daParamCollection);
                }
            }
            if (CollUtil.isNotEmpty(paramCollectionList2)){
                for (int i = 0; i < paramCollectionList2.size(); i++) {
                    DaParamCollection daParamCollection = new DaParamCollection();
                    if (CollUtil.isNotEmpty(keyCodeList) && keyCodeList.size() == 4){
                        daParamCollection.setKeyCode(keyCodeList.get(1));
                    }
                    daParamCollection.setParamCode(paramCollectionList2.get(i).getIdentifier());
                    String paramValue = "";
                    if (ObjectUtil.isNotNull(paramCollectionList2.get(i).getValue())){
                        paramValue = paramCollectionList2.get(i).getValue().toString();
                    }
                    daParamCollection.setParamValue(paramValue);
                    daParamCollection.setLocationCode(device);
                    daParamCollection.setCollectionTime(new Date());
                    saveParamList.add(daParamCollection);
                }
            }
            if (CollUtil.isNotEmpty(paramCollectionList3)){
                for (int i = 0; i < paramCollectionList3.size(); i++) {
                    DaParamCollection daParamCollection = new DaParamCollection();
                    if (CollUtil.isNotEmpty(keyCodeList) && keyCodeList.size() == 4){
                        daParamCollection.setKeyCode(keyCodeList.get(2));
                    }
                    daParamCollection.setParamCode(paramCollectionList3.get(i).getIdentifier());
                    String paramValue = "";
                    if (ObjectUtil.isNotNull(paramCollectionList3.get(i).getValue())){
                        paramValue = paramCollectionList3.get(i).getValue().toString();
                    }
                    daParamCollection.setParamValue(paramValue);
                    daParamCollection.setLocationCode(device);
                    daParamCollection.setCollectionTime(new Date());
                    saveParamList.add(daParamCollection);
                }
            }
            if (CollUtil.isNotEmpty(paramCollectionList4)){
                for (int i = 0; i < paramCollectionList4.size(); i++) {
                    DaParamCollection daParamCollection = new DaParamCollection();
                    if (CollUtil.isNotEmpty(keyCodeList) && keyCodeList.size() == 4){
                        daParamCollection.setKeyCode(keyCodeList.get(3));
                    }
                    daParamCollection.setParamCode(paramCollectionList4.get(i).getIdentifier());
                    String paramValue = "";
                    if (ObjectUtil.isNotNull(paramCollectionList4.get(i).getValue())){
                        paramValue = paramCollectionList4.get(i).getValue().toString();
                    }
                    daParamCollection.setParamValue(paramValue);
                    daParamCollection.setLocationCode(device);
                    daParamCollection.setCollectionTime(new Date());
                    saveParamList.add(daParamCollection);
                }
            }
            if (CollUtil.isNotEmpty(paramCollectionList0)){
                for (int i = 0; i < paramCollectionList0.size(); i++) {
                    if (CollUtil.isNotEmpty(keyCodeList) && keyCodeList.size() == 4){
                        for (String s : keyCodeList) {
                            DaParamCollection daParamCollection = new DaParamCollection();
                            daParamCollection.setKeyCode(s);
                            daParamCollection.setParamCode(paramCollectionList0.get(i).getIdentifier());
                            String paramValue = "";
                            if (ObjectUtil.isNotNull(paramCollectionList0.get(i).getValue())){
                                paramValue = paramCollectionList0.get(i).getValue().toString();
                            }
                            daParamCollection.setParamValue(paramValue);
                            daParamCollection.setLocationCode(device);
                            daParamCollection.setCollectionTime(new Date());
                            saveParamList.add(daParamCollection);
                        }
                    }
                }
            }
                daParamCollectionService.insertBatch(saveParamList);
            }
        return passingList;
    }
    /**
     * 030工位返回ocv测试结果
     * @param thoroughfare
     * @param device
     * @throws Exception
     */
    private boolean OCVResultFeedBack(String thoroughfare, String device) throws Exception {
        boolean flag = true;
        Object value1 = miloService.readFromOpcUa(thoroughfare + "." + device + ".CellCode_1").getValue();
        if (ObjectUtil.isNotNull(value1)){
            String string = value1.toString();
            List<DaParamCollection> list = daParamCollectionService.list(new LambdaQueryWrapper<DaParamCollection>()
                    .eq(DaParamCollection::getKeyCode, string));
            if (CollUtil.isNotEmpty(list)){
                DaParamCollection daParamCollection = list.get(0);
                if (Constants.ONE.equals(daParamCollection.getState())){
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_1").value(1).build());
                }else {
                    flag = false;
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_1").value(2).build());
                }
            }
        }
        Object value2 = miloService.readFromOpcUa(thoroughfare + "." + device + ".CellCode_2").getValue();
        if (ObjectUtil.isNotNull(value2)){
            String string = value2.toString();
            List<DaParamCollection> list = daParamCollectionService.list(new LambdaQueryWrapper<DaParamCollection>()
                    .eq(DaParamCollection::getKeyCode, string));
            if (CollUtil.isNotEmpty(list)){
                DaParamCollection paramCollection = list.get(0);
                if (Constants.ONE.equals(paramCollection.getState())){
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_2").value(1).build());
                }else {
                    flag = false;
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_2").value(2).build());
                }
            }
        }
        Object value3 = miloService.readFromOpcUa(thoroughfare + "." + device + ".CellCode_3").getValue();
        if (ObjectUtil.isNotNull(value3)){
            String string = value3.toString();
            List<DaParamCollection> list = daParamCollectionService.list(new LambdaQueryWrapper<DaParamCollection>()
                    .eq(DaParamCollection::getKeyCode, string));
            if (CollUtil.isNotEmpty(list)){
                DaParamCollection paramCollection = list.get(0);
                if (Constants.ONE.equals(paramCollection.getState())){
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_3").value(1).build());
                }else {
                    flag = false;
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_3").value(2).build());
                }
            }
        }
        Object value4 = miloService.readFromOpcUa(thoroughfare + "." + device + ".CellCode_4").getValue();
        if (ObjectUtil.isNotNull(value4)){
            String string = value4.toString();
            List<DaParamCollection> list = daParamCollectionService.list(new LambdaQueryWrapper<DaParamCollection>()
                    .eq(DaParamCollection::getKeyCode, string));
            if (CollUtil.isNotEmpty(list)){
                DaParamCollection paramCollection = list.get(0);
                if (Constants.ONE.equals(paramCollection.getState())){
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_4").value(1).build());
                }else {
                    flag = false;
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".CellStatus_4").value(2).build());
                }
            }
        }
        return flag;
    }
    /**
     * 保存过站数据和参数保存数据
     * @param device 工位号
     * @throws Exception
     */
    private void saveParamPassingData(String device,String thoroughfare) throws Exception {
        //保存参数采集数据
        List<DaCollectionParamConf> list = collectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                .eq(DaCollectionParamConf::getProcessesCode, device)
                .eq(DaCollectionParamConf::getRemarks, Constants.ONE));
        if (CollUtil.isNotEmpty(list)){
            List<String> collect = list.stream().map(DaCollectionParamConf::getGatherAddress)
                    .filter(Objects::nonNull).distinct()
                    .collect(Collectors.toList());
            QueryPLCData(device,thoroughfare,collect);
        }
    }
    /**
     * 批量查询plc站点数据
     * @param device 站点
     * @param collect 点位
     * @throws Exception
     */
    private static void QueryPLCData(String device,String thoroughfare,List<String> collect) throws Exception {
        List<ReadWriteEntity> readWriteEntityList = miloService.readFromOpcUa(collect);
        if (CollUtil.isNotEmpty(readWriteEntityList)){
            List<DaParamCollection> collectionList = new ArrayList<>();
            Object value1 = miloService.readFromOpcUa(thoroughfare + "." + device + ".ModuleCode").getValue();
            String moduleCode = null;
            if (ObjectUtil.isNotNull(value1)){
                moduleCode = value1.toString();
            }
            for (int i = 0; i < readWriteEntityList.size(); i++) {
                DaParamCollection daParamCollection = new DaParamCollection();
                if (StrUtil.isNotBlank(moduleCode)){
                    daParamCollection.setModuleCode(moduleCode);
                }
                daParamCollection.setParamCode(collect.get(i));
                String paramValue = "";
                if (ObjectUtil.isNotNull(readWriteEntityList.get(i).getValue())){
                    paramValue = readWriteEntityList.get(i).getValue().toString();
                }
                daParamCollection.setParamValue(paramValue);
                daParamCollection.setLocationCode(device);
                daParamCollection.setCollectionTime(new Date());
                collectionList.add(daParamCollection);
            }
            daParamCollectionService.insertBatch(collectionList);
        }
    }
    /**
@@ -399,7 +773,8 @@
        map.forEach((key, value) -> {
            List<DaCollectionParamConf> daCollectionParamConfs = collectionParamConfService.list(new LambdaQueryWrapper<DaCollectionParamConf>()
                    .eq(DaCollectionParamConf::getProcessesCode,locationCode)
                    .like(DaCollectionParamConf::getCollectParameterId,key));
                    .like(DaCollectionParamConf::getCollectParameterId,key)
                    .eq(DaCollectionParamConf::getRemarks,Constants.ONE));
            DaParamCollection saveData = new DaParamCollection();
            saveData.setWorkOrderNo(workOrderNo);
            saveData.setProductCode(productCode);