Explorar o código

feat: add getVisibleMembers and updateVisibility to UserService

User hai 4 meses
pai
achega
b636557a33

+ 3 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/Child.java

@@ -52,6 +52,9 @@ public class Child implements Serializable {
 
     private Date focusResetDate;
 
+    // 是否对家庭成员可见: 1=可见, 0=不可见
+    private Integer showToFamily;
+
     private Date createdAt;
 
     private Date updatedAt;

+ 3 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/User.java

@@ -88,6 +88,9 @@ public class User implements Serializable {
     // 服务商审核拒绝原因
     private String vendorRejectReason;
 
+    // 是否对家庭成员可见: 1=可见, 0=不可见
+    private Integer showToFamily;
+
     // 家庭管理员标记
     private Boolean isFamilyAdmin;
 

+ 84 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/UserService.java

@@ -623,6 +623,86 @@ private WechatService wechatService;
     return true;
   }
 
+    /**
+     * 获取对家庭成员可见的成员列表(家长+孩子)
+     */
+    public List<FamilyMemberVO> getVisibleMembers(Long userId) {
+        User user = userMapper.selectById(userId);
+        if (user == null || user.getFamilyId() == null) {
+            return new ArrayList<>();
+        }
+        Long familyId = user.getFamilyId();
+        List<FamilyMemberVO> result = new ArrayList<>();
+
+        // 家长:show_to_family=1 的同家庭家长
+        List<User> parents = userMapper.selectList(new LambdaQueryWrapper<User>()
+                .eq(User::getFamilyId, familyId)
+                .eq(User::getRole, "parent"));
+        for (User p : parents) {
+            if (p.getId().equals(userId) || (p.getShowToFamily() != null && p.getShowToFamily() == 1)) {
+                FamilyMemberVO vo = new FamilyMemberVO();
+                vo.setId(p.getId());
+                vo.setNickname(p.getNickname());
+                vo.setAvatar(p.getAvatar());
+                vo.setMemberType("parent");
+                vo.setRoleLabel(p.getFamilyRole() != null ? p.getFamilyRole() : "家长");
+                vo.setTotalPoints(p.getTotalPoints());
+                vo.setShowToFamily(p.getShowToFamily() != null ? p.getShowToFamily() : 1);
+                result.add(vo);
+            }
+        }
+
+        // 孩子:show_to_family=1 的同家庭孩子
+        List<Child> children = childMapper.selectList(new LambdaQueryWrapper<Child>()
+                .eq(Child::getFamilyId, familyId));
+        for (Child c : children) {
+            if (c.getShowToFamily() == null || c.getShowToFamily() == 1) {
+                FamilyMemberVO vo = new FamilyMemberVO();
+                vo.setId(c.getId());
+                vo.setNickname(c.getNickname());
+                vo.setAvatar("");
+                vo.setMemberType("child");
+                vo.setRoleLabel("孩子");
+                vo.setDanLevel(c.getDanLevel());
+                vo.setTotalPoints(c.getTotalPoints());
+                vo.setShowToFamily(c.getShowToFamily() != null ? c.getShowToFamily() : 1);
+                result.add(vo);
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 更新成员可见性
+     */
+    public boolean updateVisibility(Long userId, Long memberId, String memberType, Integer showToFamily) {
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            return false;
+        }
+        if ("child".equals(memberType)) {
+            Child child = childMapper.selectById(memberId);
+            if (child == null || !child.getFamilyId().equals(user.getFamilyId())) {
+                return false;
+            }
+            child.setShowToFamily(showToFamily);
+            child.setUpdatedAt(new Date());
+            childMapper.updateById(child);
+            return true;
+        } else if ("parent".equals(memberType)) {
+            // 家长只能改自己的可见性
+            if (!memberId.equals(userId)) {
+                return false;
+            }
+            user.setShowToFamily(showToFamily);
+            user.setUpdatedAt(new Date());
+            userMapper.updateById(user);
+            return true;
+        }
+        return false;
+    }
+
     public LoginResultDTO registerWithIdCard(RegisterWithIdCardDTO dto) {
         // 验证验证码
         boolean valid = verificationCodeService.verifyCode(dto.getPhone(), dto.getCode(), "login");
@@ -786,6 +866,9 @@ private WechatService wechatService;
         if (dto.getTheme() != null) {
             child.setTheme(dto.getTheme());
         }
+        if (dto.getShowToFamily() != null) {
+            child.setShowToFamily(dto.getShowToFamily());
+        }
         child.setUpdatedAt(new Date());
         childMapper.updateById(child);
         return true;
@@ -815,6 +898,7 @@ private WechatService wechatService;
         dto.setSystemPoints(child.getSystemPoints());
         dto.setStreakDays(child.getStreakDays());
         dto.setFocusRemaining(child.getFocusRemaining());
+        dto.setShowToFamily(child.getShowToFamily());
         return dto;
     }