From 6bab142343375e744e46f2042aa3b0fedea70b06 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 19 五月 2026 23:32:55 +0800
Subject: [PATCH] fix: 设备巡检修改
---
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java | 281 +++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 226 insertions(+), 55 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 511fbd7..354f971 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -1,8 +1,10 @@
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.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.inspectiontask.dto.TimingTaskDto;
@@ -13,12 +15,12 @@
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.*;
+import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -46,7 +48,12 @@
@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());
+ }
+ IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, queryWrapper);
// 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
if (taskPage.getRecords().isEmpty()) {
@@ -65,6 +72,7 @@
// 鏀堕泦宸℃浜篒D锛堝涓狪D浠ラ�楀彿鍒嗛殧锛�
taskPage.getRecords().forEach(task -> {
+ task.setDateStr(task.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
if (StringUtils.isNotBlank(task.getInspectorIds())) {
Arrays.stream(task.getInspectorIds().split(","))
.filter(StringUtils::isNotBlank)
@@ -73,10 +81,17 @@
}
});
+ // 鏀堕泦楠屾敹鍏D
+ taskPage.getRecords().forEach(task -> {
+ if (task.getInspectionAcceptorId() != null) {
+ userIds.add(task.getInspectionAcceptorId());
+ }
+ });
+
// 4. 鎵归噺鏌ヨ鐢ㄦ埛淇℃伅
Map<Long, String> userNickNameMap = new HashMap<>();
if (!userIds.isEmpty()) {
- List<SysUser> users = sysUserMapper.selectUserByIds((List<Long>) userIds);
+ List<SysUser> users = sysUserMapper.selectUserByIds((new ArrayList<>(userIds)));
users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
}
@@ -93,14 +108,19 @@
// 璁剧疆宸℃浜烘樀绉板垪琛�
if (StringUtils.isNotBlank(task.getInspectorIds())) {
- List<String> inspectorNickNames = Arrays.stream(task.getInspectorIds().split(","))
- .filter(StringUtils::isNotBlank)
- .map(idStr -> {
- Long id = Long.valueOf(idStr);
- return userNickNameMap.getOrDefault(id, "鏈煡鐢ㄦ埛");
- })
- .toList();
+ List<String> inspectorNickNames = new ArrayList<>();
+ for (String idStr : task.getInspectorIds().split(",")) {
+ if (StringUtils.isNotBlank(idStr)) {
+ Long id = Long.valueOf(idStr);
+ inspectorNickNames.add(userNickNameMap.getOrDefault(id, "鏈煡鐢ㄦ埛"));
+ }
+ }
dto.setInspector(inspectorNickNames);
+ }
+
+ // 璁剧疆楠屾敹浜烘樀绉�
+ if (task.getInspectionAcceptorId() != null) {
+ dto.setInspectionAcceptor(userNickNameMap.getOrDefault(task.getInspectionAcceptorId(), "鏈煡鐢ㄦ埛"));
}
return dto;
@@ -114,52 +134,82 @@
@Override
@Transactional
- public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException {
+ public int addOrEditTimingTask(TimingTaskDto timingTaskDto) {
TimingTask timingTask = new TimingTask();
BeanUtils.copyProperties(timingTaskDto, timingTask);
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+ LocalDate localDate = LocalDate.now();
- // 璁剧疆鍒涘缓浜轰俊鎭拰榛樿鍊�
+ if (StringUtils.isNotEmpty(timingTaskDto.getDateStr())) {
+ localDate = LocalDate.parse(timingTaskDto.getDateStr(), formatter);
+ }
+ LocalTime currentTime = LocalTime.now();
+ LocalDateTime localDateTime = LocalDateTime.of(localDate, currentTime);
+ timingTask.setCreateTime(localDateTime);
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) {
- // 鏂板鎴愬姛鍚庢坊鍔犲埌璋冨害鍣�
- timingTaskScheduler.scheduleTimingTask(timingTask);
+ // 鏂板鎴愬姛鍚庝笖鍚敤鐘舵�佹墠娣诲姞鍒拌皟搴﹀櫒
+ if (result > 0 && Integer.valueOf(1).equals(timingTask.getIsActive())) {
+ try {
+ timingTaskScheduler.scheduleTimingTask(timingTask);
+ } catch (Exception e) {
+ log.error("娣诲姞宸℃浠诲姟澶辫触 : {}", e.getMessage(), e);
+ throw new ServiceException("娣诲姞宸℃浠诲姟澶辫触");
+ }
}
return result;
} else {
+ // 缂栬緫鏃讹紝淇濆瓨鏃х殑鐘舵��
+ TimingTask oldTask = timingTaskMapper.selectById(timingTaskDto.getId());
+ Integer oldIsActive = oldTask != null ? oldTask.getIsActive() : 0;
+ Integer newIsActive = timingTask.getIsActive();
int result = timingTaskMapper.updateById(timingTask);
if (result > 0) {
- // 鏇存柊鎴愬姛鍚庨噸鏂拌皟搴︿换鍔�
- timingTaskScheduler.rescheduleTimingTask(timingTask);
+ // 浠庡惎鐢ㄥ彉涓哄仠鐢紝绉婚櫎浠诲姟
+ if (Integer.valueOf(1).equals(oldIsActive)
+ && !Integer.valueOf(1).equals(newIsActive)) {
+ timingTaskScheduler.unscheduleTimingTask(timingTask.getId());
+ }
+ // 浠庡仠鐢ㄥ彉涓哄惎鐢紝娣诲姞浠诲姟
+ else if (!Integer.valueOf(1).equals(oldIsActive)
+ && Integer.valueOf(1).equals(newIsActive)) {
+ // 璁$畻棣栨鎵ц鏃堕棿
+ LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask);
+ timingTask.setNextExecutionTime(firstExecutionTime);
+ try {
+ timingTaskScheduler.scheduleTimingTask(timingTask);
+ } catch (Exception e) {
+ log.error("娣诲姞宸℃浠诲姟澶辫触 : {}", e.getMessage(), e);
+ throw new ServiceException("娣诲姞宸℃浠诲姟澶辫触");
+ }
+ }
}
return result;
}
}
- private LocalDateTime calculateFirstExecutionTime(TimingTask task) {
+ public LocalDateTime calculateFirstExecutionTime(TimingTask task) {
// 鏍规嵁棰戠巼绫诲瀷鍜岃鎯呰绠楅娆℃墽琛屾椂闂�
- return switch (task.getFrequencyType()) {
- case "DAILY" ->
- // 濡傛灉鏄瘡澶╂墽琛岋紝璁$畻浠婂ぉ鎴栨槑澶╃殑鍏蜂綋鏃堕棿
- calculateDailyFirstExecution(task.getFrequencyDetail());
- case "WEEKLY" ->
- // 濡傛灉鏄瘡鍛ㄦ墽琛岋紝璁$畻涓嬪懆鐨勫叿浣撴槦鏈熷嚑
- calculateWeeklyFirstExecution(task.getFrequencyDetail());
- case "MONTHLY" ->
- // 濡傛灉鏄瘡鏈堟墽琛岋紝璁$畻涓嬩釜鏈堢殑鍏蜂綋鏃ユ湡
- calculateMonthlyFirstExecution(task.getFrequencyDetail());
- case "QUARTERLY" ->
- // 鑷畾涔夐鐜囷紝濡傛瘡灏忔椂銆佹瘡30鍒嗛挓绛�
- calculateCustomFirstExecution(task.getFrequencyDetail());
- default -> throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
- };
+ String frequencyType = task.getFrequencyType();
+ if ("DAILY".equals(frequencyType)) {
+ // 濡傛灉鏄瘡澶╂墽琛岋紝璁$畻浠婂ぉ鎴栨槑澶╃殑鍏蜂綋鏃堕棿
+ return calculateDailyFirstExecution(task.getFrequencyDetail());
+ } else if ("WEEKLY".equals(frequencyType)) {
+ // 濡傛灉鏄瘡鍛ㄦ墽琛岋紝璁$畻涓嬪懆鐨勫叿浣撴槦鏈熷嚑
+ return calculateWeeklyFirstExecution(task.getFrequencyDetail());
+ } else if ("MONTHLY".equals(frequencyType)) {
+ // 濡傛灉鏄瘡鏈堟墽琛岋紝璁$畻涓嬩釜鏈堢殑鍏蜂綋鏃ユ湡
+ return calculateMonthlyFirstExecution(task.getFrequencyDetail());
+ } else if ("QUARTERLY".equals(frequencyType)) {
+ // 鑷畾涔夐鐜囷紝濡傛瘡灏忔椂銆佹瘡30鍒嗛挓绛�
+ return calculateCustomFirstExecution(task.getFrequencyDetail());
+ } else {
+ throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
+ }
}
private LocalDateTime calculateDailyFirstExecution(String frequencyDetail) {
@@ -172,12 +222,108 @@
return now.isBefore(todayExecution) ? todayExecution : todayExecution.plusDays(1);
}
+ // 鏄犲皠鏄熸湡绠�鍐欎笌DayOfWeek
+ private static final Map<String, DayOfWeek> WEEK_DAY_MAP = new HashMap<>();
+
+ static {
+ WEEK_DAY_MAP.put("MON", DayOfWeek.MONDAY);
+ WEEK_DAY_MAP.put("TUE", DayOfWeek.TUESDAY);
+ WEEK_DAY_MAP.put("WED", DayOfWeek.WEDNESDAY);
+ WEEK_DAY_MAP.put("THU", DayOfWeek.THURSDAY);
+ WEEK_DAY_MAP.put("FRI", DayOfWeek.FRIDAY);
+ WEEK_DAY_MAP.put("SAT", DayOfWeek.SATURDAY);
+ WEEK_DAY_MAP.put("SUN", DayOfWeek.SUNDAY);
+ }
+
private LocalDateTime calculateWeeklyFirstExecution(String frequencyDetail) {
- return null;
+ // 瑙f瀽杈撳叆鍙傛暟
+ String[] parts = frequencyDetail.split(",");
+ if (parts.length != 2) {
+ throw new IllegalArgumentException("鍙傛暟鏍煎紡閿欒锛屽簲涓�'MON,13:43'鏍煎紡");
+ }
+
+ String weekDayStr = parts[0].trim();
+ String timeStr = parts[1].trim();
+
+ // 鑾峰彇瀵瑰簲鐨勬槦鏈熷嚑
+ DayOfWeek targetDay = WEEK_DAY_MAP.get(weekDayStr);
+ if (targetDay == null) {
+ throw new IllegalArgumentException("鏃犳晥鐨勬槦鏈熺畝鍐�: " + weekDayStr);
+ }
+
+ // 瑙f瀽鏃堕棿
+ LocalTime targetTime = LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm"));
+
+ // 鑾峰彇褰撳墠鏃堕棿
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime targetDateTime = now.with(targetDay).with(targetTime);
+
+ // 濡傛灉璁$畻鍑虹殑鏃堕棿鍦ㄥ綋鍓嶆椂闂翠箣鍓嶏紝鍒欏姞涓�鍛�
+ if (targetDateTime.isBefore(now)) {
+ targetDateTime = targetDateTime.plusWeeks(1);
+ }
+
+ return targetDateTime;
}
private LocalDateTime calculateMonthlyFirstExecution(String frequencyDetail) {
- return null;
+ // 瑙f瀽杈撳叆鍙傛暟
+ String[] parts = frequencyDetail.split(",");
+ if (parts.length != 2) {
+ throw new IllegalArgumentException("鍙傛暟鏍煎紡閿欒锛屽簲涓�'03,17:00'鏍煎紡");
+ }
+
+ String dayStr = parts[0].trim();
+ String timeStr = parts[1].trim();
+
+ // 瑙f瀽鏃ユ湡
+ int dayOfMonth;
+ try {
+ dayOfMonth = Integer.parseInt(dayStr);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("鏃犳晥鐨勬棩鏈熸牸寮�: " + dayStr, e);
+ }
+
+ // 楠岃瘉鏃ユ湡鏈夋晥鎬э紙1-31涔嬮棿锛�
+ if (dayOfMonth < 1 || dayOfMonth > 31) {
+ throw new IllegalArgumentException("鏃ユ湡蹇呴』鍦�1-31涔嬮棿: " + dayOfMonth);
+ }
+
+ // 瑙f瀽鏃堕棿
+ LocalTime targetTime;
+ try {
+ targetTime = LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm"));
+ } catch (DateTimeException e) {
+ throw new IllegalArgumentException("鏃犳晥鐨勬椂闂存牸寮�: " + timeStr, e);
+ }
+
+ // 鑾峰彇褰撳墠鏃堕棿
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime targetDateTime = now.withDayOfMonth(dayOfMonth).with(targetTime);
+
+ // 妫�鏌ユ棩鏈熸槸鍚﹁鑷姩璋冩暣锛堝31鏃ュ湪灏忔湀浼氳璋冩暣锛�
+ boolean isDateAdjusted = targetDateTime.getDayOfMonth() != dayOfMonth;
+
+ // 濡傛灉鐩爣鏃堕棿鍦ㄥ綋鍓嶆椂闂翠箣鍓嶏紝鎴栬�呮棩鏈熻绯荤粺鑷姩璋冩暣浜�
+ if (targetDateTime.isBefore(now) || isDateAdjusted) {
+ // 璁$畻涓嬩釜鏈堢殑鏃ユ湡
+ LocalDateTime nextMonth = now.plusMonths(1);
+ // 灏濊瘯璁剧疆涓嬩釜鏈堢殑鐩爣鏃ユ湡
+ LocalDateTime nextMonthTarget = nextMonth.withDayOfMonth(dayOfMonth).with(targetTime);
+
+ // 濡傛灉涓嬩釜鏈堢殑鏃ユ湡涔熻璋冩暣浜嗭紝灏辩敤涓嬩釜鏈堢殑鏈�鍚庝竴澶�
+ if (nextMonthTarget.getDayOfMonth() != dayOfMonth) {
+ // 姝g‘鑾峰彇涓嬩釜鏈堢殑鏈�鍚庝竴澶╋紙淇isLeapYear璋冪敤闂锛�
+ int lastDayOfMonth = nextMonth.getMonth().length(
+ Year.of(nextMonth.getYear()).isLeap()
+ );
+ nextMonthTarget = nextMonth.withDayOfMonth(lastDayOfMonth).with(targetTime);
+ }
+
+ targetDateTime = nextMonthTarget;
+ }
+
+ return targetDateTime;
}
private LocalDateTime calculateCustomFirstExecution(String frequencyDetail) {
@@ -214,13 +360,18 @@
String frequencyDetail,
LocalDateTime currentTime) {
try {
- return switch (frequencyType) {
- case "DAILY" -> calculateDailyNextTime(frequencyDetail, currentTime);
- case "WEEKLY" -> calculateWeeklyNextTime(frequencyDetail, currentTime);
- case "MONTHLY" -> calculateMonthlyNextTime(frequencyDetail, currentTime);
- case "QUARTERLY" -> calculateQuarterlyNextTime(frequencyDetail, currentTime);
- default -> throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + frequencyType);
- };
+ switch (frequencyType) {
+ case "DAILY":
+ return calculateDailyNextTime(frequencyDetail, currentTime);
+ case "WEEKLY":
+ return calculateWeeklyNextTime(frequencyDetail, currentTime);
+ case "MONTHLY":
+ return calculateMonthlyNextTime(frequencyDetail, currentTime);
+ case "QUARTERLY":
+ return calculateQuarterlyNextTime(frequencyDetail, currentTime);
+ default:
+ throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + frequencyType);
+ }
} catch (Exception e) {
throw new RuntimeException("璁$畻涓嬫鎵ц鏃堕棿澶辫触: " + e.getMessage(), e);
}
@@ -324,14 +475,29 @@
for (String dayStr : dayStrs) {
switch (dayStr) {
- case "MON": days.add(DayOfWeek.MONDAY); break;
- case "TUE": days.add(DayOfWeek.TUESDAY); break;
- case "WED": days.add(DayOfWeek.WEDNESDAY); break;
- case "THU": days.add(DayOfWeek.THURSDAY); break;
- case "FRI": days.add(DayOfWeek.FRIDAY); break;
- case "SAT": days.add(DayOfWeek.SATURDAY); break;
- case "SUN": days.add(DayOfWeek.SUNDAY); break;
- default: throw new IllegalArgumentException("鏃犳晥鐨勬槦鏈熷嚑: " + dayStr);
+ case "MON":
+ days.add(DayOfWeek.MONDAY);
+ break;
+ case "TUE":
+ days.add(DayOfWeek.TUESDAY);
+ break;
+ case "WED":
+ days.add(DayOfWeek.WEDNESDAY);
+ break;
+ case "THU":
+ days.add(DayOfWeek.THURSDAY);
+ break;
+ case "FRI":
+ days.add(DayOfWeek.FRIDAY);
+ break;
+ case "SAT":
+ days.add(DayOfWeek.SATURDAY);
+ break;
+ case "SUN":
+ days.add(DayOfWeek.SUNDAY);
+ break;
+ default:
+ throw new IllegalArgumentException("鏃犳晥鐨勬槦鏈熷嚑: " + dayStr);
}
}
@@ -339,10 +505,15 @@
}
-
@Override
public int delByIds(Long[] ids) {
- return timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
+ int i = timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
+ if (i > 0) {
+ for (Long id : ids) {
+ timingTaskScheduler.unscheduleTimingTask(id);
+ }
+ }
+ return i;
}
}
--
Gitblit v1.9.3