Просмотр исходного кода

fix: resolve @RequestAttribute familyId 400 error by resolving via MembershipService

Root cause: @RequestAttribute("familyId") used by 4 controllers but
no interceptor sets familyId as a request attribute → Spring 400 error.

Fix: replace @RequestAttribute("familyId") with
@RequestAttribute("userId") + membershipService.getUserFamilyId(userId)

Affected controllers:
- MindFortuneController (getTodayFortune, refreshFortune, exportFortuneReport)
- PackagePaymentController (createOrder)
- MarketController (purchasePackage, getMyPlans)
- BindController (acceptBind, getBoundGuides, unbind)
iwt 2 месяцев назад
Родитель
Сommit
9e7aa38652

+ 8 - 4
cfc-backend/src/main/java/com/etotem/cfc/controller/MarketController.java

@@ -8,6 +8,7 @@ import com.etotem.cfc.entity.TaskPlanInstance;
 import com.etotem.cfc.entity.TaskPlanItem;
 import com.etotem.cfc.entity.TaskTemplatePackage;
 import com.etotem.cfc.entity.TaskTemplateItem;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.TaskPlanService;
 import com.etotem.cfc.service.TaskTemplatePackageService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -29,6 +30,9 @@ public class MarketController {
     @Resource
     private TaskPlanService planService;
 
+    @Resource
+    private MembershipService membershipService;
+
     /**
      * 获取公开任务模板列表 (市场)
      */
@@ -81,9 +85,8 @@ public class MarketController {
     public Result<TaskPlanInstance> purchasePackage(
             @PathVariable Long id,
             @RequestBody ApplyPackageDTO dto,
-            @RequestAttribute("userId") Long userId,
-            @RequestAttribute("familyId") Long familyId) {
-        
+            @RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         dto.setPackageId(id);
         TaskPlanInstance instance = planService.applyPackage(dto, familyId);
         return Result.success(instance);
@@ -94,7 +97,8 @@ public class MarketController {
      */
     @Operation(summary = "获取我的任务计划")
     @PostMapping("/plans")
-    public Result<List<TaskPlanInstance>> getMyPlans(@RequestAttribute("familyId") Long familyId) {
+    public Result<List<TaskPlanInstance>> getMyPlans(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         List<TaskPlanInstance> plans = planService.getFamilyPlans(familyId);
         return Result.success(plans);
     }

+ 5 - 1
cfc-backend/src/main/java/com/etotem/cfc/controller/PackagePaymentController.java

@@ -4,6 +4,7 @@ import javax.annotation.Resource;
 import com.etotem.cfc.common.Result;
 import com.etotem.cfc.entity.PackageOrder;
 import com.etotem.cfc.entity.TaskPlanInstance;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.PackagePaymentService;
 import com.etotem.cfc.service.TaskPlanService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -23,6 +24,9 @@ public class PackagePaymentController {
     @Resource
     private TaskPlanService planService;
 
+    @Resource
+    private MembershipService membershipService;
+
     /**
      * 创建支付订单
      */
@@ -30,8 +34,8 @@ public class PackagePaymentController {
     @PostMapping("/create")
     public Result<PackageOrder> createOrder(
             @RequestAttribute("userId") Long userId,
-            @RequestAttribute("familyId") Long familyId,
             @RequestBody Map<String, Object> params) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         Long packageId = Long.valueOf(params.get("packageId").toString());
         String payMethod = params.get("payMethod") != null ? params.get("payMethod").toString() : "wechat";
         Long couponId = params.get("couponId") != null ? Long.valueOf(params.get("couponId").toString()) : null;

+ 9 - 4
cfc-backend/src/main/java/com/etotem/cfc/controller/family/BindController.java

@@ -5,6 +5,7 @@ import com.etotem.cfc.common.Result;
 import com.etotem.cfc.dto.BindGuideDTO;
 import com.etotem.cfc.entity.GuideFamily;
 import com.etotem.cfc.service.GuideFamilyService;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.TeacherMessageService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -26,15 +27,18 @@ public class BindController {
     @Resource
     private TeacherMessageService teacherMessageService;
 
+    @Resource
+    private MembershipService membershipService;
+
     /**
      * 家长确认绑定指导师
      */
     @Operation(summary = "确认绑定指导师")
     @PostMapping("/accept")
     public Result<Boolean> acceptBind(@RequestAttribute("userId") Long userId,
-                                        @RequestAttribute("familyId") Long familyId,
                                         @RequestBody BindGuideDTO dto) {
         try {
+            Long familyId = membershipService.getUserFamilyId(userId);
             boolean success = guideFamilyService.confirmBind(dto.getGuideId(), familyId,
                 dto.getServiceType(), dto.getServicePrice());
             return Result.success(success);
@@ -48,7 +52,8 @@ public class BindController {
      */
     @Operation(summary = "获取绑定的指导师列表")
     @PostMapping("/guides")
-    public Result<List<Map<String, Object>>> getBoundGuides(@RequestAttribute("familyId") Long familyId) {
+    public Result<List<Map<String, Object>>> getBoundGuides(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         List<GuideFamily> bindings = guideFamilyService.getGuidesByFamily(familyId);
         
         List<Map<String, Object>> result = bindings.stream().map(binding -> {
@@ -71,8 +76,8 @@ public class BindController {
     @Operation(summary = "解除绑定规划师")
     @PostMapping("/unbind")
     public Result<Boolean> unbind(@RequestAttribute("userId") Long userId,
-                                   @RequestAttribute("familyId") Long familyId,
-                                   @RequestBody Map<String, Object> params) {
+                                    @RequestBody Map<String, Object> params) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         Long id = Long.valueOf(params.get("id").toString());
         try {
             GuideFamily gf = guideFamilyService.unbindAndGet(id, familyId);

+ 10 - 3
cfc-backend/src/main/java/com/etotem/cfc/controller/mind/MindFortuneController.java

@@ -4,6 +4,7 @@ import com.etotem.cfc.common.Result;
 import com.etotem.cfc.entity.FamilyFortune;
 import com.etotem.cfc.entity.FamilyFortuneReport;
 import com.etotem.cfc.service.FortuneService;
+import com.etotem.cfc.service.MembershipService;
 import com.etotem.cfc.service.PdfReportService;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestAttribute;
@@ -24,12 +25,16 @@ public class MindFortuneController {
     
     @Resource
     private PdfReportService pdfReportService;
+
+    @Resource
+    private MembershipService membershipService;
     
     /**
      * 获取今日家庭运势
      */
     @PostMapping("/fortune")
-    public Result<Map<String, Object>> getTodayFortune(@RequestAttribute("familyId") Long familyId) {
+    public Result<Map<String, Object>> getTodayFortune(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         FamilyFortune fortune = fortuneService.getFamilyFortune(familyId, LocalDate.now());
         Map<String, Object> result = batchBuildFortuneResponse(fortune);
         return Result.success(result);
@@ -39,7 +44,8 @@ public class MindFortuneController {
      * 手动刷新运势(仅供测试)
      */
     @PostMapping("/fortune/refresh")
-    public Result<FamilyFortune> refreshFortune(@RequestAttribute("familyId") Long familyId) {
+    public Result<FamilyFortune> refreshFortune(@RequestAttribute("userId") Long userId) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         FamilyFortune fortune = fortuneService.getFamilyFortune(familyId, LocalDate.now());
         fortune.setLuckyDirection(fortuneService.calculateLuckyDirection(familyId, LocalDate.now()));
         fortuneService.saveFamilyFortune(fortune);
@@ -53,8 +59,9 @@ public class MindFortuneController {
      */
     @PostMapping("/fortune/export")
     public Result<Map<String, Object>> exportFortuneReport(
-            @RequestAttribute("familyId") Long familyId,
+            @RequestAttribute("userId") Long userId,
             @RequestBody ExportReportRequest request) {
+        Long familyId = membershipService.getUserFamilyId(userId);
         try {
             // 文件大小校验
             if (request.imageBase64 == null || request.imageBase64.length() > 4 * 1024 * 1024) {

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-b1625e7e1f77b1885063f165a2e0f34dde0714a9
+cfd282779ec0c0838281c6adfd690da42dde9cb6