From e76f0739e647fe8a7e0e2618914e2faff554b1b7 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期一, 17 十一月 2025 17:33:23 +0800
Subject: [PATCH] 解决冲突

---
 mes-processes/mes-plcSend/src/main/java/com/mes/job/PlcAutoTestTaskScheduler.java |  295 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 295 insertions(+), 0 deletions(-)

diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/job/PlcAutoTestTaskScheduler.java b/mes-processes/mes-plcSend/src/main/java/com/mes/job/PlcAutoTestTaskScheduler.java
new file mode 100644
index 0000000..4ba1b62
--- /dev/null
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/job/PlcAutoTestTaskScheduler.java
@@ -0,0 +1,295 @@
+package com.mes.job;
+
+import com.mes.entity.PlcAddress;
+import com.mes.entity.PlcTestTask;
+import com.mes.service.PlcAddressService;
+import com.mes.service.PlcTestTaskService;
+import com.mes.service.PlcTestWriteService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * PLC鑷姩娴嬭瘯浠诲姟璋冨害鍣�
+ * 鏀寔涓烘寚瀹氶」鐩垱寤哄拰绠$悊鑷姩娴嬭瘯浠诲姟
+ * 
+ * 璁捐鎬濊矾锛�
+ * 1. 缁存姢projectId -> 鑷姩浠诲姟閰嶇疆鐨勬槧灏�
+ * 2. 鏀寔鍔ㄦ�佸惎鍔�/鍋滄鑷姩娴嬭瘯
+ * 3. 姣忎釜椤圭洰鍙嫭绔嬮厤缃嚜鍔ㄦ祴璇曞弬鏁�
+ * 4. 鍦≒lcTestController涓皟鐢紝閰嶅悎AUTOMATIC妯″紡
+ * 
+ * @author huang
+ * @date 2025/11/04
+ */
+@Slf4j
+@Component
+public class PlcAutoTestTaskScheduler {
+    
+    @Resource
+    private PlcTestWriteService plcTestWriteService;
+    
+    @Resource
+    private PlcTestTaskService plcTestTaskService;
+    
+    @Resource
+    private PlcAddressService plcAddressService;
+    
+    /**
+     * 鑷姩浠诲姟閰嶇疆
+     */
+    public static class AutoTaskConfig {
+        /** 椤圭洰ID */
+        public String projectId;
+        /** 妯″潡鍚嶇О */
+        public String module;
+        /** 閫変腑鐨勫瓧娈� */
+        public List<String> selectedFields;
+        /** 鎵ц闂撮殧锛堟绉掞級 */
+        public long intervalMs;
+        /** 璇锋眰鍚庡埌姹囨姤涔嬮棿鐨勫鐞嗗欢杩熸椂闂达紙姣锛� */
+        public long processDelayMs;
+        /** 鏈�澶ч噸璇曟鏁� */
+        public int maxRetries;
+        /** 鏄惁鍚敤 */
+        public boolean enabled;
+        /** 杩愯涓殑浠诲姟绾跨▼ */
+        public volatile Thread taskThread;
+        
+        public AutoTaskConfig(String projectId, String module, List<String> selectedFields, long intervalMs, long processDelayMs) {
+            this.projectId = projectId;
+            this.module = module;
+            this.selectedFields = selectedFields;
+            this.intervalMs = intervalMs;
+            this.processDelayMs = processDelayMs > 0 ? processDelayMs : 1000;  // 榛樿1绉�
+            this.maxRetries = 3;
+            this.enabled = false;
+            this.taskThread = null;
+        }
+    }
+    
+    /** projectId -> AutoTaskConfig 鐨勬槧灏� */
+    private final Map<String, AutoTaskConfig> autoTaskConfigs = new ConcurrentHashMap<>();
+    
+    /**
+     * 鍚姩鑷姩娴嬭瘯浠诲姟
+     *
+     * @param projectId      椤圭洰ID
+     * @param module         妯″潡鍚嶇О
+     * @param selectedFields 閫変腑鐨勫瓧娈靛垪琛�
+     * @param intervalMs     鎵ц闂撮殧锛堟绉掞級
+     * @param processDelayMs 璇锋眰鍚庡埌姹囨姤涔嬮棿鐨勫鐞嗗欢杩燂紙姣锛�
+     * @return
+     */
+    public PlcTestTask startAutoTest(String projectId, String module, List<String> selectedFields, long intervalMs, long processDelayMs) {
+        try {
+            // 妫�鏌ユ槸鍚﹀凡瀛樺湪璇ラ」鐩殑鑷姩浠诲姟
+            if (autoTaskConfigs.containsKey(projectId) && autoTaskConfigs.get(projectId).enabled) {
+                log.warn("椤圭洰 {} 鐨勮嚜鍔ㄦ祴璇曚换鍔″凡鍦ㄨ繍琛岋紝璇峰厛鍋滄", projectId);
+                return null;
+            }
+            
+            // 鍒涘缓鎴栨洿鏂伴厤缃�
+            AutoTaskConfig config = new AutoTaskConfig(projectId, module, selectedFields, intervalMs, processDelayMs);
+            config.enabled = true;
+            
+            // 鍒涘缓骞跺惎鍔ㄤ换鍔$嚎绋�
+            config.taskThread = new Thread(() -> executeAutoTestLoop(config), "AutoTest-" + projectId);
+            config.taskThread.setDaemon(false);
+            config.taskThread.start();
+            
+            autoTaskConfigs.put(projectId, config);
+            log.info("鍚姩鑷姩娴嬭瘯浠诲姟锛宲rojectId: {}, module: {}, interval: {}ms", projectId, module, intervalMs);
+        } catch (Exception e) {
+            log.error("鍚姩鑷姩娴嬭瘯浠诲姟澶辫触锛宲rojectId: {}", projectId, e);
+        }
+        return null;
+    }
+    
+    /**
+     * 鍋滄鑷姩娴嬭瘯浠诲姟
+     * 
+     * @param projectId 椤圭洰ID
+     */
+    public void stopAutoTest(String projectId) {
+        try {
+            AutoTaskConfig config = autoTaskConfigs.get(projectId);
+            if (config == null) {
+                log.warn("椤圭洰 {} 鐨勮嚜鍔ㄦ祴璇曚换鍔′笉瀛樺湪", projectId);
+                return;
+            }
+            
+            config.enabled = false;
+            
+            // 涓柇绾跨▼
+            if (config.taskThread != null && config.taskThread.isAlive()) {
+                config.taskThread.interrupt();
+                try {
+                    config.taskThread.join(5000); // 绛夊緟绾跨▼缁撴潫锛屾渶澶�5绉�
+                } catch (InterruptedException e) {
+                    log.warn("绛夊緟鑷姩娴嬭瘯浠诲姟绾跨▼缁撴潫鏃惰涓柇");
+                }
+            }
+            
+            autoTaskConfigs.remove(projectId);
+            log.info("鍋滄鑷姩娴嬭瘯浠诲姟锛宲rojectId: {}", projectId);
+        } catch (Exception e) {
+            log.error("鍋滄鑷姩娴嬭瘯浠诲姟澶辫触锛宲rojectId: {}", projectId, e);
+        }
+    }
+    
+    /**
+     * 妫�鏌ヨ嚜鍔ㄦ祴璇曚换鍔℃槸鍚﹁繍琛屼腑
+     * 
+     * @param projectId 椤圭洰ID
+     * @return true琛ㄧず杩愯涓�
+     */
+    public boolean isAutoTestRunning(String projectId) {
+        AutoTaskConfig config = autoTaskConfigs.get(projectId);
+        return config != null && config.enabled;
+    }
+    
+    /**
+     * 鑾峰彇鑷姩浠诲姟閰嶇疆
+     * 
+     * @param projectId 椤圭洰ID
+     * @return 閰嶇疆淇℃伅
+     */
+    public AutoTaskConfig getAutoTaskConfig(String projectId) {
+        return autoTaskConfigs.get(projectId);
+    }
+    
+    /**
+     * 鑷姩娴嬭瘯寰幆鎵ц
+     * 
+     * @param config 浠诲姟閰嶇疆
+     */
+    private void executeAutoTestLoop(AutoTaskConfig config) {
+        log.info("鑷姩娴嬭瘯寰幆宸插惎鍔紝projectId: {}", config.projectId);
+        
+        int cycleCount = 0;
+        while (config.enabled && !Thread.currentThread().isInterrupted()) {
+            try {
+                cycleCount++;
+                log.info("鎵ц鑷姩娴嬭瘯寰幆 #{}, projectId: {}", cycleCount, config.projectId);
+                
+                // 鑾峰彇椤圭洰閰嶇疆
+                PlcAddress plcConfig = plcAddressService.getMappingByProjectId(config.projectId);
+                if (plcConfig == null) {
+                    log.error("鏃犳硶鑾峰彇椤圭洰 {} 鐨凱LC閰嶇疆", config.projectId);
+                    continue;
+                }
+                
+                // 鍒涘缓鑷姩浠诲姟璁板綍
+                PlcTestTask task = new PlcTestTask();
+                task.setProjectId(config.projectId);
+                task.setModule(config.module);
+                task.setOperationMode("AUTOMATIC");
+                task.setStatus("RUNNING");
+                task.setStartTime(new Date());
+                if (config.selectedFields != null) {
+                    task.setSelectedFields(String.join(",", config.selectedFields));
+                }
+                
+                // 淇濆瓨浠诲姟骞惰幏鍙朓D
+                PlcTestTask savedTask = plcTestTaskService.createTask(task);
+                if (savedTask == null || savedTask.getId() == null) {
+                    log.error("淇濆瓨浠诲姟澶辫触锛屾棤娉曡幏鍙栦换鍔D锛宲rojectId: {}", config.projectId);
+                    continue;
+                }
+                Long id = savedTask.getId();
+                
+                // 鎵ц娴嬭瘯姝ラ
+                long startTime = System.currentTimeMillis();
+                boolean success = true;
+                String errorMessage = null;
+                
+                try {
+                    // 姝ラ1锛氬彂閫丳LC璇锋眰
+                    log.debug("姝ラ1锛氬彂閫丳LC璇锋眰锛宨d: {}", id);
+                    boolean requestSuccess = plcTestWriteService.simulatePlcRequest(config.projectId);
+                    if (!requestSuccess) {
+                        throw new RuntimeException("PLC璇锋眰鍙戦�佸け璐�");
+                    }
+                    
+                    // 姝ラ2锛氱瓑寰匨ES澶勭悊锛堜娇鐢ㄧ敤鎴烽厤缃殑寤惰繜鏃堕棿锛�
+                    log.debug("姝ラ2锛氱瓑寰匨ES澶勭悊 {}ms", config.processDelayMs);
+                    Thread.sleep(config.processDelayMs);
+                    
+                    // 姝ラ3锛氭眹鎶ュ畬鎴�
+                    log.debug("姝ラ3锛氭眹鎶ュ畬鎴愶紝id: {}", id);
+                    boolean reportSuccess = plcTestWriteService.simulatePlcReport(config.projectId);
+                    if (!reportSuccess) {
+                        throw new RuntimeException("PLC姹囨姤澶辫触");
+                    }
+                    
+                    // 姝ラ4锛氱‘璁ゅ畬鎴�
+                    log.debug("姝ラ4锛氱‘璁ゅ畬鎴愶紝id: {}", id);
+                    
+                } catch (Exception e) {
+                    success = false;
+                    errorMessage = e.getMessage();
+                    log.error("鑷姩娴嬭瘯鎵ц鍑洪敊锛宨d: {}", id, e);
+                }
+                
+                // 鏇存柊浠诲姟瀹屾垚鐘舵��
+                long duration = System.currentTimeMillis() - startTime;
+                String finalStatus = success ? "SUCCESS" : "FAILED";
+                plcTestTaskService.completeTask(id, finalStatus, (int) duration, 
+                    "{\"cycle\": " + cycleCount + "}", errorMessage);
+                
+                log.info("鑷姩娴嬭瘯寰幆 #{} 瀹屾垚锛宨d: {}, status: {}", cycleCount, id, finalStatus);
+                
+                // 绛夊緟涓嬩竴娆℃墽琛�
+                if (config.enabled) {
+                    log.debug("绛夊緟 {}ms 鍚庢墽琛屼笅涓�杞�", config.intervalMs);
+                    Thread.sleep(config.intervalMs);
+                }
+                
+            } catch (InterruptedException e) {
+                log.info("鑷姩娴嬭瘯寰幆琚腑鏂紝projectId: {}", config.projectId);
+                Thread.currentThread().interrupt();
+                break;
+            } catch (Exception e) {
+                log.error("鑷姩娴嬭瘯寰幆鎵ц寮傚父锛宲rojectId: {}", config.projectId, e);
+                try {
+                    Thread.sleep(config.intervalMs);
+                } catch (InterruptedException ie) {
+                    log.info("鑷姩娴嬭瘯寰幆琚腑鏂�");
+                    break;
+                }
+            }
+        }
+        
+        log.info("鑷姩娴嬭瘯寰幆宸茬粨鏉燂紝projectId: {}, 鍏辨墽琛� {} 杞�", config.projectId, cycleCount);
+    }
+    
+    /**
+     * 鍋滄鎵�鏈夎繍琛屼腑鐨勮嚜鍔ㄦ祴璇曚换鍔�
+     */
+    public void stopAllAutoTests() {
+        List<String> projectIds = new ArrayList<>(autoTaskConfigs.keySet());
+        for (String projectId : projectIds) {
+            stopAutoTest(projectId);
+        }
+        log.info("宸插仠姝㈡墍鏈夎嚜鍔ㄦ祴璇曚换鍔�");
+    }
+    
+    /**
+     * 鑾峰彇鎵�鏈夎繍琛屼腑鐨勮嚜鍔ㄤ换鍔�
+     * 
+     * @return projectId鍒楄〃
+     */
+    public List<String> getRunningAutoTests() {
+        List<String> result = new ArrayList<>();
+        for (Map.Entry<String, AutoTaskConfig> entry : autoTaskConfigs.entrySet()) {
+            if (entry.getValue().enabled) {
+                result.add(entry.getKey());
+            }
+        }
+        return result;
+    }
+}

--
Gitblit v1.8.0