| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package com.yimeng.okr.schedule;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.yimeng.okr.entity.AssessmentPeriod;
- import com.yimeng.okr.entity.SysUser;
- import com.yimeng.okr.enums.PeriodStatus;
- import com.yimeng.okr.event.NotificationEvent;
- import com.yimeng.okr.mapper.AssessmentPeriodMapper;
- import com.yimeng.okr.mapper.SysUserMapper;
- import com.yimeng.okr.service.AssessmentPeriodService;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.context.ApplicationEventPublisher;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Component;
- import java.time.LocalDate;
- import java.time.LocalDateTime;
- import java.time.temporal.ChronoUnit;
- import java.util.List;
- @Slf4j
- @Component
- @RequiredArgsConstructor
- public class PeriodScheduler {
- private final AssessmentPeriodService periodService;
- private final AssessmentPeriodMapper periodMapper;
- private final SysUserMapper userMapper;
- private final ApplicationEventPublisher publisher;
- @Scheduled(cron = "0 0 2 * * ?")
- public void autoAdvancePeriods() {
- log.info("Running period auto-advance check...");
- periodService.checkAndAutoAdvance();
- }
- @Scheduled(cron = "0 0 10 * * ?")
- public void checkPeriodDeadlines() {
- log.info("Checking period deadlines...");
- List<AssessmentPeriod> periods = periodMapper.selectList(
- new LambdaQueryWrapper<AssessmentPeriod>()
- .eq(AssessmentPeriod::getStatus, PeriodStatus.EXECUTING));
- LocalDate today = LocalDate.now();
- for (AssessmentPeriod p : periods) {
- try {
- LocalDate end = LocalDate.parse(p.getEndDate().substring(0, 10));
- if (ChronoUnit.DAYS.between(today, end) == 3) {
- List<SysUser> users = userMapper.selectList(null);
- for (SysUser u : users) {
- publisher.publishEvent(new NotificationEvent(
- this, u.getId(), "PERIOD_DEADLINE",
- "周期即将结束", "考核周期「" + p.getName() + "」将于3天后结束",
- "period", p.getId()));
- }
- }
- } catch (Exception e) {
- log.warn("Failed to check deadline for period {}: {}", p.getId(), e.getMessage());
- }
- }
- }
- }
|