gongchunyi
22 小时以前 6bab142343375e744e46f2042aa3b0fedea70b06
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,7 +15,6 @@
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;
@@ -47,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()) {
@@ -72,6 +78,13 @@
                        .filter(StringUtils::isNotBlank)
                        .map(Long::valueOf)
                        .forEach(userIds::add);
            }
        });
        // 收集验收入ID
        taskPage.getRecords().forEach(task -> {
            if (task.getInspectionAcceptorId() != null) {
                userIds.add(task.getInspectionAcceptorId());
            }
        });
@@ -105,6 +118,11 @@
                dto.setInspector(inspectorNickNames);
            }
            // 设置验收人昵称
            if (task.getInspectionAcceptorId() != null) {
                dto.setInspectionAcceptor(userNickNameMap.getOrDefault(task.getInspectionAcceptorId(), "未知用户"));
            }
            return dto;
        }).collect(Collectors.toList());
@@ -116,42 +134,59 @@
    @Override
    @Transactional
    public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException {
    public int addOrEditTimingTask(TimingTaskDto timingTaskDto) {
        TimingTask timingTask = new TimingTask();
        BeanUtils.copyProperties(timingTaskDto, timingTask);
        // 1. 解析字符串为 LocalDate(只包含年月日)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate localDate = LocalDate.now();
        if(StringUtils.isNotEmpty(timingTaskDto.getDateStr())){
        if (StringUtils.isNotEmpty(timingTaskDto.getDateStr())) {
            localDate = LocalDate.parse(timingTaskDto.getDateStr(), formatter);
        }
        // 2. 获取当前系统的 LocalTime(包含时分秒)
        LocalTime currentTime = LocalTime.now();
        // 3. 合并 LocalDate 和当前 LocalTime 为 LocalDateTime
        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;
        }
@@ -189,6 +224,7 @@
    // 映射星期简写与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);
@@ -439,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);
            }
        }
@@ -454,11 +505,10 @@
    }
    @Override
    public int delByIds(Long[] ids) {
        int i = timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
        if(i > 0){
        if (i > 0) {
            for (Long id : ids) {
                timingTaskScheduler.unscheduleTimingTask(id);
            }