| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | @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()) { |
| | |
| | | .filter(StringUtils::isNotBlank) |
| | | .map(Long::valueOf) |
| | | .forEach(userIds::add); |
| | | } |
| | | }); |
| | | |
| | | // 收集验收入ID |
| | | taskPage.getRecords().forEach(task -> { |
| | | if (task.getInspectionAcceptorId() != null) { |
| | | userIds.add(task.getInspectionAcceptorId()); |
| | | } |
| | | }); |
| | | |
| | |
| | | dto.setInspector(inspectorNickNames); |
| | | } |
| | | |
| | | // 设置验收人昵称 |
| | | if (task.getInspectionAcceptorId() != null) { |
| | | dto.setInspectionAcceptor(userNickNameMap.getOrDefault(task.getInspectionAcceptorId(), "未知用户")); |
| | | } |
| | | |
| | | return dto; |
| | | }).collect(Collectors.toList()); |
| | | |
| | |
| | | |
| | | @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; |
| | | } |
| | |
| | | |
| | | // 映射星期简写与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); |
| | |
| | | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | @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); |
| | | } |