|
|
@@ -1,10 +1,14 @@
|
|
|
package com.etotem.cfc.service;
|
|
|
|
|
|
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.ReportMemberPermission;
|
|
|
+import com.etotem.cfc.entity.User;
|
|
|
+import com.etotem.cfc.mapper.FamilyMapper;
|
|
|
import com.etotem.cfc.mapper.FamilyMemberMapper;
|
|
|
import com.etotem.cfc.mapper.ReportMemberPermissionMapper;
|
|
|
+import com.etotem.cfc.mapper.UserMapper;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
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 授权某用户查看某成员的全部报告
|
|
|
* - 授权按「成员」粒度:授权后该用户可查看该成员的所有报告(健康报告 + DAN 测评报告),含未来新报告
|
|
|
*/
|
|
|
@@ -31,16 +35,46 @@ public class ReportMemberPermissionService {
|
|
|
@Resource
|
|
|
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) {
|
|
|
if (userId == null || familyId == null) {
|
|
|
return false;
|
|
|
}
|
|
|
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(
|
|
|
new LambdaQueryWrapper<FamilyMember>()
|
|
|
.eq(FamilyMember::getFamilyId, familyId)
|