From 4f55d3cb4bc644e4534106336f2047af1a4db5df Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 29 五月 2026 18:09:46 +0800
Subject: [PATCH] feat(config): 添加新环境配置并扩展设备台账功能
---
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java | 142 ++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 121 insertions(+), 21 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 d6cffe4..4508625 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -1,20 +1,22 @@
package com.ruoyi.inspectiontask.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.device.mapper.DeviceAreaMapper;
+import com.ruoyi.device.pojo.DeviceArea;
import com.ruoyi.inspectiontask.dto.TimingTaskDto;
-import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
import com.ruoyi.inspectiontask.mapper.TimingTaskMapper;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import com.ruoyi.inspectiontask.service.TimingTaskService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
+import lombok.RequiredArgsConstructor;
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;
@@ -29,25 +31,39 @@
*/
@Service
@Slf4j
+@RequiredArgsConstructor
public class TimingTaskServiceImpl extends ServiceImpl<TimingTaskMapper, TimingTask> implements TimingTaskService {
- @Autowired
- private TimingTaskMapper timingTaskMapper;
-
- @Autowired
- private InspectionTaskMapper inspectionTaskMapper;
-
- @Autowired
- private TimingTaskScheduler timingTaskScheduler;
-
- @Autowired
- private SysUserMapper sysUserMapper;
+ private final TimingTaskMapper timingTaskMapper;
+ private final TimingTaskScheduler timingTaskScheduler;
+ private final SysUserMapper sysUserMapper;
+ private final DeviceAreaMapper deviceAreaMapper;
+ private static final int ENABLED = 1;
+ private static final int DISABLED = 0;
@Override
public IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask) {
// 1. 鍏堝垎椤垫煡璇㈠畾鏃朵换鍔℃暟鎹�
- IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, null);
+ // 鏋勫缓鏌ヨ鏉′欢
+ LambdaQueryWrapper<TimingTask> queryWrapper = new LambdaQueryWrapper<>();
+ if (StringUtils.isNotBlank(timingTask.getTaskName())) {
+ queryWrapper.like(TimingTask::getTaskName, timingTask.getTaskName());
+ }
+ if (StringUtils.isNotBlank(timingTask.getInspectionProject())) {
+ queryWrapper.like(TimingTask::getInspectionProject, timingTask.getInspectionProject());
+ }
+ if (timingTask.getIsEnabled() != null) {
+ queryWrapper.eq(TimingTask::getIsEnabled, timingTask.getIsEnabled());
+ }
+ if (timingTask.getAreaId() != null) {
+ queryWrapper.eq(TimingTask::getAreaId, timingTask.getAreaId());
+ }
+ if (StringUtils.isNotBlank(timingTask.getTaskIdsStr())) {
+ queryWrapper.like(TimingTask::getTaskIdsStr, timingTask.getTaskIdsStr());
+ }
+ queryWrapper.orderByDesc(TimingTask::getCreateTime);
+ IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, queryWrapper);
// 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
if (taskPage.getRecords().isEmpty()) {
@@ -82,6 +98,17 @@
users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
}
+ // 4.1 鎵归噺鏌ヨ鍖哄煙鍚嶇О
+ Set<Long> areaIds = taskPage.getRecords().stream()
+ .map(TimingTask::getAreaId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ Map<Long, String> areaNameMap = new HashMap<>();
+ if (!areaIds.isEmpty()) {
+ List<DeviceArea> areas = deviceAreaMapper.selectBatchIds(new ArrayList<>(areaIds));
+ areas.forEach(area -> areaNameMap.put(area.getId(), area.getAreaName()));
+ }
+
// 5. 杞崲涓篋TO
List<TimingTaskDto> dtoList = taskPage.getRecords().stream().map(task -> {
TimingTaskDto dto = new TimingTaskDto();
@@ -105,6 +132,11 @@
dto.setInspector(inspectorNickNames);
}
+ // 璁剧疆鍖哄煙鍚嶇О
+ if (task.getAreaId() != null) {
+ dto.setAreaName(areaNameMap.getOrDefault(task.getAreaId(), ""));
+ }
+
return dto;
}).collect(Collectors.toList());
@@ -115,10 +147,19 @@
}
@Override
- @Transactional
+ @Transactional(rollbackFor = Exception.class)
public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException {
+ TimingTask oldTimingTask = null;
+ if (Objects.nonNull(timingTaskDto.getId())) {
+ oldTimingTask = timingTaskMapper.selectById(timingTaskDto.getId());
+ if (oldTimingTask == null) {
+ throw new IllegalArgumentException("瀹氭椂浠诲姟涓嶅瓨鍦�");
+ }
+ }
TimingTask timingTask = new TimingTask();
BeanUtils.copyProperties(timingTaskDto, timingTask);
+ timingTask.setIsEnabled(resolveEnabledValue(timingTask.getIsEnabled(), oldTimingTask));
+ timingTask.setActive(ENABLED == timingTask.getIsEnabled());
// 1. 瑙f瀽瀛楃涓蹭负 LocalDate锛堝彧鍖呭惈骞存湀鏃ワ級
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.now();
@@ -134,13 +175,12 @@
// 璁剧疆鍒涘缓浜轰俊鎭拰榛樿鍊�
if (Objects.isNull(timingTaskDto.getId())) {
timingTask.setRegistrationDate(LocalDate.now());
- timingTask.setActive(true);
// 璁$畻棣栨鎵ц鏃堕棿
LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask);
timingTask.setNextExecutionTime(firstExecutionTime);
int result = timingTaskMapper.insert(timingTask);
- if (result > 0) {
+ if (result > 0 && isEnabled(timingTask.getIsEnabled(), timingTask.isActive())) {
// 鏂板鎴愬姛鍚庢坊鍔犲埌璋冨害鍣�
timingTaskScheduler.scheduleTimingTask(timingTask);
}
@@ -150,11 +190,48 @@
int result = timingTaskMapper.updateById(timingTask);
if (result > 0) {
- // 鏇存柊鎴愬姛鍚庨噸鏂拌皟搴︿换鍔�
- timingTaskScheduler.rescheduleTimingTask(timingTask);
+ boolean oldEnabled = isEnabled(oldTimingTask == null ? null : oldTimingTask.getIsEnabled(), oldTimingTask != null && oldTimingTask.isActive());
+ boolean newEnabled = isEnabled(timingTask.getIsEnabled(), timingTask.isActive());
+ if (!newEnabled) {
+ timingTaskScheduler.unscheduleTimingTask(timingTask.getId());
+ } else if (oldEnabled) {
+ // 鏇存柊鎴愬姛鍚庨噸鏂拌皟搴︿换鍔�
+ timingTaskScheduler.rescheduleTimingTask(timingTask);
+ } else {
+ // 浠庣鐢ㄦ敼涓哄惎鐢ㄦ椂閲嶆柊鍒涘缓璋冨害浠诲姟
+ timingTaskScheduler.scheduleTimingTask(timingTask);
+ }
}
return result;
}
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int changeEnable(Long id, Integer isEnabled) throws SchedulerException {
+ TimingTask oldTimingTask = timingTaskMapper.selectById(id);
+ if (oldTimingTask == null) {
+ throw new IllegalArgumentException("瀹氭椂浠诲姟涓嶅瓨鍦�");
+ }
+ TimingTask update = new TimingTask();
+ update.setId(id);
+ update.setIsEnabled(resolveEnabledValue(isEnabled, oldTimingTask));
+ update.setActive(ENABLED == update.getIsEnabled());
+
+ int result = timingTaskMapper.updateById(update);
+ if (result <= 0) {
+ return result;
+ }
+
+ boolean enabled = isEnabled(update.getIsEnabled(), update.isActive());
+ if (!enabled) {
+ timingTaskScheduler.unscheduleTimingTask(id);
+ } else if (oldTimingTask.getIsEnabled() != null && oldTimingTask.getIsEnabled() == DISABLED) {
+ timingTaskScheduler.scheduleTimingTask(oldTimingTask);
+ } else {
+ timingTaskScheduler.resumeTimingTask(id);
+ }
+ return result;
}
public LocalDateTime calculateFirstExecutionTime(TimingTask task) {
@@ -291,7 +368,7 @@
}
private LocalDateTime calculateCustomFirstExecution(String frequencyDetail) {
- return null;
+ return TimingTaskScheduleUtils.calculateFirstExecutionTime("QUARTERLY", frequencyDetail);
}
@Override
@@ -397,7 +474,7 @@
/**
* 璁$畻姣忓搴︿换鍔$殑涓嬫鎵ц鏃堕棿
*/
- private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) {
+ private LocalDateTime calculateQuarterlyNextTimeLegacy(String detail, LocalDateTime current) {
String[] parts = detail.split(",");
int quarterMonth = Integer.parseInt(parts[0]); // 1=绗�1涓湀锛�2=绗�2涓湀锛�3=绗�3涓湀
int dayOfMonth = Integer.parseInt(parts[1]);
@@ -433,6 +510,9 @@
/**
* 瑙f瀽鏄熸湡鍑犲瓧绗︿覆
*/
+ private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) {
+ return TimingTaskScheduleUtils.calculateNextExecutionTime("QUARTERLY", detail, current);
+ }
private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) {
Set<DayOfWeek> days = new HashSet<>();
String[] dayStrs = dayOfWeekStr.split("\\|");
@@ -453,6 +533,26 @@
return days;
}
+ private Integer resolveEnabledValue(Integer requestEnabled, TimingTask oldTimingTask) {
+ if (requestEnabled != null) {
+ return requestEnabled;
+ }
+ if (oldTimingTask != null) {
+ if (oldTimingTask.getIsEnabled() != null) {
+ return oldTimingTask.getIsEnabled();
+ }
+ return oldTimingTask.isActive() ? ENABLED : DISABLED;
+ }
+ return ENABLED;
+ }
+
+ private boolean isEnabled(Integer enabledValue, boolean activeFallback) {
+ if (enabledValue != null) {
+ return ENABLED == enabledValue;
+ }
+ return activeFallback;
+ }
+
@Override
--
Gitblit v1.9.3