Browse Source

fix(family): switchMemberToFamily 兼容孤儿成员记录,审批加入不再 500

Xiaogang Liao 19 hours ago
parent
commit
f5b441810b

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

@@ -674,7 +674,41 @@ vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
                         .eq(FamilyMember::getUserId, userId)
                         .last("LIMIT 1"));
         if (member == null) {
-            throw new RuntimeException("未找到该用户的家庭成员记录");
+            // 兼容历史孤儿数据:users.family_id 指向旧家庭但 family_members 无该用户成员记录
+            // (早期创建家庭路径漏建创建者成员记录)。旧家庭无能量值资产(按 member_id 关联必然无),
+            // 健康报告按 user_id 关联可能残留,先尝试迁移;再在目标家庭补建成员记录,后续流程自然兼容。
+            try {
+                List<HealthReport> orphanReports = healthReportMapper.selectList(
+                        new LambdaQueryWrapper<HealthReport>()
+                                .eq(HealthReport::getFamilyId, oldFamilyId)
+                                .and(w -> w.eq(HealthReport::getUserId, userId)
+                                        .or().eq(HealthReport::getSubjectId, userId)));
+                for (HealthReport r : orphanReports) {
+                    r.setFamilyId(targetFamilyId);
+                    healthReportMapper.updateById(r);
+                }
+            } catch (Exception e) {
+                log.warn("孤儿成员健康报告迁移异常: userId={}, oldFamilyId={}", userId, oldFamilyId, e);
+            }
+
+            FamilyMember newMember = new FamilyMember();
+            newMember.setFamilyId(targetFamilyId);
+            newMember.setUserId(userId);
+            newMember.setNickname((user.getNickname() != null && !user.getNickname().isEmpty())
+                    ? user.getNickname() : ("用户" + userId));
+            newMember.setPhone(user.getPhone());
+            newMember.setAvatar(user.getAvatar());
+            newMember.setGender(user.getGender());
+            newMember.setGeneration(0);
+            newMember.setTotalPoints(0);
+            newMember.setSystemPoints(0);
+            newMember.setStatus("active");
+            newMember.setCreatedAt(new Date());
+            newMember.setUpdatedAt(new Date());
+            familyMemberMapper.insert(newMember);
+            member = newMember;
+            log.warn("成员记录缺失,已在目标家庭补建: userId={}, oldFamilyId={}, targetFamilyId={}, memberId={}",
+                    userId, oldFamilyId, targetFamilyId, member.getId());
         }
 
         // CF 值清零丢弃(留在原家庭)