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