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

fix: resolve getPlanDetail duplicate declaration and clean up assessment controllers

- Rename guide getPlanDetail to getGuidePlanDetail to avoid duplicate identifier
- Update imports in guide/plans/detail.vue and guide/plans/index.vue
- Remove AssessmentOrderController and related tests (moved to DanAssessmentController)
- Resolve merge conflicts in cfc-web
User 4 месяцев назад
Родитель
Сommit
58ef4ad2a2

+ 1 - 1
README.md

@@ -229,7 +229,7 @@ npm run serve                # localhost:8082
 | 任务 | `TaskController` | `/api/tasks/*` — CRUD/审核/小游戏 |
 | 任务 | `TaskController` | `/api/tasks/*` — CRUD/审核/小游戏 |
 | 心愿 | `WishController` | `/api/wishes/*` — 创建/审批/兑换 |
 | 心愿 | `WishController` | `/api/wishes/*` — 创建/审批/兑换 |
 | 五维能量 | `EnergyController` | `/api/energy/*` — 概览/流水/配置 |
 | 五维能量 | `EnergyController` | `/api/energy/*` — 概览/流水/配置 |
-| 测评 | `AssessmentOrderController` | `/api/assessment/order/*` — 订单/支付 |
+| 测评 | `DanAssessmentController` | `/api/dan-assessment/*` — 测评全链路(订单/预约/支付/结果) |
 | 测评 | `AssessmentAppointmentController` | `/api/assessment/appointment/*` — 预约/确认 |
 | 测评 | `AssessmentAppointmentController` | `/api/assessment/appointment/*` — 预约/确认 |
 | 成长 | `GrowthRecordController` | `/api/growth/*` — 记录/外部同步 |
 | 成长 | `GrowthRecordController` | `/api/growth/*` — 记录/外部同步 |
 | 服务商 | `GuideController` | `/api/guide/*` — 入驻/套餐/邀请 |
 | 服务商 | `GuideController` | `/api/guide/*` — 入驻/套餐/邀请 |

+ 0 - 3
cfc-backend/.classpath

@@ -47,9 +47,6 @@
 	<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
 	<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
 		<attributes>
 		<attributes>
 			<attribute name="optional" value="true"/>
 			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-			<attribute name="ignore_optional_problems" value="true"/>
-			<attribute name="m2e-apt" value="true"/>
 			<attribute name="test" value="true"/>
 			<attribute name="test" value="true"/>
 		</attributes>
 		</attributes>
 	</classpathentry>
 	</classpathentry>

+ 1 - 1
cfc-backend/AGENTS.md

@@ -21,7 +21,7 @@ Spring Boot 2.7.18 后端服务,MyBatis-Plus ORM,JWT 认证。
 |--------|------|----------|------|
 |--------|------|----------|------|
 | `AuthController` | Controller | `controller/auth/AuthController.java` | 微信登录、JWT 认证 |
 | `AuthController` | Controller | `controller/auth/AuthController.java` | 微信登录、JWT 认证 |
 | `TaskService` | Service | `service/TaskService.java` | 任务业务逻辑核心 |
 | `TaskService` | Service | `service/TaskService.java` | 任务业务逻辑核心 |
-| `AssessmentOrderController` | Controller | `controller/assessment/AssessmentOrderController.java` | 测评订单(创建/详情/支付) |
+| `DanAssessmentController` | Controller | `controller/DanAssessmentController.java` | DAN测评全链路(订单/预约/支付/结果) |
 | `AssessmentAppointmentController` | Controller | `controller/assessment/AssessmentAppointmentController.java` | 测评预约管理 |
 | `AssessmentAppointmentController` | Controller | `controller/assessment/AssessmentAppointmentController.java` | 测评预约管理 |
 | `DataMigrationService` | Service | `service/DataMigrationService.java` | sfms → cfc 全量数据迁移 |
 | `DataMigrationService` | Service | `service/DataMigrationService.java` | sfms → cfc 全量数据迁移 |
 | `User` | Entity | `entity/User.java` | 用户实体 (parent/child/teacher) |
 | `User` | Entity | `entity/User.java` | 用户实体 (parent/child/teacher) |

+ 7 - 5
cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java

@@ -122,8 +122,9 @@ public class DanAssessmentController {
     }
     }
 
 
     @Operation(summary = "获取我的测评报告列表")
     @Operation(summary = "获取我的测评报告列表")
-    @GetMapping("/my-results")
-    public Result<List<DanAssessmentResult>> getMyResults(@RequestParam(required = false) Long userId) {
+    @PostMapping("/my-results")
+    public Result<List<DanAssessmentResult>> getMyResults(@RequestBody Map<String, Object> body) {
+        Long userId = body.get("userId") != null ? Long.valueOf(body.get("userId").toString()) : null;
         if (userId == null) {
         if (userId == null) {
             return Result.success(assessmentService.getAccessibleResults(0L, "teacher"));
             return Result.success(assessmentService.getAccessibleResults(0L, "teacher"));
         }
         }
@@ -132,15 +133,16 @@ public class DanAssessmentController {
     }
     }
 
 
     @Operation(summary = "获取下级成长规划师的测评报告")
     @Operation(summary = "获取下级成长规划师的测评报告")
-    @GetMapping("/child-results")
-    public Result<List<DanAssessmentResult>> getChildResults(@RequestParam(required = false) Long userId) {
+    @PostMapping("/child-results")
+    public Result<List<DanAssessmentResult>> getChildResults(@RequestBody Map<String, Object> body) {
+        Long userId = body.get("userId") != null ? Long.valueOf(body.get("userId").toString()) : null;
         List<DanAssessmentResult> results = assessmentService.getAccessibleResults(
         List<DanAssessmentResult> results = assessmentService.getAccessibleResults(
                 userId != null ? userId : 0L, "teacher");
                 userId != null ? userId : 0L, "teacher");
         return Result.success(results);
         return Result.success(results);
     }
     }
 
 
     @Operation(summary = "获取测评报告详情")
     @Operation(summary = "获取测评报告详情")
-    @GetMapping("/result/{id}")
+    @PostMapping("/result/{id}")
     public Result<DanAssessmentResult> getResult(@PathVariable Long id) {
     public Result<DanAssessmentResult> getResult(@PathVariable Long id) {
         return Result.success(assessmentService.getByAppointmentId(id));
         return Result.success(assessmentService.getByAppointmentId(id));
     }
     }

+ 0 - 144
cfc-backend/src/main/java/com/etotem/cfc/controller/assessment/AssessmentOrderController.java

@@ -1,144 +0,0 @@
-package com.etotem.cfc.controller.assessment;
-
-import com.etotem.cfc.common.Result;
-import com.etotem.cfc.entity.AssessmentOrder;
-import com.etotem.cfc.entity.AssessmentAppointment;
-import com.etotem.cfc.service.AssessmentOrderService;
-import com.etotem.cfc.service.AssessmentAppointmentService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import java.util.*;
-import java.util.stream.Collectors;
-
-@Tag(name = "评估订单", description = "评估订单与支付(已废弃,改用商城额度系统)")
-@Deprecated
-@RestController
-@RequestMapping("/api/assessment/order")
-public class AssessmentOrderController {
-
-    @Resource
-    private AssessmentOrderService orderService;
-
-    @Resource
-    private AssessmentAppointmentService appointmentService;
-
-    @Resource
-    private com.etotem.cfc.mapper.FamilyMapper familyMapper;
-
-    @Operation(summary = "创建评估订单")
-    @PostMapping("/create")
-    public Result<Map<String, Object>> createOrder(
-            @RequestAttribute("userId") Long userId,
-            @RequestBody Map<String, Object> body) {
-        Long familyId = Long.valueOf(body.get("familyId").toString());
-        Long childId = body.get("childId") != null ? Long.valueOf(body.get("childId").toString()) : null;
-        Long guideId = null;
-        if (body.get("guideId") != null) {
-            guideId = Long.valueOf(body.get("guideId").toString());
-        }
-        // 未指定规划师时,尝试使用家庭绑定的规划师
-        if (guideId == null) {
-            com.etotem.cfc.entity.Family family = familyMapper.selectById(familyId);
-            if (family != null && family.getTeacherId() != null) {
-                guideId = family.getTeacherId();
-            }
-        }
-        Long packageId = Long.valueOf(body.get("packageId").toString());
-        String guideName = body.get("guideName") != null ? body.get("guideName").toString() : null;
-        String packageName = body.get("packageName") != null ? body.get("packageName").toString() : null;
-        Long totalPrice = body.get("totalPrice") != null ? Long.valueOf(body.get("totalPrice").toString()) : 0L;
-        Long discountAmount = body.get("discountAmount") != null ? Long.valueOf(body.get("discountAmount").toString()) : 0L;
-
-        AssessmentOrder order = orderService.createOrder(
-                familyId, userId, childId, guideId, packageId,
-                guideName, packageName, totalPrice, discountAmount);
-
-        Map<String, Object> result = new HashMap<>();
-        result.put("orderNo", order.getOrderNo());
-        result.put("actualPrice", order.getActualPrice());
-        result.put("status", order.getStatus());
-        return Result.success(result);
-    }
-
-    @Operation(summary = "获取订单详情")
-    @PostMapping("/detail")
-    public Result<AssessmentOrder> getOrderDetail(
-            @RequestAttribute("userId") Long userId,
-            @RequestBody Map<String, Object> body) {
-        String orderNo = body.get("orderNo") != null ? body.get("orderNo").toString() : null;
-        if (orderNo == null) return Result.error("订单号不能为空");
-        AssessmentOrder order = orderService.getByOrderNo(orderNo);
-        if (order == null) return Result.error("订单不存在");
-        if (!order.getUserId().equals(userId)) return Result.error("无权查看");
-        return Result.success(order);
-    }
-
-    @Operation(summary = "我的订单列表")
-    @PostMapping("/my-orders")
-    public Result<List<AssessmentOrder>> getMyOrders(@RequestAttribute("userId") Long userId) {
-        List<AssessmentOrder> orders = orderService.getByUserId(userId);
-        return Result.success(orders);
-    }
-
-    @Operation(summary = "支付订单")
-    @PostMapping("/pay")
-    public Result<Map<String, Object>> payOrder(
-            @RequestAttribute("userId") Long userId,
-            @RequestBody Map<String, Object> body) {
-        String orderNo = body.get("orderNo") != null ? body.get("orderNo").toString() : null;
-        String payType = body.get("payType") != null ? body.get("payType").toString() : "wechat";
-        if (orderNo == null) return Result.error("订单号不能为空");
-
-        boolean success = orderService.payOrder(orderNo, payType);
-        if (!success) return Result.error("支付失败");
-
-        // 支付成功后确认预约
-        AssessmentOrder order = orderService.getByOrderNo(orderNo);
-        if (order != null && order.getChildId() != null) {
-            appointmentService.confirmAppointmentByOrder(order);
-        }
-
-        Map<String, Object> result = new HashMap<>();
-        result.put("orderNo", orderNo);
-        result.put("payTime", new Date());
-        result.put("status", "paid");
-        return Result.success(result);
-    }
-
-    @Operation(summary = "取消订单")
-    @PostMapping("/cancel")
-    public Result<Boolean> cancelOrder(
-            @RequestAttribute("userId") Long userId,
-            @RequestBody Map<String, Object> body) {
-        String orderNo = body.get("orderNo") != null ? body.get("orderNo").toString() : null;
-        if (orderNo == null) return Result.error("订单号不能为空");
-
-        AssessmentOrder order = orderService.getByOrderNo(orderNo);
-        if (order == null) return Result.error("订单不存在");
-        if (!order.getUserId().equals(userId)) return Result.error("无权操作");
-
-        boolean success = orderService.cancelOrder(orderNo);
-        if (!success) return Result.error("取消失败,仅待支付订单可取消");
-        return Result.success(true);
-    }
-
-    @Operation(summary = "退款订单")
-    @PostMapping("/refund")
-    public Result<Boolean> refundOrder(
-            @RequestAttribute("userId") Long userId,
-            @RequestBody Map<String, Object> body) {
-        String orderNo = body.get("orderNo") != null ? body.get("orderNo").toString() : null;
-        if (orderNo == null) return Result.error("订单号不能为空");
-
-        AssessmentOrder order = orderService.getByOrderNo(orderNo);
-        if (order == null) return Result.error("订单不存在");
-        if (!order.getUserId().equals(userId)) return Result.error("无权操作");
-
-        boolean success = orderService.refundOrder(orderNo);
-        if (!success) return Result.error("退款失败,仅已支付订单可退款");
-        return Result.success(true);
-    }
-}

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/controller/guide/GuideAssessmentController.java

@@ -55,7 +55,7 @@ public class GuideAssessmentController {
     }
     }
 
 
     @Operation(summary = "关闭家庭测评")
     @Operation(summary = "关闭家庭测评")
-    @DeleteMapping("/family/{familyId}")
+    @PostMapping("/family/{familyId}/disable")
     public Result<Boolean> disableFamilyAssessment(@PathVariable Long familyId) {
     public Result<Boolean> disableFamilyAssessment(@PathVariable Long familyId) {
         boolean success = assessmentService.disableFamilyAssessment(familyId);
         boolean success = assessmentService.disableFamilyAssessment(familyId);
         return Result.success(success);
         return Result.success(success);

+ 1 - 1
cfc-backend/src/main/java/com/etotem/cfc/service/ArticleService.java

@@ -329,7 +329,7 @@ public class ArticleService {
             wrapper.eq(Article::getDifficultyLevel, difficultyLevel);
             wrapper.eq(Article::getDifficultyLevel, difficultyLevel);
         }
         }
         if (dimensionCode != null && !dimensionCode.isEmpty()) {
         if (dimensionCode != null && !dimensionCode.isEmpty()) {
-            wrapper.like(Article::getDimensionIds, dimensionCode);
+            wrapper.like(Article::getRelatedDimensions, dimensionCode);
         }
         }
         if (tagId != null && tagId > 0) {
         if (tagId != null && tagId > 0) {
             wrapper.inSql(Article::getId, "SELECT article_id FROM article_tags WHERE tag_id = " + tagId);
             wrapper.inSql(Article::getId, "SELECT article_id FROM article_tags WHERE tag_id = " + tagId);

+ 31 - 20
cfc-backend/src/main/java/com/etotem/cfc/service/CommissionService.java

@@ -56,6 +56,12 @@ public class CommissionService {
     @Resource
     @Resource
     private ReferralLeaderboardService referralLeaderboardService;
     private ReferralLeaderboardService referralLeaderboardService;
 
 
+    @Resource
+    private PpointService ppointService;
+
+    @Resource
+    private PromotionTierService promotionTierService;
+
     // ==================== 工具方法 ====================
     // ==================== 工具方法 ====================
 
 
     /**
     /**
@@ -204,28 +210,33 @@ public class CommissionService {
 
 
                 if (productId != null) {
                 if (productId != null) {
                     Product product = productMapper.selectById(productId);
                     Product product = productMapper.selectById(productId);
-                    if (product != null && product.getProfitRate() != null) {
-                        int profitRate = product.getProfitRate();
-                        if (isFamily) {
-                            // FAMILY推荐人获取利润佣金
-                            int profitShareBps = getRateBps("commission_product_profit_share", 1000);
-                            l1Amount = orderAmount * profitRate / 100 * profitShareBps / 10000;
-                            commissionType = "profit";
-                        } else {
-                            // FREE推荐人只获得member类型佣金(不计利润分成)
-                            l1Amount = 0;
-                            commissionType = "member";
+                    // Get effective P-point: product_ppoint table (date-valid) or fallback to Product.profitRate
+                    int effectivePpoint = ppointService.getEffectivePpoint(productId);
+
+                    if (effectivePpoint > 0 && isFamily) {
+                        // P-point based profit share (platform profit distribution)
+                        int profitShareBps = getRateBps("commission_product_profit_share", 1000);
+                        l1Amount = orderAmount * effectivePpoint / 100 * profitShareBps / 10000;
+                        commissionType = "profit";
+
+                        // Track share earnings in PromotionTier for tier evaluation
+                        int shareAmount = orderAmount * effectivePpoint / 10000;
+                        if (shareAmount > 0) {
+                            promotionTierService.addShareEarnings(l1ReferrerId, shareAmount);
                         }
                         }
+                    } else if (product != null && product.getProfitRate() != null && isFamily) {
+                        // Fallback to Product.profitRate if no P-point configured
+                        int profitRate = product.getProfitRate();
+                        int profitShareBps = getRateBps("commission_product_profit_share", 1000);
+                        l1Amount = orderAmount * profitRate / 100 * profitShareBps / 10000;
+                        commissionType = "service";
+                    } else if (isFamily) {
+                        int serviceRateBps = getRateBps("commission_service_rate", 1000);
+                        l1Amount = orderAmount * serviceRateBps / 10000;
+                        commissionType = "service";
                     } else {
                     } else {
-                        // 没有利润率的产品,只给FAMILY推荐人基础服务佣金
-                        if (isFamily) {
-                            int serviceRateBps = getRateBps("commission_service_rate", 1000);
-                            l1Amount = orderAmount * serviceRateBps / 10000;
-                            commissionType = "service";
-                        } else {
-                            l1Amount = 0;
-                            commissionType = "member";
-                        }
+                        l1Amount = 0;
+                        commissionType = "member";
                     }
                     }
                 } else {
                 } else {
                     // 没有productId的非会员订单(如评估、套餐)
                     // 没有productId的非会员订单(如评估、套餐)

+ 0 - 482
cfc-backend/src/test/java/com/etotem/cfc/controller/AssessmentOrderControllerTest.java

@@ -1,482 +0,0 @@
-package com.etotem.cfc.controller;
-
-import com.etotem.cfc.common.Result;
-import com.etotem.cfc.controller.assessment.AssessmentOrderController;
-import com.etotem.cfc.entity.AssessmentAppointment;
-import com.etotem.cfc.entity.AssessmentOrder;
-import com.etotem.cfc.entity.Family;
-import com.etotem.cfc.mapper.FamilyMapper;
-import com.etotem.cfc.service.AssessmentAppointmentService;
-import com.etotem.cfc.service.AssessmentOrderService;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-
-import javax.annotation.Resource;
-import java.util.*;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-/**
- * P0-测评测试:评估订单创建 → 支付 → 取消 → 退款
- * 覆盖 AssessmentOrderController 全链路
- */
-@SpringBootTest
-public class AssessmentOrderControllerTest {
-
-    @Resource
-    private AssessmentOrderController controller;
-
-    @MockBean
-    private AssessmentOrderService orderService;
-
-    @MockBean
-    private AssessmentAppointmentService appointmentService;
-
-    @MockBean
-    private FamilyMapper familyMapper;
-
-    // ===== 创建订单 =====
-
-    @Test
-    public void createOrder_Success() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("familyId", 100L);
-        body.put("childId", 10L);
-        body.put("guideId", 50L);
-        body.put("packageId", 5L);
-        body.put("guideName", "张规划师");
-        body.put("packageName", "DAN测评年度版");
-        body.put("totalPrice", 198000L);
-        body.put("discountAmount", 0L);
-
-        AssessmentOrder mockOrder = new AssessmentOrder();
-        mockOrder.setId(1L);
-        mockOrder.setOrderNo("ASR20260622001");
-        mockOrder.setFamilyId(100L);
-        mockOrder.setChildId(10L);
-        mockOrder.setGuideId(50L);
-        mockOrder.setPackageId(5L);
-        mockOrder.setActualPrice(198000L);
-        mockOrder.setStatus("pending");
-
-        when(orderService.createOrder(
-                eq(100L), eq(1L), eq(10L), eq(50L), eq(5L),
-                eq("张规划师"), eq("DAN测评年度版"), eq(198000L), eq(0L)
-        )).thenReturn(mockOrder);
-
-        Result<Map<String, Object>> result = controller.createOrder(1L, body);
-
-        assertEquals(200, result.getCode());
-        assertNotNull(result.getData());
-        assertEquals("ASR20260622001", result.getData().get("orderNo"));
-        assertEquals("pending", result.getData().get("status"));
-    }
-
-    @Test
-    public void createOrder_WithAutoGuideAssignment() {
-        // guideId is null but family has teacherId → should auto-assign
-        Family family = new Family();
-        family.setId(100L);
-        family.setTeacherId(50L);
-
-        Map<String, Object> body = new HashMap<>();
-        body.put("familyId", 100L);
-        body.put("childId", 10L);
-        // guideId not provided
-        body.put("packageId", 5L);
-        body.put("guideName", "自动分配");
-        body.put("packageName", "DAN测评");
-        body.put("totalPrice", 98000L);
-        body.put("discountAmount", 0L);
-
-        AssessmentOrder mockOrder = new AssessmentOrder();
-        mockOrder.setOrderNo("ASR20260622002");
-        mockOrder.setStatus("pending");
-        mockOrder.setActualPrice(98000L);
-
-        when(familyMapper.selectById(100L)).thenReturn(family);
-        when(orderService.createOrder(
-                eq(100L), eq(1L), eq(10L), eq(50L), eq(5L),
-                anyString(), anyString(), eq(98000L), eq(0L)
-        )).thenReturn(mockOrder);
-
-        Result<Map<String, Object>> result = controller.createOrder(1L, body);
-
-        assertEquals(200, result.getCode());
-    }
-
-    @Test
-    public void createOrder_WithoutChildId() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("familyId", 100L);
-        // childId not provided
-        body.put("guideId", 50L);
-        body.put("packageId", 5L);
-        body.put("guideName", "张规划师");
-        body.put("packageName", "DAN测评");
-        body.put("totalPrice", 98000L);
-
-        AssessmentOrder mockOrder = new AssessmentOrder();
-        mockOrder.setOrderNo("ASR20260622003");
-        mockOrder.setStatus("pending");
-
-        when(orderService.createOrder(
-                eq(100L), eq(1L), isNull(), eq(50L), eq(5L),
-                anyString(), anyString(), eq(98000L), isNull()
-        )).thenReturn(mockOrder);
-
-        Result<Map<String, Object>> result = controller.createOrder(1L, body);
-
-        assertEquals(200, result.getCode());
-    }
-
-    // ===== 订单详情 =====
-
-    @Test
-    public void getOrderDetail_Success() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setId(1L);
-        order.setOrderNo("ASR20260622001");
-        order.setUserId(1L);
-        order.setStatus("pending");
-        order.setActualPrice(198000L);
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-
-        Result<AssessmentOrder> result = controller.getOrderDetail(1L, body);
-
-        assertEquals(200, result.getCode());
-        assertNotNull(result.getData());
-        assertEquals("ASR20260622001", result.getData().getOrderNo());
-    }
-
-    @Test
-    public void getOrderDetail_OrderNotFound() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "NOTEXIST");
-
-        when(orderService.getByOrderNo("NOTEXIST")).thenReturn(null);
-
-        Result<AssessmentOrder> result = controller.getOrderDetail(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("订单不存在", result.getMessage());
-    }
-
-    @Test
-    public void getOrderDetail_NoPermission() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setUserId(999L); // different user
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-
-        Result<AssessmentOrder> result = controller.getOrderDetail(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("无权查看", result.getMessage());
-    }
-
-    @Test
-    public void getOrderDetail_NullOrderNo() {
-        Map<String, Object> body = new HashMap<>();
-        // orderNo not provided
-
-        Result<AssessmentOrder> result = controller.getOrderDetail(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("订单号不能为空", result.getMessage());
-    }
-
-    // ===== 我的订单列表 =====
-
-    @Test
-    public void getMyOrders_Success() {
-        List<AssessmentOrder> orders = Arrays.asList(
-                createOrder(1L, "ASR001", 1L, "pending"),
-                createOrder(2L, "ASR002", 1L, "paid")
-        );
-        when(orderService.getByUserId(1L)).thenReturn(orders);
-
-        Result<List<AssessmentOrder>> result = controller.getMyOrders(1L);
-
-        assertEquals(200, result.getCode());
-        assertEquals(2, result.getData().size());
-    }
-
-    @Test
-    public void getMyOrders_EmptyList() {
-        when(orderService.getByUserId(1L)).thenReturn(Collections.emptyList());
-
-        Result<List<AssessmentOrder>> result = controller.getMyOrders(1L);
-
-        assertEquals(200, result.getCode());
-        assertTrue(result.getData().isEmpty());
-    }
-
-    // ===== 支付订单 =====
-
-    @Test
-    public void payOrder_Success() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-        body.put("payType", "wechat");
-
-        AssessmentOrder paidOrder = new AssessmentOrder();
-        paidOrder.setOrderNo("ASR20260622001");
-        paidOrder.setStatus("paid");
-        paidOrder.setChildId(10L);
-
-        when(orderService.payOrder("ASR20260622001", "wechat")).thenReturn(true);
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(paidOrder);
-
-        Result<Map<String, Object>> result = controller.payOrder(1L, body);
-
-        assertEquals(200, result.getCode());
-        assertEquals("ASR20260622001", result.getData().get("orderNo"));
-        assertEquals("paid", result.getData().get("status"));
-        verify(appointmentService).confirmAppointmentByOrder(paidOrder);
-    }
-
-    @Test
-    public void payOrder_AlipayType() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622002");
-        body.put("payType", "alipay");
-
-        AssessmentOrder paidOrder = new AssessmentOrder();
-        paidOrder.setOrderNo("ASR20260622002");
-        paidOrder.setStatus("paid");
-        paidOrder.setChildId(10L);
-
-        when(orderService.payOrder("ASR20260622002", "alipay")).thenReturn(true);
-        when(orderService.getByOrderNo("ASR20260622002")).thenReturn(paidOrder);
-
-        Result<Map<String, Object>> result = controller.payOrder(1L, body);
-
-        assertEquals(200, result.getCode());
-        verify(appointmentService).confirmAppointmentByOrder(paidOrder);
-    }
-
-    @Test
-    public void payOrder_Fails() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622003");
-        body.put("payType", "wechat");
-
-        when(orderService.payOrder("ASR20260622003", "wechat")).thenReturn(false);
-
-        Result<Map<String, Object>> result = controller.payOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("支付失败", result.getMessage());
-    }
-
-    @Test
-    public void payOrder_NullOrderNo() {
-        Map<String, Object> body = new HashMap<>();
-        // orderNo not provided
-
-        Result<Map<String, Object>> result = controller.payOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("订单号不能为空", result.getMessage());
-    }
-
-    @Test
-    public void payOrder_NoChildId_DoesNotTriggerConfirm() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622004");
-        body.put("payType", "wechat");
-
-        AssessmentOrder paidOrder = new AssessmentOrder();
-        paidOrder.setOrderNo("ASR20260622004");
-        paidOrder.setStatus("paid");
-        paidOrder.setChildId(null); // no child id
-
-        when(orderService.payOrder("ASR20260622004", "wechat")).thenReturn(true);
-        when(orderService.getByOrderNo("ASR20260622004")).thenReturn(paidOrder);
-
-        controller.payOrder(1L, body);
-
-        verify(appointmentService, never()).confirmAppointmentByOrder(any());
-    }
-
-    // ===== 取消订单 =====
-
-    @Test
-    public void cancelOrder_Success() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setUserId(1L);
-        order.setOrderNo("ASR20260622001");
-        order.setStatus("pending");
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-        when(orderService.cancelOrder("ASR20260622001")).thenReturn(true);
-
-        Result<Boolean> result = controller.cancelOrder(1L, body);
-
-        assertEquals(200, result.getCode());
-        assertTrue(result.getData());
-    }
-
-    @Test
-    public void cancelOrder_OrderNotFound() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "NOTEXIST");
-
-        when(orderService.getByOrderNo("NOTEXIST")).thenReturn(null);
-
-        Result<Boolean> result = controller.cancelOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("订单不存在", result.getMessage());
-    }
-
-    @Test
-    public void cancelOrder_NoPermission() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setUserId(999L); // different user
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-
-        Result<Boolean> result = controller.cancelOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("无权操作", result.getMessage());
-    }
-
-    @Test
-    public void cancelOrder_AlreadyCancelled() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setUserId(1L);
-        order.setOrderNo("ASR20260622001");
-        order.setStatus("cancelled");
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-        when(orderService.cancelOrder("ASR20260622001")).thenReturn(false);
-
-        Result<Boolean> result = controller.cancelOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("取消失败,仅待支付订单可取消", result.getMessage());
-    }
-
-    @Test
-    public void cancelOrder_NullOrderNo() {
-        Map<String, Object> body = new HashMap<>();
-
-        Result<Boolean> result = controller.cancelOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("订单号不能为空", result.getMessage());
-    }
-
-    // ===== 退款订单 =====
-
-    @Test
-    public void refundOrder_Success() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setUserId(1L);
-        order.setOrderNo("ASR20260622001");
-        order.setStatus("paid");
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-        when(orderService.refundOrder("ASR20260622001")).thenReturn(true);
-
-        Result<Boolean> result = controller.refundOrder(1L, body);
-
-        assertEquals(200, result.getCode());
-        assertTrue(result.getData());
-    }
-
-    @Test
-    public void refundOrder_OrderNotFound() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "NOTEXIST");
-
-        when(orderService.getByOrderNo("NOTEXIST")).thenReturn(null);
-
-        Result<Boolean> result = controller.refundOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("订单不存在", result.getMessage());
-    }
-
-    @Test
-    public void refundOrder_NoPermission() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setUserId(999L);
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-
-        Result<Boolean> result = controller.refundOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("无权操作", result.getMessage());
-    }
-
-    @Test
-    public void refundOrder_NotYetPaid() {
-        Map<String, Object> body = new HashMap<>();
-        body.put("orderNo", "ASR20260622001");
-
-        AssessmentOrder order = new AssessmentOrder();
-        order.setUserId(1L);
-        order.setOrderNo("ASR20260622001");
-        order.setStatus("pending");
-
-        when(orderService.getByOrderNo("ASR20260622001")).thenReturn(order);
-        when(orderService.refundOrder("ASR20260622001")).thenReturn(false);
-
-        Result<Boolean> result = controller.refundOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("退款失败,仅已支付订单可退款", result.getMessage());
-    }
-
-    @Test
-    public void refundOrder_NullOrderNo() {
-        Map<String, Object> body = new HashMap<>();
-
-        Result<Boolean> result = controller.refundOrder(1L, body);
-
-        assertEquals(500, result.getCode());
-        assertEquals("订单号不能为空", result.getMessage());
-    }
-
-    // ===== 辅助方法 =====
-
-    private AssessmentOrder createOrder(Long id, String orderNo, Long userId, String status) {
-        AssessmentOrder order = new AssessmentOrder();
-        order.setId(id);
-        order.setOrderNo(orderNo);
-        order.setUserId(userId);
-        order.setStatus(status);
-        order.setActualPrice(98000L);
-        return order;
-    }
-}

+ 0 - 353
cfc-backend/src/test/java/com/etotem/cfc/integration/AssessmentOrderFlowTest.java

@@ -1,353 +0,0 @@
-package com.etotem.cfc.integration;
-
-import com.etotem.cfc.common.Result;
-import com.etotem.cfc.controller.assessment.AssessmentOrderController;
-import com.etotem.cfc.controller.assessment.AssessmentAppointmentController;
-import com.etotem.cfc.controller.DanAssessmentController;
-import com.etotem.cfc.entity.*;
-import com.etotem.cfc.mapper.*;
-import com.etotem.cfc.service.*;
-import org.junit.jupiter.api.*;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-
-import javax.annotation.Resource;
-import java.util.*;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-/**
- * ================================================================
- * 场景:测评订单全流程
- * ================================================================
- * 用户故事:作为家长,我希望为孩子购买专业测评服务,
- *           以便了解孩子的认知发展状况并获得成长建议。
- *
- * 流程步骤:
- *   1. 家长选择规划师和测评套餐,创建评估订单
- *   2. 家长完成支付,订单状态变更为"已支付"
- *   3. 系统自动确认预约,预约状态变更为"待测评"
- *   4. 规划师确认预约,查看孩子的基本信息(快照)
- *   5. 规划师完成测评,录入认知评估结果
- *   6. 家长/孩子查看测评报告
- *
- * 关键里程碑:
- *   - [Milestone-1] 订单创建成功,获得订单号
- *   - [Milestone-2] 支付成功,预约自动创建
- *   - [Milestone-3] 规划师确认预约
- *   - [Milestone-4] 测评结果录入完成
- *   - [Milestone-5] 家长可查询到孩子的最新报告
- * ================================================================
- */
-@SpringBootTest
-public class AssessmentOrderFlowTest {
-
-    @Resource
-    private AssessmentOrderController orderController;
-
-    @Resource
-    private AssessmentAppointmentController appointmentController;
-
-    @Resource
-    private DanAssessmentController danAssessmentController;
-
-    @MockBean
-    private AssessmentOrderService orderService;
-
-    @MockBean
-    private AssessmentAppointmentService appointmentService;
-
-    @MockBean
-    private AssessmentService assessmentService;
-
-    @MockBean
-    private PaymentService paymentService;
-
-    @MockBean
-    private FamilyMapper familyMapper;
-
-    @MockBean
-    private UserMapper userMapper;
-
-    @MockBean
-    private DanAssessmentResultMapper danAssessmentResultMapper;
-
-    // ========== 测试数据 ==========
-
-    private static final Long PARENT_USER_ID = 1001L;
-    private static final Long CHILD_ID = 2001L;
-    private static final Long FAMILY_ID = 3001L;
-    private static final Long GUIDE_ID = 4001L;
-    private static final Long PACKAGE_ID = 5001L;
-    private static final String ORDER_NO = "ASR20260628001";
-    private static final String PACKAGE_NAME = "DAN认知测评年度版";
-    private static final String GUIDE_NAME = "张规划师";
-
-    // ========== 场景1:正常支付流程 ==========
-
-    /**
-     * 场景:家长选择规划师并购买测评套餐,完成支付
-     * 角色:家长
-     * 触发条件:家长选择了具体的规划师和测评套餐
-     */
-    @Test
-    @DisplayName("[场景1] 家长购买测评套餐并完成支付 - 期望全流程成功")
-    void parentPurchasesAssessmentPackage_Success() {
-        // === Given:家长已选择规划师和孩子 ===
-        Map<String, Object> createOrderRequest = new HashMap<>();
-        createOrderRequest.put("familyId", FAMILY_ID);
-        createOrderRequest.put("childId", CHILD_ID);
-        createOrderRequest.put("guideId", GUIDE_ID);
-        createOrderRequest.put("packageId", PACKAGE_ID);
-        createOrderRequest.put("guideName", GUIDE_NAME);
-        createOrderRequest.put("packageName", PACKAGE_NAME);
-        createOrderRequest.put("totalPrice", 198000L);
-        createOrderRequest.put("discountAmount", 0L);
-
-        // Mock 创建订单服务
-        AssessmentOrder mockOrder = createMockOrder(ORDER_NO, "pending", 198000L);
-        when(orderService.createOrder(
-                eq(FAMILY_ID), eq(PARENT_USER_ID), eq(CHILD_ID), eq(GUIDE_ID), eq(PACKAGE_ID),
-                eq(GUIDE_NAME), eq(PACKAGE_NAME), eq(198000L), eq(0L)
-        )).thenReturn(mockOrder);
-
-        // === When:家长创建订单 ===
-        Result<Map<String, Object>> createResult = orderController.createOrder(PARENT_USER_ID, createOrderRequest);
-
-        // === Then:Milestone-1 - 订单创建成功 ===
-        assertEquals(200, createResult.getCode());
-        assertNotNull(createResult.getData());
-        assertEquals(ORDER_NO, createResult.getData().get("orderNo"));
-        assertEquals("pending", createResult.getData().get("status"));
-        verify(orderService).createOrder(
-                eq(FAMILY_ID), eq(PARENT_USER_ID), eq(CHILD_ID), eq(GUIDE_ID), eq(PACKAGE_ID),
-                eq(GUIDE_NAME), eq(PACKAGE_NAME), eq(198000L), eq(0L)
-        );
-
-        // === Given:订单已创建,现在进行支付 ===
-        when(orderService.getByOrderNo(ORDER_NO)).thenReturn(mockOrder);
-        when(paymentService.processPayment(eq(ORDER_NO), anyString())).thenReturn(true);
-
-        // Mock 预约服务
-        AssessmentAppointment mockAppointment = createMockAppointment(1L, "pending");
-        when(appointmentService.confirmAppointmentByOrder(any(AssessmentOrder.class))).thenReturn(mockAppointment);
-
-        // === When:家长使用微信支付 ===
-        Map<String, Object> payRequest = new HashMap<>();
-        payRequest.put("orderNo", ORDER_NO);
-        payRequest.put("payType", "wechat");
-        Result<Map<String, Object>> payResult = orderController.payOrder(PARENT_USER_ID, payRequest);
-
-        // === Then:Milestone-2 - 支付成功,预约自动创建 ===
-        assertEquals(200, payResult.getCode());
-        assertEquals("paid", payResult.getData().get("status"));
-        assertNotNull(payResult.getData().get("payTime"));
-        verify(paymentService).processPayment(eq(ORDER_NO), eq("wechat"));
-        verify(appointmentService).confirmAppointmentByOrder(any(AssessmentOrder.class));
-    }
-
-    // ========== 场景2:自动分配规划师流程 ==========
-
-    /**
-     * 场景:家长未指定规划师,系统自动分配家庭绑定的规划师
-     * 角色:家长
-     * 触发条件:家长未指定 guideId,但家庭已绑定规划师
-     */
-    @Test
-    @DisplayName("[场景2] 未指定规划师时系统自动分配 - 期望使用家庭绑定的规划师")
-    void parentCreatesOrderWithoutGuide_AutoAssignFromFamily() {
-        // === Given:家庭已绑定规划师 ===
-        Family family = new Family();
-        family.setId(FAMILY_ID);
-        family.setTeacherId(GUIDE_ID);
-        when(familyMapper.selectById(FAMILY_ID)).thenReturn(family);
-
-        Map<String, Object> createOrderRequest = new HashMap<>();
-        createOrderRequest.put("familyId", FAMILY_ID);
-        createOrderRequest.put("childId", CHILD_ID);
-        // guideId 未指定
-        createOrderRequest.put("packageId", PACKAGE_ID);
-        createOrderRequest.put("guideName", "自动分配");
-        createOrderRequest.put("packageName", PACKAGE_NAME);
-        createOrderRequest.put("totalPrice", 98000L);
-        createOrderRequest.put("discountAmount", 0L);
-
-        AssessmentOrder mockOrder = createMockOrder(ORDER_NO, "pending", 98000L);
-        when(orderService.createOrder(
-                eq(FAMILY_ID), eq(PARENT_USER_ID), eq(CHILD_ID), eq(GUIDE_ID), eq(PACKAGE_ID),
-                anyString(), anyString(), eq(98000L), eq(0L)
-        )).thenReturn(mockOrder);
-
-        // === When:家长创建订单(不指定规划师)===
-        Result<Map<String, Object>> createResult = orderController.createOrder(PARENT_USER_ID, createOrderRequest);
-
-        // === Then:系统自动使用家庭绑定的规划师 ===
-        assertEquals(200, createResult.getCode());
-        assertEquals(ORDER_NO, createResult.getData().get("orderNo"));
-        verify(familyMapper).selectById(FAMILY_ID);
-        verify(orderService).createOrder(
-                eq(FAMILY_ID), eq(PARENT_USER_ID), eq(CHILD_ID), eq(GUIDE_ID), eq(PACKAGE_ID),
-                anyString(), anyString(), eq(98000L), eq(0L)
-        );
-    }
-
-    // ========== 场景3:规划师录入测评结果 ==========
-
-    /**
-     * 场景:规划师完成测评后,录入孩子的认知评估结果
-     * 角色:成长规划师
-     * 触发条件:预约已完成,规划师完成了一对一测评
-     */
-    @Test
-    @DisplayName("[场景3] 规划师录入测评结果 - 期望结果保存并可查询")
-    void guideRecordsAssessmentResult_Success() {
-        // === Given:存在已确认的预约 ===
-        Long appointmentId = 1L;
-        when(assessmentService.getByAppointmentId(appointmentId)).thenReturn(null);
-
-        DanAssessmentResult inputResult = new DanAssessmentResult();
-        inputResult.setChildId(CHILD_ID);
-        inputResult.setChildName("王小明");
-        inputResult.setAppointmentId(appointmentId);
-        inputResult.setOverallScore(85);
-        inputResult.setAttentionScore(88);
-        inputResult.setFocusScore(82);
-        inputResult.setMemoryScore(90);
-        inputResult.setLogicScore(78);
-        inputResult.setPerceptionScore(85);
-        inputResult.setSpatialScore(80);
-        inputResult.setProcessingSpeedScore(83);
-        inputResult.setAnalysisReport("孩子整体认知发展良好...");
-        inputResult.setGrowthSuggestions("建议加强逻辑思维训练...");
-        inputResult.setStatus("completed");
-
-        when(assessmentService.recordResult(any(DanAssessmentResult.class))).thenAnswer(invocation -> {
-            DanAssessmentResult result = invocation.getArgument(0);
-            result.setId(1L);
-            return result;
-        });
-
-        // === When:规划师提交测评结果 ===
-        Result<DanAssessmentResult> recordResult = danAssessmentController.recordResult(inputResult);
-
-        // === Then:Milestone-4 - 测评结果保存成功 ===
-        assertEquals(200, recordResult.getCode());
-        assertNotNull(recordResult.getData());
-        assertNotNull(recordResult.getData().getId());
-        assertEquals("completed", recordResult.getData().getStatus());
-        assertEquals(85, recordResult.getData().getOverallScore());
-        verify(assessmentService).recordResult(any(DanAssessmentResult.class));
-    }
-
-    // ========== 场景4:家长查询孩子测评报告 ==========
-
-    // ========== 场景5:取消未支付订单 ==========
-
-    /**
-     * 场景:家长创建订单后决定取消,选择关闭交易
-     * 角色:家长
-     * 触发条件:订单状态为"待支付"
-     */
-    @Test
-    @DisplayName("[场景5] 家长取消未支付订单 - 期望订单关闭成功")
-    void parentCancelsPendingOrder_Success() {
-        // === Given:存在待支付的订单 ===
-        AssessmentOrder pendingOrder = createMockOrder(ORDER_NO, "pending", 198000L);
-        pendingOrder.setUserId(PARENT_USER_ID);
-        when(orderService.getByOrderNo(ORDER_NO)).thenReturn(pendingOrder);
-        when(orderService.cancelOrder(ORDER_NO)).thenReturn(true);
-
-        // === When:家长取消订单 ===
-        Map<String, Object> cancelRequest = new HashMap<>();
-        cancelRequest.put("orderNo", ORDER_NO);
-        Result<Boolean> cancelResult = orderController.cancelOrder(PARENT_USER_ID, cancelRequest);
-
-        // === Then:订单成功取消 ===
-        assertEquals(200, cancelResult.getCode());
-        assertTrue(cancelResult.getData());
-        verify(orderService).cancelOrder(ORDER_NO);
-    }
-
-    // ========== 场景6:已支付订单退款 ==========
-
-    /**
-     * 场景:家长支付后因故需要退款,由规划师确认后完成退款
-     * 角色:家长(发起退款)→ 系统处理
-     * 触发条件:订单状态为"已支付"
-     */
-    @Test
-    @DisplayName("[场景6] 已支付订单申请退款 - 期望退款成功")
-    void parentRequestsRefundForPaidOrder_Success() {
-        // === Given:存在已支付的订单 ===
-        AssessmentOrder paidOrder = createMockOrder(ORDER_NO, "paid", 198000L);
-        paidOrder.setUserId(PARENT_USER_ID);
-        when(orderService.getByOrderNo(ORDER_NO)).thenReturn(paidOrder);
-        when(orderService.refundOrder(ORDER_NO)).thenReturn(true);
-
-        // === When:家长申请退款 ===
-        Map<String, Object> refundRequest = new HashMap<>();
-        refundRequest.put("orderNo", ORDER_NO);
-        Result<Boolean> refundResult = orderController.refundOrder(PARENT_USER_ID, refundRequest);
-
-        // === Then:退款成功 ===
-        assertEquals(200, refundResult.getCode());
-        assertTrue(refundResult.getData());
-        verify(orderService).refundOrder(ORDER_NO);
-    }
-
-    // ========== 场景7:无权查看他人订单 ==========
-
-    /**
-     * 场景:家长尝试查看其他家庭的订单详情
-     * 角色:家长
-     * 触发条件:订单不属于当前用户
-     */
-    @Test
-    @DisplayName("[场景7] 查看非本人订单 - 期望拒绝访问")
-    void parentViewsOtherFamilyOrder_Forbidden() {
-        // === Given:存在其他用户的订单 ===
-        AssessmentOrder otherOrder = createMockOrder(ORDER_NO, "paid", 198000L);
-        otherOrder.setUserId(9999L); // 不同用户
-        when(orderService.getByOrderNo(ORDER_NO)).thenReturn(otherOrder);
-
-        // === When:家长尝试查看他人订单 ===
-        Map<String, Object> detailRequest = new HashMap<>();
-        detailRequest.put("orderNo", ORDER_NO);
-        Result<AssessmentOrder> detailResult = orderController.getOrderDetail(PARENT_USER_ID, detailRequest);
-
-        // === Then:拒绝访问 ===
-        assertEquals(500, detailResult.getCode());
-        assertEquals("无权查看", detailResult.getMessage());
-    }
-
-    // ========== Helper Methods ==========
-
-    private AssessmentOrder createMockOrder(String orderNo, String status, Long actualPrice) {
-        AssessmentOrder order = new AssessmentOrder();
-        order.setId(1L);
-        order.setOrderNo(orderNo);
-        order.setFamilyId(FAMILY_ID);
-        order.setUserId(PARENT_USER_ID);
-        order.setChildId(CHILD_ID);
-        order.setGuideId(GUIDE_ID);
-        order.setPackageId(PACKAGE_ID);
-        order.setGuideName(GUIDE_NAME);
-        order.setPackageName(PACKAGE_NAME);
-        order.setActualPrice(actualPrice);
-        order.setStatus(status);
-        return order;
-    }
-
-    private AssessmentAppointment createMockAppointment(Long id, String status) {
-        AssessmentAppointment appointment = new AssessmentAppointment();
-        appointment.setId(id);
-        appointment.setChildId(CHILD_ID);
-        appointment.setGuideId(GUIDE_ID);
-        appointment.setStatus(0); // 0: pending
-        appointment.setAppointmentDate("2026-07-15");
-        appointment.setAppointmentTime("14:00");
-        return appointment;
-    }
-}

+ 2 - 2
cfc-frontend/pages/guide/plans/detail.vue

@@ -32,7 +32,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { getPlanDetail, reviewPlan, activatePlan } from '@/utils/api'
+import { getGuidePlanDetail, reviewPlan, activatePlan } from '@/utils/api'
 
 
 export default {
 export default {
   data() {
   data() {
@@ -46,7 +46,7 @@ export default {
   methods: {
   methods: {
     async loadPlan(planId) {
     async loadPlan(planId) {
       try {
       try {
-        const res = await getPlanDetail({ planId })
+        const res = await getGuidePlanDetail({ planId })
         if (res.code === 200) this.plan = res.data
         if (res.code === 200) this.plan = res.data
       } catch (e) { /* ignore */ }
       } catch (e) { /* ignore */ }
     },
     },

+ 1 - 1
cfc-frontend/pages/guide/plans/index.vue

@@ -53,7 +53,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { listFamilyPlans, reviewPlan, activatePlan, getPlanDetail } from '@/utils/api'
+import { listFamilyPlans, reviewPlan, activatePlan, getGuidePlanDetail } from '@/utils/api'
 
 
 export default {
 export default {
   data() {
   data() {

+ 4 - 4
cfc-frontend/utils/api.js

@@ -727,17 +727,17 @@ export const handleAlipayCallback = (params) => {
 
 
 // 鑾峰彇鎴戠殑娴嬭瘎鎶ュ憡
 // 鑾峰彇鎴戠殑娴嬭瘎鎶ュ憡
 export const getMyAssessmentResults = (userId) => {
 export const getMyAssessmentResults = (userId) => {
-  return request('/api/dan-assessment/my-results?userId=' + userId, 'GET')
+  return request('/api/dan-assessment/my-results', 'POST', { userId })
 }
 }
 
 
 // 鑾峰彇涓嬬骇鎴愰暱瑙勫垝甯堢殑娴嬭瘎鎶ュ憡
 // 鑾峰彇涓嬬骇鎴愰暱瑙勫垝甯堢殑娴嬭瘎鎶ュ憡
 export const getChildAssessmentResults = (userId) => {
 export const getChildAssessmentResults = (userId) => {
-  return request('/api/dan-assessment/child-results?userId=' + userId, 'GET')
+  return request('/api/dan-assessment/child-results', 'POST', { userId })
 }
 }
 
 
 // 鑾峰彇娴嬭瘎鎶ュ憡璇︽儏
 // 鑾峰彇娴嬭瘎鎶ュ憡璇︽儏
 export const getAssessmentResult = (id) => {
 export const getAssessmentResult = (id) => {
-  return request('/api/dan-assessment/result/' + id, 'GET')
+  return request('/api/dan-assessment/result/' + id, 'POST')
 }
 }
 
 
 // 鍒涘缓娴嬭瘎棰勭害
 // 鍒涘缓娴嬭瘎棰勭害
@@ -1679,4 +1679,4 @@ export const getProductRequiredFields = (productId) => request('/api/product/pur
 export const listFamilyPlans = (data) => request('/api/guide/plans/family-list', 'POST', data)
 export const listFamilyPlans = (data) => request('/api/guide/plans/family-list', 'POST', data)
 export const reviewPlan = (data) => request('/api/guide/plans/review', 'POST', data)
 export const reviewPlan = (data) => request('/api/guide/plans/review', 'POST', data)
 export const activatePlan = (data) => request('/api/guide/plans/activate', 'POST', data)
 export const activatePlan = (data) => request('/api/guide/plans/activate', 'POST', data)
-export const getPlanDetail = (data) => request('/api/guide/plans/detail', 'POST', data)
+export const getGuidePlanDetail = (data) => request('/api/guide/plans/detail', 'POST', data)

+ 11 - 11
cfc-web/src/api/assessment.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 export function getAssessmentMaterials() {
 export function getAssessmentMaterials() {
   return request({
   return request({
     url: '/api/admin/assessment/materials',
     url: '/api/admin/assessment/materials',
-    method: 'get'
+    method: 'post'
   })
   })
 }
 }
 
 
@@ -17,30 +17,30 @@ export function createAssessmentMaterial(data) {
 
 
 export function updateAssessmentMaterial(id, data) {
 export function updateAssessmentMaterial(id, data) {
   return request({
   return request({
-    url: `/api/admin/assessment/materials/${id}`,
-    method: 'put',
+    url: `/api/admin/assessment/materials/${id}/update`,
+    method: 'post',
     data
     data
   })
   })
 }
 }
 
 
 export function deleteAssessmentMaterial(id) {
 export function deleteAssessmentMaterial(id) {
   return request({
   return request({
-    url: `/api/admin/assessment/materials/${id}`,
-    method: 'delete'
+    url: `/api/admin/assessment/materials/${id}/delete`,
+    method: 'post'
   })
   })
 }
 }
 
 
 export function getAssessmentConfig() {
 export function getAssessmentConfig() {
   return request({
   return request({
     url: '/api/admin/assessment/config',
     url: '/api/admin/assessment/config',
-    method: 'get'
+    method: 'post'
   })
   })
 }
 }
 
 
 export function updateAssessmentConfig(data) {
 export function updateAssessmentConfig(data) {
   return request({
   return request({
-    url: '/api/admin/assessment/config',
-    method: 'put',
+    url: '/api/admin/assessment/config/update',
+    method: 'post',
     data
     data
   })
   })
 }
 }
@@ -62,15 +62,15 @@ export function enableFamilyAssessment(data) {
 
 
 export function disableFamilyAssessment(familyId) {
 export function disableFamilyAssessment(familyId) {
   return request({
   return request({
-    url: `/api/guide/assessment/family/${familyId}`,
-    method: 'delete'
+    url: `/api/guide/assessment/family/${familyId}/disable`,
+    method: 'post'
   })
   })
 }
 }
 
 
 export function getGuideAssessmentMaterials() {
 export function getGuideAssessmentMaterials() {
   return request({
   return request({
     url: '/api/guide/assessment/materials',
     url: '/api/guide/assessment/materials',
-    method: 'get'
+    method: 'post'
   })
   })
 }
 }