Pārlūkot izejas kodu

feat(family-invite): 邀请切换改为单成员切换语义并接入非微信限制

Sisyphus 2 nedēļas atpakaļ
vecāks
revīzija
1a61ee2777

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

@@ -34,7 +34,8 @@ public class FamilyHealthScoreService {
         }
 
         LambdaQueryWrapper<FamilyMember> wrapper = new LambdaQueryWrapper<FamilyMember>()
-                .eq(FamilyMember::getFamilyId, familyId);
+                .eq(FamilyMember::getFamilyId, familyId)
+                .ne(FamilyMember::getStatus, "recycled");
         SortUtil.applySort(wrapper);
         List<FamilyMember> allMembers = familyMemberMapper.selectList(wrapper);
 

+ 12 - 56
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyInvitationService.java

@@ -4,13 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.etotem.cfc.dto.FamilyStatusDTO;
 import com.etotem.cfc.dto.InviteValidateDTO;
-import com.etotem.cfc.entity.FamilyMember;
-import com.etotem.cfc.entity.FamilyMembership;
 import com.etotem.cfc.entity.Family;
 import com.etotem.cfc.entity.FamilyInvitation;
 import com.etotem.cfc.entity.User;
-import com.etotem.cfc.mapper.FamilyMemberMapper;
-import com.etotem.cfc.mapper.FamilyMembershipMapper;
 import com.etotem.cfc.mapper.FamilyInvitationMapper;
 import com.etotem.cfc.mapper.FamilyMapper;
 import com.etotem.cfc.mapper.UserMapper;
@@ -34,10 +30,7 @@ public class FamilyInvitationService {
     private UserMapper userMapper;
 
     @Resource
-    private FamilyMemberMapper familyMemberMapper;
-
-    @Resource
-    private FamilyMembershipMapper familyMembershipMapper;
+    private FamilyMemberService familyMemberService;
 
     public InviteValidateDTO validateInvitation(String token) {
         FamilyInvitation invitation = familyInvitationMapper.selectOne(
@@ -161,7 +154,8 @@ public class FamilyInvitationService {
             if (mergeFamily == null || !mergeFamily) {
                 throw new RuntimeException("您已加入其他家庭,如需加入请选择合并家庭");
             }
-            mergeIntoFamily(userId, invitation.getFamilyId());
+            // 切换家庭:迁移该成员资产到新家庭,CF 清零留在原家庭
+            familyMemberService.switchMemberToFamily(userId, invitation.getFamilyId());
         }
 
         user.setFamilyId(invitation.getFamilyId());
@@ -181,54 +175,16 @@ public class FamilyInvitationService {
         return "加入家庭成功";
     }
 
+    /**
+     * 切换家庭(兼容旧调用方:UserService.joinFamily / FamilyJoinRequestService.approveJoinRequest)
+     * 语义已从"合并整个家庭"改为"切换单个成员":
+     * - 只迁移该用户自己的 family_members 记录与资产到目标家庭
+     * - 不搬走旧家庭其他成员
+     * - 不迁移 family_memberships(付费等级留在原家庭)
+     * - CF 值清零留在原家庭
+     */
     public void mergeIntoFamily(Long userId, Long targetFamilyId) {
-        User user = userMapper.selectById(userId);
-        if (user == null) {
-            throw new RuntimeException("用户不存在");
-        }
-        Long oldFamilyId = user.getFamilyId();
-        if (oldFamilyId == null || oldFamilyId == 0L) {
-            throw new RuntimeException("用户尚未加入任何家庭");
-        }
-
-        user.setFamilyId(targetFamilyId);
-        user.setUpdatedAt(new Date());
-        userMapper.updateById(user);
-
-        List<FamilyMember> children = familyMemberMapper.selectList(
-                new LambdaQueryWrapper<FamilyMember>()
-                        .eq(FamilyMember::getFamilyId, oldFamilyId)
-        );
-        for (FamilyMember child : children) {
-            child.setFamilyId(targetFamilyId);
-            child.setUpdatedAt(new Date());
-            familyMemberMapper.updateById(child);
-        }
-
-        // 迁移家庭会员记录(付费等级等)
-        List<FamilyMembership> memberships = familyMembershipMapper.selectList(
-                new LambdaQueryWrapper<FamilyMembership>()
-                        .eq(FamilyMembership::getFamilyId, oldFamilyId)
-        );
-        for (FamilyMembership ms : memberships) {
-            ms.setFamilyId(targetFamilyId);
-            familyMembershipMapper.updateById(ms);
-        }
-
-        // 只有在确实迁移到不同家庭时才检查并清理旧家庭
-        if (!oldFamilyId.equals(targetFamilyId)) {
-            Long memberCount = userMapper.selectCount(
-                    new LambdaQueryWrapper<User>()
-                            .eq(User::getFamilyId, oldFamilyId)
-            );
-            Long fmCount = familyMemberMapper.selectCount(
-                    new LambdaQueryWrapper<FamilyMember>()
-                            .eq(FamilyMember::getFamilyId, oldFamilyId)
-            );
-            if (memberCount == 0 && fmCount == 0) {
-                familyMapper.deleteById(oldFamilyId);
-            }
-        }
+        familyMemberService.switchMemberToFamily(userId, targetFamilyId);
     }
 
     public FamilyStatusDTO checkUserFamilyStatus(Long userId) {