From 04914a9997afbbead6f8adbb9d9c40e05b2edbd1 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期三, 17 十二月 2025 17:04:34 +0800
Subject: [PATCH] 修复调用导入工程失败 重复保存;修复分批出片逻辑
---
mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java | 526 +++++++++++++++++++++++++++++++++++++---------------------
1 files changed, 336 insertions(+), 190 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..4170ef4 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,20 +1,30 @@
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.entity.PlcBaseData;
-import com.mes.entity.PlcAddress;
+import com.mes.device.entity.DeviceConfig;
+import com.mes.device.service.DeviceConfigService;
+import com.mes.device.util.ConfigJsonHelper;
+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.HashMap;
+import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* PLC娴嬭瘯鍐欏叆鏈嶅姟
- * 妯℃嫙PLC琛屼负锛屽悜PLC鍐欏叆娴嬭瘯鏁版嵁锛岀敤浜庢祴璇昅ES绋嬪簭
+ *
+ * 鍩轰簬DeviceConfig鐨勬柊API锛岀敤浜庢ā鎷烶LC琛屼负杩涜娴嬭瘯
+ *
+ * 鎺ㄨ崘浣跨敤锛欴evicePlcOperationService锛堢敓浜х幆澧冿級
*
* @author huang
* @date 2025/10/29
@@ -24,256 +34,392 @@
public class PlcTestWriteService {
@Resource
- private PlcAddressService plcAddressService;
+ 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;
- // 褰撳墠浣跨敤鐨勯」鐩爣璇�
- private String currentProjectId = "vertical";
-
- // 缂撳瓨涓嶅悓椤圭洰鐨凷7Serializer瀹炰緥
+ // 缂撳瓨涓嶅悓璁惧鐨凷7Serializer瀹炰緥
private final ConcurrentMap<String, EnhancedS7Serializer> serializerCache = new ConcurrentHashMap<>();
- /**
- * 妯℃嫙PLC鍙戦�佽姹傚瓧锛堣Е鍙慚ES浠诲姟涓嬪彂锛�
- */
- public boolean simulatePlcRequest() {
- return simulatePlcRequest(currentProjectId);
- }
+ // ==================== 鍩轰簬DeviceConfig鐨勬柊API锛堟帹鑽愪娇鐢級 ====================
/**
- * 妯℃嫙PLC鍙戦�佽姹傚瓧锛堣Е鍙慚ES浠诲姟涓嬪彂锛�- 鏀寔鎸囧畾椤圭洰
+ * 鏍规嵁璁惧ID妯℃嫙PLC鍙戦�佽姹傚瓧
+ *
+ * @param deviceId 璁惧ID
+ * @return 鏄惁鎴愬姛
*/
- public boolean simulatePlcRequest(String projectId) {
+ public boolean simulatePlcRequestByDevice(Long deviceId) {
+ DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+ if (device == null) {
+ log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+ return false;
+ }
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锛屽仠姝㈣仈鏈�");
+ EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+ if (s7Serializer == null) {
+ log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
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;
+ // 浣跨敤PlcDynamicDataService璇诲彇鏁版嵁锛堟敮鎸乤ddressMapping锛�
+ Map<String, Object> currentData = plcDynamicDataService.readAllPlcData(device, s7Serializer);
+ if (currentData == null || currentData.isEmpty()) {
+ log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥炵┖: deviceId={}", deviceId);
+ return false;
+ }
+
+ // 妫�鏌ヨ仈鏈虹姸鎬�
+ Object onlineStateObj = currentData.get("onlineState");
+ Integer onlineState = null;
+ if (onlineStateObj != null) {
+ if (onlineStateObj instanceof Number) {
+ onlineState = ((Number) onlineStateObj).intValue();
+ } else {
+ try {
+ String strValue = String.valueOf(onlineStateObj);
+ if (!strValue.isEmpty() && !"null".equalsIgnoreCase(strValue)) {
+ onlineState = Integer.parseInt(strValue);
+ }
+ } catch (NumberFormatException e) {
+ log.warn("瑙f瀽onlineState澶辫触: deviceId={}, value={}", deviceId, onlineStateObj, e);
+ }
+ }
+ }
+
+ if (onlineState != null && onlineState == OFF) {
+ log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", deviceId);
+ return false;
+ }
+
+ // 妫�鏌ユ眹鎶ュ瓧锛屽鏋滀负1鍒欓噸缃负0
+ Object plcReportObj = currentData.get("plcReport");
+ Integer plcReport = null;
+ if (plcReportObj != null) {
+ if (plcReportObj instanceof Number) {
+ plcReport = ((Number) plcReportObj).intValue();
+ } else {
+ try {
+ String strValue = String.valueOf(plcReportObj);
+ if (!strValue.isEmpty() && !"null".equalsIgnoreCase(strValue)) {
+ plcReport = Integer.parseInt(strValue);
+ }
+ } catch (NumberFormatException e) {
+ log.warn("瑙f瀽plcReport澶辫触: deviceId={}, value={}", deviceId, plcReportObj, e);
+ }
+ }
+ }
+
+ if (plcReport != null && plcReport == ON) {
+ log.info("褰撳墠涓婄墖PLC姹囨姤瀛椾负1锛岄噸缃负0: deviceId={}", deviceId);
+ currentData.put("plcReport", OFF);
+ }
+
+ // 璁剧疆璇锋眰瀛椾负1
+ currentData.put("plcRequest", ON);
+
+ // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
+ plcDynamicDataService.writePlcData(device, currentData, s7Serializer);
+
+ log.info("妯℃嫙PLC鍙戦�佽姹傚瓧鎴愬姛锛歱lcRequest=1, deviceId={}", deviceId);
+ return true;
} catch (Exception e) {
- log.error("妯℃嫙PLC璇锋眰瀛楀け璐�", e);
+ log.error("鏍规嵁璁惧妯℃嫙PLC璇锋眰瀛楀け璐�: deviceId={}", deviceId, e);
return false;
}
}
-
- /**
- * 妯℃嫙PLC浠诲姟瀹屾垚姹囨姤
- */
- public boolean simulatePlcReport() {
- return simulatePlcReport(currentProjectId);
- }
/**
- * 妯℃嫙PLC浠诲姟瀹屾垚姹囨姤 - 鏀寔鎸囧畾椤圭洰
+ * 鏍规嵁璁惧ID妯℃嫙PLC浠诲姟瀹屾垚姹囨姤
+ *
+ * @param deviceId 璁惧ID
+ * @return 鏄惁鎴愬姛
*/
- public boolean simulatePlcReport(String projectId) {
+ public boolean simulatePlcReportByDevice(Long deviceId) {
+ DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+ if (device == null) {
+ log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+ return false;
+ }
try {
- // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
- PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
+ EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+ if (s7Serializer == null) {
+ log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
+ return false;
+ }
- // 鑾峰彇瀵瑰簲鐨凷7Serializer
- EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
+ // 浣跨敤PlcDynamicDataService璇诲彇鏁版嵁
+ Map<String, Object> currentData = plcDynamicDataService.readAllPlcData(device, s7Serializer);
+ if (currentData == null || currentData.isEmpty()) {
+ log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥炵┖: deviceId={}", deviceId);
+ return false;
+ }
- PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
-
- // 璁剧疆PLC姹囨姤瀛椾负1锛堜换鍔″畬鎴愶級
- currentData.setPlcReport(ON);
- // 璇锋眰瀛楁竻0
- currentData.setPlcRequest(OFF);
+ // 璁剧疆姹囨姤瀛椾负1锛岃姹傚瓧娓�0
+ currentData.put("plcReport", ON);
+ currentData.put("plcRequest", OFF);
+ currentData.put("mesGlassCount", 10);
- // 璁剧疆瀹屾垚鏁伴噺绛夋暟鎹�
- currentData.setMesGlassCount(10);
+ // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
+ plcDynamicDataService.writePlcData(device, currentData, s7Serializer);
- s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
- log.info("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤锛歱lcReport=1, mesGlassCount=10, projectId={}, dbArea={}, beginIndex={}",
- projectId, config.getDbArea(), config.getBeginIndex());
+ log.info("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤锛歱lcReport=1, mesGlassCount=10, deviceId={}", deviceId);
return true;
-
} catch (Exception e) {
- log.error("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤澶辫触", e);
+ log.error("鏍规嵁璁惧妯℃嫙PLC姹囨姤澶辫触: deviceId={}", deviceId, e);
return false;
}
}
-
- /**
- * 妯℃嫙PLC鍙戦�佽仈鏈虹姸鎬�
- */
- public boolean simulateOnlineStatus(int onlineState) {
- return simulateOnlineStatus(onlineState, currentProjectId);
- }
/**
- * 妯℃嫙PLC鍙戦�佽仈鏈虹姸鎬� - 鏀寔鎸囧畾椤圭洰
+ * 鏍规嵁璁惧ID閲嶇疆PLC鎵�鏈夌姸鎬�
+ *
+ * @param deviceId 璁惧ID
+ * @return 鏄惁鎴愬姛
*/
- public boolean simulateOnlineStatus(int onlineState, String projectId) {
+ public boolean resetPlcByDevice(Long deviceId) {
+ DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+ if (device == null) {
+ log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+ return false;
+ }
try {
- // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
- PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
+ EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+ if (s7Serializer == null) {
+ log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
+ return false;
+ }
- // 鑾峰彇瀵瑰簲鐨凷7Serializer
- EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
+ // 鏋勫缓閲嶇疆鏁版嵁
+ Map<String, Object> resetData = new HashMap<>();
+ resetData.put("plcRequest", OFF);
+ resetData.put("plcReport", OFF);
+ resetData.put("mesSend", OFF);
+ resetData.put("mesConfirm", OFF);
+ resetData.put("onlineState", ON);
+ resetData.put("mesGlassCount", 0);
+ resetData.put("alarmInfo", OFF);
- PlcBaseData currentData = s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
-
- // 1:鑱旀満 0:鑴辨満
- currentData.setOnlineState(onlineState);
+ // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
+ plcDynamicDataService.writePlcData(device, resetData, s7Serializer);
- s7Serializer.write(currentData, config.getDbArea(), config.getBeginIndex());
- log.info("妯℃嫙PLC鑱旀満鐘舵�侊細onlineState={}, projectId={}, dbArea={}, beginIndex={}",
- onlineState, projectId, config.getDbArea(), config.getBeginIndex());
+ log.info("PLC鐘舵�佸凡閲嶇疆, deviceId={}", deviceId);
return true;
-
} catch (Exception e) {
- log.error("妯℃嫙PLC鑱旀満鐘舵�佸け璐�", e);
+ log.error("鏍规嵁璁惧閲嶇疆PLC鐘舵�佸け璐�: deviceId={}", deviceId, e);
return false;
}
}
-
- /**
- * 閲嶇疆PLC鎵�鏈夌姸鎬�
- */
- public boolean resetPlc() {
- return resetPlc(currentProjectId);
- }
/**
- * 閲嶇疆PLC鎵�鏈夌姸鎬� - 鏀寔鎸囧畾椤圭洰
+ * 鏍规嵁璁惧ID璇诲彇PLC褰撳墠鐘舵��
+ *
+ * @param deviceId 璁惧ID
+ * @return PLC鐘舵�佹暟鎹�
*/
- public boolean resetPlc(String projectId) {
- try {
- // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
- PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
-
- // 鑾峰彇瀵瑰簲鐨凷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;
-
- } catch (Exception e) {
- log.error("閲嶇疆PLC鐘舵�佸け璐�", e);
- return false;
+ public Map<String, Object> readPlcStatusByDevice(Long deviceId) {
+ DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+ if (device == null) {
+ log.error("璁惧涓嶅瓨鍦�: deviceId={}", deviceId);
+ return null;
}
- }
-
- /**
- * 璇诲彇PLC褰撳墠鐘舵��
- */
- public PlcBaseData readPlcStatus() {
- return readPlcStatus(currentProjectId);
- }
-
- /**
- * 璇诲彇PLC褰撳墠鐘舵�� - 鏀寔鎸囧畾椤圭洰
- */
- public PlcBaseData readPlcStatus(String projectId) {
try {
- // 鑾峰彇椤圭洰閰嶇疆锛堟暟鎹簱瀹炰綋锛�
- PlcAddress config = plcAddressService.getProjectConfigWithMapping(projectId);
-
- // 鑾峰彇瀵瑰簲鐨凷7Serializer
- EnhancedS7Serializer s7Serializer = getSerializerForProject(projectId, config);
-
- return s7Serializer.read(PlcBaseData.class, config.getDbArea(), config.getBeginIndex());
+ EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+ if (s7Serializer == null) {
+ log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
+ return null;
+ }
+ // 浣跨敤PlcDynamicDataService璇诲彇鎵�鏈夋暟鎹紙鏀寔addressMapping锛�
+ Map<String, Object> data = plcDynamicDataService.readAllPlcData(device, s7Serializer);
+ return data;
} catch (Exception e) {
- log.error("璇诲彇PLC鐘舵�佸け璐�", e);
+ log.error("璇诲彇璁惧PLC鐘舵�佸け璐�: deviceId={}", deviceId, e);
return null;
}
}
/**
- * 璁剧疆褰撳墠椤圭洰鏍囪瘑
- */
- public void setCurrentProjectId(String projectId) {
- this.currentProjectId = projectId;
- }
-
- /**
- * 鑾峰彇褰撳墠椤圭洰鏍囪瘑
- */
- public String getCurrentProjectId() {
- return this.currentProjectId;
- }
-
- /**
- * 鑾峰彇椤圭洰瀵瑰簲鐨凷7Serializer瀹炰緥
- * 濡傛灉涓嶅瓨鍦紝鍒欏垱寤轰竴涓柊鐨勫疄渚嬪苟缂撳瓨
+ * 鏍规嵁璁惧ID鍐欏叆PLC瀛楁
*
- * @param projectId 椤圭洰鏍囪瘑
- * @param config 椤圭洰閰嶇疆
+ * @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 {
+ // 鑾峰彇瀵瑰簲鐨凷7Serializer锛堜娇鐢ㄨ澶囬厤缃級
+ EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+ if (s7Serializer == null) {
+ log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
+ return false;
+ }
+
+ // 浣跨敤鍔ㄦ�佹暟鎹湇鍔″啓鍏ュ瓧娈碉紙鍩轰簬DeviceConfig锛�
+ plcDynamicDataService.writePlcData(device, fieldValues, s7Serializer);
+
+ log.info("鍐欏叆PLC瀛楁鎴愬姛: deviceId={}, fields={}", deviceId, fieldValues.keySet());
+ return true;
+ } catch (Exception e) {
+ log.error("鍐欏叆PLC瀛楁澶辫触: deviceId={}", deviceId, e);
+ return false;
+ }
+ }
+
+ /**
+ * 鑾峰彇璁惧瀵瑰簲鐨凷7Serializer瀹炰緥
+ *
+ * @param device 璁惧閰嶇疆
* @return S7Serializer瀹炰緥
*/
- private EnhancedS7Serializer getSerializerForProject(String projectId, PlcAddress config) {
- return serializerCache.computeIfAbsent(projectId, id -> {
- // 瑙f瀽PLC绫诲瀷
- EPlcType plcType = EPlcType.S1200; // 榛樿鍊�
- if (config != null && config.getPlcType() != null) {
+ private EnhancedS7Serializer getSerializerForDevice(DeviceConfig device) {
+ if (device == null) {
+ log.error("璁惧閰嶇疆涓虹┖锛屾棤娉曞垱寤篠7Serializer");
+ return null;
+ }
+
+ try {
+ String cacheKey;
+ if (device.getId() != null) {
+ cacheKey = "device:" + device.getId();
+ } else {
try {
- plcType = EPlcType.valueOf(config.getPlcType());
- } catch (IllegalArgumentException e) {
- log.warn("鏈煡鐨凱LC绫诲瀷: {}, 浣跨敤榛樿绫诲瀷 S1200", config.getPlcType());
+ cacheKey = "device:" + resolveProjectId(device);
+ } catch (Exception e) {
+ cacheKey = "device:" + (device.getDeviceCode() != null ? device.getDeviceCode() : "unknown");
}
}
- // 鍒涘缓S7PLC瀹炰緥
- String plcIp = (config != null && config.getPlcIp() != null) ? config.getPlcIp() : "192.168.10.21";
- S7PLC s7Plc = new S7PLC(plcType, plcIp);
-
- // 鍒涘缓骞惰繑鍥濫nhancedS7Serializer瀹炰緥
- return EnhancedS7Serializer.newInstance(s7Plc);
- });
+ return serializerCache.computeIfAbsent(cacheKey, id -> {
+ try {
+ // 瑙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瀹炰緥
+ EnhancedS7Serializer serializer = EnhancedS7Serializer.newInstance(s7Plc);
+ if (serializer == null) {
+ log.error("鍒涘缓EnhancedS7Serializer澶辫触: deviceId={}, plcIp={}, plcType={}",
+ device.getId(), plcIp, plcType);
+ }
+ return serializer;
+ } catch (Exception e) {
+ log.error("鍒涘缓S7Serializer寮傚父: deviceId={}", device.getId(), e);
+ return null;
+ }
+ });
+ } catch (Exception e) {
+ log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", device.getId(), e);
+ return null;
+ }
}
+
+ 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;
+ }
+ }
+
/**
- * 娓呴櫎鎸囧畾椤圭洰鐨凷7Serializer缂撳瓨
+ * 浠庤澶囬厤缃腑瑙f瀽椤圭洰鏍囪瘑
*
- * @param projectId 椤圭洰鏍囪瘑
+ * @param device 璁惧閰嶇疆
+ * @return 椤圭洰鏍囪瘑
*/
- public void clearSerializerCache(String projectId) {
- serializerCache.remove(projectId);
- log.info("宸叉竻闄ら」鐩� {} 鐨凷7Serializer缂撳瓨", projectId);
+ 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());
}
-
- /**
- * 娓呴櫎鎵�鏈塖7Serializer缂撳瓨
- */
- public void clearAllSerializerCache() {
- serializerCache.clear();
- log.info("宸叉竻闄ゆ墍鏈塖7Serializer缂撳瓨");
- }
-}
\ No newline at end of file
+}
--
Gitblit v1.8.0