|
|
@@ -885,16 +885,31 @@ vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
|
|
|
return updateParentMember(user, memberId, dto);
|
|
|
}
|
|
|
|
|
|
- // 检查编辑权限:管理员可编辑所有成员;普通用户只能编辑无关联账号的成员
|
|
|
- boolean isAdmin = false;
|
|
|
- Family family = familyMapper.selectById(user.getFamilyId());
|
|
|
- if (family != null && Long.valueOf(userId).equals(family.getCreatorId())) {
|
|
|
- isAdmin = true;
|
|
|
- }
|
|
|
+ // 检查编辑权限:管理员(family_members.is_admin=1 或家庭创建者)可编辑所有成员;
|
|
|
+ // 普通用户只能编辑无关联账号的成员
|
|
|
+ boolean isAdmin = isFamilyAdminOperator(userId, user.getFamilyId());
|
|
|
if (!isAdmin && !isEditable(memberId)) {
|
|
|
throw new RuntimeException("该成员关联了登录账号,不可编辑");
|
|
|
}
|
|
|
|
|
|
+ // 管理员设置(多管理员):仅管理员可操作;取消管理员时家庭至少保留一名
|
|
|
+ if (dto.getIsAdmin() != null) {
|
|
|
+ if (!isAdmin) {
|
|
|
+ throw new RuntimeException("仅家庭管理员可设置管理员");
|
|
|
+ }
|
|
|
+ int newAdminVal = dto.getIsAdmin() == 1 ? 1 : 0;
|
|
|
+ boolean targetIsAdmin = member.getIsAdmin() != null && member.getIsAdmin() == 1;
|
|
|
+ if (newAdminVal == 0 && targetIsAdmin) {
|
|
|
+ Long adminCount = familyMemberMapper.selectCount(new LambdaQueryWrapper<FamilyMember>()
|
|
|
+ .eq(FamilyMember::getFamilyId, user.getFamilyId())
|
|
|
+ .eq(FamilyMember::getIsAdmin, 1));
|
|
|
+ if (adminCount != null && adminCount <= 1) {
|
|
|
+ throw new RuntimeException("家庭至少需要保留一名管理员");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ member.setIsAdmin(newAdminVal);
|
|
|
+ }
|
|
|
+
|
|
|
String oldNickname = member.getNickname();
|
|
|
if (dto.getNickname() != null && !dto.getNickname().trim().isEmpty()) {
|
|
|
member.setNickname(dto.getNickname().trim());
|
|
|
@@ -931,6 +946,26 @@ vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
|
|
|
return toFamilyMemberVO(member);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 判断用户是否为家庭管理员(多管理员):家庭创建者,或其成员记录 is_admin=1。
|
|
|
+ */
|
|
|
+ private boolean isFamilyAdminOperator(Long userId, Long familyId) {
|
|
|
+ if (userId == null || familyId == null) return false;
|
|
|
+ Family family = familyMapper.selectById(familyId);
|
|
|
+ if (family != null && family.getCreatorId() != null && Long.valueOf(userId).equals(family.getCreatorId())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Long c = familyMemberMapper.selectCount(new LambdaQueryWrapper<FamilyMember>()
|
|
|
+ .eq(FamilyMember::getFamilyId, familyId)
|
|
|
+ .eq(FamilyMember::getUserId, userId)
|
|
|
+ .eq(FamilyMember::getIsAdmin, 1));
|
|
|
+ return c != null && c > 0;
|
|
|
+ } catch (Exception e) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 更新家长账号(users 表成员)的基本资料。
|
|
|
* 家长账号只存在于 users 表(family_id + role=parent),无 family_members 记录,
|
|
|
@@ -942,6 +977,9 @@ vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
|
|
|
if (!isAdmin) {
|
|
|
throw new RuntimeException("仅家庭创建者可编辑该成员");
|
|
|
}
|
|
|
+ if (dto.getIsAdmin() != null) {
|
|
|
+ throw new RuntimeException("该成员为家长账号,不支持设置管理员,请对家庭成员记录操作");
|
|
|
+ }
|
|
|
User parent = userMapper.selectById(memberId);
|
|
|
if (parent == null
|
|
|
|| parent.getFamilyId() == null
|