|
@@ -210,7 +210,7 @@ public class FamilyMemberService {
|
|
|
membershipService.syncMembershipForNewMember(memberUserId, familyId);
|
|
membershipService.syncMembershipForNewMember(memberUserId, familyId);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return toFamilyMemberVO(member, userId);
|
|
|
|
|
|
|
+ return toFamilyMemberVO(member);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -290,9 +290,15 @@ public class FamilyMemberService {
|
|
|
vo.setTrustScore(fm.getTrustScore());
|
|
vo.setTrustScore(fm.getTrustScore());
|
|
|
vo.setIntimacyScore(fm.getIntimacyScore());
|
|
vo.setIntimacyScore(fm.getIntimacyScore());
|
|
|
vo.setCommunicationScore(fm.getCommunicationScore());
|
|
vo.setCommunicationScore(fm.getCommunicationScore());
|
|
|
- vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
|
|
|
|
|
- // 设置 isSwitchable:同家庭非自己成员均可切换视角(含被邀请的能登录成员)
|
|
|
|
|
- vo.setIsSwitchable(!(viewerMember != null && viewerMember.getId().equals(fm.getId())));
|
|
|
|
|
|
|
+vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
|
|
|
|
|
+ // 设置 isSwitchable:仅无 openid 的不可登录成员可被切换(可登录成员不允许切换视角)
|
|
|
|
|
+ if (fm.getUserId() != null) {
|
|
|
|
|
+ User memberUser = userMapper.selectById(fm.getUserId());
|
|
|
|
|
+ String openid = memberUser != null ? memberUser.getOpenid() : null;
|
|
|
|
|
+ vo.setIsSwitchable(openid == null || openid.isEmpty());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ vo.setIsSwitchable(true);
|
|
|
|
|
+ }
|
|
|
vo.setLastInteractionAt(fm.getLastInteractionAt());
|
|
vo.setLastInteractionAt(fm.getLastInteractionAt());
|
|
|
vo.setStreakDays(fm.getStreakDays());
|
|
vo.setStreakDays(fm.getStreakDays());
|
|
|
// 兼容旧前端字段
|
|
// 兼容旧前端字段
|
|
@@ -337,7 +343,8 @@ public class FamilyMemberService {
|
|
|
vo.setGeneration(0);
|
|
vo.setGeneration(0);
|
|
|
vo.setIsAdmin(isAdmin);
|
|
vo.setIsAdmin(isAdmin);
|
|
|
vo.setIsSelf(p.getId().equals(userId));
|
|
vo.setIsSelf(p.getId().equals(userId));
|
|
|
- vo.setIsSwitchable(!p.getId().equals(userId)); // 非自己即可切换(含 source='parent' 段)
|
|
|
|
|
|
|
+ // 家长账号均为可登录用户,不允许切换视角(与成员段"仅不可登录可切换"一致)
|
|
|
|
|
+ vo.setIsSwitchable(false); // 含 source='parent' 段
|
|
|
vo.setShowToFamily(p.getShowToFamily() != null ? p.getShowToFamily() : 1);
|
|
vo.setShowToFamily(p.getShowToFamily() != null ? p.getShowToFamily() : 1);
|
|
|
vo.setIsSpouse(false);
|
|
vo.setIsSpouse(false);
|
|
|
vo.setTotalPoints(p.getTotalPoints());
|
|
vo.setTotalPoints(p.getTotalPoints());
|
|
@@ -363,6 +370,13 @@ public class FamilyMemberService {
|
|
|
if (member.getUserId() != null && member.getUserId().equals(userId)) {
|
|
if (member.getUserId() != null && member.getUserId().equals(userId)) {
|
|
|
throw new RuntimeException("不能切换到自己");
|
|
throw new RuntimeException("不能切换到自己");
|
|
|
}
|
|
}
|
|
|
|
|
+ // 仅不可登录成员可被切换:可登录成员(有 openid,可通过微信登录)不允许切换视角
|
|
|
|
|
+ User memberUser = member.getUserId() != null ? userMapper.selectById(member.getUserId()) : null;
|
|
|
|
|
+ String openid = memberUser != null ? memberUser.getOpenid() : null;
|
|
|
|
|
+ boolean canLogin = openid != null && !openid.isEmpty();
|
|
|
|
|
+ if (canLogin) {
|
|
|
|
|
+ throw new RuntimeException("该成员可通过微信登录,不能切换为TA的身份");
|
|
|
|
|
+ }
|
|
|
String effectiveRole = computeEffectiveRole(member);
|
|
String effectiveRole = computeEffectiveRole(member);
|
|
|
// 直接登录的孩子端不能切换到家长端
|
|
// 直接登录的孩子端不能切换到家长端
|
|
|
if ("child".equals(user.getRole()) && "parent".equals(effectiveRole)) {
|
|
if ("child".equals(user.getRole()) && "parent".equals(effectiveRole)) {
|
|
@@ -390,13 +404,8 @@ public class FamilyMemberService {
|
|
|
if ("child".equals(user.getRole())) {
|
|
if ("child".equals(user.getRole())) {
|
|
|
throw new RuntimeException("孩子账号不能切换到家长视角");
|
|
throw new RuntimeException("孩子账号不能切换到家长视角");
|
|
|
}
|
|
}
|
|
|
- SwitchMemberVO vo = new SwitchMemberVO();
|
|
|
|
|
- vo.setMemberId(targetParent.getId());
|
|
|
|
|
- vo.setSource("parent");
|
|
|
|
|
- vo.setEffectiveRole("parent");
|
|
|
|
|
- vo.setNickname(targetParent.getNickname());
|
|
|
|
|
- vo.setIsSwitchable(true);
|
|
|
|
|
- return vo;
|
|
|
|
|
|
|
+ // source='parent' 的家长账号均为可登录用户,不允许切换视角
|
|
|
|
|
+ throw new RuntimeException("该成员可通过微信登录,不能切换为TA的身份");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
throw new RuntimeException("成员不存在或不属于您的家庭");
|
|
throw new RuntimeException("成员不存在或不属于您的家庭");
|
|
@@ -870,7 +879,7 @@ public class FamilyMemberService {
|
|
|
member.setUpdatedAt(new Date());
|
|
member.setUpdatedAt(new Date());
|
|
|
familyMemberMapper.updateById(member);
|
|
familyMemberMapper.updateById(member);
|
|
|
logMemberAction(member.getFamilyId(), member.getId(), "update", oldNickname, member.getNickname(), userId);
|
|
logMemberAction(member.getFamilyId(), member.getId(), "update", oldNickname, member.getNickname(), userId);
|
|
|
- return toFamilyMemberVO(member, userId);
|
|
|
|
|
|
|
+ return toFamilyMemberVO(member);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -935,7 +944,8 @@ public class FamilyMemberService {
|
|
|
vo.setGeneration(0);
|
|
vo.setGeneration(0);
|
|
|
vo.setIsAdmin(true);
|
|
vo.setIsAdmin(true);
|
|
|
vo.setIsSelf(parent.getId().equals(operator.getId()));
|
|
vo.setIsSelf(parent.getId().equals(operator.getId()));
|
|
|
- vo.setIsSwitchable(!parent.getId().equals(operator.getId()));
|
|
|
|
|
|
|
+ // 家长账号均为可登录用户,不允许切换视角(与成员段"仅不可登录可切换"一致)
|
|
|
|
|
+ vo.setIsSwitchable(false); // source='parent' 段(updateParentMember 返回 VO)
|
|
|
vo.setShowToFamily(parent.getShowToFamily() != null ? parent.getShowToFamily() : 1);
|
|
vo.setShowToFamily(parent.getShowToFamily() != null ? parent.getShowToFamily() : 1);
|
|
|
vo.setIsSpouse(false);
|
|
vo.setIsSpouse(false);
|
|
|
vo.setTotalPoints(parent.getTotalPoints());
|
|
vo.setTotalPoints(parent.getTotalPoints());
|
|
@@ -959,7 +969,7 @@ public class FamilyMemberService {
|
|
|
return fm.getNickname();
|
|
return fm.getNickname();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private FamilyMemberVO toFamilyMemberVO(FamilyMember member, Long operatorUserId) {
|
|
|
|
|
|
|
+ private FamilyMemberVO toFamilyMemberVO(FamilyMember member) {
|
|
|
FamilyMemberVO vo = new FamilyMemberVO();
|
|
FamilyMemberVO vo = new FamilyMemberVO();
|
|
|
vo.setId(member.getId());
|
|
vo.setId(member.getId());
|
|
|
vo.setSource("family_member");
|
|
vo.setSource("family_member");
|
|
@@ -976,10 +986,14 @@ public class FamilyMemberService {
|
|
|
if (member.getBirthday() != null) {
|
|
if (member.getBirthday() != null) {
|
|
|
vo.setAge(calculateAge(member.getBirthday()));
|
|
vo.setAge(calculateAge(member.getBirthday()));
|
|
|
}
|
|
}
|
|
|
- // 设置 isSwitchable:非操作者本人即可切换视角(含可登录成员),与 listMembers 口径一致
|
|
|
|
|
- boolean switchableIsSelf = operatorUserId != null && member.getUserId() != null
|
|
|
|
|
- && operatorUserId.equals(member.getUserId());
|
|
|
|
|
- vo.setIsSwitchable(!switchableIsSelf);
|
|
|
|
|
|
|
+ // 设置 isSwitchable:仅无 openid 的不可登录成员可被切换(可登录成员不允许切换视角)
|
|
|
|
|
+ if (member.getUserId() != null) {
|
|
|
|
|
+ User memberUser = userMapper.selectById(member.getUserId());
|
|
|
|
|
+ String openid = memberUser != null ? memberUser.getOpenid() : null;
|
|
|
|
|
+ vo.setIsSwitchable(openid == null || openid.isEmpty());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ vo.setIsSwitchable(true);
|
|
|
|
|
+ }
|
|
|
return vo;
|
|
return vo;
|
|
|
}
|
|
}
|
|
|
|
|
|