PeriodScheduler.java 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package com.yimeng.okr.schedule;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.yimeng.okr.entity.AssessmentPeriod;
  4. import com.yimeng.okr.entity.SysUser;
  5. import com.yimeng.okr.enums.PeriodStatus;
  6. import com.yimeng.okr.event.NotificationEvent;
  7. import com.yimeng.okr.mapper.AssessmentPeriodMapper;
  8. import com.yimeng.okr.mapper.SysUserMapper;
  9. import com.yimeng.okr.service.AssessmentPeriodService;
  10. import lombok.RequiredArgsConstructor;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.context.ApplicationEventPublisher;
  13. import org.springframework.scheduling.annotation.Scheduled;
  14. import org.springframework.stereotype.Component;
  15. import java.time.LocalDate;
  16. import java.time.LocalDateTime;
  17. import java.time.temporal.ChronoUnit;
  18. import java.util.List;
  19. @Slf4j
  20. @Component
  21. @RequiredArgsConstructor
  22. public class PeriodScheduler {
  23. private final AssessmentPeriodService periodService;
  24. private final AssessmentPeriodMapper periodMapper;
  25. private final SysUserMapper userMapper;
  26. private final ApplicationEventPublisher publisher;
  27. @Scheduled(cron = "0 0 2 * * ?")
  28. public void autoAdvancePeriods() {
  29. log.info("Running period auto-advance check...");
  30. periodService.checkAndAutoAdvance();
  31. }
  32. @Scheduled(cron = "0 0 10 * * ?")
  33. public void checkPeriodDeadlines() {
  34. log.info("Checking period deadlines...");
  35. List<AssessmentPeriod> periods = periodMapper.selectList(
  36. new LambdaQueryWrapper<AssessmentPeriod>()
  37. .eq(AssessmentPeriod::getStatus, PeriodStatus.EXECUTING));
  38. LocalDate today = LocalDate.now();
  39. for (AssessmentPeriod p : periods) {
  40. try {
  41. LocalDate end = LocalDate.parse(p.getEndDate().substring(0, 10));
  42. if (ChronoUnit.DAYS.between(today, end) == 3) {
  43. List<SysUser> users = userMapper.selectList(null);
  44. for (SysUser u : users) {
  45. publisher.publishEvent(new NotificationEvent(
  46. this, u.getId(), "PERIOD_DEADLINE",
  47. "周期即将结束", "考核周期「" + p.getName() + "」将于3天后结束",
  48. "period", p.getId()));
  49. }
  50. }
  51. } catch (Exception e) {
  52. log.warn("Failed to check deadline for period {}: {}", p.getId(), e.getMessage());
  53. }
  54. }
  55. }
  56. }