Forráskód Böngészése

feat(backend): 实现 workbench/review-queue/history 端点

wangkangyjy 1 hete
szülő
commit
1a82c763b4

+ 6 - 0
backend/src/main/java/com/yimeng/okr/controller/OkrController.java

@@ -140,6 +140,12 @@ public class OkrController {
         return ApiResult.success(okrService.getAllOkrsForPeriod(periodId, SecurityUtils.getCurrentUserId()));
     }
 
+    @GetMapping("/workbench")
+    public ApiResult<?> workbench(@RequestParam Long periodId) {
+        Long userId = SecurityUtils.getCurrentUserId();
+        return ApiResult.success(okrService.getWorkbench(periodId, userId));
+    }
+
     @GetMapping("/{id}")
     public ApiResult<OkrDetailDto> getDetail(@PathVariable Long id) {
         return ApiResult.success(okrService.getOkrDetail(id, SecurityUtils.getCurrentUserId()));

+ 14 - 0
backend/src/main/java/com/yimeng/okr/controller/PerformanceController.java

@@ -85,6 +85,20 @@ public class PerformanceController {
                 performanceService.publishFinalScore(periodId, targetUserId, SecurityUtils.getCurrentUserId()));
     }
 
+    @GetMapping("/review-queue")
+    @OperationLogAnnotation(action = "VIEW_REVIEW_QUEUE", entityType = "performance_score", sensitive = true)
+    public ApiResult<List<ScoringDto>> reviewQueue(@RequestParam Long periodId) {
+        return ApiResult.success(
+                performanceService.getSubordinateScores(periodId, SecurityUtils.getCurrentUserId()));
+    }
+
+    @GetMapping("/history")
+    @OperationLogAnnotation(action = "VIEW_SCORE_HISTORY", entityType = "performance_score", sensitive = true)
+    public ApiResult<List<ScoringDto>> history() {
+        return ApiResult.success(
+                performanceService.getMyHistory(SecurityUtils.getCurrentUserId()));
+    }
+
     @GetMapping("/subordinates")
     @OperationLogAnnotation(action = "VIEW_SUBORDINATE_SCORES", entityType = "performance_score", sensitive = true)
     public ApiResult<List<ScoringDto>> getSubordinates(@RequestParam Long periodId) {

+ 35 - 0
backend/src/main/java/com/yimeng/okr/service/OkrService.java

@@ -717,4 +717,39 @@ public class OkrService {
             target.add(value);
         }
     }
+
+    public com.yimeng.okr.dto.OkrWorkbenchDto getWorkbench(Long periodId, Long userId) {
+        com.yimeng.okr.dto.OkrWorkbenchDto dto = new com.yimeng.okr.dto.OkrWorkbenchDto();
+        dto.setMyObjectives(getMyOkrForPeriod(periodId, userId));
+        dto.setWorkflowState(determineWorkflowState(periodId, userId));
+        dto.setVersion(System.currentTimeMillis());
+        return dto;
+    }
+
+    private String determineWorkflowState(Long periodId, Long userId) {
+        var period = periodMapper.selectById(periodId);
+        if (period == null) return "NO_PERIOD";
+        var objectives = objectiveMapper.selectList(
+            new LambdaQueryWrapper<OkrObjective>()
+                .eq(OkrObjective::getPeriodId, periodId)
+                .eq(OkrObjective::getUserId, userId));
+        if (objectives.isEmpty()) return "DRAFT_REQUIRED";
+        boolean hasSubmitted = objectives.stream().anyMatch(o -> "SUBMITTED".equals(o.getStatus()));
+        return hasSubmitted ? "SUBMITTED" : "DRAFT";
+    }
+
+    private java.util.List<com.yimeng.okr.dto.OkrWorkbenchDto.ObjectiveDto> getMyOkrForPeriod(Long periodId, Long userId) {
+        return objectiveMapper.selectList(
+            new LambdaQueryWrapper<OkrObjective>()
+                .eq(OkrObjective::getPeriodId, periodId)
+                .eq(OkrObjective::getUserId, userId)).stream()
+            .map(o -> {
+                com.yimeng.okr.dto.OkrWorkbenchDto.ObjectiveDto od = new com.yimeng.okr.dto.OkrWorkbenchDto.ObjectiveDto();
+                od.setId(o.getId());
+                od.setTitle(o.getTitle());
+                od.setStatus(o.getStatus());
+                od.setProgress(o.getProgress());
+                return od;
+            }).toList();
+    }
 }

+ 24 - 0
backend/src/main/java/com/yimeng/okr/service/PerformanceService.java

@@ -354,6 +354,30 @@ public class PerformanceService {
     }
 
 
+
+    public List<ScoringDto> getMyHistory(Long userId) {
+        var scores = scoreMapper.selectList(
+            new LambdaQueryWrapper<PerformanceScore>()
+                .eq(PerformanceScore::getUserId, userId)
+                .eq(PerformanceScore::getType, ScoreType.FINAL)
+                .in(PerformanceScore::getStatus, java.util.List.of("PUBLISHED", "CONFIRMED"))
+                .orderByDesc(PerformanceScore::getCreatedAt)
+                .last("LIMIT 10"));
+        return scores.stream().map(s -> {
+            ScoringDto dto = new ScoringDto();
+            ScoringDto.PeriodInfo pi = new ScoringDto.PeriodInfo();
+            AssessmentPeriod p = periodMapper.selectById(s.getPeriodId());
+            if (p != null) {
+                pi.setId(p.getId());
+                pi.setName(p.getName());
+                pi.setStatus(p.getStatus().name());
+            }
+            dto.setPeriod(pi);
+            dto.setFinalScore(s);
+            return dto;
+        }).toList();
+    }
+
     private void writeScoreItems(Long scoreId, String commentsJson) {
         if (commentsJson == null || commentsJson.isBlank()) return;
         try {