From a2d3c6f8d43fbf9daa372fea53acf50642094de4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 16 五月 2026 10:49:06 +0800
Subject: [PATCH] feat(task): 添加定时任务启用禁用功能
---
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 108 insertions(+), 9 deletions(-)
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
index 5c84b2e..30122c3 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -17,8 +17,10 @@
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.extern.slf4j.Slf4j;
+import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -36,14 +38,19 @@
@Autowired
private MaintenanceTaskMapper maintenanceTaskMapper;
+
@Autowired
private SysUserMapper sysUserMapper;
+
@Autowired
private TimingTaskServiceImpl timingTaskService;
+
@Autowired
private MaintenanceTaskScheduler maintenanceTaskScheduler;
+
@Autowired
private IDeviceLedgerService deviceLedgerService;
+
@Autowired
private DeviceAreaMapper deviceAreaMapper;
@@ -57,6 +64,10 @@
if (maintenanceTask.getAreaId() != null) {
queryWrapper.eq(MaintenanceTask::getAreaId, maintenanceTask.getAreaId());
}
+ if (maintenanceTask.getIsEnabled() != null) {
+ queryWrapper.eq(MaintenanceTask::getIsEnabled, maintenanceTask.getIsEnabled());
+ }
+
Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper);
if (taskPage.getRecords().isEmpty()) {
return AjaxResult.success(taskPage);
@@ -74,6 +85,7 @@
List<SysUser> users = sysUserMapper.selectUserByIds(new ArrayList<>(userIds));
users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
}
+
Map<Long, String> areaNameMap = deviceAreaMapper.selectBatchIds(taskPage.getRecords().stream()
.map(MaintenanceTask::getAreaId)
.filter(java.util.Objects::nonNull)
@@ -81,6 +93,7 @@
.collect(Collectors.toList()))
.stream()
.collect(Collectors.toMap(DeviceArea::getId, DeviceArea::getAreaName, (left, right) -> left, HashMap::new));
+
taskPage.getRecords().forEach(task -> {
if (task.getRegistrantId() != null) {
task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "鏈煡鐢ㄦ埛"));
@@ -91,37 +104,70 @@
}
@Override
+ @Transactional
public AjaxResult add(MaintenanceTask maintenanceTask) {
if (!prepareMaintenanceTask(maintenanceTask)) {
return AjaxResult.error("璇烽�夋嫨璁惧");
}
- maintenanceTask.setActive(true);
+ if (maintenanceTask.getIsEnabled() == null) {
+ maintenanceTask.setIsEnabled(1);
+ }
+
TimingTask task = new TimingTask();
task.setFrequencyType(maintenanceTask.getFrequencyType());
task.setFrequencyDetail(maintenanceTask.getFrequencyDetail());
LocalDateTime firstExecutionTime = timingTaskService.calculateFirstExecutionTime(task);
maintenanceTask.setNextExecutionTime(firstExecutionTime);
+
int insert = maintenanceTaskMapper.insert(maintenanceTask);
if (insert > 0) {
- maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+ AjaxResult schedulerResult = resetSchedulerStatus(maintenanceTask);
+ if (schedulerResult.isError()) {
+ return schedulerResult;
+ }
}
return AjaxResult.success("娣诲姞鎴愬姛");
}
@Override
+ @Transactional
public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
- MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId());
- if (maintenanceTask1 == null) {
+ if (maintenanceTask.getId() == null) {
+ return AjaxResult.error("id涓嶈兘涓虹┖");
+ }
+
+ MaintenanceTask currentTask = maintenanceTaskMapper.selectById(maintenanceTask.getId());
+ if (currentTask == null) {
return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
}
- BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
- if (!prepareMaintenanceTask(maintenanceTask1)) {
+
+ Integer oldEnabled = currentTask.getIsEnabled();
+ LocalDateTime oldNextExecutionTime = currentTask.getNextExecutionTime();
+ BeanUtils.copyProperties(maintenanceTask, currentTask);
+ if (maintenanceTask.getIsEnabled() == null) {
+ currentTask.setIsEnabled(oldEnabled);
+ }
+ if (maintenanceTask.getNextExecutionTime() == null) {
+ currentTask.setNextExecutionTime(oldNextExecutionTime);
+ }
+ if (!prepareMaintenanceTask(currentTask)) {
return AjaxResult.error("璇烽�夋嫨璁惧");
}
- maintenanceTask1.setDeviceLedgerIds(null);
- int update = maintenanceTaskMapper.updateById(maintenanceTask1);
+
+ currentTask.setDeviceLedgerIds(null);
+ if (currentTask.getNextExecutionTime() == null) {
+ TimingTask task = new TimingTask();
+ task.setFrequencyType(currentTask.getFrequencyType());
+ task.setFrequencyDetail(currentTask.getFrequencyDetail());
+ currentTask.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(task));
+ }
+
+ int update = maintenanceTaskMapper.updateById(currentTask);
if (update > 0) {
- maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ AjaxResult schedulerResult = resetSchedulerStatus(currentTask);
+ if (schedulerResult.isError()) {
+ return schedulerResult;
+ }
}
return AjaxResult.success("鏇存柊鎴愬姛");
}
@@ -133,6 +179,57 @@
ids.forEach(id -> maintenanceTaskScheduler.unscheduleMaintenanceTask(id));
}
return AjaxResult.success("鍒犻櫎鎴愬姛");
+ }
+
+ @Override
+ @Transactional
+ public AjaxResult changeEnable(Long taskId, Integer isEnabled) {
+ if (taskId == null || isEnabled == null) {
+ return AjaxResult.error("id鍜宨sEnabled涓嶈兘涓虹┖");
+ }
+
+ MaintenanceTask task = maintenanceTaskMapper.selectById(taskId);
+ if (task == null) {
+ return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
+ }
+ task.setIsEnabled(isEnabled);
+ if (task.getNextExecutionTime() == null) {
+ TimingTask timingTask = new TimingTask();
+ timingTask.setFrequencyType(task.getFrequencyType());
+ timingTask.setFrequencyDetail(task.getFrequencyDetail());
+ task.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(timingTask));
+ }
+
+ int update = maintenanceTaskMapper.updateById(task);
+ if (update > 0) {
+ AjaxResult schedulerResult = resetSchedulerStatus(task);
+ if (schedulerResult.isError()) {
+ return schedulerResult;
+ }
+ }
+ return AjaxResult.success("鏇存柊鎴愬姛");
+ }
+
+ private AjaxResult resetSchedulerStatus(MaintenanceTask task) {
+ try {
+ maintenanceTaskScheduler.rescheduleMaintenanceTask(task);
+ if (isTaskEnabled(task.getIsEnabled())) {
+ maintenanceTaskScheduler.resumeMaintenanceTask(task.getId());
+ } else {
+ maintenanceTaskScheduler.pauseMaintenanceTask(task.getId());
+ }
+ return AjaxResult.success();
+ } catch (SchedulerException e) {
+ log.error("resetSchedulerStatus error, taskId={}", task.getId(), e);
+ return AjaxResult.error("鏇存柊璋冨害鐘舵�佸け璐�");
+ } catch (RuntimeException e) {
+ log.error("resetSchedulerStatus runtime error, taskId={}", task.getId(), e);
+ return AjaxResult.error("鏇存柊璋冨害鐘舵�佸け璐�");
+ }
+ }
+
+ private boolean isTaskEnabled(Integer isEnabled) {
+ return isEnabled == null || isEnabled == 1;
}
private boolean prepareMaintenanceTask(MaintenanceTask task) {
@@ -150,6 +247,7 @@
if (validIds.isEmpty()) {
return false;
}
+
List<DeviceLedger> devices = validIds.stream()
.map(deviceLedgerService::getById)
.filter(device -> device != null)
@@ -157,6 +255,7 @@
if (devices.isEmpty()) {
return false;
}
+
task.setTaskId(devices.get(0).getId());
if (task.getAreaId() == null) {
task.setAreaId(devices.get(0).getAreaId());
--
Gitblit v1.9.3