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/PlcTestWriteService.java |  504 ++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 437 insertions(+), 67 deletions(-)

diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java b/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java
index 9e53e9f..ba3905b 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java
@@ -1,14 +1,22 @@
 package com.mes.service;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
 import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+import com.mes.device.entity.DeviceConfig;
+import com.mes.device.service.DeviceConfigService;
+import com.mes.device.util.ConfigJsonHelper;
 import com.mes.entity.PlcBaseData;
 import com.mes.entity.PlcAddress;
+import com.mes.service.PlcDynamicDataService;
 import com.mes.s7.enhanced.EnhancedS7Serializer;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -25,6 +33,15 @@
 
     @Resource
     private PlcAddressService plcAddressService;
+    
+    @Resource
+    private DeviceConfigService deviceConfigService;
+    
+    @Resource
+    private PlcDynamicDataService plcDynamicDataService;
+    
+    private final ObjectMapper objectMapper = new ObjectMapper();
+    private static final TypeReference<Map<String, Object>> MAP_TYPE = new TypeReference<Map<String, Object>>() {};
 
     private static final int ON = 1;
     private static final int OFF = 0;
@@ -47,33 +64,43 @@
      */
     public boolean simulatePlcRequest(String projectId) {
         try {
-            // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
             PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
-            
-            // 鑾峰彇瀵瑰簲鐨凷7Serializer
-            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
-            
-            // 璇诲彇褰撳墠PLC鐘舵��
-            PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
-
-            if (currentData.getOnlineState() == OFF) {
-                log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�");
+            if (config == null) {
+                log.error("椤圭洰閰嶇疆涓嶅瓨鍦�: projectId={}", projectId);
                 return false;
-            }else if (currentData.getPlcReport() == ON){
-                log.info("褰撳墠涓婄墖PLC姹囨姤瀛椾负1锛岄噸缃负0");
-                currentData.setPlcReport(OFF);
             }
-            // 璁剧疆PLC璇锋眰瀛椾负1锛堣Е鍙慚ES浠诲姟澶勭悊锛�
-            currentData.setPlcRequest(ON);
-            s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
-            log.info("妯℃嫙PLC鍙戦�佽姹傚瓧鎴愬姛锛歱lcRequest=1, projectId={}, dbArea={}, beginIndex={}", 
-                    projectId, config.getDbArea(), config.getBeginIndex());
-            return true;
-            
+            EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
+            if (s7Serializer == null) {
+                log.error("鏃犳硶鍒涘缓S7Serializer: projectId={}", projectId);
+                return false;
+            }
+            return simulatePlcRequestInternal(projectId, config, s7Serializer);
         } catch (Exception e) {
             log.error("妯℃嫙PLC璇锋眰瀛楀け璐�", e);
             return false;
         }
+    }
+
+    private boolean simulatePlcRequestInternal(String projectId, PlcAddress config, EnhancedS7Serializer s7Serializer) throws Exception {
+        PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
+        if (currentData == null) {
+            log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥瀗ull: projectId={}, dbArea={}, beginIndex={}", 
+                    projectId, config.getDbArea(), config.getBeginIndex());
+            return false;
+        }
+
+        if (currentData.getOnlineState() == OFF) {
+            log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�");
+            return false;
+        } else if (currentData.getPlcReport() == ON) {
+            log.info("褰撳墠涓婄墖PLC姹囨姤瀛椾负1锛岄噸缃负0");
+            currentData.setPlcReport(OFF);
+        }
+        currentData.setPlcRequest(ON);
+        s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
+        log.info("妯℃嫙PLC鍙戦�佽姹傚瓧鎴愬姛锛歱lcRequest=1, projectId={}, dbArea={}, beginIndex={}", 
+                projectId, config.getDbArea(), config.getBeginIndex());
+        return true;
     }
 
     /**
@@ -90,29 +117,41 @@
         try {
             // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
             PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
+            if (config == null) {
+                log.error("椤圭洰閰嶇疆涓嶅瓨鍦�: projectId={}", projectId);
+                return false;
+            }
             
             // 鑾峰彇瀵瑰簲鐨凷7Serializer
             EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
+            if (s7Serializer == null) {
+                log.error("鏃犳硶鍒涘缓S7Serializer: projectId={}", projectId);
+                return false;
+            }
             
-            PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
-
-            // 璁剧疆PLC姹囨姤瀛椾负1锛堜换鍔″畬鎴愶級
-            currentData.setPlcReport(ON);
-            // 璇锋眰瀛楁竻0
-            currentData.setPlcRequest(OFF);
-            
-            // 璁剧疆瀹屾垚鏁伴噺绛夋暟鎹�
-            currentData.setMesGlassCount(10);
-            
-            s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
-            log.info("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤锛歱lcReport=1, mesGlassCount=10, projectId={}, dbArea={}, beginIndex={}", 
-                    projectId, config.getDbArea(), config.getBeginIndex());
-            return true;
-            
+            return simulatePlcReportInternal(projectId, config, s7Serializer);
         } catch (Exception e) {
             log.error("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤澶辫触", e);
             return false;
         }
+    }
+
+    private boolean simulatePlcReportInternal(String projectId, PlcAddress config, EnhancedS7Serializer s7Serializer) throws Exception {
+        PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
+        if (currentData == null) {
+            log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥瀗ull: projectId={}, dbArea={}, beginIndex={}", 
+                    projectId, config.getDbArea(), config.getBeginIndex());
+            return false;
+        }
+
+        currentData.setPlcReport(ON);
+        currentData.setPlcRequest(OFF);
+        currentData.setMesGlassCount(10);
+
+        s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
+        log.info("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤锛歱lcReport=1, mesGlassCount=10, projectId={}, dbArea={}, beginIndex={}", 
+                projectId, config.getDbArea(), config.getBeginIndex());
+        return true;
     }
 
     /**
@@ -129,24 +168,38 @@
         try {
             // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
             PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
+            if (config == null) {
+                log.error("椤圭洰閰嶇疆涓嶅瓨鍦�: projectId={}", projectId);
+                return false;
+            }
             
             // 鑾峰彇瀵瑰簲鐨凷7Serializer
             EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
+            if (s7Serializer == null) {
+                log.error("鏃犳硶鍒涘缓S7Serializer: projectId={}", projectId);
+                return false;
+            }
             
-            PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
-
-            // 1:鑱旀満 0:鑴辨満
-            currentData.setOnlineState(onlineState);
-            
-            s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
-            log.info("妯℃嫙PLC鑱旀満鐘舵�侊細onlineState={}, projectId={}, dbArea={}, beginIndex={}", 
-                    onlineState, projectId, config.getDbArea(), config.getBeginIndex());
-            return true;
-            
+            return simulateOnlineStatusInternal(onlineState, projectId, config, s7Serializer);
         } catch (Exception e) {
             log.error("妯℃嫙PLC鑱旀満鐘舵�佸け璐�", e);
             return false;
         }
+    }
+
+    private boolean simulateOnlineStatusInternal(int onlineState, String projectId, PlcAddress config, EnhancedS7Serializer s7Serializer) throws Exception {
+        PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
+        if (currentData == null) {
+            log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥瀗ull: projectId={}, dbArea={}, beginIndex={}", 
+                    projectId, config.getDbArea(), config.getBeginIndex());
+            return false;
+        }
+
+        currentData.setOnlineState(onlineState);
+        s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
+        log.info("妯℃嫙PLC鑱旀満鐘舵�侊細onlineState={}, projectId={}, dbArea={}, beginIndex={}", 
+                onlineState, projectId, config.getDbArea(), config.getBeginIndex());
+        return true;
     }
 
     /**
@@ -163,32 +216,37 @@
         try {
             // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
             PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
+            if (config == null) {
+                log.error("椤圭洰閰嶇疆涓嶅瓨鍦�: projectId={}", projectId);
+                return false;
+            }
             
-            // 鑾峰彇瀵瑰簲鐨凷7Serializer
             EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
-            
-            PlcBaseData resetData = new PlcBaseData();
-            
-            // 閲嶇疆鎵�鏈夊叧閿瓧娈�
-            resetData.setPlcRequest(OFF);
-            resetData.setPlcReport(OFF);
-            resetData.setMesSend(OFF);
-            resetData.setMesConfirm(OFF);
-            // 榛樿鑱旀満
-            resetData.setOnlineState(ON);
-            resetData.setMesGlassCount(0);
-            // 娓呴櫎鎶ヨ
-            resetData.setAlarmInfo(OFF);
-
-            s7Serializer.write(resetData, config.getDbArea(), config.getBeginIndex());
-            log.info("PLC鐘舵�佸凡閲嶇疆, projectId={}, dbArea={}, beginIndex={}", 
-                    projectId, config.getDbArea(), config.getBeginIndex());
-            return true;
-            
+            if (s7Serializer == null) {
+                log.error("鏃犳硶鍒涘缓S7Serializer: projectId={}", projectId);
+                return false;
+            }
+            return resetPlcInternal(projectId, config, s7Serializer);
         } catch (Exception e) {
             log.error("閲嶇疆PLC鐘舵�佸け璐�", e);
             return false;
         }
+    }
+
+    private boolean resetPlcInternal(String projectId, PlcAddress config, EnhancedS7Serializer s7Serializer) throws Exception {
+        PlcBaseData resetData = new PlcBaseData();
+        resetData.setPlcRequest(OFF);
+        resetData.setPlcReport(OFF);
+        resetData.setMesSend(OFF);
+        resetData.setMesConfirm(OFF);
+        resetData.setOnlineState(ON);
+        resetData.setMesGlassCount(0);
+        resetData.setAlarmInfo(OFF);
+
+        s7Serializer.write(resetData, config.getDbArea(), config.getBeginIndex());
+        log.info("PLC鐘舵�佸凡閲嶇疆, projectId={}, dbArea={}, beginIndex={}", 
+                projectId, config.getDbArea(), config.getBeginIndex());
+        return true;
     }
 
     /**
@@ -205,15 +263,31 @@
         try {
             // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
             PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
+            if (config == null) {
+                log.error("椤圭洰閰嶇疆涓嶅瓨鍦�: projectId={}", projectId);
+                return null;
+            }
             
-            // 鑾峰彇瀵瑰簲鐨凷7Serializer
             EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
+            if (s7Serializer == null) {
+                log.error("鏃犳硶鍒涘缓S7Serializer: projectId={}", projectId);
+                return null;
+            }
             
-            return s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
+            return readPlcStatusInternal(projectId, config, s7Serializer);
         } catch (Exception e) {
             log.error("璇诲彇PLC鐘舵�佸け璐�", e);
             return null;
         }
+    }
+
+    private PlcBaseData readPlcStatusInternal(String projectId, PlcAddress config, EnhancedS7Serializer s7Serializer) throws Exception {
+        PlcBaseData data = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
+        if (data == null) {
+            log.error("璇诲彇PLC鐘舵�佽繑鍥瀗ull: projectId={}, dbArea={}, beginIndex={}", 
+                    projectId, config.getDbArea(), config.getBeginIndex());
+        }
+        return data;
     }
     
     /**
@@ -276,4 +350,300 @@
         serializerCache.clear();
         log.info("宸叉竻闄ゆ墍鏈塖7Serializer缂撳瓨");
     }
+    
+    /**
+     * 鏍规嵁璁惧ID妯℃嫙PLC鍙戦�佽姹傚瓧
+     * 
+     * @param deviceId 璁惧ID
+     * @return 鏄惁鎴愬姛
+     */
+    public boolean simulatePlcRequestByDevice(Long deviceId) {
+        DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+        if (device == null) {
+            log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+            return false;
+        }
+        try {
+            String projectId = resolveProjectId(device);
+            PlcAddress config = buildPlcAddressFromDevice(device);
+            EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+            return simulatePlcRequestInternal(projectId, config, s7Serializer);
+        } catch (Exception e) {
+            log.error("鏍规嵁璁惧妯℃嫙PLC璇锋眰瀛楀け璐�: deviceId={}", deviceId, e);
+            return false;
+        }
+    }
+    
+    /**
+     * 鏍规嵁璁惧ID妯℃嫙PLC浠诲姟瀹屾垚姹囨姤
+     * 
+     * @param deviceId 璁惧ID
+     * @return 鏄惁鎴愬姛
+     */
+    public boolean simulatePlcReportByDevice(Long deviceId) {
+        DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+        if (device == null) {
+            log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+            return false;
+        }
+        try {
+            String projectId = resolveProjectId(device);
+            PlcAddress config = buildPlcAddressFromDevice(device);
+            EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+            return simulatePlcReportInternal(projectId, config, s7Serializer);
+        } catch (Exception e) {
+            log.error("鏍规嵁璁惧妯℃嫙PLC姹囨姤澶辫触: deviceId={}", deviceId, e);
+            return false;
+        }
+    }
+    
+    /**
+     * 鏍规嵁璁惧ID閲嶇疆PLC鎵�鏈夌姸鎬�
+     * 
+     * @param deviceId 璁惧ID
+     * @return 鏄惁鎴愬姛
+     */
+    public boolean resetPlcByDevice(Long deviceId) {
+        DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+        if (device == null) {
+            log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+            return false;
+        }
+        try {
+            String projectId = resolveProjectId(device);
+            PlcAddress config = buildPlcAddressFromDevice(device);
+            EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+            return resetPlcInternal(projectId, config, s7Serializer);
+        } catch (Exception e) {
+            log.error("鏍规嵁璁惧閲嶇疆PLC鐘舵�佸け璐�: deviceId={}", deviceId, e);
+            return false;
+        }
+    }
+    
+    /**
+     * 鏍规嵁璁惧ID璇诲彇PLC褰撳墠鐘舵��
+     * 
+     * @param deviceId 璁惧ID
+     * @return PLC鐘舵�佹暟鎹�
+     */
+    public Map<String, Object> readPlcStatusByDevice(Long deviceId) {
+        DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+        if (device == null) {
+            log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+            return null;
+        }
+        try {
+            String projectId = resolveProjectId(device);
+            PlcAddress config = buildPlcAddressFromDevice(device);
+            EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+            PlcBaseData data = readPlcStatusInternal(projectId, config, s7Serializer);
+            if (data == null) {
+                return null;
+            }
+            String json = objectMapper.writeValueAsString(data);
+            return objectMapper.readValue(json, MAP_TYPE);
+        } catch (Exception e) {
+            log.error("璇诲彇璁惧PLC鐘舵�佸け璐�: deviceId={}", deviceId, e);
+            return null;
+        }
+    }
+    
+    /**
+     * 鏍规嵁璁惧ID鍐欏叆PLC瀛楁
+     * 
+     * @param deviceId 璁惧ID
+     * @param fieldValues 瀛楁鍚�->鍊� 鐨凪ap
+     * @return 鏄惁鎴愬姛
+     */
+    public boolean writeFieldsByDevice(Long deviceId, Map<String, Object> fieldValues) {
+        DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+        if (device == null) {
+            log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+            return false;
+        }
+        
+        try {
+            // 浠庤澶囬厤缃腑鑾峰彇椤圭洰鏍囪瘑
+            String projectId = resolveProjectId(device);
+            
+            // 鑾峰彇瀵瑰簲鐨凷7Serializer锛堜娇鐢ㄨ澶囬厤缃級
+            EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+            
+            // 浣跨敤鍔ㄦ�佹暟鎹湇鍔″啓鍏ュ瓧娈碉紙鍩轰簬DeviceConfig锛�
+            plcDynamicDataService.writePlcData(device, fieldValues, s7Serializer);
+            
+            log.info("鍐欏叆PLC瀛楁鎴愬姛: deviceId={}, projectId={}, fields={}", deviceId, projectId, fieldValues.keySet());
+            return true;
+        } catch (Exception e) {
+            log.error("鍐欏叆PLC瀛楁澶辫触: deviceId={}", deviceId, e);
+            return false;
+        }
+    }
+    
+    /**
+     * 鑾峰彇璁惧瀵瑰簲鐨凷7Serializer瀹炰緥
+     * 
+     * @param device 璁惧閰嶇疆
+     * @return S7Serializer瀹炰緥
+     */
+    private EnhancedS7Serializer getSerializerForDevice(DeviceConfig device) {
+        String cacheKey = "device:" + (device.getId() != null ? device.getId() : resolveProjectId(device));
+        return serializerCache.computeIfAbsent(cacheKey, id -> {
+            // 瑙f瀽PLC绫诲瀷锛堜粎鍙栧疄浣撳瓧娈碉級
+            EPlcType plcType = EPlcType.S1200;
+            String plcTypeValue = device.getPlcType();
+            if (plcTypeValue == null || plcTypeValue.isEmpty()) {
+                log.warn("璁惧鏈厤缃甈LC绫诲瀷锛屼娇鐢ㄩ粯璁ょ被鍨婼1200, deviceId={}", device.getId());
+            } else {
+                try {
+                    plcType = EPlcType.valueOf(plcTypeValue);
+                } catch (IllegalArgumentException e) {
+                    log.warn("鏈煡鐨凱LC绫诲瀷: {}, 浣跨敤榛樿绫诲瀷 S1200", plcTypeValue);
+                }
+            }
+            
+            // 鍒涘缓S7PLC瀹炰緥锛堜粎鍙栧疄浣撳瓧娈碉級
+            String plcIp = device.getPlcIp();
+            if (plcIp == null || plcIp.isEmpty()) {
+                log.warn("璁惧鏈厤缃甈LC IP锛屼娇鐢ㄩ粯璁� 192.168.10.21, deviceId={}", device.getId());
+                plcIp = "192.168.10.21";
+            }
+            S7PLC s7Plc = new S7PLC(plcType, plcIp);
+            
+            // 鍒涘缓骞惰繑鍥濫nhancedS7Serializer瀹炰緥
+            return EnhancedS7Serializer.newInstance(s7Plc);
+        });
+    }
+    
+    private PlcAddress buildPlcAddressFromDevice(DeviceConfig device) {
+        Map<String, Object> plcConfig = getPlcConfigParams(device);
+        String dbArea = plcConfig.get("dbArea") != null ? String.valueOf(plcConfig.get("dbArea")) : "DB12";
+        int beginIndex = plcConfig.get("beginIndex") != null ? parseInteger(plcConfig.get("beginIndex")) : 0;
+
+        String plcIp = device.getPlcIp();
+        if (plcIp == null || plcIp.isEmpty()) {
+            log.warn("璁惧鏈厤缃甈LC IP锛屼娇鐢ㄩ粯璁� 192.168.10.21, deviceId={}", device.getId());
+            plcIp = "192.168.10.21";
+        }
+
+        String plcType = device.getPlcType();
+        if (plcType == null || plcType.isEmpty()) {
+            log.warn("璁惧鏈厤缃甈LC绫诲瀷锛屼娇鐢ㄩ粯璁1200, deviceId={}", device.getId());
+            plcType = EPlcType.S1200.name();
+        }
+
+        String addressMapping = resolveAddressMapping(device);
+
+        PlcAddress config = new PlcAddress();
+        config.setProjectId(resolveProjectId(device));
+        config.setDbArea(dbArea);
+        config.setBeginIndex(beginIndex);
+        config.setPlcIp(plcIp);
+        config.setPlcType(plcType);
+        config.setAddressMapping(addressMapping);
+        return config;
+    }
+
+    private String resolveAddressMapping(DeviceConfig device) {
+        Map<String, Object> mapping = ConfigJsonHelper.parseToMap(device.getConfigJson(), objectMapper);
+        if (!mapping.isEmpty()) {
+            try {
+                return objectMapper.writeValueAsString(mapping);
+            } catch (Exception e) {
+                log.warn("搴忓垪鍖朿onfigJson瀛楁鏄犲皠澶辫触, deviceId={}", device.getId(), e);
+            }
+        }
+        Map<String, Object> extraParams = parseExtraParams(device);
+        Object addressMapping = extraParams.get("addressMapping");
+        if (addressMapping instanceof String) {
+            return (String) addressMapping;
+        }
+        if (addressMapping != null) {
+            try {
+                return objectMapper.writeValueAsString(addressMapping);
+            } catch (Exception e) {
+                log.warn("搴忓垪鍖杄xtraParams.addressMapping澶辫触, deviceId={}", device.getId(), e);
+            }
+        }
+        throw new IllegalStateException("璁惧鏈厤缃甈LC瀛楁鏄犲皠, deviceId=" + device.getId());
+    }
+
+    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> getPlcConfigParams(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;
+        }
+    }
+
+    /**
+     * 浠庤澶囬厤缃腑瑙f瀽椤圭洰鏍囪瘑
+     * 
+     * @param device 璁惧閰嶇疆
+     * @return 椤圭洰鏍囪瘑
+     */
+    private String resolveProjectId(DeviceConfig device) {
+        if (device == null) {
+            throw new IllegalArgumentException("璁惧淇℃伅涓虹┖");
+        }
+        
+        // 1. 浼樺厛浣跨敤瀹炰綋涓婄殑projectId
+        if (device.getProjectId() != null) {
+            return String.valueOf(device.getProjectId());
+        }
+
+        // 2. 浠巈xtraParams涓鍙�
+        Map<String, Object> extraParams = parseExtraParams(device);
+        Object plcProjectId = extraParams.get("plcProjectId");
+        if (plcProjectId != null) {
+            return String.valueOf(plcProjectId);
+        }
+
+        // 3. 鍏煎鏃х粨鏋勶細configJson鎴杄xtraParams鍐呭祵
+        Map<String, Object> configParams = ConfigJsonHelper.parseToMap(device.getConfigJson(), objectMapper);
+        Object legacyProjectId = configParams.get("plcProjectId");
+        if (legacyProjectId != null) {
+            return String.valueOf(legacyProjectId);
+        }
+        
+        // 鏈�鍚庝娇鐢ㄨ澶囩紪鍙�
+        if (device.getDeviceCode() != null && !device.getDeviceCode().isEmpty()) {
+            return device.getDeviceCode();
+        }
+        
+        throw new IllegalStateException("鏃犳硶瑙f瀽璁惧鐨凱LC椤圭洰鏍囪瘑, deviceId=" + device.getId());
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0