|
|
@@ -1,21 +1,62 @@
|
|
|
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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|