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