Quellcode durchsuchen

feat(team): S-cfc-63 team.user.portal 实现使绿 - 场景A注册绑定 referrerId + 邀请校验补团队业绩预览

- DistributionService.registerByInviteCode:未注册用户扫码入团时绑定 user.referrerId=邀请人(§5.1场景A①/§9#10,幂等不覆盖既有推荐人)
- DistributionInviteController.validate:校验返回补 teamPerformance 预览键(§5.2,以团队规模 memberCount 先落结构)
- TeamUserPortalContractTest:4/4 绿(RED 2 失败 → GREEN 0 失败)
E2E Test Bot vor 4 Tagen
Ursprung
Commit
b6d5b0391

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

@@ -58,12 +58,29 @@ public class DistributionInviteController {
             teamName = teamsResult.getData().get(0).getName();
         }
 
+        // §5.2 契约(T6 团队邀请入口):校验返回须含「团队业绩」预览——以团队规模(memberCount)为先落结构,
+        // 精确业绩金额待设计契约化后扩展(test 只锁定键存在,设计未契约化)。
+        Integer teamMemberCount = null;
+        if (relation.getSystemId() != null) {
+            Result<List<Map<String, Object>>> membersResult =
+                    distributionService.getTeamMembers(relation.getSystemId());
+            if (membersResult != null && membersResult.getCode() == 200 && membersResult.getData() != null) {
+                teamMemberCount = membersResult.getData().size();
+            }
+        }
+
         Map<String, Object> result = new java.util.LinkedHashMap<>();
         result.put("valid", true);
         result.put("inviteCode", inviteCode);
         result.put("systemId", relation.getSystemId());
         result.put("inviterId", relation.getUserId());
         result.put("teamName", teamName);
+
+        Map<String, Object> teamPerformance = new java.util.LinkedHashMap<>();
+        teamPerformance.put("systemId", relation.getSystemId());
+        teamPerformance.put("teamName", teamName);
+        teamPerformance.put("memberCount", teamMemberCount != null ? teamMemberCount : 0);
+        result.put("teamPerformance", teamPerformance);
         return Result.success(result);
     }
 

+ 11 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/DistributionService.java

@@ -404,6 +404,17 @@ public class DistributionService {
         relation.setDepth(inviter.getDepth() + 1);
         relation.setCreatedAt(new Date());
         distributionRelationMapper.insert(relation);
+
+        // §5.1 场景A① / §9#10:未注册用户扫码入团时,同时绑定 user.referrerId=邀请人
+        // (F03a/F03b 可得)。幂等:用户已有推荐人关系则不覆盖(与场景B「不改变既有推荐人关系」口径一致)。
+        if (newUserId != null) {
+            User joiner = userMapper.selectById(newUserId);
+            if (joiner != null && joiner.getReferrerId() == null) {
+                joiner.setReferrerId(inviter.getUserId());
+                joiner.setUpdatedAt(new Date());
+                userMapper.updateById(joiner);
+            }
+        }
         return Result.success("注册成功");
     }
 }