From fc4e5c458094c6bf5238d7d21291325f19a57adb Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期一, 22 十二月 2025 16:57:21 +0800
Subject: [PATCH] 修改:逻辑交互写入使用plc通讯工厂统一接口

---
 mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java |  280 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 215 insertions(+), 65 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 4170ef4..82582c4 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
@@ -7,7 +7,8 @@
 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.plc.client.PlcClient;
+import com.mes.plc.factory.PlcClientFactory;
 import com.mes.s7.enhanced.EnhancedS7Serializer;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -21,11 +22,9 @@
 
 /**
  * PLC娴嬭瘯鍐欏叆鏈嶅姟
- * 
+ *
  * 鍩轰簬DeviceConfig鐨勬柊API锛岀敤浜庢ā鎷烶LC琛屼负杩涜娴嬭瘯
- * 
- * 鎺ㄨ崘浣跨敤锛欴evicePlcOperationService锛堢敓浜х幆澧冿級
- * 
+ *
  * @author huang
  * @date 2025/10/29
  */
@@ -35,24 +34,26 @@
 
     @Resource
     private DeviceConfigService deviceConfigService;
-    
+
     @Resource
     private PlcDynamicDataService plcDynamicDataService;
-    
+
+    @Resource
+    private PlcClientFactory plcClientFactory;
+
     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;
-    
-    // 缂撳瓨涓嶅悓璁惧鐨凷7Serializer瀹炰緥
+
+    // 缂撳瓨涓嶅悓璁惧鐨凷7Serializer瀹炰緥锛堜繚鎸佸吋瀹癸紝閫愭杩佺Щ锛�
     private final ConcurrentMap<String, EnhancedS7Serializer> serializerCache = new ConcurrentHashMap<>();
 
-    // ==================== 鍩轰簬DeviceConfig鐨勬柊API锛堟帹鑽愪娇鐢級 ====================
-    
+
     /**
      * 鏍规嵁璁惧ID妯℃嫙PLC鍙戦�佽姹傚瓧
-     * 
+     *
      * @param deviceId 璁惧ID
      * @return 鏄惁鎴愬姛
      */
@@ -63,19 +64,68 @@
             return false;
         }
         try {
+            // 灏濊瘯浣跨敤鏂扮殑PLC瀹㈡埛绔伐鍘�
+            PlcClient plcClient = plcClientFactory.getClient(device);
+            if (plcClient != null) {
+                // 浣跨敤鏂扮殑PLC瀹㈡埛绔鍙栨暟鎹�
+                Map<String, Object> currentData = plcClient.readAllData();
+                if (currentData != null && !currentData.isEmpty()) {
+                    // 妫�鏌ヨ仈鏈虹姸鎬�
+                    Integer onlineState = parseInteger(currentData.get("onlineState"));
+                    if (onlineState != null && onlineState == OFF) {
+                        log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", deviceId);
+                        return false;
+                    }
+
+                    // 妫�鏌ユ眹鎶ュ瓧锛屽鏋滀负1鍒欓噸缃负0
+                    Integer plcReport = parseInteger(currentData.get("plcReport"));
+                    if (plcReport != null && plcReport == ON) {
+                        log.info("褰撳墠涓婄墖PLC姹囨姤瀛椾负1锛岄噸缃负0: deviceId={}", deviceId);
+                        currentData.put("plcReport", OFF);
+                    }
+
+                    // 璁剧疆璇锋眰瀛椾负1
+                    currentData.put("plcRequest", ON);
+
+                    // 浣跨敤鏂扮殑PLC瀹㈡埛绔啓鍏ユ暟鎹�
+                    boolean success = plcClient.writeData(currentData);
+                    if (success) {
+                        log.info("妯℃嫙PLC鍙戦�佽姹傚瓧鎴愬姛锛歱lcRequest=1, deviceId={}", deviceId);
+                        return true;
+                    }
+                }
+            }
+
+            // 濡傛灉鏂板鎴风澶辫触锛屽洖閫�鍒版棫瀹炵幇锛堜繚鎸佸吋瀹癸級
+            log.warn("鏂癙LC瀹㈡埛绔け璐ワ紝鍥為��鍒版棫瀹炵幇: deviceId={}", deviceId);
+            return simulatePlcRequestByDeviceLegacy(device);
+        } catch (Exception e) {
+            log.error("鏍规嵁璁惧妯℃嫙PLC璇锋眰瀛楀け璐�: deviceId={}", deviceId, e);
+            return false;
+        }
+    }
+
+    /**
+     * 鏃х増瀹炵幇锛氭牴鎹澶嘔D妯℃嫙PLC鍙戦�佽姹傚瓧
+     *
+     * @param device 璁惧閰嶇疆
+     * @return 鏄惁鎴愬姛
+     */
+    private boolean simulatePlcRequestByDeviceLegacy(DeviceConfig device) {
+        try {
             EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
             if (s7Serializer == null) {
-                log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
+                log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", device.getId());
                 return false;
             }
-            
+
             // 浣跨敤PlcDynamicDataService璇诲彇鏁版嵁锛堟敮鎸乤ddressMapping锛�
             Map<String, Object> currentData = plcDynamicDataService.readAllPlcData(device, s7Serializer);
             if (currentData == null || currentData.isEmpty()) {
-                log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥炵┖: deviceId={}", deviceId);
+                log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥炵┖: deviceId={}", device.getId());
                 return false;
             }
-            
+
             // 妫�鏌ヨ仈鏈虹姸鎬�
             Object onlineStateObj = currentData.get("onlineState");
             Integer onlineState = null;
@@ -89,16 +139,16 @@
                             onlineState = Integer.parseInt(strValue);
                         }
                     } catch (NumberFormatException e) {
-                        log.warn("瑙f瀽onlineState澶辫触: deviceId={}, value={}", deviceId, onlineStateObj, e);
+                        log.warn("瑙f瀽onlineState澶辫触: deviceId={}, value={}", device.getId(), onlineStateObj, e);
                     }
                 }
             }
-            
+
             if (onlineState != null && onlineState == OFF) {
-                log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", deviceId);
+                log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", device.getId());
                 return false;
             }
-            
+
             // 妫�鏌ユ眹鎶ュ瓧锛屽鏋滀负1鍒欓噸缃负0
             Object plcReportObj = currentData.get("plcReport");
             Integer plcReport = null;
@@ -112,33 +162,33 @@
                             plcReport = Integer.parseInt(strValue);
                         }
                     } catch (NumberFormatException e) {
-                        log.warn("瑙f瀽plcReport澶辫触: deviceId={}, value={}", deviceId, plcReportObj, e);
+                        log.warn("瑙f瀽plcReport澶辫触: deviceId={}, value={}", device.getId(), plcReportObj, e);
                     }
                 }
             }
-            
+
             if (plcReport != null && plcReport == ON) {
-                log.info("褰撳墠涓婄墖PLC姹囨姤瀛椾负1锛岄噸缃负0: deviceId={}", deviceId);
+                log.info("褰撳墠涓婄墖PLC姹囨姤瀛椾负1锛岄噸缃负0: deviceId={}", device.getId());
                 currentData.put("plcReport", OFF);
             }
-            
+
             // 璁剧疆璇锋眰瀛椾负1
             currentData.put("plcRequest", ON);
-            
+
             // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
             plcDynamicDataService.writePlcData(device, currentData, s7Serializer);
-            
-            log.info("妯℃嫙PLC鍙戦�佽姹傚瓧鎴愬姛锛歱lcRequest=1, deviceId={}", deviceId);
+
+            log.info("妯℃嫙PLC鍙戦�佽姹傚瓧鎴愬姛锛堟棫鐗堬級锛歱lcRequest=1, deviceId={}", device.getId());
             return true;
         } catch (Exception e) {
-            log.error("鏍规嵁璁惧妯℃嫙PLC璇锋眰瀛楀け璐�: deviceId={}", deviceId, e);
+            log.error("鏍规嵁璁惧妯℃嫙PLC璇锋眰瀛楀け璐ワ紙鏃х増锛�: deviceId={}", device.getId(), e);
             return false;
         }
     }
-    
+
     /**
      * 鏍规嵁璁惧ID妯℃嫙PLC浠诲姟瀹屾垚姹囨姤
-     * 
+     *
      * @param deviceId 璁惧ID
      * @return 鏄惁鎴愬姛
      */
@@ -149,38 +199,75 @@
             return false;
         }
         try {
-            EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
-            if (s7Serializer == null) {
-                log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
-                return false;
+            // 灏濊瘯浣跨敤鏂扮殑PLC瀹㈡埛绔伐鍘�
+            PlcClient plcClient = plcClientFactory.getClient(device);
+            if (plcClient != null) {
+                // 浣跨敤鏂扮殑PLC瀹㈡埛绔鍙栨暟鎹�
+                Map<String, Object> currentData = plcClient.readAllData();
+                if (currentData == null) {
+                    currentData = new HashMap<>();
+                }
+
+                // 璁剧疆姹囨姤瀛椾负1锛岃姹傚瓧娓�0
+                currentData.put("plcReport", ON);
+                currentData.put("plcRequest", OFF);
+
+                // 浣跨敤鏂扮殑PLC瀹㈡埛绔啓鍏ユ暟鎹�
+                boolean success = plcClient.writeData(currentData);
+                if (success) {
+                    log.info("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤锛歱lcReport=1, deviceId={}", deviceId);
+                    return true;
+                }
             }
-            
-            // 浣跨敤PlcDynamicDataService璇诲彇鏁版嵁
-            Map<String, Object> currentData = plcDynamicDataService.readAllPlcData(device, s7Serializer);
-            if (currentData == null || currentData.isEmpty()) {
-                log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥炵┖: deviceId={}", deviceId);
-                return false;
-            }
-            
-            // 璁剧疆姹囨姤瀛椾负1锛岃姹傚瓧娓�0
-            currentData.put("plcReport", ON);
-            currentData.put("plcRequest", OFF);
-            currentData.put("mesGlassCount", 10);
-            
-            // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
-            plcDynamicDataService.writePlcData(device, currentData, s7Serializer);
-            
-            log.info("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤锛歱lcReport=1, mesGlassCount=10, deviceId={}", deviceId);
-            return true;
+
+            // 濡傛灉鏂板鎴风澶辫触锛屽洖閫�鍒版棫瀹炵幇锛堜繚鎸佸吋瀹癸級
+            log.warn("鏂癙LC瀹㈡埛绔け璐ワ紝鍥為��鍒版棫瀹炵幇: deviceId={}", deviceId);
+            return simulatePlcReportByDeviceLegacy(device);
         } catch (Exception e) {
             log.error("鏍规嵁璁惧妯℃嫙PLC姹囨姤澶辫触: deviceId={}", deviceId, e);
             return false;
         }
     }
-    
+
+    /**
+     * 鏃х増瀹炵幇锛氭牴鎹澶囨ā鎷烶LC浠诲姟瀹屾垚姹囨姤
+     *
+     * @param device 璁惧閰嶇疆
+     * @return 鏄惁鎴愬姛
+     */
+    private boolean simulatePlcReportByDeviceLegacy(DeviceConfig device) {
+        try {
+            EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
+            if (s7Serializer == null) {
+                log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", device.getId());
+                return false;
+            }
+
+            // 浣跨敤PlcDynamicDataService璇诲彇鏁版嵁
+            Map<String, Object> currentData = plcDynamicDataService.readAllPlcData(device, s7Serializer);
+            if (currentData == null || currentData.isEmpty()) {
+                log.error("璇诲彇PLC鏁版嵁澶辫触锛岃繑鍥炵┖: deviceId={}", device.getId());
+                return false;
+            }
+
+            // 璁剧疆姹囨姤瀛椾负1锛岃姹傚瓧娓�0
+            currentData.put("plcReport", ON);
+            currentData.put("plcRequest", OFF);
+
+            // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
+            plcDynamicDataService.writePlcData(device, currentData, s7Serializer);
+
+            log.info("妯℃嫙PLC浠诲姟瀹屾垚姹囨姤锛堟棫鐗堬級锛歱lcReport=1, deviceId={}", device.getId());
+            return true;
+        } catch (Exception e) {
+            log.error("鏍规嵁璁惧妯℃嫙PLC姹囨姤澶辫触锛堟棫鐗堬級: deviceId={}", device.getId(), e);
+            return false;
+        }
+    }
+
     /**
      * 鏍规嵁璁惧ID閲嶇疆PLC鎵�鏈夌姸鎬�
-     * 
+     *
      * @param deviceId 璁惧ID
      * @return 鏄惁鎴愬姛
      */
@@ -191,12 +278,49 @@
             return false;
         }
         try {
+            // 灏濊瘯浣跨敤鏂扮殑PLC瀹㈡埛绔伐鍘�
+            PlcClient plcClient = plcClientFactory.getClient(device);
+            if (plcClient != null) {
+                // 鏋勫缓閲嶇疆鏁版嵁
+                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("alarmInfo", OFF);
+
+                // 浣跨敤鏂扮殑PLC瀹㈡埛绔啓鍏ユ暟鎹�
+                boolean success = plcClient.writeData(resetData);
+                if (success) {
+                    log.info("PLC鐘舵�佸凡閲嶇疆, deviceId={}", deviceId);
+                    return true;
+                }
+            }
+
+            // 濡傛灉鏂板鎴风澶辫触锛屽洖閫�鍒版棫瀹炵幇锛堜繚鎸佸吋瀹癸級
+            log.warn("鏂癙LC瀹㈡埛绔け璐ワ紝鍥為��鍒版棫瀹炵幇: deviceId={}", deviceId);
+            return resetPlcByDeviceLegacy(device);
+        } catch (Exception e) {
+            log.error("鏍规嵁璁惧閲嶇疆PLC鐘舵�佸け璐�: deviceId={}", deviceId, e);
+            return false;
+        }
+    }
+
+    /**
+     * 鏃х増瀹炵幇锛氭牴鎹澶囬噸缃甈LC鎵�鏈夌姸鎬�
+     *
+     * @param device 璁惧閰嶇疆
+     * @return 鏄惁鎴愬姛
+     */
+    private boolean resetPlcByDeviceLegacy(DeviceConfig device) {
+        try {
             EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
             if (s7Serializer == null) {
-                log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
+                log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", device.getId());
                 return false;
             }
-            
+
             // 鏋勫缓閲嶇疆鏁版嵁
             Map<String, Object> resetData = new HashMap<>();
             resetData.put("plcRequest", OFF);
@@ -204,23 +328,22 @@
             resetData.put("mesSend", OFF);
             resetData.put("mesConfirm", OFF);
             resetData.put("onlineState", ON);
-            resetData.put("mesGlassCount", 0);
             resetData.put("alarmInfo", OFF);
-            
+
             // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
             plcDynamicDataService.writePlcData(device, resetData, s7Serializer);
-            
-            log.info("PLC鐘舵�佸凡閲嶇疆, deviceId={}", deviceId);
+
+            log.info("PLC鐘舵�佸凡閲嶇疆锛堟棫鐗堬級: deviceId={}", device.getId());
             return true;
         } catch (Exception e) {
-            log.error("鏍规嵁璁惧閲嶇疆PLC鐘舵�佸け璐�: deviceId={}", deviceId, e);
+            log.error("鏍规嵁璁惧閲嶇疆PLC鐘舵�佸け璐ワ紙鏃х増锛�: deviceId={}", device.getId(), e);
             return false;
         }
     }
-    
+
     /**
      * 鏍规嵁璁惧ID璇诲彇PLC褰撳墠鐘舵��
-     * 
+     *
      * @param deviceId 璁惧ID
      * @return PLC鐘舵�佹暟鎹�
      */
@@ -231,6 +354,18 @@
             return null;
         }
         try {
+            // 灏濊瘯浣跨敤鏂扮殑PLC瀹㈡埛绔伐鍘�
+            PlcClient plcClient = plcClientFactory.getClient(device);
+            if (plcClient != null) {
+                // 浣跨敤鏂扮殑PLC瀹㈡埛绔鍙栨墍鏈夋暟鎹�
+                Map<String, Object> data = plcClient.readAllData();
+                log.info("璇诲彇PLC鐘舵�佹垚鍔�: deviceId={}, dataSize={}", deviceId, data != null ? data.size() : 0);
+                return data;
+            }
+            
+            // 濡傛灉鏂板鎴风澶辫触锛屽洖閫�鍒版棫瀹炵幇锛堜繚鎸佸吋瀹癸級
+            log.warn("鏂癙LC瀹㈡埛绔け璐ワ紝鍥為��鍒版棫瀹炵幇: deviceId={}", deviceId);
+            
             EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
             if (s7Serializer == null) {
                 log.error("鑾峰彇S7Serializer澶辫触: deviceId={}", deviceId);
@@ -238,6 +373,7 @@
             }
             // 浣跨敤PlcDynamicDataService璇诲彇鎵�鏈夋暟鎹紙鏀寔addressMapping锛�
             Map<String, Object> data = plcDynamicDataService.readAllPlcData(device, s7Serializer);
+            log.info("璇诲彇PLC鐘舵�佹垚鍔燂紙鏃х増锛�: deviceId={}, dataSize={}", deviceId, data != null ? data.size() : 0);
             return data;
         } catch (Exception e) {
             log.error("璇诲彇璁惧PLC鐘舵�佸け璐�: deviceId={}", deviceId, e);
@@ -260,6 +396,20 @@
         }
         
         try {
+            // 灏濊瘯浣跨敤鏂扮殑PLC瀹㈡埛绔伐鍘�
+            PlcClient plcClient = plcClientFactory.getClient(device);
+            if (plcClient != null) {
+                // 浣跨敤鏂扮殑PLC瀹㈡埛绔啓鍏ユ暟鎹�
+                boolean success = plcClient.writeData(fieldValues);
+                if (success) {
+                    log.info("鍐欏叆PLC瀛楁鎴愬姛: deviceId={}, fields={}", deviceId, fieldValues.keySet());
+                    return true;
+                }
+            }
+            
+            // 濡傛灉鏂板鎴风澶辫触锛屽洖閫�鍒版棫瀹炵幇锛堜繚鎸佸吋瀹癸級
+            log.warn("鏂癙LC瀹㈡埛绔け璐ワ紝鍥為��鍒版棫瀹炵幇: deviceId={}", deviceId);
+            
             // 鑾峰彇瀵瑰簲鐨凷7Serializer锛堜娇鐢ㄨ澶囬厤缃級
             EnhancedS7Serializer s7Serializer = getSerializerForDevice(device);
             if (s7Serializer == null) {
@@ -270,7 +420,7 @@
             // 浣跨敤鍔ㄦ�佹暟鎹湇鍔″啓鍏ュ瓧娈碉紙鍩轰簬DeviceConfig锛�
             plcDynamicDataService.writePlcData(device, fieldValues, s7Serializer);
             
-            log.info("鍐欏叆PLC瀛楁鎴愬姛: deviceId={}, fields={}", deviceId, fieldValues.keySet());
+            log.info("鍐欏叆PLC瀛楁鎴愬姛锛堟棫鐗堬級: deviceId={}, fields={}", deviceId, fieldValues.keySet());
             return true;
         } catch (Exception e) {
             log.error("鍐欏叆PLC瀛楁澶辫触: deviceId={}", deviceId, e);
@@ -329,7 +479,7 @@
                     EnhancedS7Serializer serializer = EnhancedS7Serializer.newInstance(s7Plc);
                     if (serializer == null) {
                         log.error("鍒涘缓EnhancedS7Serializer澶辫触: deviceId={}, plcIp={}, plcType={}", 
-                            device.getId(), plcIp, plcType);
+                            device.getId(), plcIp, plcType.name());
                     }
                     return serializer;
                 } catch (Exception e) {

--
Gitblit v1.8.0