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

fix(backend): 报告成员权限管理员判定兼容家庭创建者与 users.is_family_admin

Xiaogang Liao 2 недель назад
Родитель
Сommit
0dd690225e

+ 36 - 2
cfc-backend/src/main/java/com/etotem/cfc/service/ReportMemberPermissionService.java

@@ -1,10 +1,14 @@
 package com.etotem.cfc.service;
 package com.etotem.cfc.service;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.entity.Family;
 import com.etotem.cfc.entity.FamilyMember;
 import com.etotem.cfc.entity.FamilyMember;
 import com.etotem.cfc.entity.ReportMemberPermission;
 import com.etotem.cfc.entity.ReportMemberPermission;
+import com.etotem.cfc.entity.User;
+import com.etotem.cfc.mapper.FamilyMapper;
 import com.etotem.cfc.mapper.FamilyMemberMapper;
 import com.etotem.cfc.mapper.FamilyMemberMapper;
 import com.etotem.cfc.mapper.ReportMemberPermissionMapper;
 import com.etotem.cfc.mapper.ReportMemberPermissionMapper;
+import com.etotem.cfc.mapper.UserMapper;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -16,7 +20,7 @@ import java.util.*;
  * 报告成员级查看权限服务
  * 报告成员级查看权限服务
  *
  *
  * 模型:
  * 模型:
- *  - 家庭管理员(family_members.is_admin=1):可见家庭内全部成员的报告
+ *  - 家庭管理员(家庭创建者 / users.is_family_admin=1 / family_members.is_admin=1):可见家庭内全部成员的报告
  *  - 普通成员:仅可见自己的报告;管理员可通过 report_member_permissions 授权某用户查看某成员的全部报告
  *  - 普通成员:仅可见自己的报告;管理员可通过 report_member_permissions 授权某用户查看某成员的全部报告
  *  - 授权按「成员」粒度:授权后该用户可查看该成员的所有报告(健康报告 + DAN 测评报告),含未来新报告
  *  - 授权按「成员」粒度:授权后该用户可查看该成员的所有报告(健康报告 + DAN 测评报告),含未来新报告
  */
  */
@@ -31,16 +35,46 @@ public class ReportMemberPermissionService {
     @Resource
     @Resource
     private FamilyMemberMapper familyMemberMapper;
     private FamilyMemberMapper familyMemberMapper;
 
 
+    @Resource
+    private FamilyMapper familyMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
     /* ============ 管理员判定 ============ */
     /* ============ 管理员判定 ============ */
 
 
     /**
     /**
-     * 判断用户是否为某家庭的管理员(family_members.is_admin=1)
+     * 判断用户是否为某家庭的管理员。
+     * <p>
+     * 三个等价来源(任一命中即为管理员):
+     * <ol>
+     *  <li><b>家庭创建者</b>:{@code families.creator_id = userId}。
+     *      家长账号按系统设计只存在于 {@code users} 表(family_id + role=parent),
+     *      <b>没有 {@code family_members} 行</b>(见 FamilyMemberService#updateParentMember),
+     *      因此不能只查 family_members.is_admin,否则家庭创建者会被误判为普通成员:
+     *      报告列表坍缩为空、报告详情返回「无权查看」(生产故障 2026-10-23,林小朋 userId=55)。
+     *  <li><b>users.is_family_admin=1</b> 且属于该家庭:兼容管理员转让等场景。</li>
+     *  <li><b>family_members.is_admin=1</b>:家庭成员记录被设为管理员。</li>
+     * </ol>
+     * 与 {@code FamilyMemberService#isFamilyAdminOperator} 判定口径保持一致。
      */
      */
     public boolean isFamilyAdmin(Long userId, Long familyId) {
     public boolean isFamilyAdmin(Long userId, Long familyId) {
         if (userId == null || familyId == null) {
         if (userId == null || familyId == null) {
             return false;
             return false;
         }
         }
         try {
         try {
+            // 1) 家庭创建者(家长账号按设计无 family_members 行,必须认这条)
+            Family family = familyMapper.selectById(familyId);
+            if (family != null && Long.valueOf(userId).equals(family.getCreatorId())) {
+                return true;
+            }
+            // 2) users.is_family_admin=1 且属于该家庭(兼容管理员转让)
+            User user = userMapper.selectById(userId);
+            if (user != null && Boolean.TRUE.equals(user.getIsFamilyAdmin())
+                    && familyId.equals(user.getFamilyId())) {
+                return true;
+            }
+            // 3) family_members.is_admin=1
             Long count = familyMemberMapper.selectCount(
             Long count = familyMemberMapper.selectCount(
                     new LambdaQueryWrapper<FamilyMember>()
                     new LambdaQueryWrapper<FamilyMember>()
                             .eq(FamilyMember::getFamilyId, familyId)
                             .eq(FamilyMember::getFamilyId, familyId)