已添加1个文件
已修改12个文件
270 ■■■■ 文件已修改
doc/fix_maintenance_tables.sql 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/fix_maintenance_tables.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
-- ============================================================
-- è®¾å¤‡ä¿å…»æ¨¡å—数据库修复脚本
-- ä¿®å¤ä¿å…»éƒ¨ä½å’Œä¿å…»é¡¹ç›®å­—段缺失问题
-- åˆ›å»ºæ—¶é—´: 2026-05-18
-- ============================================================
-- ============================================================
-- é—®é¢˜è¯´æ˜Žï¼š
-- 1. maintenance_task è¡¨ç¼ºå°‘ maintenance_location (保养部位) å­—段
-- 2. device_maintenance è¡¨ç¼ºå°‘ maintenance_items (保养项目) å­—段
-- ============================================================
-- ----------------------------
-- ä¿®å¤ 1: åœ¨ maintenance_task è¡¨æ·»åŠ  maintenance_location (保养部位) å­—段
-- ----------------------------
-- å…ˆæ£€æŸ¥å­—段是否存在,不存在则添加
SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
                   WHERE TABLE_SCHEMA = DATABASE()
                   AND TABLE_NAME = 'maintenance_task'
                   AND COLUMN_NAME = 'maintenance_location');
SET @sql = IF(@col_exists = 0,
    'ALTER TABLE `maintenance_task` ADD COLUMN `maintenance_location` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT ''保养部位''',
    'SELECT ''maintenance_location column already exists'' AS result');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ----------------------------
-- ä¿®å¤ 2: åœ¨ device_maintenance è¡¨æ·»åŠ  maintenance_items (保养项目) å­—段
-- ----------------------------
-- å…ˆæ£€æŸ¥å­—段是否存在,不存在则添加
SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
                   WHERE TABLE_SCHEMA = DATABASE()
                   AND TABLE_NAME = 'device_maintenance'
                   AND COLUMN_NAME = 'maintenance_items');
SET @sql = IF(@col_exists = 0,
    'ALTER TABLE `device_maintenance` ADD COLUMN `maintenance_items` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT ''保养项目''',
    'SELECT ''maintenance_items column already exists'' AS result');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ============================================================
-- éªŒè¯æ‰§è¡Œï¼šæŸ¥è¯¢è¡¨ç»“构确认字段已添加
-- ============================================================
-- SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT
-- FROM INFORMATION_SCHEMA.COLUMNS
-- WHERE TABLE_NAME IN ('maintenance_task', 'device_maintenance')
-- AND COLUMN_NAME IN ('maintenance_location', 'maintenance_items');
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -23,9 +23,12 @@
    @ApiModelProperty("规格型号")
    private String deviceModel;
    @ApiModelProperty("设备保养位置")
    @ApiModelProperty("保养部位")
    private String maintenanceLocation;
    @ApiModelProperty("保养项目")
    private String maintenanceItems;
    @ApiModelProperty("计划保养日期")
    private String maintenancePlanTimeReq;
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -10,6 +10,7 @@
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("device_maintenance")
@@ -91,6 +92,13 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("设备保养位置")
    @ApiModelProperty("保养部位")
    private String maintenanceLocation;
    @ApiModelProperty("保养项目")
    private String maintenanceItems;
    @ApiModelProperty("临时文件ID列表")
    @TableField(exist = false)
    private List<String> tempFileIds;
}
src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -56,7 +56,7 @@
    private LocalDateTime lastExecutionTime;
    @ApiModelProperty(value = "是否激活")
    private boolean isActive;
    private Integer isActive;
    @ApiModelProperty(value = "备注")
    @Excel(name = "备注")
@@ -80,6 +80,10 @@
    @Excel(name = "保养项目")
    private String maintenanceItems;
    @ApiModelProperty(value = "保养部位")
    @Excel(name = "保养内容")
    private String maintenanceLocation;
    @ApiModelProperty(value = "录入日期")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd")
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -10,10 +10,12 @@
import com.ruoyi.device.execl.DeviceMaintenanceExeclDto;
import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.DeviceMaintenanceFileService;
import com.ruoyi.device.service.IDeviceMaintenanceService;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
@@ -28,6 +30,9 @@
    @Autowired
    private DeviceMaintenanceMapper deviceMaintenanceMapper;
    @Autowired
    private DeviceMaintenanceFileService deviceMaintenanceFileService;
    @Override
    public IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto) {
@@ -35,16 +40,42 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult saveDeviceRepair(DeviceMaintenance deviceMaintenance) {
        // å…ˆä¿å­˜è®¾å¤‡ä¿å…»è®°å½•
        boolean save = this.save(deviceMaintenance);
        if (save) {
            return AjaxResult.success(deviceMaintenance);
        if (!save) {
            return AjaxResult.error("保存失败");
        }
        return AjaxResult.error();
        // å¤„理临时文件关联
        if (deviceMaintenance.getTempFileIds() != null && !deviceMaintenance.getTempFileIds().isEmpty()) {
            for (String tempId : deviceMaintenance.getTempFileIds()) {
                try {
                    deviceMaintenanceFileService.bindFromTemp(tempId, deviceMaintenance.getId().intValue(), null);
                } catch (Exception e) {
                    throw new RuntimeException("关联临时文件失败: " + e.getMessage());
                }
            }
        }
        return AjaxResult.success(deviceMaintenance);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult updateDeviceDeviceMaintenance(DeviceMaintenance deviceMaintenance) {
        // å¤„理临时文件关联
        if (deviceMaintenance.getTempFileIds() != null && !deviceMaintenance.getTempFileIds().isEmpty()) {
            for (String tempId : deviceMaintenance.getTempFileIds()) {
                try {
                    deviceMaintenanceFileService.bindFromTemp(tempId, deviceMaintenance.getId().intValue(), null);
                } catch (Exception e) {
                    return AjaxResult.error("关联临时文件失败: " + e.getMessage());
                }
            }
        }
        if (this.updateById(deviceMaintenance)) {
            return AjaxResult.success();
        }
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -45,21 +45,26 @@
       try{
           TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
           // èŽ·å–çŽ°æœ‰è§¦å‘å™¨å¹¶è½¬æ¢ä¸º CronTrigger
           // èŽ·å–çŽ°æœ‰è§¦å‘å™¨
           Trigger oldTrigger = scheduler.getTrigger(triggerKey);
           // ä¸å­˜åœ¨åˆ™æ·»åŠ 
           if (oldTrigger == null) {
               scheduleMaintenanceTask(task);
               return;
           }
           if (!(oldTrigger instanceof CronTrigger)) {
               throw new SchedulerException("Existing trigger is not a CronTrigger");
           }
           // 3. æž„建CronTrigger,确保持久化配置
           // æž„建新的CronTrigger
           CronTrigger newTrigger = TriggerBuilder.newTrigger()
                   .withIdentity(triggerKey)                // å”¯ä¸€æ ‡è¯†ï¼Œç”¨äºŽæŒä¹…化存储
                   .withDescription(task.getTaskName() + "_TRIGGER") // è§¦å‘器描述
                   .forJob(oldTrigger.getJobKey())                       // å…³è”对应的Job
                   .withIdentity(triggerKey)
                   .withDescription(task.getTaskName() + "_TRIGGER")
                   .forJob(oldTrigger.getJobKey())
                   .withSchedule(CronScheduleBuilder
                           .cronSchedule(convertToCronExpression(task)) // é”™è¿‡æ‰§è¡Œæ—¶çš„策略(根据业务调整)
                           .cronSchedule(convertToCronExpression(task))
                   )
                   // 4. è®¾ç½®å¼€å§‹æ—¶é—´ï¼ˆè‹¥ä¸ºnull则立即生效)
                   .startAt(task.getNextExecutionTime() != null
                           ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                           : new Date())
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.device.mapper.MaintenanceTaskMapper;
@@ -47,8 +48,8 @@
            if (StringUtils.isNotEmpty(maintenanceTask.getTaskName())) {
                queryWrapper.like(MaintenanceTask::getTaskName, maintenanceTask.getTaskName());
            }
            if (StringUtils.isNotEmpty(maintenanceTask.getStatus())) {
                queryWrapper.eq(MaintenanceTask::getStatus, maintenanceTask.getStatus());
            if (maintenanceTask.getIsActive() != null) {
                queryWrapper.eq(MaintenanceTask::getIsActive, maintenanceTask.getIsActive());
            }
        }
        queryWrapper.orderByDesc(MaintenanceTask::getCreateTime);
@@ -90,15 +91,20 @@
    @Override
    public AjaxResult add(MaintenanceTask maintenanceTask) {
        maintenanceTask.setActive(true);
        // è®¡ç®—首次执行时间
        TimingTask task = new TimingTask();
        task.setFrequencyType(maintenanceTask.getFrequencyType());
        task.setFrequencyDetail(maintenanceTask.getFrequencyDetail());
        LocalDateTime firstExecutionTime = timingTaskService.calculateFirstExecutionTime(task);
        maintenanceTask.setNextExecutionTime(firstExecutionTime);
        if (maintenanceTask == null){
            throw new ServiceException("新增失败,数据不能为空");
        }
        // åªæœ‰å¯ç”¨çŠ¶æ€æ‰æ·»åŠ 
        if (maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) {
            // è®¡ç®—首次执行时间
            TimingTask task = new TimingTask();
            task.setFrequencyType(maintenanceTask.getFrequencyType());
            task.setFrequencyDetail(maintenanceTask.getFrequencyDetail());
            LocalDateTime firstExecutionTime = timingTaskService.calculateFirstExecutionTime(task);
            maintenanceTask.setNextExecutionTime(firstExecutionTime);
        }
        int insert = maintenanceTaskMapper.insert(maintenanceTask);
        if (insert > 0) {
        if (insert > 0 && maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) {
            maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
        }
        return AjaxResult.success("添加成功");
@@ -110,10 +116,23 @@
        if (maintenanceTask1 == null) {
            return AjaxResult.warn("没有此数据");
        }
        Integer oldIsActive = maintenanceTask1.getIsActive();
        Integer newIsActive = maintenanceTask.getIsActive();
        BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
        int update = maintenanceTaskMapper.updateById(maintenanceTask1);
        if (update > 0) {
            maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
            // æ ¹æ®isActive状态变化来处理任务
            if (oldIsActive != null && oldIsActive == 1 && newIsActive != null && newIsActive == 0) {
                // ä»Žå¯ç”¨å˜ä¸ºåœç”¨ï¼Œç§»é™¤ä»»åŠ¡
                maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask.getId());
            } else if ((oldIsActive == null || oldIsActive == 0) && newIsActive != null && newIsActive == 1) {
                // ä»Žåœç”¨å˜ä¸ºå¯ç”¨ï¼Œæ·»åŠ 
                maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask1);
            } else {
                maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
            }
        }
        return AjaxResult.success("更新成功");
    }
src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
@@ -60,7 +60,7 @@
    @PostMapping("/addOrEditTimingTask")
    @ApiOperation(value = "新增修改定时任务")
    @Log(title = "定时任务", businessType = BusinessType.INSERT)
    public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) throws SchedulerException {
    public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) {
        return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto));
    }
src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
@@ -58,7 +58,7 @@
    private LocalDateTime lastExecutionTime;
    @ApiModelProperty(value = "是否激活")
    private boolean isActive;
    private Integer isActive;
    @ApiModelProperty(value = "备注")
    @Excel(name = "备注")
src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java
@@ -15,7 +15,7 @@
    IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask);
    int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException;
    int addOrEditTimingTask(TimingTaskDto timingTaskDto);
    int delByIds(Long[] ids);
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -111,7 +111,7 @@
        inspectionTask.setTaskId(timingTask.getTaskId());
        inspectionTask.setInspectorId(timingTask.getInspectorIds());
        inspectionTask.setInspectionLocation(timingTask.getInspectionLocation());
        inspectionTask.setRemarks("自动生成自定时任务ID: " + timingTask.getId());
        inspectionTask.setRemarks(timingTask.getRemarks());
        inspectionTask.setRegistrantId(timingTask.getRegistrantId());
        inspectionTask.setFrequencyType(timingTask.getFrequencyType());
        inspectionTask.setFrequencyDetail(timingTask.getFrequencyDetail());
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -4,6 +4,7 @@
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;
@@ -14,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;
@@ -122,42 +122,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;
        }
@@ -195,6 +212,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);
@@ -445,14 +463,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);
            }
        }
@@ -460,11 +493,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);
            }
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -20,6 +20,7 @@
        dm.maintenance_actually_name,
        dm.maintenance_person,
        dm.maintenance_location,
        dm.maintenance_items,
        dl.device_name,
        dl.device_model,
        su.nick_name as create_user_name
@@ -43,6 +44,9 @@
            <if test="deviceMaintenanceDto.maintenanceLocation != null and deviceMaintenanceDto.maintenanceLocation != ''">
                and dm.maintenance_location like concat('%',#{deviceMaintenanceDto.maintenanceLocation},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenanceItems != null and deviceMaintenanceDto.maintenanceItems != ''">
                and dm.maintenance_items like concat('%',#{deviceMaintenanceDto.maintenanceItems},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenancePlanTime != null">
                and dm.maintenance_plan_time like concat('%',#{deviceMaintenanceDto.maintenancePlanTime},'%')
            </if>
@@ -54,6 +58,7 @@
                and dm.maintenance_actually_time &lt; date_add(str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d'), interval 1 day)
            </if>
        </where>
        order by dm.create_time desc
    </select>
    <select id="detailById" resultType="com.ruoyi.device.dto.DeviceMaintenanceDto">
        select dm.id,
@@ -70,6 +75,7 @@
               dm.maintenance_actually_name,
               dm.maintenance_person,
               dm.maintenance_location,
               dm.maintenance_items,
               dl.device_name,
               dl.device_model,
               su.user_name as create_user_name