Selaa lähdekoodia

feat: add period transition notifications — notify all users on status change

wangkangyjy 2 kuukautta sitten
vanhempi
commit
111ed4fa1f

+ 39 - 0
backend/src/main/java/com/yimeng/okr/service/AssessmentPeriodService.java

@@ -2,12 +2,16 @@ package com.yimeng.okr.service;
 
 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.enums.PeriodType;
+import com.yimeng.okr.event.NotificationEvent;
 import com.yimeng.okr.exception.BusinessException;
 import com.yimeng.okr.mapper.AssessmentPeriodMapper;
+import com.yimeng.okr.mapper.SysUserMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -22,6 +26,8 @@ import java.util.Map;
 public class AssessmentPeriodService {
 
     private final AssessmentPeriodMapper periodMapper;
+    private final SysUserMapper userMapper;
+    private final ApplicationEventPublisher publisher;
 
     public List<AssessmentPeriod> list(boolean isAdmin) {
         LambdaQueryWrapper<AssessmentPeriod> wrapper = new LambdaQueryWrapper<AssessmentPeriod>()
@@ -80,6 +86,38 @@ public class AssessmentPeriodService {
         period.setStatus(targetStatus);
         periodMapper.updateById(period);
         log.info("Period {} status: {} -> {}", id, current.getLabel(), targetStatus.getLabel());
+
+        notifyPeriodTransition(period, targetStatus);
+    }
+
+    private void notifyPeriodTransition(AssessmentPeriod period, PeriodStatus target) {
+        String title;
+        String content;
+        switch (target) {
+            case OKR_ALIGN -> {
+                title = "考核周期已发布";
+                content = "「" + period.getName() + "」已发布,请进入 OKR 对齐阶段,制定目标并完成对齐";
+            }
+            case EXECUTING -> {
+                title = "OKR 已锁定,开始执行";
+                content = "「" + period.getName() + "」OKR 已锁定,进入执行追踪阶段,请定期更新 KR 进度";
+            }
+            case ASSESSING -> {
+                title = "考评阶段已开始";
+                content = "「" + period.getName() + "」进入考评阶段,请前往「我的绩效」完成自评";
+            }
+            case ARCHIVED -> {
+                title = "考核周期已归档";
+                content = "「" + period.getName() + "」已完成并归档,可在历史绩效中查看结果";
+            }
+            default -> { return; }
+        }
+        List<SysUser> users = userMapper.selectList(null);
+        for (SysUser u : users) {
+            publisher.publishEvent(new NotificationEvent(
+                    this, u.getId(), "PERIOD_" + target.name(),
+                    title, content, "period", period.getId()));
+        }
     }
 
     public void delete(Long id) {
@@ -133,6 +171,7 @@ public class AssessmentPeriodService {
                 p.setStatus(PeriodStatus.ASSESSING);
                 periodMapper.updateById(p);
                 log.info("Auto transition period {} to ASSESSING", p.getId());
+                notifyPeriodTransition(p, PeriodStatus.ASSESSING);
             }
         }
     }