cl
2024-07-11 13a2a47e159db5e17d1c551805436d9ae30480ef
jcdm-main/src/main/java/com/jcdm/main/plcserver/sub/OPCUaSubscription.java
@@ -90,139 +90,145 @@
                String device = nodes[1];//设备
                String tab = nodes[2];//标记
                String valueString = value.toString();//地址值
                if (Constants.RECORD_CHECK_CODE.equals(tab)){//电芯校验
                    if (Constants.ONE.equals(valueString)){
                        Integer scanResult = 11;
                        if (Constants.OP010.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);
                                //仅校验长度是否合格
                CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
                    subHandle(thoroughfare,device,tab,valueString);
                });
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }
    public void subHandle(String thoroughfare,String device,String tab,String valueString){
        try{
            if (Constants.RECORD_CHECK_CODE.equals(tab)){//电芯校验
                if (Constants.ONE.equals(valueString)){
                    Integer scanResult = 11;
                    if (Constants.OP010.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 if(Constants.OP030.equals(device)){
                            Object value1 = miloService.readFromOpcUa(thoroughfare + "." + device + ".Scaner").getValue();
                            if (ObjectUtil.isNotNull(value1)){
                                String cellCode = value1.toString();
                                //反馈电芯ocv检测结果
                                boolean b = OCVResultFeedBack(thoroughfare, device,cellCode);
                                //四个电芯的状态
                                if (b){
                                    scanResult = 11;
                                }else {
                                    scanResult = 12;
                                }
                        }
                    }else if(Constants.OP030.equals(device)){
                        Object value1 = miloService.readFromOpcUa(thoroughfare + "." + device + ".Scaner").getValue();
                        if (ObjectUtil.isNotNull(value1)){
                            String cellCode = value1.toString();
                            //反馈电芯ocv检测结果
                            boolean b = OCVResultFeedBack(thoroughfare, device,cellCode);
                            //四个电芯的状态
                            if (b){
                                scanResult = 11;
                            }else {
                                scanResult = 12;
                            }
                        }
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ScanerResult1").value(scanResult).build());
                        log.info("写入到工位{}的ScanerResult1数据:{}",device,scanResult);
                    }
                }else if (Constants.RECORD_SN.equals(tab)){//求下发模组码请9
                    if (Constants.ONE.equals(valueString)){
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordSNDone").value(1).build());//没有要生产的工单
                    }
                }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 if(Constants.OP100_1.equals(device) || Constants.OP100_2.equals(device)){
                            //1、进站PLC给产品类型,MES读取产品类型
                            ReadWriteEntity productTypeRead = miloService.readFromOpcUa(thoroughfare + "." + device + ".MES_ProductType");//产品类型
                            if (ObjectUtil.isNotNull(productTypeRead.getValue())){
                                String productType = productTypeRead.getValue().toString();
                                CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
                                    //调用工厂MES,保存到数据库,并且将工单传给PLC (目前临时用该方法)
                                    receivingWorkOrders(thoroughfare, device);
                                });
                                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());
                            }
                        }else {
                            scanResult = 12;
                        }
                    }
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ScanerResult1").value(scanResult).build());
                    log.info("写入到工位{}的ScanerResult1数据:{}",device,scanResult);
                }
            }else if (Constants.RECORD_SN.equals(tab)){//求下发模组码请9
                if (Constants.ONE.equals(valueString)){
                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordSNDone").value(1).build());//没有要生产的工单
                }
            }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 if (Constants.TWO.equals(valueString)){//出站
                        //分段010-065段
                        if (Constants.OP010.equals(device)){
                            //010工位无过站记录,只给放行信号
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(21).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,21);
                        }else if (Constants.OP020_OP065.contains(device)){
                            Integer result = 21;
                            //读取电芯码
                            List<String> cellCodeList = readCellCodeList(thoroughfare, device);
                            if(ObjectUtil.isNull(cellCodeList) || cellCodeList.size() != 4){
                                result = 23;
                            }else{
                                result = savePassingStation(thoroughfare, device,cellCodeList);//保存过站
                                if(result == 21) {
                                    result = saveParamCollection(thoroughfare, device,cellCodeList);//保存参数,发送工厂MES
                                }
                            }
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,result);
                        } else if (Constants.OP100_1.equals(device) || Constants.OP100_2.equals(device)){
                    } else if(Constants.OP100_1.equals(device) || Constants.OP100_2.equals(device)){
                        //1、进站PLC给产品类型,MES读取产品类型
                        Object productTypeObjcet = miloService.readFromOpcUa(thoroughfare + "." + device + ".ProductType").getValue();//产品类型
                        if (ObjectUtil.isNotNull(productTypeObjcet)){
                            String productType = productTypeObjcet.toString();//产品类型
                            String materialCode = Constants.materialMap.get(productType);
                            CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
                                //调用工厂MES,保存到数据库,并且将工单传给PLC (目前临时用该方法)
                                receivingWorkOrders(thoroughfare, device,materialCode);
                            });
                            WebSocketUsers.sendMessageToUserByText(map.get(device), "END");
                        } else {
                            Integer result = 21;
                            Object modulCodeObjcet = miloService.readFromOpcUa(thoroughfare + "." + device + ".ModuleCode").getValue();
                            if (ObjectUtil.isNull(modulCodeObjcet) && modulCodeObjcet.toString().trim().isEmpty()){
                                result = 23;
                            }else{
                                String moduleCode = modulCodeObjcet.toString();
                                result = savePassingStation(thoroughfare, device,moduleCode);//保存过站
                                if(result == 21) {
                                    result = saveParamCollection(thoroughfare, device,moduleCode);//保存参数,发送工厂MES
                                }
                            }
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build());
                            log.info("写入到工位{}的RecordDataDone数据:{}",device,result);
                            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());
                        }
                    }else if (Constants.ModuleList.contains(device)){//有模组码的工位
                        Object modulCodeObjcet = miloService.readFromOpcUa(thoroughfare + "." + device + ".ModuleCode").getValue();
                        if (ObjectUtil.isNull(modulCodeObjcet)){
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(12).build());
                        }else{
                            miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(11).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());
                    else {
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(11).build());
                        log.info("写入到工位{}的RecordDataDone数据:{}",device,11);
                    }
                }*/
                }else if (Constants.TWO.equals(valueString)){//出站
                    //分段010-065段
                    if (Constants.OP010.equals(device)){
                        //010工位无过站记录,只给放行信号
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(21).build());
                        log.info("写入到工位{}的RecordDataDone数据:{}",device,21);
                    }else if (Constants.OP020_OP090.contains(device)){
                        Integer result = 21;
                        //读取电芯码
                        List<String> cellCodeList = readCellCodeList(thoroughfare, device);
                        if(ObjectUtil.isNull(cellCodeList) || cellCodeList.size() != 4){
                            result = 23;
                        }else{
                            result = savePassingStation(thoroughfare, device,cellCodeList);//保存过站
                            if(result == 21) {
                                result = saveParamCollection(thoroughfare, device,cellCodeList);//保存参数,发送工厂MES
                            }
                        }
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build());
                        log.info("写入到工位{}的RecordDataDone数据:{}",device,result);
                    } else if (Constants.OP100_OP150.contains(device)){//人工工位
                        WebSocketUsers.sendMessageToUserByText(map.get(device), "END");
                    } else {
                        Integer result = 21;
                        //Object productTypeObjcet = miloService.readFromOpcUa(thoroughfare + "." + device + ".ProductType").getValue();//产品类型
                        Object modulCodeObjcet = miloService.readFromOpcUa(thoroughfare + "." + device + ".ModuleCode").getValue();
                        if (ObjectUtil.isNull(modulCodeObjcet)){
                            result = 23;
                        }else{
                            String moduleCode = modulCodeObjcet.toString();
                            result = savePassingStation(thoroughfare, device,moduleCode);//保存过站
                            if(result == 21) {
                                result = saveParamCollection(thoroughfare, device,moduleCode);//保存参数,发送工厂MES
                            }
                        }
                        miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build());
                        log.info("写入到工位{}的RecordDataDone数据:{}",device,result);
                    }
                }
            }
        } catch (Exception e) {
        }catch (Exception e) {
            log.error(e.getMessage());
            System.out.println(e.getMessage());
            log.info(e.getMessage());
        }
    }
    public void receivingWorkOrders(String thoroughfare ,String device)
    {
/*    public void receivingWorkOrders(String thoroughfare ,String device) {
        String paramProductNum = "";
        try {
@@ -232,9 +238,10 @@
            if (CollUtil.isNotEmpty(orderList)){
                Long id = orderList.get(0).getId();
                String productNum = orderList.get(0).getProductNum();//模组码
                String orderNum = orderList.get(0).getWorkOrderNo();
                //下发产品模组码
                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".MES_ModuleCode").value(productNum).build());
                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".MES_WorkOrderNumber").value(productNum).build());
                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".ModuleCode").value(productNum).build());
                miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".WorkOrderNumber").value(orderNum).build());
                //miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordSNDone").value(1).build());
                //更新工单状态为执行中
@@ -246,21 +253,21 @@
                //将产品SN发送到前台
                productNum = "productNum,"+ productNum;
                WebSocketUsers.sendMessageToUserByText(map.get(device), productNum);
            }/*else{
            }*//*else{
                miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordSNDone").value(2).build());//没有要生产的工单
            }*/
            }*//*
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    }*/
   /* public void receivingWorkOrders(String thoroughfare ,String device)
    public void receivingWorkOrders(String thoroughfare ,String device ,String materialCode)
    {
        String paramProductNum = "";
        try {
            // 查询最新的工单信息
            OmProductionOrdeInfo lastOrder = omProductionOrdeInfoService.getLastOrder();
            String orderJsonString = RestfulService.getProductionWorkOrderRequest(lastOrder.getProductNum(), "M1OP100");
            String orderJsonString = RestfulService.getProductionWorkOrderRequest(lastOrder.getProductNum(), "M1OP100",materialCode);
            JSONObject jsonObject = new JSONObject(orderJsonString);
            // 从JSONObject中获取data对象
            JSONObject dataObject = jsonObject.getJSONObject("data");
@@ -273,6 +280,7 @@
                omProductionOrdeInfo.setProductNum(dataObject.getStr("productNum"));
                omProductionOrdeInfo.setStationCode(dataObject.getStr("stationCode"));
                omProductionOrdeInfo.setMaterialCode(dataObject.getStr("materialCode"));
                omProductionOrdeInfo.setPlanQty(Long.valueOf(dataObject.getStr("plannedQuantity")));
                omProductionOrdeInfo.setOnlineCompletionMark("0");
                omProductionOrdeInfo.setSfResult("0");
                omProductionOrdeInfo.setProductCode(dataObject.getStr("model"));
@@ -291,7 +299,7 @@
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }*/
    }
    /**
     * 读取电芯码
@@ -476,6 +484,9 @@
                    String paramValue = "";
                    if (ObjectUtil.isNotNull(readWriteEntityList.get(i).getValue())){
                        paramValue = readWriteEntityList.get(i).getValue().toString();//参数值
                        if("DATE".equals(list.get(i).getCollectParameterType()) && !paramValue.isEmpty()){
                            paramValue = format.parse(TimeUtil.test(TimeUtil.stringProcessing(paramValue))).toString();
                        }
                    }
                    daParamCollection.setParamValue(paramValue);//参数值
                    daParamCollection.setLocationCode(device);//工位
@@ -489,7 +500,7 @@
                    childVO.setItemValue(paramValue);//参数值
                    childVO.setItemText(list.get(i).getCollectParameterName());
                    childVO.setCheckResult("1");
                    childVO.setCheckTime(new Date().toString());
                    childVO.setCheckTime(format.format(new Date()));
                    mesList.add(childVO);
                }
@@ -506,9 +517,9 @@
                    parentVO.setProductNum(moduleCode);
                    parentVO.setCheckList(mesList);
                    log.info("执行工厂MES方法start,传入数据:{}",parentVO);
                    log.info("执行工厂MES方法start,工位号{} 传入数据:{}",device ,parentVO);
                    HttpResponse execute = HttpRequest.post(Constants.FACTORY_EMS_UAT_RUL+"deviceResultFeedback").body(JSONUtil.toJsonStr(parentVO)).execute();
                    log.info("执行工厂MES方法end,返回数据:{}",execute.body());
                    log.info("执行工厂MES方法end,工位号{} 返回数据:{}",device,execute.body());
                });
            }
@@ -585,12 +596,12 @@
                        //发送给工厂mes参数封装
                        ChildVO childVO = new ChildVO();
                        childVO.setItemCode(confColl1.get(i).getCollectParameterName());//参数
                        childVO.setItemCode(confColl1.get(i).getCollectParameterId());//参数
                        childVO.setItemType(confColl1.get(i).getItemType());
                        childVO.setItemValue(paramValue);//参数值
                        childVO.setItemText(confColl1.get(i).getParameterSetName());
                        childVO.setItemText(confColl1.get(i).getCollectParameterName());
                        childVO.setCheckResult("1");
                        childVO.setCheckTime(new Date().toString());
                        childVO.setCheckTime(format.format(new Date()));
                        mesChildList1.add(childVO);
                    }
@@ -613,12 +624,12 @@
                        //发送给工厂mes参数封装
                        ChildVO childVO = new ChildVO();
                        childVO.setItemCode(confColl2.get(i).getCollectParameterName());//参数
                        childVO.setItemCode(confColl2.get(i).getCollectParameterId());//参数
                        childVO.setItemType(confColl2.get(i).getItemType());
                        childVO.setItemValue(paramValue);//参数值
                        childVO.setItemText(confColl2.get(i).getParameterSetName());
                        childVO.setItemText(confColl2.get(i).getCollectParameterName());
                        childVO.setCheckResult("1");
                        childVO.setCheckTime(new Date().toString());
                        childVO.setCheckTime(format.format(new Date()));
                        mesChildList2.add(childVO);
                    }
                }
@@ -639,12 +650,12 @@
                        //发送给工厂mes参数封装
                        ChildVO childVO = new ChildVO();
                        childVO.setItemCode(confColl3.get(i).getCollectParameterName());//参数
                        childVO.setItemCode(confColl3.get(i).getCollectParameterId());//参数
                        childVO.setItemType(confColl3.get(i).getItemType());
                        childVO.setItemValue(paramValue);//参数值
                        childVO.setItemText(confColl3.get(i).getParameterSetName());
                        childVO.setItemText(confColl3.get(i).getCollectParameterName());
                        childVO.setCheckResult("1");
                        childVO.setCheckTime(new Date().toString());
                        childVO.setCheckTime(format.format(new Date()));
                        mesChildList3.add(childVO);
                    }
                }
@@ -665,12 +676,12 @@
                        //发送给工厂mes参数封装
                        ChildVO childVO = new ChildVO();
                        childVO.setItemCode(confColl4.get(i).getCollectParameterName());//参数
                        childVO.setItemCode(confColl4.get(i).getCollectParameterId());//参数
                        childVO.setItemType(confColl4.get(i).getItemType());
                        childVO.setItemValue(paramValue);//参数值
                        childVO.setItemText(confColl4.get(i).getParameterSetName());
                        childVO.setItemText(confColl4.get(i).getCollectParameterName());
                        childVO.setCheckResult("1");
                        childVO.setCheckTime(new Date().toString());
                        childVO.setCheckTime(format.format(new Date()));
                        mesChildList4.add(childVO);
                    }
                }
@@ -687,9 +698,9 @@
                                String paramValue = "";
                                if (ObjectUtil.isNotNull(paramCollectionList0.get(j).getValue())) {
                                    paramValue = paramCollectionList0.get(j).getValue().toString();//参数值
                                }
                                if(confColl0.get(j).getCollectParameterName().contains("时间") && !"".equals(paramValue)){
                                    paramValue = format.parse(TimeUtil.test(TimeUtil.stringProcessing(paramValue))).toString();
                                    if("DATE".equals(confColl0.get(j).getCollectParameterType()) && !paramValue.isEmpty()){
                                        paramValue = TimeUtil.test(TimeUtil.stringProcessing(paramValue));
                                    }
                                }
                                daParamCollection.setParamValue(paramValue);//参数值
                                daParamCollection.setLocationCode(device);//工位
@@ -698,12 +709,12 @@
                                //发送给工厂mes参数封装
                                ChildVO childVO = new ChildVO();
                                childVO.setItemCode(confColl0.get(j).getCollectParameterName());//参数
                                childVO.setItemCode(confColl0.get(j).getCollectParameterId());//参数
                                childVO.setItemType(confColl0.get(j).getItemType());
                                childVO.setItemValue(paramValue);//参数值
                                childVO.setItemText(confColl0.get(j).getParameterSetName());
                                childVO.setItemText(confColl0.get(j).getCollectParameterName());
                                childVO.setCheckResult("1");
                                childVO.setCheckTime(new Date().toString());
                                childVO.setCheckTime(format.format(new Date()));
                                mesChildList0.add(childVO);
                            }
                        }