Эх сурвалжийг харах

S-cfc-232: Implement family.family.autoCreateForPurchase to auto-create initial family on purchase

无家庭新用户购买会员时自动创建初始家庭并完成购买(MembershipController
/upgrade、/trial、/orders 由 getUserFamilyId 改走 getOrCreateUserFamilyId;
/plan/purchase 改走 get-or-create,noFamily(5001) 守卫仅作兜底保留)。
契约测试 FamilyAutoCreateForPurchaseContractTest 5/5 转绿(原 4F/1G)。
zxyj-langgraph 45 минут өмнө
parent
commit
d819f2dd28

+ 15 - 6
cfc-backend/src/main/java/com/etotem/cfc/controller/MembershipController.java

@@ -196,7 +196,8 @@ public class MembershipController {
             return Result.error("用户不存在");
         }
 
-        Long familyId = membershipService.getUserFamilyId(userId);
+        // S-cfc-232 family.family.autoCreateForPurchase: 无家庭新用户购买时自动创建初始家庭
+        Long familyId = membershipService.getOrCreateUserFamilyId(userId);
         String levelCode = params.getOrDefault("levelCode", "FAMILY").toString();
         String paymentType = params.getOrDefault("paymentType", "yearly").toString();
         String period = params.getOrDefault("period", "yearly").toString();
@@ -221,7 +222,8 @@ public class MembershipController {
             return Result.error("用户不存在");
         }
 
-        Long familyId = membershipService.getUserFamilyId(userId);
+        // S-cfc-232 family.family.autoCreateForPurchase: 无家庭新用户激活试用时自动创建初始家庭
+        Long familyId = membershipService.getOrCreateUserFamilyId(userId);
         PaymentOrderDTO order = membershipService.createOrder(userId, familyId, "FAMILY", "trial", null, null);
         return Result.success(order);
     }
@@ -242,7 +244,8 @@ public class MembershipController {
             return Result.error("用户不存在");
         }
 
-        Long familyId = membershipService.getUserFamilyId(userId);
+        // S-cfc-232 family.family.autoCreateForPurchase: 无家庭新用户下单时自动创建初始家庭
+        Long familyId = membershipService.getOrCreateUserFamilyId(userId);
         String levelCode = params.get("levelCode").toString();
         String paymentType = params.get("paymentType").toString();
         String period = params.get("period") != null ? params.get("period").toString() : "yearly";
@@ -280,7 +283,9 @@ public class MembershipController {
 
     /**
      * 购买会员档位(SC-P-58 一段式购买入口:选档位 → 待支付订单 + 支付参数)。
-     * 无家庭时 fail-fast 拒绝(与 createOrder 同源文案),家庭维度重复购买幂等在
+     * 无家庭新用户购买时自动创建初始家庭(family.family.autoCreateForPurchase;
+     * 与 /upgrade|/trial|/orders 同语义);get-or-create 仍无法获得家庭时
+     * noFamily 守卫兜底拒绝。家庭维度重复购买幂等在
      * {@code MembershipService#createOrder} 落单前守卫。
      */
     @Operation(summary = "购买会员档位")
@@ -295,7 +300,11 @@ public class MembershipController {
         if (user == null) {
             return Result.error("用户不存在");
         }
-        if (user.getFamilyId() == null) {
+
+        // S-cfc-232 family.family.autoCreateForPurchase: 无家庭新用户自动创建初始家庭后继续购买;
+        // 兜底:get-or-create 仍无法获得家庭时才 noFamily(5001) 守卫拒绝
+        Long familyId = membershipService.getOrCreateUserFamilyId(userId);
+        if (familyId == null) {
             return Result.noFamily("请先创建或加入家庭后再购买会员");
         }
 
@@ -307,7 +316,7 @@ public class MembershipController {
         Long couponId = ParamUtils.getLong(params.get("couponId"));
 
         Map<String, Object> result = membershipService.purchasePlan(
-                userId, user.getFamilyId(), levelCode, period, couponId);
+                userId, familyId, levelCode, period, couponId);
         if (result == null) {
             return Result.error(46001, "该商品暂未开放购买");
         }