Pārlūkot izejas kodu

feat(backend): 成长计划列表接口与childName组装

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
E2E Test Bot 3 nedēļas atpakaļ
vecāks
revīzija
c4937173fb

+ 12 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/growth/GrowthPlanController.java

@@ -20,6 +20,18 @@ public class GrowthPlanController {
     @Resource
     private GrowthPlanService growthPlanService;
 
+    @Operation(summary = "获取成长方案列表(规划师/管理员)")
+    @PostMapping("/list")
+    public Result<List<Map<String, Object>>> listPlans(@RequestBody(required = false) Map<String, Object> body,
+                                                       @RequestAttribute("userId") Long userId,
+                                                       @RequestAttribute("role") String role) {
+        if (!"teacher".equals(role) && !"admin".equals(role)) {
+            return Result.error("无权限");
+        }
+        List<Map<String, Object>> list = growthPlanService.listVos("admin".equals(role), userId);
+        return Result.success(list);
+    }
+
     @Operation(summary = "创建成长方案")
     @PostMapping("/create")
     public Result<GrowthPlan> createPlan(@RequestBody GrowthPlan plan,

+ 49 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/GrowthPlanService.java

@@ -1,13 +1,20 @@
 package com.etotem.cfc.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.entity.FamilyMember;
 import com.etotem.cfc.entity.GrowthPlan;
+import com.etotem.cfc.entity.User;
+import com.etotem.cfc.mapper.FamilyMemberMapper;
 import com.etotem.cfc.mapper.GrowthPlanMapper;
+import com.etotem.cfc.mapper.UserMapper;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import com.etotem.cfc.util.SortUtil;
 
 @Service
@@ -16,6 +23,12 @@ public class GrowthPlanService {
     @Resource
     private GrowthPlanMapper growthPlanMapper;
 
+    @Resource
+    private FamilyMemberMapper familyMemberMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
     public GrowthPlan createPlan(GrowthPlan plan) {
         if (plan.getStatus() == null) {
             plan.setStatus("active");
@@ -65,6 +78,42 @@ public class GrowthPlanService {
         return growthPlanMapper.updateById(plan) > 0;
     }
 
+    /**
+     * 成长方案列表视图:admin 查看全部,teacher 查看自己创建的方案。
+     * 组装前端列表需要的 childName(family_members → users 兜底解析)。
+     */
+    public List<Map<String, Object>> listVos(boolean isAdmin, Long teacherId) {
+        List<GrowthPlan> plans;
+        if (isAdmin) {
+            LambdaQueryWrapper<GrowthPlan> w = new LambdaQueryWrapper<>();
+            w.orderByDesc(GrowthPlan::getCreatedAt);
+            SortUtil.applySort(w);
+            plans = growthPlanMapper.selectList(w);
+        } else {
+            plans = getByTeacherId(teacherId);
+        }
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (GrowthPlan p : plans) {
+            Map<String, Object> m = new HashMap<>();
+            m.put("id", p.getId());
+            m.put("title", p.getPlanTitle());
+            m.put("childId", p.getChildId());
+            m.put("childName", resolveChildName(p.getChildId()));
+            m.put("status", p.getStatus());
+            m.put("createdAt", p.getCreatedAt());
+            result.add(m);
+        }
+        return result;
+    }
+
+    private String resolveChildName(Long childId) {
+        if (childId == null) return null;
+        FamilyMember member = familyMemberMapper.selectById(childId);
+        if (member != null && member.getNickname() != null) return member.getNickname();
+        User user = userMapper.selectById(childId);
+        return user != null ? user.getNickname() : null;
+    }
+
     public boolean reviewPlan(Long id) {
         GrowthPlan plan = growthPlanMapper.selectById(id);
         if (plan == null) return false;