Parcourir la source

feat(health-plan): 新增用户端/管理端方案删除接口(任务 2/6)

iwt il y a 1 semaine
Parent
commit
3d83ef499d

+ 15 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthPlanController.java

@@ -157,6 +157,21 @@ public class HealthPlanController {
         return Result.success(tasks);
     }
 
+    @Operation(summary = "删除健康方案(级联删除方案产生的全部任务,含每日实例)")
+    @PostMapping("/delete")
+    public Result<Map<String, Object>> deletePlan(@RequestBody Map<String, Object> params,
+                                                  @RequestAttribute("userId") Long userId,
+                                                  @RequestAttribute(value = "familyId", required = false) Long familyId) {
+        Long planId = ParamUtils.getLong(params.get("planId"));
+        if (planId == null) return Result.error("planId不能为空");
+        // familyId 从 JWT 注入:方案不属于该家庭时 Service 返回 null → 拒绝删除(IDOR 防护)
+        Map<String, Object> result = healthPlanService.deletePlanCascade(planId, familyId);
+        if (result == null) {
+            return Result.error("无权删除该方案");
+        }
+        return Result.success(result);
+    }
+
     @Operation(summary = "获取可用规划师列表")
     @PostMapping("/available-teachers")
     public Result<List<Map<String, Object>>> availableTeachers(

+ 17 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminHealthPlanController.java

@@ -59,4 +59,21 @@ public class AdminHealthPlanController {
         plan.setTasks(tasks);
         return Result.success(plan);
     }
+
+    @Operation(summary = "删除健康方案(级联删除方案产生的全部任务,含每日实例)")
+    @PostMapping("/delete")
+    public Result<Map<String, Object>> deletePlan(@RequestBody Map<String, Object> params,
+                                                  @RequestAttribute("role") String role) {
+        if (!"admin".equals(role) && !"teacher".equals(role) && !"butler".equals(role)
+                && !"nutritionist".equals(role) && !"operator".equals(role)) {
+            return Result.error("无权限");
+        }
+        Long planId = ParamUtils.getLong(params.get("planId"));
+        if (planId == null) {
+            return Result.error("planId不能为空");
+        }
+        // 管理端跨家庭删除,跳过 familyId 归属校验(Service familyId 传 null)
+        Map<String, Object> result = healthPlanService.deletePlanCascade(planId, null);
+        return Result.success(result);
+    }
 }