From 0a4d548b6bf9cfef252400fb6d6612e45cf5b602 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 27 十月 2026 13:21:23 +0800
Subject: [PATCH] fix(scheduler): 修复定时任务调度问题并增强系统稳定性
---
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java | 76 +++++++++++++++++++++++++++++++++++---
1 files changed, 70 insertions(+), 6 deletions(-)
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
index 779dc5f..deb88ac 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -12,6 +12,7 @@
import com.ruoyi.inspectiontask.service.TimingTaskService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
+import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
@@ -38,6 +39,33 @@
private static final int ENABLED = 1;
private static final int DISABLED = 0;
+ /**
+ * 鍚姩鏃舵妸宸插惎鐢ㄤ絾鏈敞鍐屽埌 Quartz 鐨勫贰妫�浠诲姟琛ユ敞鍐岋紝
+ * 閬垮厤璋冨害璁板綍涓㈠け鍚庡畾鏃朵换鍔¢潤榛樹笉鎵ц
+ */
+ @PostConstruct
+ public void restoreScheduledTasks() {
+ try {
+ List<TimingTask> tasks = timingTaskMapper.selectList(new LambdaQueryWrapper<TimingTask>()
+ .eq(TimingTask::getIsEnabled, ENABLED)
+ .eq(TimingTask::getDeleted, 0));
+ for (TimingTask task : tasks) {
+ try {
+ LocalDateTime nextTime = calculateFirstExecutionTime(task);
+ if (!Objects.equals(task.getNextExecutionTime(), nextTime)) {
+ task.setNextExecutionTime(nextTime);
+ timingTaskMapper.updateById(task);
+ }
+ timingTaskScheduler.ensureScheduled(task);
+ } catch (Exception e) {
+ log.error("鎭㈠宸℃瀹氭椂浠诲姟澶辫触: id={}, name={}", task.getId(), task.getTaskName(), e);
+ }
+ }
+ } catch (Exception e) {
+ log.error("鎭㈠宸℃瀹氭椂浠诲姟寮傚父", e);
+ }
+ }
+
@Override
public IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask) {
@@ -53,6 +81,7 @@
if (timingTask.getIsEnabled() != null) {
queryWrapper.eq(TimingTask::getIsEnabled, timingTask.getIsEnabled());
}
+ queryWrapper.orderByDesc(TimingTask::getCreateTime);
IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, queryWrapper);
// 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
@@ -160,8 +189,11 @@
}
return result;
} else {
-
-
+ // 棰戠巼鍙樺寲鏃堕噸绠椾笅娆℃墽琛屾椂闂达紝閬垮厤椤甸潰鏄剧ず涓庡疄闄呰皟搴︿笉涓�鑷�
+ if (!Objects.equals(oldTimingTask.getFrequencyType(), timingTask.getFrequencyType())
+ || !Objects.equals(oldTimingTask.getFrequencyDetail(), timingTask.getFrequencyDetail())) {
+ timingTask.setNextExecutionTime(calculateFirstExecutionTime(timingTask));
+ }
int result = timingTaskMapper.updateById(timingTask);
if (result > 0) {
boolean oldEnabled = isEnabled(oldTimingTask == null ? null : oldTimingTask.getIsEnabled(), oldTimingTask != null && oldTimingTask.isActive());
@@ -193,8 +225,8 @@
// 濡傛灉鏄瘡鏈堟墽琛岋紝璁$畻涓嬩釜鏈堢殑鍏蜂綋鏃ユ湡
return calculateMonthlyFirstExecution(task.getFrequencyDetail());
} else if ("QUARTERLY".equals(frequencyType)) {
- // 鑷畾涔夐鐜囷紝濡傛瘡灏忔椂銆佹瘡30鍒嗛挓绛�
- return calculateCustomFirstExecution(task.getFrequencyDetail());
+ // 瀛e害鎵ц锛屾牸寮忎负 鏈�,鏃�,鏃堕棿
+ return calculateQuarterlyFirstExecution(task.getFrequencyDetail());
} else {
throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
}
@@ -313,8 +345,40 @@
return targetDateTime;
}
- private LocalDateTime calculateCustomFirstExecution(String frequencyDetail) {
- return null;
+ /**
+ * 璁$畻瀛e害浠诲姟鐨勯娆℃墽琛屾椂闂达紝鏍煎紡涓� 鏈�,鏃�,鏃堕棿锛堝 01,15,14:00锛�
+ * 鎵ц鏈堜唤鎸夊搴﹁捣鐐瑰榻愶紝涓� convertQuarterlyToCron 鐢熸垚鐨� cron 淇濇寔涓�鑷�
+ */
+ private LocalDateTime calculateQuarterlyFirstExecution(String frequencyDetail) {
+ String[] parts = frequencyDetail.split(",");
+ if (parts.length != 3) {
+ throw new IllegalArgumentException("鍙傛暟鏍煎紡閿欒锛屽簲涓�'01,15,14:00'鏍煎紡");
+ }
+ int month = Integer.parseInt(parts[0].trim());
+ int dayOfMonth = Integer.parseInt(parts[1].trim());
+ LocalTime time = LocalTime.parse(parts[2].trim(), DateTimeFormatter.ofPattern("HH:mm"));
+ if (month < 1 || month > 12) {
+ throw new IllegalArgumentException("鏈堜唤蹇呴』鍦�1-12涔嬮棿: " + month);
+ }
+ if (dayOfMonth < 1 || dayOfMonth > 31) {
+ throw new IllegalArgumentException("鏃ユ湡蹇呴』鍦�1-31涔嬮棿: " + dayOfMonth);
+ }
+
+ // 鎸夊搴﹁捣鐐瑰榻愭墽琛屾湀浠斤紙1銆�4銆�7銆�10 鏈堬級
+ int quarterStartMonth = ((month - 1) / 3) * 3 + 1;
+ LocalDateTime now = LocalDateTime.now();
+ int currentYear = now.getYear();
+ for (int i = 0; i < 8; i++) {
+ int totalMonth = quarterStartMonth + i * 3;
+ int year = currentYear + (totalMonth - 1) / 12;
+ int targetMonth = ((totalMonth - 1) % 12) + 1;
+ int adjustedDay = Math.min(dayOfMonth, YearMonth.of(year, targetMonth).lengthOfMonth());
+ LocalDateTime candidate = LocalDateTime.of(year, targetMonth, adjustedDay, time.getHour(), time.getMinute());
+ if (candidate.isAfter(now)) {
+ return candidate;
+ }
+ }
+ throw new IllegalStateException("鏃犳硶璁$畻瀛e害浠诲姟鐨勯娆℃墽琛屾椂闂�: " + frequencyDetail);
}
@Override
--
Gitblit v1.9.3