package com.ruoyi.staff.task; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.project.system.service.ISysNoticeService; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.staff.mapper.StaffOnJobMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 人员合同到期提醒定时任务 * 检查即将到期的合同,推送通知给相关员工 * * @author system */ @Slf4j @Component @RequiredArgsConstructor public class StaffContractReminderTask { private final StaffOnJobMapper staffOnJobMapper; private final SysUserMapper sysUserMapper; private final ISysNoticeService sysNoticeService; /** * 每天早上8点执行合同到期提醒 * 提前30天、7天、1天提醒 */ @Scheduled(cron = "0 0 8 * * ?") public void contractExpirationReminder() { log.info("开始执行合同到期提醒任务..."); try { LocalDate today = LocalDate.now(); // 提前30天提醒 sendReminder(today.plusDays(30), "30天后到期"); // 提前7天提醒 sendReminder(today.plusDays(7), "7天后到期"); // 提前1天提醒 sendReminder(today.plusDays(1), "1天后到期"); log.info("合同到期提醒任务执行完成"); } catch (Exception e) { log.error("合同到期提醒任务执行失败:{}", e.getMessage(), e); } } /** * 发送合同到期提醒 * @param expireDate 到期日期 * @param daysDesc 剩余天数描述 */ private void sendReminder(LocalDate expireDate, String daysDesc) { Date targetDate = Date.from(expireDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); // 查询合同到期日期等于目标日期的在职员工 List staffList = staffOnJobMapper.selectList(Wrappers.lambdaQuery() .eq(StaffOnJob::getStaffState, 1) .eq(StaffOnJob::getContractExpireTime, targetDate)); if (CollectionUtil.isEmpty(staffList)) { return; } for (StaffOnJob staff : staffList) { try { // 通过员工编号查询系统用户 SysUser sysUser = sysUserMapper.selectUserByUserName(staff.getStaffNo()); if (sysUser == null) { log.warn("员工 {} 未找到对应的系统用户账号", staff.getStaffName()); continue; } // 构建通知内容 String title = "合同到期提醒"; String message = String.format("您好,%s 的合同将于%s到期,请及时处理相关事宜。", staff.getStaffName(), daysDesc); // 发送通知 List userIds = new ArrayList<>(); userIds.add(sysUser.getUserId()); sysNoticeService.simpleNoticeByUser(title, message, userIds, "/staffOnJob"); log.info("已向员工 {} 发送合同到期提醒", staff.getStaffName()); } catch (Exception e) { log.error("向员工 {} 发送合同到期提醒失败:{}", staff.getStaffName(), e.getMessage()); } } } }