gaoluyang
6 天以前 cf330c6a6c2ae7ec86d20de465d5af27a4684cf6
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -1,18 +1,16 @@
package com.ruoyi.inspectiontask.service.impl;
import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
import com.ruoyi.inspectiontask.mapper.TimingTaskMapper;
import com.ruoyi.inspectiontask.pojo.InspectionTask;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import com.ruoyi.inspectiontask.service.TimingTaskService;
import com.ruoyi.common.utils.StringUtils;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.Serializable;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -23,17 +21,11 @@
@Component
@DisallowConcurrentExecution // 禁止并发执行同一个Job
public class TimingTaskJob implements Job {
    @Autowired
    private TimingTaskMapper timingTaskMapper;
    @Autowired
    private TimingTaskService timingTaskService;
public class TimingTaskJob implements Job, Serializable {
    private static final long serialVersionUID = 1L; // 必须定义序列化ID
    @Autowired
    private InspectionTaskMapper inspectionTaskMapper;
    @Autowired
    private JdbcTemplate jdbcTemplate;
@@ -56,14 +48,19 @@
            if (timingTask == null) {
                throw new JobExecutionException("找不到定时任务: " + taskId);
            }
            if (timingTask.getIsEnabled() != null && timingTask.getIsEnabled() == 0) {
                return;
            }
//            if (!timingTask.isActive()) {
//                throw new JobExecutionException("定时任务已禁用: " + taskId);
//            }
            // 2. 创建并保存巡检任务记录 - 这就是您提供的代码应该放的位置
            InspectionTask inspectionTask = createInspectionTask(timingTask);
            inspectionTaskMapper.insert(inspectionTask);
            // 2. 创建并保存巡检任务记录;设备已停用时跳过,不生成巡检任务
            if (!isDeviceDisabled(timingTask.getTaskId())) {
                InspectionTask inspectionTask = createInspectionTask(timingTask);
                inspectionTaskMapper.insert(inspectionTask);
            }
            // 3. 更新定时任务的执行时间
            if (!tasks.isEmpty()) {
@@ -102,16 +99,36 @@
        }
    }
    /**
     * 设备是否已停用(停用设备不参与巡检)
     */
    private boolean isDeviceDisabled(Integer deviceId) {
        if (deviceId == null || deviceId <= 0) {
            return false;
        }
        List<Integer> enabledList = jdbcTemplate.queryForList(
                "SELECT is_enabled FROM device_ledger WHERE id = ?", Integer.class, deviceId);
        if (enabledList.isEmpty() || enabledList.get(0) == null) {
            return false;
        }
        return enabledList.get(0) == 0;
    }
    // 这就是您提供的代码封装成的方法
    private InspectionTask createInspectionTask(TimingTask timingTask) {
        InspectionTask inspectionTask = new InspectionTask();
        // 复制基本属性
        inspectionTask.setTaskName(timingTask.getTaskName());
        inspectionTask.setInspectionProject(timingTask.getInspectionProject());
        inspectionTask.setTaskId(timingTask.getTaskId());
        inspectionTask.setInspectorId(timingTask.getInspectorIds());
        inspectionTask.setInspectionLocation(timingTask.getInspectionLocation());
        inspectionTask.setRemarks("自动生成自定时任务ID: " + timingTask.getId());
        String remarks = "自动生成自定时任务ID: " + timingTask.getId();
        if (StringUtils.isNotBlank(timingTask.getRemarks())) {
            remarks = remarks + ";" + timingTask.getRemarks();
        }
        inspectionTask.setRemarks(remarks);
        inspectionTask.setRegistrantId(timingTask.getRegistrantId());
        inspectionTask.setFrequencyType(timingTask.getFrequencyType());
        inspectionTask.setFrequencyDetail(timingTask.getFrequencyDetail());
@@ -129,6 +146,8 @@
                                                     LocalDateTime currentTime) {
        try {
            switch (frequencyType) {
                case "YEARLY":
                    return calculateYearlyNextTime(frequencyDetail, currentTime);
                case "DAILY":
                    return calculateDailyNextTime(frequencyDetail, currentTime);
                case "WEEKLY":
@@ -145,6 +164,30 @@
        }
    }
    /** 每年巡检默认执行时间:07:00(页面上不精确到时分) */
    private static final LocalTime DEFAULT_EXECUTION_TIME = LocalTime.of(7, 0);
    /**
     * 计算每年任务的下次执行时间
     * frequencyDetail 格式为 "月,日",可选 "月,日,HH:mm"(默认 07:00)
     */
    private LocalDateTime calculateYearlyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        int month = Integer.parseInt(parts[0].trim());
        int day = Integer.parseInt(parts[1].trim());
        LocalTime time = parts.length >= 3 ? LocalTime.parse(parts[2].trim()) : DEFAULT_EXECUTION_TIME;
        int year = current.getYear();
        LocalDateTime target = LocalDateTime.of(
                year, month, Math.min(day, YearMonth.of(year, month).lengthOfMonth()), time.getHour(), time.getMinute());
        if (!current.isBefore(target)) {
            year++;
            target = LocalDateTime.of(
                    year, month, Math.min(day, YearMonth.of(year, month).lengthOfMonth()), time.getHour(), time.getMinute());
        }
        return target;
    }
    /**
     * 计算每日任务的下次执行时间
     */