From 366ba040d2447bacd3455299425e3166f1f992bb Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期四, 20 十一月 2025 14:38:32 +0800
Subject: [PATCH] 添加大车、大理片笼以及多设备串行/并行执行写入基础逻辑
---
mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java | 508 +++++++++++++++++++++++++++++++++-----------------------
1 files changed, 299 insertions(+), 209 deletions(-)
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
index 15a52af..b906dbd 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
@@ -7,12 +7,14 @@
import com.github.xingshuangs.iot.protocol.s7.serializer.S7Parameter;
import com.mes.device.entity.DeviceConfig;
import com.mes.device.util.ConfigJsonHelper;
-import com.mes.entity.PlcAddress;
import com.mes.s7.enhanced.EnhancedS7Serializer;
import com.mes.service.PlcDynamicDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
+import com.github.xingshuangs.iot.protocol.s7.serializer.S7Variable;
+
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -21,7 +23,7 @@
/**
* PLC鍔ㄦ�佹暟鎹鍐欐湇鍔″疄鐜�
- * 閫氳繃PlcAddress涓殑addressMapping閰嶇疆鍔ㄦ�佽鍐欎换鎰忓瓧娈电粍鍚�
+ * 閫氳繃DeviceConfig涓殑configJson閰嶇疆鍔ㄦ�佽鍐欎换鎰忓瓧娈电粍鍚�
*
* @author huang
* @date 2025/11/05
@@ -33,194 +35,6 @@
private final ObjectMapper objectMapper = new ObjectMapper();
private static final TypeReference<Map<String, Object>> MAP_TYPE = new TypeReference<Map<String, Object>>() {};
- /**
- * 鏍规嵁PlcAddress閰嶇疆鍜屽瓧娈靛悕绉拌鍙朠LC鏁版嵁
- *
- * @param config PLC鍦板潃鏄犲皠閰嶇疆
- * @param fieldNames 瑕佽鍙栫殑瀛楁鍚嶇О鍒楄〃
- * @param s7Serializer S7搴忓垪鍖栧櫒
- * @return 瀛楁鍚�->鍊� 鐨凪ap
- */
- @Override
- public Map<String, Object> readPlcData(PlcAddress config, List<String> fieldNames, EnhancedS7Serializer s7Serializer) {
- if (config == null || config.getAddressMapping() == null) {
- throw new IllegalArgumentException("PlcAddress閰嶇疆鎴朼ddressMapping涓嶈兘涓虹┖");
- }
-
- try {
- // 瑙f瀽addressMapping JSON閰嶇疆
- JSONObject addressMapping = JSONObject.parseObject(config.getAddressMapping());
-
- // 鏋勫缓S7Parameter鍒楄〃
- List<S7Parameter> parameters = buildS7Parameters(config, addressMapping, fieldNames);
-
- // 浠嶱LC璇诲彇鏁版嵁
- List<S7Parameter> results = s7Serializer.read(parameters);
-
- // 灏嗙粨鏋滆浆鎹负Map
- Map<String, Object> resultMap = new HashMap<>();
- for (int i = 0; i < fieldNames.size() && i < results.size(); i++) {
- String fieldName = fieldNames.get(i);
- Object value = results.get(i).getValue();
- resultMap.put(fieldName, value);
- }
-
- return resultMap;
- } catch (Exception e) {
- log.error("璇诲彇PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛岃缁嗛敊璇�: {}",
- config.getPlcIp(), e.getMessage(), e);
- return new HashMap<>();
- }
- }
-
- /**
- * 鏍规嵁PlcAddress閰嶇疆鍜屾暟鎹甅ap鍐欏叆PLC
- *
- * @param config PLC鍦板潃鏄犲皠閰嶇疆
- * @param dataMap 瀛楁鍚�->鍊� 鐨凪ap
- * @param s7Serializer S7搴忓垪鍖栧櫒
- */
- @Override
- public void writePlcData(PlcAddress config, Map<String, Object> dataMap, EnhancedS7Serializer s7Serializer) {
- if (config == null || config.getAddressMapping() == null) {
- throw new IllegalArgumentException("PlcAddress閰嶇疆鎴朼ddressMapping涓嶈兘涓虹┖");
- }
-
- try {
- // 瑙f瀽addressMapping JSON閰嶇疆
- JSONObject addressMapping = JSONObject.parseObject(config.getAddressMapping());
-
- // 鏋勫缓S7Parameter鍒楄〃锛屽苟濉厖鍊�
- List<S7Parameter> parameters = buildS7ParametersWithValues(config, addressMapping, dataMap);
-
- // 鍐欏叆PLC
- s7Serializer.write(parameters);
- } catch (Exception e) {
- log.error("鍐欏叆PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛岃缁嗛敊璇�: {}",
- config.getPlcIp(), e.getMessage(), e);
- }
- }
-
- /**
- * 璇诲彇PLC鎵�鏈夊瓧娈�
- *
- * @param config PLC鍦板潃鏄犲皠閰嶇疆
- * @param s7Serializer S7搴忓垪鍖栧櫒
- * @return 鎵�鏈夊瓧娈电殑鍊�
- */
- @Override
- public Map<String, Object> readAllPlcData(PlcAddress config, EnhancedS7Serializer s7Serializer) {
- if (config == null || config.getAddressMapping() == null) {
- throw new IllegalArgumentException("PlcAddress閰嶇疆鎴朼ddressMapping涓嶈兘涓虹┖");
- }
-
- // 鑾峰彇鎵�鏈夊瓧娈靛悕
- JSONObject addressMapping = JSONObject.parseObject(config.getAddressMapping());
- List<String> allFields = new ArrayList<>(addressMapping.keySet());
-
- // 璇诲彇鎵�鏈夊瓧娈�
- return readPlcData(config, allFields, s7Serializer);
- }
-
- /**
- * 璇诲彇鍗曚釜瀛楁
- *
- * @param config PLC鍦板潃鏄犲皠閰嶇疆
- * @param fieldName 瀛楁鍚�
- * @param s7Serializer S7搴忓垪鍖栧櫒
- * @return 瀛楁鍊�
- */
- @Override
- public Object readPlcField(PlcAddress config, String fieldName, EnhancedS7Serializer s7Serializer) {
- List<String> fields = new ArrayList<>();
- fields.add(fieldName);
-
- Map<String, Object> result = readPlcData(config, fields, s7Serializer);
- return result.get(fieldName);
- }
-
- /**
- * 鍐欏叆鍗曚釜瀛楁
- *
- * @param config PLC鍦板潃鏄犲皠閰嶇疆
- * @param fieldName 瀛楁鍚�
- * @param value 瀛楁鍊�
- * @param s7Serializer S7搴忓垪鍖栧櫒
- */
- @Override
- public void writePlcField(PlcAddress config, String fieldName, Object value, EnhancedS7Serializer s7Serializer) {
- Map<String, Object> dataMap = new HashMap<>();
- dataMap.put(fieldName, value);
-
- writePlcData(config, dataMap, s7Serializer);
- }
-
- /**
- * 鏋勫缓S7Parameter鍒楄〃锛堜笉鍖呭惈鍊硷級
- *
- * @param config PLC鍦板潃閰嶇疆
- * @param addressMapping 鍦板潃鏄犲皠
- * @param fieldNames 瀛楁鍚嶅垪琛�
- * @return S7Parameter鍒楄〃
- */
- private List<S7Parameter> buildS7Parameters(PlcAddress config, JSONObject addressMapping, List<String> fieldNames) {
- List<S7Parameter> parameters = new ArrayList<>();
-
- for (String fieldName : fieldNames) {
- if (!addressMapping.containsKey(fieldName)) {
- log.warn("瀛楁 {} 鍦╝ddressMapping涓笉瀛樺湪锛岃烦杩�", fieldName);
- continue;
- }
-
- // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�
- int offset = addressMapping.getInteger(fieldName);
-
- // 鏋勫缓瀹屾暣鍦板潃锛歞bArea + offset锛堝锛欴B12.2锛�
- String fullAddress = config.getDbArea() + "." + offset;
-
- // 鍒涘缓S7Parameter锛岄粯璁や娇鐢║INT16绫诲瀷锛�16浣嶆棤绗﹀彿鏁存暟锛�
- S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
- parameters.add(parameter);
- }
-
- return parameters;
- }
-
- /**
- * 鏋勫缓S7Parameter鍒楄〃锛堝寘鍚�硷級
- *
- * @param config PLC鍦板潃閰嶇疆
- * @param addressMapping 鍦板潃鏄犲皠
- * @param dataMap 瀛楁鍚�->鍊� 鐨凪ap
- * @return S7Parameter鍒楄〃
- */
- private List<S7Parameter> buildS7ParametersWithValues(PlcAddress config, JSONObject addressMapping, Map<String, Object> dataMap) {
- List<S7Parameter> parameters = new ArrayList<>();
-
- for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
- String fieldName = entry.getKey();
- Object value = entry.getValue();
-
- if (!addressMapping.containsKey(fieldName)) {
- log.warn("瀛楁 {} 鍦╝ddressMapping涓笉瀛樺湪锛岃烦杩�", fieldName);
- continue;
- }
-
- // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�
- int offset = addressMapping.getInteger(fieldName);
-
- // 鏋勫缓瀹屾暣鍦板潃
- String fullAddress = config.getDbArea() + "." + offset;
-
- // 鍒涘缓S7Parameter锛岃缃��
- S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
- parameter.setValue(value);
- parameters.add(parameter);
- }
-
- return parameters;
- }
-
/**
* 浠嶥eviceConfig涓彁鍙栧湴鍧�鏄犲皠閰嶇疆
*
@@ -391,12 +205,18 @@
throw new IllegalArgumentException("璁惧閰嶇疆涓嶈兘涓虹┖");
}
- String addressMapping = extractAddressMapping(device);
- if (addressMapping == null || addressMapping.isEmpty()) {
- throw new IllegalArgumentException("璁惧閰嶇疆涓璦ddressMapping涓嶈兘涓虹┖");
+ if (s7Serializer == null) {
+ log.error("S7Serializer涓虹┖锛屾棤娉曞啓鍏LC鏁版嵁: deviceId={}", device.getId());
+ return;
}
try {
+ String addressMapping = extractAddressMapping(device);
+ if (addressMapping == null || addressMapping.isEmpty()) {
+ log.error("璁惧閰嶇疆涓璦ddressMapping涓虹┖: deviceId={}", device.getId());
+ return;
+ }
+
// 瑙f瀽addressMapping JSON閰嶇疆
JSONObject addressMappingObj = JSONObject.parseObject(addressMapping);
@@ -418,17 +238,28 @@
throw new IllegalArgumentException("璁惧閰嶇疆涓嶈兘涓虹┖");
}
- String addressMapping = extractAddressMapping(device);
- if (addressMapping == null || addressMapping.isEmpty()) {
- throw new IllegalArgumentException("璁惧閰嶇疆涓璦ddressMapping涓嶈兘涓虹┖");
+ if (s7Serializer == null) {
+ log.error("S7Serializer涓虹┖锛屾棤娉曡鍙朠LC鏁版嵁: deviceId={}", device.getId());
+ return new HashMap<>();
}
- // 鑾峰彇鎵�鏈夊瓧娈靛悕
- JSONObject addressMappingObj = JSONObject.parseObject(addressMapping);
- List<String> allFields = new ArrayList<>(addressMappingObj.keySet());
-
- // 璇诲彇鎵�鏈夊瓧娈�
- return readPlcData(device, allFields, s7Serializer);
+ try {
+ String addressMapping = extractAddressMapping(device);
+ if (addressMapping == null || addressMapping.isEmpty()) {
+ log.error("璁惧閰嶇疆涓璦ddressMapping涓虹┖: deviceId={}", device.getId());
+ return new HashMap<>();
+ }
+
+ // 鑾峰彇鎵�鏈夊瓧娈靛悕
+ JSONObject addressMappingObj = JSONObject.parseObject(addressMapping);
+ List<String> allFields = new ArrayList<>(addressMappingObj.keySet());
+
+ // 璇诲彇鎵�鏈夊瓧娈�
+ return readPlcData(device, allFields, s7Serializer);
+ } catch (Exception e) {
+ log.error("璇诲彇鎵�鏈塒LC鏁版嵁澶辫触: deviceId={}", device.getId(), e);
+ return new HashMap<>();
+ }
}
@Override
@@ -448,11 +279,123 @@
writePlcData(device, dataMap, s7Serializer);
}
+ @Override
+ public <T> void writePlcDataByEntity(DeviceConfig device, T entity, EnhancedS7Serializer s7Serializer) {
+ if (device == null || entity == null) {
+ throw new IllegalArgumentException("璁惧閰嶇疆鍜屽疄浣撳璞′笉鑳戒负绌�");
+ }
+
+ try {
+ // 1. 浠巆onfigJson涓幏鍙栧湴鍧�鏄犲皠锛堝瓧娈靛悕 -> 鍋忕Щ閲忥級
+ Map<String, Object> addressMapping = ConfigJsonHelper.parseToMap(device.getConfigJson(), objectMapper);
+ if (addressMapping.isEmpty()) {
+ throw new IllegalArgumentException("璁惧閰嶇疆涓湭鎵惧埌鍦板潃鏄犲皠閰嶇疆, deviceId=" + device.getId());
+ }
+
+ // 2. 鑾峰彇dbArea鍜宐eginIndex
+ String dbArea = extractDbArea(device);
+ int beginIndex = extractBeginIndex(device);
+
+ // 3. 鑾峰彇瀛楁閰嶇疆锛堢被鍨嬪拰count锛�
+ Map<String, FieldConfig> fieldConfigMap = extractFieldConfigMap(device);
+
+ // 4. 瑙f瀽瀹炰綋绫伙紝鑾峰彇鎵�鏈夊甫@S7Variable娉ㄨВ鐨勫瓧娈�
+ Class<?> entityClass = entity.getClass();
+ List<S7Parameter> parameters = new ArrayList<>();
+
+ for (Field field : entityClass.getDeclaredFields()) {
+ S7Variable annotation = field.getAnnotation(S7Variable.class);
+ if (annotation == null) {
+ continue;
+ }
+
+ // 鑾峰彇瀛楁鍚嶏紙浠庢敞瑙g殑address鑾峰彇锛屽搴攃onfigJson涓殑paramKey锛�
+ String fieldName = annotation.address();
+ if (fieldName == null || fieldName.isEmpty()) {
+ continue;
+ }
+
+ // 浠巃ddressMapping涓幏鍙栧亸绉婚噺
+ Object offsetObj = addressMapping.get(fieldName);
+ if (offsetObj == null) {
+ log.warn("瀛楁 {} 鍦╟onfigJson鍦板潃鏄犲皠涓笉瀛樺湪锛岃烦杩�", fieldName);
+ continue;
+ }
+
+ int offset;
+ if (offsetObj instanceof Number) {
+ offset = ((Number) offsetObj).intValue();
+ } else {
+ offset = Integer.parseInt(String.valueOf(offsetObj));
+ }
+
+ // 鏋勫缓瀹屾暣鍦板潃锛歞bArea + (beginIndex + offset)
+ String fullAddress = dbArea + "." + (beginIndex + offset);
+
+ // 纭畾鏁版嵁绫诲瀷鍜宑ount
+ // 浼樺厛绾э細1. 娉ㄨВ涓殑type鍜宑ount 2. configJson涓殑閰嶇疆 3. 鏍规嵁瀛楁鍚嶆帹鏂�
+ EDataType dataType = annotation.type();
+ int count = annotation.count();
+
+ // 濡傛灉娉ㄨВ涓病鏈夋寚瀹歝ount锛屽皾璇曚粠configJson鎴栧瓧娈靛悕鎺ㄦ柇
+ if (count <= 0) {
+ FieldConfig fieldConfig = fieldConfigMap.get(fieldName);
+ if (fieldConfig != null && fieldConfig.count > 0) {
+ count = fieldConfig.count;
+ } else {
+ count = determineFieldCountByName(fieldName);
+ }
+ }
+
+ // 濡傛灉娉ㄨВ涓殑绫诲瀷鏄疷INT16浣嗗瓧娈垫槸String绫诲瀷锛屽皾璇曚粠configJson鑾峰彇
+ if (dataType == EDataType.UINT16 && field.getType() == String.class) {
+ FieldConfig fieldConfig = fieldConfigMap.get(fieldName);
+ if (fieldConfig != null && fieldConfig.dataType != null) {
+ dataType = fieldConfig.dataType;
+ } else {
+ dataType = determineFieldTypeByName(fieldName);
+ }
+ }
+
+ // 鑾峰彇瀛楁鍊�
+ field.setAccessible(true);
+ Object value = field.get(entity);
+ if (value == null) {
+ continue; // 璺宠繃null鍊�
+ }
+
+ // 鍒涘缓S7Parameter骞惰缃��
+ S7Parameter parameter = new S7Parameter(fullAddress, dataType, count);
+ parameter.setValue(value);
+ parameters.add(parameter);
+ }
+
+ if (parameters.isEmpty()) {
+ log.warn("瀹炰綋绫� {} 涓病鏈夋壘鍒版湁鏁堢殑瀛楁锛屾棤娉曞啓鍏LC", entityClass.getSimpleName());
+ return;
+ }
+
+ // 5. 鍐欏叆PLC
+ s7Serializer.write(parameters);
+
+ log.info("鏍规嵁瀹炰綋绫诲啓鍏LC鏁版嵁鎴愬姛: deviceId={}, entityClass={}, fields={}",
+ device.getId(), entityClass.getSimpleName(), parameters.size());
+
+ } catch (Exception e) {
+ log.error("鏍规嵁瀹炰綋绫诲啓鍏LC鏁版嵁澶辫触: deviceId={}, entityClass={}",
+ device.getId(), entity != null ? entity.getClass().getSimpleName() : "null", e);
+ throw new RuntimeException("鍐欏叆PLC鏁版嵁澶辫触: " + e.getMessage(), e);
+ }
+ }
+
/**
* 鏋勫缓S7Parameter鍒楄〃锛堜笉鍖呭惈鍊硷級- 鍩轰簬DeviceConfig
*/
private List<S7Parameter> buildS7ParametersForDevice(DeviceConfig device, String dbArea, JSONObject addressMapping, List<String> fieldNames) {
List<S7Parameter> parameters = new ArrayList<>();
+
+ // 鑾峰彇瀛楁閰嶇疆锛堜粠configJson涓В鏋愮被鍨嬪拰count锛�
+ Map<String, FieldConfig> fieldConfigMap = extractFieldConfigMap(device);
for (String fieldName : fieldNames) {
if (!addressMapping.containsKey(fieldName)) {
@@ -460,14 +403,25 @@
continue;
}
- // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�
- int offset = addressMapping.getInteger(fieldName);
+ // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�锛坅ddressMapping涓彧瀛樺偍鏁板瓧鍋忕Щ閲忥級
+ Object offsetObj = addressMapping.get(fieldName);
+ int offset;
+ if (offsetObj instanceof Number) {
+ offset = ((Number) offsetObj).intValue();
+ } else {
+ offset = Integer.parseInt(String.valueOf(offsetObj));
+ }
// 鏋勫缓瀹屾暣鍦板潃锛歞bArea + offset锛堝锛欴B12.2锛�
String fullAddress = dbArea + "." + offset;
- // 鍒涘缓S7Parameter锛岄粯璁や娇鐢║INT16绫诲瀷锛�16浣嶆棤绗﹀彿鏁存暟锛�
- S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
+ // 鑾峰彇瀛楁绫诲瀷鍜岄暱搴︼紙浠巆onfigJson鎴栨牴鎹瓧娈靛悕鎺ㄦ柇锛�
+ FieldConfig fieldConfig = fieldConfigMap.getOrDefault(fieldName, new FieldConfig());
+ EDataType dataType = fieldConfig.dataType != null ? fieldConfig.dataType : determineFieldTypeByName(fieldName);
+ int count = fieldConfig.count > 0 ? fieldConfig.count : determineFieldCountByName(fieldName);
+
+ // 鍒涘缓S7Parameter
+ S7Parameter parameter = new S7Parameter(fullAddress, dataType, count);
parameters.add(parameter);
}
@@ -480,6 +434,9 @@
private List<S7Parameter> buildS7ParametersWithValuesForDevice(DeviceConfig device, String dbArea, JSONObject addressMapping, Map<String, Object> dataMap) {
List<S7Parameter> parameters = new ArrayList<>();
+ // 鑾峰彇瀛楁閰嶇疆锛堜粠configJson涓В鏋愮被鍨嬪拰count锛�
+ Map<String, FieldConfig> fieldConfigMap = extractFieldConfigMap(device);
+
for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
String fieldName = entry.getKey();
Object value = entry.getValue();
@@ -489,18 +446,151 @@
continue;
}
- // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�
- int offset = addressMapping.getInteger(fieldName);
+ // 鑾峰彇瀛楁鐨勫亸绉诲湴鍧�锛坅ddressMapping涓彧瀛樺偍鏁板瓧鍋忕Щ閲忥級
+ Object offsetObj = addressMapping.get(fieldName);
+ int offset;
+ if (offsetObj instanceof Number) {
+ offset = ((Number) offsetObj).intValue();
+ } else {
+ offset = Integer.parseInt(String.valueOf(offsetObj));
+ }
// 鏋勫缓瀹屾暣鍦板潃
String fullAddress = dbArea + "." + offset;
+ // 鑾峰彇瀛楁绫诲瀷鍜岄暱搴︼紙浠巆onfigJson鎴栨牴鎹瓧娈靛悕鎺ㄦ柇锛�
+ FieldConfig fieldConfig = fieldConfigMap.getOrDefault(fieldName, new FieldConfig());
+ EDataType dataType = fieldConfig.dataType != null ? fieldConfig.dataType : determineFieldTypeByName(fieldName);
+ int count = fieldConfig.count > 0 ? fieldConfig.count : determineFieldCountByName(fieldName);
+
// 鍒涘缓S7Parameter锛岃缃��
- S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
+ S7Parameter parameter = new S7Parameter(fullAddress, dataType, count);
parameter.setValue(value);
parameters.add(parameter);
}
return parameters;
}
+
+ /**
+ * 瀛楁閰嶇疆淇℃伅
+ */
+ private static class FieldConfig {
+ EDataType dataType;
+ int count;
+
+ FieldConfig() {
+ this.dataType = null;
+ this.count = 0;
+ }
+
+ FieldConfig(EDataType dataType, int count) {
+ this.dataType = dataType;
+ this.count = count;
+ }
+ }
+
+ /**
+ * 浠庤澶囬厤缃腑鎻愬彇瀛楁閰嶇疆鏄犲皠锛堢被鍨嬪拰count锛�
+ * configJson鏍煎紡: [{paramKey: "plcGlassId1", paramValue: "4", description: "鐜荤拑id1", dataType: "STRING", count: 20}]
+ */
+ private Map<String, FieldConfig> extractFieldConfigMap(DeviceConfig device) {
+ Map<String, FieldConfig> configMap = new HashMap<>();
+
+ try {
+ String configJson = device.getConfigJson();
+ if (configJson == null || configJson.trim().isEmpty()) {
+ return configMap;
+ }
+
+ String trimmed = configJson.trim();
+ // 濡傛灉configJson鏄暟缁勬牸寮忥紝瑙f瀽鏁扮粍
+ if (trimmed.startsWith("[")) {
+ List<Map<String, Object>> paramList = objectMapper.readValue(trimmed,
+ new TypeReference<List<Map<String, Object>>>() {});
+
+ for (Map<String, Object> param : paramList) {
+ Object paramKeyObj = param.get("paramKey");
+ if (paramKeyObj == null) {
+ continue;
+ }
+ String paramKey = String.valueOf(paramKeyObj);
+
+ EDataType dataType = null;
+ int count = 0;
+
+ // 瑙f瀽dataType
+ Object dataTypeObj = param.get("dataType");
+ if (dataTypeObj != null) {
+ String dataTypeStr = String.valueOf(dataTypeObj).toUpperCase();
+ try {
+ dataType = EDataType.valueOf(dataTypeStr);
+ } catch (IllegalArgumentException e) {
+ log.debug("鏃犳硶瑙f瀽鏁版嵁绫诲瀷: {}, 瀛楁: {}", dataTypeStr, paramKey);
+ }
+ }
+
+ // 瑙f瀽count
+ Object countObj = param.get("count");
+ if (countObj != null) {
+ if (countObj instanceof Number) {
+ count = ((Number) countObj).intValue();
+ } else {
+ try {
+ count = Integer.parseInt(String.valueOf(countObj));
+ } catch (NumberFormatException e) {
+ log.debug("鏃犳硶瑙f瀽count鍊�: {}, 瀛楁: {}", countObj, paramKey);
+ }
+ }
+ }
+
+ if (dataType != null || count > 0) {
+ configMap.put(paramKey, new FieldConfig(dataType, count));
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.debug("瑙f瀽瀛楁閰嶇疆鏄犲皠澶辫触: {}", e.getMessage());
+ }
+
+ return configMap;
+ }
+
+ /**
+ * 鏍规嵁瀛楁鍚嶆帹鏂暟鎹被鍨�
+ */
+ private EDataType determineFieldTypeByName(String fieldName) {
+ if (fieldName == null) {
+ return EDataType.UINT16;
+ }
+
+ String lowerName = fieldName.toLowerCase();
+ // 鐜荤拑ID瀛楁閫氬父鏄瓧绗︿覆
+ if (lowerName.contains("glassid") || lowerName.contains("glass_id") ||
+ lowerName.startsWith("plcglassid")) {
+ return EDataType.STRING;
+ }
+
+ // 榛樿杩斿洖UINT16
+ return EDataType.UINT16;
+ }
+
+ /**
+ * 鏍规嵁瀛楁鍚嶆帹鏂瓧娈甸暱搴�/鏁伴噺
+ */
+ private int determineFieldCountByName(String fieldName) {
+ if (fieldName == null) {
+ return 1;
+ }
+
+ String lowerName = fieldName.toLowerCase();
+ // 鐜荤拑ID閫氬父鏄�20涓瓧绗�
+ if (lowerName.contains("glassid") || lowerName.contains("glass_id") ||
+ lowerName.startsWith("plcglassid")) {
+ return 20; // 榛樿20涓瓧绗�
+ }
+
+ // 榛樿杩斿洖1
+ return 1;
+ }
}
--
Gitblit v1.8.0