gongchunyi
2 天以前 0481b3942353f83c8506d77a0fc1a447a6942763
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -44,14 +44,35 @@
    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");
            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") // 触发器描述
@@ -59,7 +80,6 @@
                   .withSchedule(CronScheduleBuilder
                           .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整)
                   )
                   // 4. 设置开始时间(若为null则立即生效)
                   .startAt(task.getNextExecutionTime() != null
                           ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                           : new Date())
@@ -143,6 +163,7 @@
                        : new Date())
                .build();
    }
    private String convertToCronExpression(MaintenanceTask task) {
        // 参数校验
        if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) {
@@ -264,14 +285,22 @@
    // 转换单个星期几名称
    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);
        }
    }