From f48c38125956578611832f6017b0cb2ffdbe3725 Mon Sep 17 00:00:00 2001
From: 吴健 <14790700720@163.com>
Date: 星期二, 15 四月 2025 09:00:32 +0800
Subject: [PATCH] add

---
 billion-main/src/main/java/com/billion/main/plc/sub/OPCUaSubscription.java |  523 ++++++++++++++++++++++++++-------------------------------
 1 files changed, 237 insertions(+), 286 deletions(-)

diff --git a/billion-main/src/main/java/com/billion/main/plc/sub/OPCUaSubscription.java b/billion-main/src/main/java/com/billion/main/plc/sub/OPCUaSubscription.java
index 5deb902..b777540 100644
--- a/billion-main/src/main/java/com/billion/main/plc/sub/OPCUaSubscription.java
+++ b/billion-main/src/main/java/com/billion/main/plc/sub/OPCUaSubscription.java
@@ -1,286 +1,237 @@
-package com.billion.main.plc.sub;
-
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpRequest;
-import cn.hutool.http.HttpResponse;
-import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.billion.main.api.domain.StationST180;
-import com.billion.main.da.domain.DaParamCollection;
-import com.billion.main.da.service.IDaParamCollectionService;
-import com.billion.main.da.service.IDaStationCollectionService;
-import com.billion.main.plc.constant.Constants;
-import com.billion.main.sc.domain.ScCollectionParamConf;
-import com.billion.main.sc.service.IScCollectionParamConfService;
-import com.kangaroohy.milo.model.ReadWriteEntity;
-import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
-import com.kangaroohy.milo.service.MiloService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-import com.alibaba.fastjson.JSONObject;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-import java.lang.reflect.Field;
-
-
-@Slf4j
-@Component
-public class OPCUaSubscription implements SubscriptionCallback {
-
-    public static MiloService miloService;
-    public static IScCollectionParamConfService collectionParamConfService;
-    public static IDaParamCollectionService paramCollectionService;
-    public static IDaStationCollectionService stationCollectionService;
-
-    public OPCUaSubscription(MiloService miloService, IScCollectionParamConfService collectionParamConfService
-            ,IDaParamCollectionService paramCollectionService,IDaStationCollectionService stationCollectionService) {
-        OPCUaSubscription.miloService = miloService;
-        OPCUaSubscription.collectionParamConfService = collectionParamConfService;
-        OPCUaSubscription.paramCollectionService = paramCollectionService;
-        OPCUaSubscription.stationCollectionService = stationCollectionService;
-    }
-
-    @Override
-    public void onSubscribe(String identifier, Object value) {
-        log.info("鍦板潃锛�"+identifier+"鍊硷細"+value);
-        try {
-            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 valueString = value.toString();//鍦板潃鍊�
-
-                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{
-            //鐩戝惉recordData
-            if(tab.equals(Constants.RECORD_DATA)){
-                //濡傛灉鏄�2鍋氬嚭绔欏鐞�
-                if(valueString.equals(Constants.TWO)){
-                    Integer result = Constants.INTEGER_TWO_ONE;
-                    result = saveParamCollection(device, "snCode", "stationStatus");
-                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build());
-                }
-            }
-        }catch (Exception e) {
-            log.error(e.getMessage());
-        }
-    }
-
-    /**
-     * 淇濆瓨杩囩珯鏁版嵁
-     *
-     * @param device       宸ヤ綅
-     * @param snCode       浜у搧搴忓垪鍙�
-     * @return Integer
-     * @throws Exception e
-     */
-    private static Integer savePassingStation(String device, String snCode,String stationStatus){
-        Integer result = 21;
-        try {
-
-
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        return result;
-    }
-
-    /**
-     * 淇濆瓨鍙傛暟鏁版嵁鍜屽彂閫佸伐鍘侻ES
-     * @param device 宸ヤ綅
-     * @param snCode 浜у搧SN
-     * @param stationStatus 绔欑姸鎬�
-     * @return result
-     * @throws Exception e
-     */
-    private static Integer saveParamCollection(String device, String snCode, String stationStatus) {
-        Integer result = Constants.INTEGER_TWO_ONE;
-        try {
-            // 鏌ヨ鍙傛暟閰嶇疆琛�
-            List<ScCollectionParamConf> list = collectionParamConfService.list(new LambdaQueryWrapper<ScCollectionParamConf>()
-                    .eq(ScCollectionParamConf::getLocationCode, device)
-                    .eq(ScCollectionParamConf::getSubscribe, Constants.ONE)
-                    .orderByDesc(ScCollectionParamConf::getOrderNum)
-            );
-            
-            if (CollUtil.isNotEmpty(list)) {
-                // 鑾峰彇鍙傛暟鍊�
-                List<String> collect = list.stream()
-                        .map(ScCollectionParamConf::getNode)
-                        .collect(Collectors.toList());
-                List<ReadWriteEntity> readWriteEntityList = miloService.readFromOpcUa(collect);
-                
-                // 淇濆瓨閲囬泦鏁版嵁
-                saveCollectionData(device, snCode, list, readWriteEntityList);
-                
-                // 鍒涘缓宸ヤ綅瀵硅薄骞惰祴鍊�
-                Object stationObject = createStationObject(device, list, readWriteEntityList);
-                if (stationObject != null) {
-                    System.out.println("宸ヤ綅" + device + "瀵硅薄鍒涘缓鎴愬姛锛�" + stationObject);
-                    // 杩欓噷鍙互瀵瑰垱寤虹殑瀵硅薄杩涜杩涗竴姝ュ鐞�
-                    handleMesRequest(stationObject, device);
-                }
-            }
-
-        } catch (Exception e) {
-            log.error("淇濆瓨鏁版嵁寮傚父", e);
-            throw new RuntimeException("淇濆瓨鏁版嵁鍙戦�佸伐鍘侻ES寮傚父");
-        }
-        return result;
-    }
-
-    /**
-     * 淇濆瓨閲囬泦鏁版嵁
-     */
-    private static void saveCollectionData(String device, String snCode, 
-            List<ScCollectionParamConf> list, List<ReadWriteEntity> readWriteEntityList) {
-        ArrayList<DaParamCollection> collectionList = new ArrayList<>();
-        for (int i = 0; i < readWriteEntityList.size(); i++) {
-            DaParamCollection daParamCollection = new DaParamCollection();
-            daParamCollection.setSfcCode(snCode);
-            daParamCollection.setLocationCode(device);
-            daParamCollection.setParamCode(list.get(i).getParamCode());
-            daParamCollection.setParamName(list.get(i).getParamName());
-            daParamCollection.setParamValue(readWriteEntityList.get(i).getValue().toString());
-            daParamCollection.setCollectTime(new Date());
-            collectionList.add(daParamCollection);
-        }
-        paramCollectionService.insertBatch(collectionList);
-    }
-
-    /**
-     * 鍒涘缓宸ヤ綅瀵硅薄骞惰祴鍊�
-     */
-    private static Object createStationObject(String device, 
-            List<ScCollectionParamConf> list, List<ReadWriteEntity> readWriteEntityList) {
-        try {
-            // 鏋勫缓瀹屾暣鐨勭被鍚�
-            String className = "com.billion.main.api.domain.Station" + device;
-            Class<?> stationClass = Class.forName(className);
-            Object stationObject = stationClass.newInstance();
-
-            // 鑾峰彇鎵�鏈夊睘鎬�
-            Field[] fields = stationClass.getDeclaredFields();
-            
-            // 鍒涘缓鍙傛暟鍊糓ap锛屾柟渚挎煡鎵�
-            Map<String, String> paramValueMap = new HashMap<>();
-            for (int i = 0; i < list.size(); i++) {
-                paramValueMap.put(list.get(i).getParamCode(), 
-                    readWriteEntityList.get(i).getValue().toString());
-            }
-
-            // 鎸夐『搴忕粰灞炴�ц祴鍊�
-            for (Field field : fields) {
-                field.setAccessible(true);
-                String paramCode = field.getName(); // 鍋囪灞炴�у悕涓庡弬鏁扮紪鐮佷竴鑷�
-                String value = paramValueMap.get(paramCode);
-                
-                if (value != null) {
-                    // 鏍规嵁瀛楁绫诲瀷杞崲鍊�
-                    Object convertedValue = convertValue(value, field.getType());
-                    field.set(stationObject, convertedValue);
-                }
-            }
-
-            return stationObject;
-        } catch (Exception e) {
-            log.error("鍒涘缓宸ヤ綅瀵硅薄澶辫触锛�" + device, e);
-            return null;
-        }
-    }
-
-    /**
-     * 鏍规嵁瀛楁绫诲瀷杞崲鍊�
-     */
-    private static Object convertValue(String value, Class<?> type) {
-        if (type == String.class) {
-            return value;
-        } else if (type == Integer.class || type == int.class) {
-            return Integer.parseInt(value);
-        } else if (type == Double.class || type == double.class) {
-            return Double.parseDouble(value);
-        } else if (type == Float.class || type == float.class) {
-            return Float.parseFloat(value);
-        } else if (type == Long.class || type == long.class) {
-            return Long.parseLong(value);
-        } else if (type == Boolean.class || type == boolean.class) {
-            return Boolean.parseBoolean(value);
-        } else if (type == Date.class) {
-            try {
-                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-                return sdf.parse(value);
-            } catch (ParseException e) {
-                return null;
-            }
-        }
-        return value;
-    }
-
-    private static void handleMesRequest(Object stationObject, String device) {
-        try {
-            // 鍙戦�丠TTP璇锋眰
-            HttpResponse response = HttpRequest.post(Constants.SY_MES_URL)
-                    .body(JSONUtil.toJsonStr(stationObject))
-                    .timeout(5000) // 璁剧疆瓒呮椂鏃堕棿
-                    .execute();
-
-            // 瑙f瀽鍝嶅簲
-            if (response.isOk()) { // 璇锋眰鎴愬姛
-                JSONObject jsonResponse = JSONUtil.parseObj(response.body());
-                String message = jsonResponse.getStr("message");
-                
-                if (!"ok".equals(message)) {
-                    // 鍝嶅簲涓嶆槸ok锛屼繚瀛樺け璐ヨ褰�
-                    saveMesFailRecord(stationObject, device, "鍝嶅簲寮傚父锛�" + message);
-                }
-            } else {
-                // HTTP璇锋眰澶辫触锛屼繚瀛樺け璐ヨ褰�
-                saveMesFailRecord(stationObject, device, "HTTP鐘舵�佺爜锛�" + response.getStatus());
-            }
-        } catch (Exception e) {
-            // 鍙戠敓寮傚父锛堟瘮濡傝繛鎺ヨ秴鏃躲�佹湇鍔′笉鍙敤绛夛級锛屼繚瀛樺け璐ヨ褰�
-            saveMesFailRecord(stationObject, device, "璇锋眰寮傚父锛�" + e.getMessage());
-        }
-    }
-
-    /**
-     * 淇濆瓨MES鎺ㄩ�佸け璐ヨ褰�
-     */
-    private static void saveMesFailRecord(Object stationObject, String device, String errorMsg) {
-        try {
-            MesFailRecord failRecord = new MesFailRecord();
-            failRecord.setDeviceCode(device);
-            failRecord.setRequestData(JSONUtil.toJsonStr(stationObject));
-            failRecord.setErrorMsg(errorMsg);
-            failRecord.setCreateTime(new Date());
-            failRecord.setStatus(0); // 0:鏈鐞� 1:宸插鐞�
-            failRecord.setRetryCount(0); // 閲嶈瘯娆℃暟
-            
-            // 淇濆瓨鍒版暟鎹簱
-            mesFailRecordService.save(failRecord);
-            
-            log.error("MES鎺ㄩ�佸け璐ワ紝宸蹭繚瀛樺け璐ヨ褰曘�傝澶囷細{}锛岄敊璇細{}", device, errorMsg);
-        } catch (Exception e) {
-            log.error("淇濆瓨MES澶辫触璁板綍鏃跺彂鐢熼敊璇�", e);
-        }
-    }
-
-}
+//package com.billion.main.plc.sub;
+//
+//
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.util.ObjectUtil;
+//import cn.hutool.http.HttpRequest;
+//import cn.hutool.http.HttpResponse;
+//import cn.hutool.json.JSONUtil;
+//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+//import com.billion.main.api.domain.StationST180;
+//import com.billion.main.da.domain.DaParamCollection;
+//import com.billion.main.da.service.IDaParamCollectionService;
+//import com.billion.main.da.service.IDaStationCollectionService;
+//import com.billion.main.plc.constant.Constants;
+//import com.billion.main.sc.domain.ScCollectionParamConf;
+//import com.billion.main.sc.service.IScCollectionParamConfService;
+//import com.kangaroohy.milo.model.ReadWriteEntity;
+//import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
+//import com.kangaroohy.milo.service.MiloService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.stereotype.Component;
+//import com.alibaba.fastjson.JSONObject;
+//
+//import java.text.ParseException;
+//import java.text.SimpleDateFormat;
+//import java.util.*;
+//import java.util.concurrent.CompletableFuture;
+//import java.util.stream.Collectors;
+//import java.lang.reflect.Field;
+//
+//
+//@Slf4j
+//@Component
+//public class OPCUaSubscription implements SubscriptionCallback {
+//
+//    public static MiloService miloService;
+//    public static IScCollectionParamConfService collectionParamConfService;
+//    public static IDaParamCollectionService paramCollectionService;
+//    public static IDaStationCollectionService stationCollectionService;
+//
+//    public OPCUaSubscription(MiloService miloService, IScCollectionParamConfService collectionParamConfService
+//            ,IDaParamCollectionService paramCollectionService,IDaStationCollectionService stationCollectionService) {
+//        OPCUaSubscription.miloService = miloService;
+//        OPCUaSubscription.collectionParamConfService = collectionParamConfService;
+//        OPCUaSubscription.paramCollectionService = paramCollectionService;
+//        OPCUaSubscription.stationCollectionService = stationCollectionService;
+//    }
+//
+//    @Override
+//    public void onSubscribe(String identifier, Object value) {
+//        log.info("鍦板潃锛�"+identifier+"鍊硷細"+value);
+//        try {
+//            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 valueString = value.toString();//鍦板潃鍊�
+//
+//                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{
+//            //鐩戝惉recordData
+//            if(tab.equals(Constants.RECORD_DATA)){
+//                //濡傛灉鏄�2鍋氬嚭绔欏鐞�
+//                if(valueString.equals(Constants.TWO)){
+//                    Integer result = Constants.INTEGER_TWO_ONE;
+//                    result = saveParamCollection(device, "snCode", "stationStatus");
+//                    miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build());
+//                }
+//            }
+//        }catch (Exception e) {
+//            log.error(e.getMessage());
+//        }
+//    }
+//
+//    /**
+//     * 淇濆瓨杩囩珯鏁版嵁
+//     *
+//     * @param device       宸ヤ綅
+//     * @param snCode       浜у搧搴忓垪鍙�
+//     * @return Integer
+//     * @throws Exception e
+//     */
+//    private static Integer savePassingStation(String device, String snCode,String stationStatus){
+//        Integer result = 21;
+//        try {
+//
+//
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+//
+//        return result;
+//    }
+//
+//    /**
+//     * 淇濆瓨鍙傛暟鏁版嵁鍜屽彂閫佸伐鍘侻ES
+//     * @param device 宸ヤ綅
+//     * @param snCode 浜у搧SN
+//     * @param stationStatus 绔欑姸鎬�
+//     * @return result
+//     * @throws Exception e
+//     */
+//    private static Integer saveParamCollection(String device, String snCode, String stationStatus) {
+//        Integer result = Constants.INTEGER_TWO_ONE;
+//        try {
+//            // 鏌ヨ鍙傛暟閰嶇疆琛�
+//            List<ScCollectionParamConf> list = collectionParamConfService.list(new LambdaQueryWrapper<ScCollectionParamConf>()
+//                    .eq(ScCollectionParamConf::getLocationCode, device)
+//                    .eq(ScCollectionParamConf::getSubscribe, Constants.ONE)
+//                    .orderByDesc(ScCollectionParamConf::getOrderNum)
+//            );
+//
+//            if (CollUtil.isNotEmpty(list)) {
+//                // 鑾峰彇鍙傛暟鍊�
+//                List<String> collect = list.stream()
+//                        .map(ScCollectionParamConf::getNode)
+//                        .collect(Collectors.toList());
+//                List<ReadWriteEntity> readWriteEntityList = miloService.readFromOpcUa(collect);
+//
+//                // 淇濆瓨閲囬泦鏁版嵁
+//                saveCollectionData(device, snCode, list, readWriteEntityList);
+//
+//                // 鍒涘缓宸ヤ綅瀵硅薄骞惰祴鍊�
+//                Object stationObject = createStationObject(device, list, readWriteEntityList);
+//                if (stationObject != null) {
+//                    System.out.println("宸ヤ綅" + device + "瀵硅薄鍒涘缓鎴愬姛锛�" + stationObject);
+//                    // 杩欓噷鍙互瀵瑰垱寤虹殑瀵硅薄杩涜杩涗竴姝ュ鐞�
+//
+//                }
+//            }
+//
+//        } catch (Exception e) {
+//            log.error("淇濆瓨鏁版嵁寮傚父", e);
+//            throw new RuntimeException("淇濆瓨鏁版嵁鍙戦�佸伐鍘侻ES寮傚父");
+//        }
+//        return result;
+//    }
+//
+//    /**
+//     * 淇濆瓨閲囬泦鏁版嵁
+//     */
+//    private static void saveCollectionData(String device, String snCode,
+//            List<ScCollectionParamConf> list, List<ReadWriteEntity> readWriteEntityList) {
+//        ArrayList<DaParamCollection> collectionList = new ArrayList<>();
+//        for (int i = 0; i < readWriteEntityList.size(); i++) {
+//            DaParamCollection daParamCollection = new DaParamCollection();
+//            daParamCollection.setSfcCode(snCode);
+//            daParamCollection.setLocationCode(device);
+//            daParamCollection.setParamCode(list.get(i).getParamCode());
+//            daParamCollection.setParamName(list.get(i).getParamName());
+//            daParamCollection.setParamValue(readWriteEntityList.get(i).getValue().toString());
+//            daParamCollection.setCollectTime(new Date());
+//            collectionList.add(daParamCollection);
+//        }
+//        paramCollectionService.insertBatch(collectionList);
+//    }
+//
+//    /**
+//     * 鍒涘缓宸ヤ綅瀵硅薄骞惰祴鍊�
+//     */
+//    private static Object createStationObject(String device,
+//            List<ScCollectionParamConf> list, List<ReadWriteEntity> readWriteEntityList) {
+//        try {
+//            // 鏋勫缓瀹屾暣鐨勭被鍚�
+//            String className = "com.billion.main.api.domain.Station" + device;
+//            Class<?> stationClass = Class.forName(className);
+//            Object stationObject = stationClass.newInstance();
+//
+//            // 鑾峰彇鎵�鏈夊睘鎬�
+//            Field[] fields = stationClass.getDeclaredFields();
+//
+//            // 鍒涘缓鍙傛暟鍊糓ap锛屾柟渚挎煡鎵�
+//            Map<String, String> paramValueMap = new HashMap<>();
+//            for (int i = 0; i < list.size(); i++) {
+//                paramValueMap.put(list.get(i).getParamCode(),
+//                    readWriteEntityList.get(i).getValue().toString());
+//            }
+//
+//            // 鎸夐『搴忕粰灞炴�ц祴鍊�
+//            for (Field field : fields) {
+//                field.setAccessible(true);
+//                String paramCode = field.getName(); // 鍋囪灞炴�у悕涓庡弬鏁扮紪鐮佷竴鑷�
+//                String value = paramValueMap.get(paramCode);
+//
+//                if (value != null) {
+//                    // 鏍规嵁瀛楁绫诲瀷杞崲鍊�
+//                    Object convertedValue = convertValue(value, field.getType());
+//                    field.set(stationObject, convertedValue);
+//                }
+//            }
+//
+//            return stationObject;
+//        } catch (Exception e) {
+//            log.error("鍒涘缓宸ヤ綅瀵硅薄澶辫触锛�" + device, e);
+//            return null;
+//        }
+//    }
+//
+//    /**
+//     * 鏍规嵁瀛楁绫诲瀷杞崲鍊�
+//     */
+//    private static Object convertValue(String value, Class<?> type) {
+//        if (type == String.class) {
+//            return value;
+//        } else if (type == Integer.class || type == int.class) {
+//            return Integer.parseInt(value);
+//        } else if (type == Double.class || type == double.class) {
+//            return Double.parseDouble(value);
+//        } else if (type == Float.class || type == float.class) {
+//            return Float.parseFloat(value);
+//        } else if (type == Long.class || type == long.class) {
+//            return Long.parseLong(value);
+//        } else if (type == Boolean.class || type == boolean.class) {
+//            return Boolean.parseBoolean(value);
+//        } else if (type == Date.class) {
+//            try {
+//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                return sdf.parse(value);
+//            } catch (ParseException e) {
+//                return null;
+//            }
+//        }
+//        return value;
+//    }
+//
+//}

--
Gitblit v1.9.3