gongchunyi
2 天以前 0481b3942353f83c8506d77a0fc1a447a6942763
fix: 设备保养和巡检定时任务修改
已修改2个文件
152 ■■■■■ 文件已修改
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -27,13 +27,13 @@
    /**
     * 添加新任务到调度器
     */
    public void scheduleMaintenanceTask(MaintenanceTask task){
    public void scheduleMaintenanceTask(MaintenanceTask task) {
        try {
            JobDetail jobDetail = buildJobDetail(task);
            Trigger trigger = buildJobTrigger(task, jobDetail);
            scheduler.scheduleJob(jobDetail, trigger);
        }catch (SchedulerException e){
            log.error("SchedulerException scheduleMaintenanceTask ERROR",e);
        } catch (SchedulerException e) {
            log.error("SchedulerException scheduleMaintenanceTask ERROR", e);
            throw new RuntimeException(e);
        }
    }
@@ -41,34 +41,54 @@
    /**
     * 更新已有任务
     */
    public void rescheduleMaintenanceTask(MaintenanceTask task){
       try{
           TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
    public void rescheduleMaintenanceTask(MaintenanceTask task) {
        try {
            TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
            JobKey jobKey = new JobKey("MaintenanceTask_" + task.getId());
           // 获取现有触发器并转换为 CronTrigger
           Trigger oldTrigger = scheduler.getTrigger(triggerKey);
           if (!(oldTrigger instanceof CronTrigger)) {
               throw new SchedulerException("Existing trigger is not a CronTrigger");
           }
            Trigger oldTrigger = scheduler.getTrigger(triggerKey);
           // 3. 构建CronTrigger,确保持久化配置
           CronTrigger newTrigger = TriggerBuilder.newTrigger()
                   .withIdentity(triggerKey)                // 唯一标识,用于持久化存储
                   .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述
                   .forJob(oldTrigger.getJobKey())                       // 关联对应的Job
                   .withSchedule(CronScheduleBuilder
                           .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整)
                   )
                   // 4. 设置开始时间(若为null则立即生效)
                   .startAt(task.getNextExecutionTime() != null
                           ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                           : new Date())
                   .build();
           scheduler.rescheduleJob(triggerKey, newTrigger);
       }catch (SchedulerException e){
           log.error("SchedulerException rescheduleMaintenanceTask ERROR",e);
           throw new RuntimeException(e);
       }
            if (oldTrigger == null) {
                if (!scheduler.checkExists(jobKey)) {
                    JobDetail jobDetail = buildJobDetail(task);
                    Trigger newTrigger = buildJobTrigger(task, jobDetail);
                    scheduler.scheduleJob(jobDetail, newTrigger);
                } else {
                    Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey));
                    scheduler.scheduleJob(newTrigger);
                }
                return;
            }
            if (!(oldTrigger instanceof CronTrigger)) {
                scheduler.unscheduleJob(triggerKey);
                if (!scheduler.checkExists(jobKey)) {
                    JobDetail jobDetail = buildJobDetail(task);
                    Trigger newTrigger = buildJobTrigger(task, jobDetail);
                    scheduler.scheduleJob(jobDetail, newTrigger);
                } else {
                    Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey));
                    scheduler.scheduleJob(newTrigger);
                }
                return;
            }
            CronTrigger newTrigger = TriggerBuilder.newTrigger()
                    .withIdentity(triggerKey)                // 唯一标识,用于持久化存储
                    .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述
                    .forJob(oldTrigger.getJobKey())                       // 关联对应的Job
                    .withSchedule(CronScheduleBuilder
                            .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整)
                    )
                    .startAt(task.getNextExecutionTime() != null
                            ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                            : new Date())
                    .build();
            scheduler.rescheduleJob(triggerKey, newTrigger);
        } catch (SchedulerException e) {
            log.error("SchedulerException rescheduleMaintenanceTask ERROR", e);
            throw new RuntimeException(e);
        }
    }
    /**
@@ -90,12 +110,12 @@
    /**
     * 删除任务
     */
    public void unscheduleMaintenanceTask(Long taskId){
    public void unscheduleMaintenanceTask(Long taskId) {
        try {
            JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
            scheduler.deleteJob(jobKey);
        }catch (SchedulerException e){
            log.error("SchedulerException unscheduleMaintenanceTask ERROR",e);
        } catch (SchedulerException e) {
            log.error("SchedulerException unscheduleMaintenanceTask ERROR", e);
            throw new RuntimeException(e);
        }
    }
@@ -143,6 +163,7 @@
                        : new Date())
                .build();
    }
    private String convertToCronExpression(MaintenanceTask task) {
        // 参数校验
        if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) {
@@ -264,15 +285,23 @@
    // 转换单个星期几名称
    private String convertSingleDayName(String dayName) {
        switch (dayName.toUpperCase()) {
            case "MON": return "MON";
            case "TUE": return "TUE";
            case "WED": return "WED";
            case "THU": return "THU";
            case "FRI": return "FRI";
            case "SAT": return "SAT";
            case "SUN": return "SUN";
            default: throw new IllegalArgumentException("无效的星期几: " + dayName);
            case "MON":
                return "MON";
            case "TUE":
                return "TUE";
            case "WED":
                return "WED";
            case "THU":
                return "THU";
            case "FRI":
                return "FRI";
            case "SAT":
                return "SAT";
            case "SUN":
                return "SUN";
            default:
                throw new IllegalArgumentException("无效的星期几: " + dayName);
        }
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -32,14 +32,36 @@
     */
    public void rescheduleTimingTask(TimingTask task) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
        JobKey jobKey = new JobKey("timingTask_" + task.getId());
        // 获取现有触发器并转换为 CronTrigger
        // 获取现有触发器
        Trigger oldTrigger = scheduler.getTrigger(triggerKey);
        if (!(oldTrigger instanceof CronTrigger)) {
            throw new SchedulerException("Existing trigger is not a CronTrigger");
        if (oldTrigger == null) {
            if (!scheduler.checkExists(jobKey)) {
                JobDetail jobDetail = buildJobDetail(task);
                Trigger newTrigger = buildJobTrigger(task, jobDetail);
                scheduler.scheduleJob(jobDetail, newTrigger);
            } else {
                Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey));
                scheduler.scheduleJob(newTrigger);
            }
            return;
        }
        // 3. 构建CronTrigger,确保持久化配置
        if (!(oldTrigger instanceof CronTrigger)) {
            scheduler.unscheduleJob(triggerKey);
            if (!scheduler.checkExists(jobKey)) {
                JobDetail jobDetail = buildJobDetail(task);
                Trigger newTrigger = buildJobTrigger(task, jobDetail);
                scheduler.scheduleJob(jobDetail, newTrigger);
            } else {
                Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey));
                scheduler.scheduleJob(newTrigger);
            }
            return;
        }
        CronTrigger newTrigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)                // 唯一标识,用于持久化存储
                .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述
@@ -47,20 +69,11 @@
                .withSchedule(CronScheduleBuilder
                        .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整)
                )
                // 4. 设置开始时间(若为null则立即生效)
                // 设置开始时间(若为null则立即生效)
                .startAt(task.getNextExecutionTime() != null
                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                        : new Date())
                .build();
        // 构建新触发器
//        Trigger newTrigger = TriggerBuilder.newTrigger()
//                .withIdentity(triggerKey)
//                .withDescription(task.getTaskName())
//                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
//                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
//                .forJob(oldTrigger.getJobKey())
//                .build();
        scheduler.rescheduleJob(triggerKey, newTrigger);
    }