From 1566e4c7604d85737ea67fe6757e71b8185fa48e Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期二, 18 十一月 2025 16:52:42 +0800
Subject: [PATCH] 添加设备管理页面,添加测试设备任务监控页面

---
 mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java |  299 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 295 insertions(+), 4 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 2a1b439..15a52af 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
@@ -1,8 +1,12 @@
 package com.mes.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.xingshuangs.iot.common.enums.EDataType;
 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;
@@ -10,6 +14,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -24,6 +29,9 @@
 @Slf4j
 @Service
 public class PlcDynamicDataServiceImpl implements PlcDynamicDataService {
+    
+    private final ObjectMapper objectMapper = new ObjectMapper();
+    private static final TypeReference<Map<String, Object>> MAP_TYPE = new TypeReference<Map<String, Object>>() {};
 
     /**
      * 鏍规嵁PlcAddress閰嶇疆鍜屽瓧娈靛悕绉拌鍙朠LC鏁版嵁
@@ -59,8 +67,8 @@
             
             return resultMap;
         } catch (Exception e) {
-            log.error("璇诲彇PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛宮odule: {}, 璇︾粏閿欒: {}", 
-                config.getPlcIp(), config.getModule(), e.getMessage(), e);
+            log.error("璇诲彇PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛岃缁嗛敊璇�: {}", 
+                config.getPlcIp(), e.getMessage(), e);
             return new HashMap<>();
         }
     }
@@ -88,8 +96,8 @@
             // 鍐欏叆PLC
             s7Serializer.write(parameters);
         } catch (Exception e) {
-            log.error("鍐欏叆PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛宮odule: {}, 璇︾粏閿欒: {}", 
-                config.getPlcIp(), config.getModule(), e.getMessage(), e);
+            log.error("鍐欏叆PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛岃缁嗛敊璇�: {}", 
+                config.getPlcIp(), e.getMessage(), e);
         }
     }
 
@@ -212,4 +220,287 @@
         
         return parameters;
     }
+    
+    /**
+     * 浠嶥eviceConfig涓彁鍙栧湴鍧�鏄犲皠閰嶇疆
+     * 
+     * @param device 璁惧閰嶇疆
+     * @return 鍦板潃鏄犲皠JSON瀛楃涓�
+     */
+    private String extractAddressMapping(DeviceConfig device) {
+        // configJson 鐜板湪浠呭瓨鏀惧瓧娈靛湴鍧�鏄犲皠锛堟暟缁勫舰寮忥級
+        Map<String, Object> configParams = ConfigJsonHelper.parseToMap(device.getConfigJson(), objectMapper);
+        if (!configParams.isEmpty()) {
+            try {
+                return objectMapper.writeValueAsString(configParams);
+            } catch (Exception e) {
+                log.warn("搴忓垪鍖朿onfigJson鍦板潃鏄犲皠澶辫触, deviceId={}", device.getId(), e);
+            }
+        }
+        
+        // 鍏舵浠巈xtraParams涓幏鍙栵紙鍏煎鏃х粨鏋勶級
+        Map<String, Object> extraParams = parseExtraParams(device);
+        Object addressMapping = extraParams.get("addressMapping");
+        if (addressMapping != null) {
+            if (addressMapping instanceof String) {
+                return (String) addressMapping;
+            } else {
+                try {
+                    return objectMapper.writeValueAsString(addressMapping);
+                } catch (Exception e) {
+                    log.warn("搴忓垪鍖杄xtraParams.addressMapping澶辫触, deviceId={}", device.getId(), e);
+                }
+            }
+        }
+        
+        throw new IllegalArgumentException("璁惧閰嶇疆涓湭鎵惧埌addressMapping, deviceId=" + device.getId());
+    }
+    
+    /**
+     * 浠嶥eviceConfig涓彁鍙杁bArea
+     * 
+     * @param device 璁惧閰嶇疆
+     * @return dbArea
+     */
+    private String extractDbArea(DeviceConfig device) {
+        // 浠巈xtraParams.plcConfig涓幏鍙栵紙鏂扮粨鏋勶級
+        Map<String, Object> plcConfig = getPlcConfig(device);
+        Object dbArea = plcConfig.get("dbArea");
+        if (dbArea != null) {
+            return String.valueOf(dbArea);
+        }
+        
+        // 鍏煎鏃х粨鏋勶細extraParams鏍硅妭鐐�
+        Map<String, Object> extraParams = parseExtraParams(device);
+        Object legacyDbArea = extraParams.get("dbArea");
+        if (legacyDbArea != null) {
+            return String.valueOf(legacyDbArea);
+        }
+        
+        // 榛樿鍊�
+        return "DB12";
+    }
+    
+    /**
+     * 浠嶥eviceConfig涓彁鍙朾eginIndex
+     * 
+     * @param device 璁惧閰嶇疆
+     * @return beginIndex
+     */
+    private int extractBeginIndex(DeviceConfig device) {
+        // 浠巈xtraParams.plcConfig涓幏鍙�
+        Map<String, Object> plcConfig = getPlcConfig(device);
+        Object beginIndex = plcConfig.get("beginIndex");
+        if (beginIndex != null) {
+            return parseInteger(beginIndex);
+        }
+        
+        // 鍏煎鏃х粨鏋勶細extraParams鏍硅妭鐐�
+        Map<String, Object> extraParams = parseExtraParams(device);
+        Object legacyBeginIndex = extraParams.get("beginIndex");
+        if (legacyBeginIndex != null) {
+            return parseInteger(legacyBeginIndex);
+        }
+        
+        // 榛樿鍊�
+        return 0;
+    }
+    
+    private Map<String, Object> parseExtraParams(DeviceConfig device) {
+        if (device.getExtraParams() == null || device.getExtraParams().trim().isEmpty()) {
+            return Collections.emptyMap();
+        }
+        try {
+            return objectMapper.readValue(device.getExtraParams(), MAP_TYPE);
+        } catch (Exception e) {
+            log.warn("瑙f瀽璁惧extraParams澶辫触, deviceId={}", device.getId(), e);
+            return Collections.emptyMap();
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Map<String, Object> getPlcConfig(DeviceConfig device) {
+        Map<String, Object> extraParams = parseExtraParams(device);
+        Object plcConfig = extraParams.get("plcConfig");
+        if (plcConfig instanceof Map) {
+            return (Map<String, Object>) plcConfig;
+        }
+        if (plcConfig instanceof String) {
+            try {
+                return objectMapper.readValue((String) plcConfig, MAP_TYPE);
+            } catch (Exception e) {
+                log.warn("瑙f瀽extraParams.plcConfig澶辫触, deviceId={}", device.getId(), e);
+            }
+        }
+        return Collections.emptyMap();
+    }
+    
+    private int parseInteger(Object value) {
+        if (value instanceof Number) {
+            return ((Number) value).intValue();
+        }
+        try {
+            return Integer.parseInt(String.valueOf(value));
+        } catch (NumberFormatException ex) {
+            log.warn("鏃犳硶瑙f瀽鏁存暟鍊�: {}", value);
+            return 0;
+        }
+    }
+    
+    @Override
+    public Map<String, Object> readPlcData(DeviceConfig device, List<String> fieldNames, EnhancedS7Serializer s7Serializer) {
+        if (device == null) {
+            throw new IllegalArgumentException("璁惧閰嶇疆涓嶈兘涓虹┖");
+        }
+        
+        String addressMapping = extractAddressMapping(device);
+        if (addressMapping == null || addressMapping.isEmpty()) {
+            throw new IllegalArgumentException("璁惧閰嶇疆涓璦ddressMapping涓嶈兘涓虹┖");
+        }
+        
+        try {
+            // 瑙f瀽addressMapping JSON閰嶇疆
+            JSONObject addressMappingObj = JSONObject.parseObject(addressMapping);
+            
+            // 鏋勫缓S7Parameter鍒楄〃
+            String dbArea = extractDbArea(device);
+            List<S7Parameter> parameters = buildS7ParametersForDevice(device, dbArea, addressMappingObj, 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父锛宒eviceId: {}, 璇︾粏閿欒: {}", 
+                device.getPlcIp(), device.getId(), e.getMessage(), e);
+            return new HashMap<>();
+        }
+    }
+    
+    @Override
+    public void writePlcData(DeviceConfig device, Map<String, Object> dataMap, EnhancedS7Serializer s7Serializer) {
+        if (device == null) {
+            throw new IllegalArgumentException("璁惧閰嶇疆涓嶈兘涓虹┖");
+        }
+        
+        String addressMapping = extractAddressMapping(device);
+        if (addressMapping == null || addressMapping.isEmpty()) {
+            throw new IllegalArgumentException("璁惧閰嶇疆涓璦ddressMapping涓嶈兘涓虹┖");
+        }
+        
+        try {
+            // 瑙f瀽addressMapping JSON閰嶇疆
+            JSONObject addressMappingObj = JSONObject.parseObject(addressMapping);
+            
+            // 鏋勫缓S7Parameter鍒楄〃锛屽苟濉厖鍊�
+            String dbArea = extractDbArea(device);
+            List<S7Parameter> parameters = buildS7ParametersWithValuesForDevice(device, dbArea, addressMappingObj, dataMap);
+            
+            // 鍐欏叆PLC
+            s7Serializer.write(parameters);
+        } catch (Exception e) {
+            log.error("鍐欏叆PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛宒eviceId: {}, 璇︾粏閿欒: {}", 
+                device.getPlcIp(), device.getId(), e.getMessage(), e);
+        }
+    }
+    
+    @Override
+    public Map<String, Object> readAllPlcData(DeviceConfig device, EnhancedS7Serializer s7Serializer) {
+        if (device == null) {
+            throw new IllegalArgumentException("璁惧閰嶇疆涓嶈兘涓虹┖");
+        }
+        
+        String addressMapping = extractAddressMapping(device);
+        if (addressMapping == null || addressMapping.isEmpty()) {
+            throw new IllegalArgumentException("璁惧閰嶇疆涓璦ddressMapping涓嶈兘涓虹┖");
+        }
+        
+        // 鑾峰彇鎵�鏈夊瓧娈靛悕
+        JSONObject addressMappingObj = JSONObject.parseObject(addressMapping);
+        List<String> allFields = new ArrayList<>(addressMappingObj.keySet());
+        
+        // 璇诲彇鎵�鏈夊瓧娈�
+        return readPlcData(device, allFields, s7Serializer);
+    }
+    
+    @Override
+    public Object readPlcField(DeviceConfig device, String fieldName, EnhancedS7Serializer s7Serializer) {
+        List<String> fields = new ArrayList<>();
+        fields.add(fieldName);
+        
+        Map<String, Object> result = readPlcData(device, fields, s7Serializer);
+        return result.get(fieldName);
+    }
+    
+    @Override
+    public void writePlcField(DeviceConfig device, String fieldName, Object value, EnhancedS7Serializer s7Serializer) {
+        Map<String, Object> dataMap = new HashMap<>();
+        dataMap.put(fieldName, value);
+        
+        writePlcData(device, dataMap, s7Serializer);
+    }
+    
+    /**
+     * 鏋勫缓S7Parameter鍒楄〃锛堜笉鍖呭惈鍊硷級- 鍩轰簬DeviceConfig
+     */
+    private List<S7Parameter> buildS7ParametersForDevice(DeviceConfig device, String dbArea, 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 = dbArea + "." + offset;
+            
+            // 鍒涘缓S7Parameter锛岄粯璁や娇鐢║INT16绫诲瀷锛�16浣嶆棤绗﹀彿鏁存暟锛�
+            S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
+            parameters.add(parameter);
+        }
+        
+        return parameters;
+    }
+    
+    /**
+     * 鏋勫缓S7Parameter鍒楄〃锛堝寘鍚�硷級- 鍩轰簬DeviceConfig
+     */
+    private List<S7Parameter> buildS7ParametersWithValuesForDevice(DeviceConfig device, String dbArea, 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 = dbArea + "." + offset;
+            
+            // 鍒涘缓S7Parameter锛岃缃��
+            S7Parameter parameter = new S7Parameter(fullAddress, EDataType.UINT16, 1);
+            parameter.setValue(value);
+            parameters.add(parameter);
+        }
+        
+        return parameters;
+    }
 }

--
Gitblit v1.8.0