|
@@ -609,26 +609,153 @@ public class AdminController {
|
|
|
return Result.error("家庭不存在");
|
|
return Result.error("家庭不存在");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 查询家长
|
|
|
|
|
|
|
+ // 统一成员列表:family_members(含创建者)+ users 中 role=parent 且未落入 family_members 的成员
|
|
|
|
|
+ // 仅区分「管理员 / 成员」,不区分家长 / 孩子
|
|
|
|
|
+ LambdaQueryWrapper<FamilyMember> memberWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ memberWrapper.eq(FamilyMember::getFamilyId, id);
|
|
|
|
|
+ SortUtil.applySort(memberWrapper);
|
|
|
|
|
+ java.util.List<FamilyMember> familyMembers = familyMemberMapper.selectList(memberWrapper);
|
|
|
|
|
+
|
|
|
|
|
+ // 收集已落入 family_members 的 user_id,避免与 users 家长重复
|
|
|
|
|
+ java.util.Set<Long> coveredUserIds = new java.util.HashSet<>();
|
|
|
|
|
+ for (FamilyMember fm : familyMembers) {
|
|
|
|
|
+ if (fm.getUserId() != null) {
|
|
|
|
|
+ coveredUserIds.add(fm.getUserId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 通过邀请码加入、未写入 family_members 的家长
|
|
|
LambdaQueryWrapper<User> parentWrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<User> parentWrapper = new LambdaQueryWrapper<>();
|
|
|
parentWrapper.eq(User::getFamilyId, id).eq(User::getRole, "parent");
|
|
parentWrapper.eq(User::getFamilyId, id).eq(User::getRole, "parent");
|
|
|
SortUtil.applySort(parentWrapper);
|
|
SortUtil.applySort(parentWrapper);
|
|
|
java.util.List<User> parents = userMapper.selectList(parentWrapper);
|
|
java.util.List<User> parents = userMapper.selectList(parentWrapper);
|
|
|
|
|
|
|
|
- // 查询孩子
|
|
|
|
|
- LambdaQueryWrapper<FamilyMember> childWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
- childWrapper.eq(FamilyMember::getFamilyId, id);
|
|
|
|
|
- SortUtil.applySort(childWrapper);
|
|
|
|
|
- java.util.List<FamilyMember> children = familyMemberMapper.selectList(childWrapper);
|
|
|
|
|
|
|
+ Long creatorId = family.getCreatorId();
|
|
|
|
|
+ java.util.List<Map<String, Object>> members = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ // family_members 来源成员
|
|
|
|
|
+ for (FamilyMember fm : familyMembers) {
|
|
|
|
|
+ boolean isAdmin = (fm.getIsAdmin() != null && fm.getIsAdmin() == 1)
|
|
|
|
|
+ || (creatorId != null && creatorId.equals(fm.getUserId()));
|
|
|
|
|
+ Map<String, Object> m = new HashMap<>();
|
|
|
|
|
+ m.put("memberId", fm.getId());
|
|
|
|
|
+ m.put("userId", fm.getUserId());
|
|
|
|
|
+ m.put("source", "family_member");
|
|
|
|
|
+ m.put("nickname", fm.getNickname());
|
|
|
|
|
+ m.put("phone", fm.getPhone());
|
|
|
|
|
+ m.put("avatar", fm.getAvatar());
|
|
|
|
|
+ m.put("gender", fm.getGender());
|
|
|
|
|
+ if (fm.getBirthday() != null) {
|
|
|
|
|
+ m.put("age", fm.getAge());
|
|
|
|
|
+ }
|
|
|
|
|
+ m.put("totalPoints", fm.getTotalPoints());
|
|
|
|
|
+ m.put("isAdmin", isAdmin);
|
|
|
|
|
+ m.put("role", isAdmin ? "admin" : "member");
|
|
|
|
|
+ m.put("createdAt", fm.getCreatedAt());
|
|
|
|
|
+ members.add(m);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // users 来源家长(未落入 family_members)
|
|
|
|
|
+ for (User u : parents) {
|
|
|
|
|
+ if (coveredUserIds.contains(u.getId())) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ boolean isAdmin = creatorId != null && creatorId.equals(u.getId());
|
|
|
|
|
+ Map<String, Object> m = new HashMap<>();
|
|
|
|
|
+ m.put("memberId", null);
|
|
|
|
|
+ m.put("userId", u.getId());
|
|
|
|
|
+ m.put("source", "user");
|
|
|
|
|
+ m.put("nickname", u.getNickname());
|
|
|
|
|
+ m.put("phone", u.getPhone());
|
|
|
|
|
+ m.put("avatar", u.getAvatar());
|
|
|
|
|
+ m.put("gender", u.getGender());
|
|
|
|
|
+ m.put("totalPoints", u.getTotalPoints() != null ? u.getTotalPoints() : 0);
|
|
|
|
|
+ m.put("isAdmin", isAdmin);
|
|
|
|
|
+ m.put("role", isAdmin ? "admin" : "member");
|
|
|
|
|
+ m.put("createdAt", u.getCreatedAt());
|
|
|
|
|
+ members.add(m);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
result.put("family", family);
|
|
result.put("family", family);
|
|
|
- result.put("parents", parents);
|
|
|
|
|
- result.put("children", children);
|
|
|
|
|
|
|
+ result.put("members", members);
|
|
|
|
|
+
|
|
|
|
|
+ // 兼容字段:TeacherMessages.vue 依赖 parents/children 结构,沿用旧查询
|
|
|
|
|
+ java.util.List<User> compatParents = new ArrayList<>();
|
|
|
|
|
+ LambdaQueryWrapper<User> parentCompatWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ parentCompatWrapper.eq(User::getFamilyId, id).eq(User::getRole, "parent");
|
|
|
|
|
+ SortUtil.applySort(parentCompatWrapper);
|
|
|
|
|
+ compatParents.addAll(userMapper.selectList(parentCompatWrapper));
|
|
|
|
|
+
|
|
|
|
|
+ java.util.List<FamilyMember> compatChildren = new ArrayList<>();
|
|
|
|
|
+ LambdaQueryWrapper<FamilyMember> childCompatWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ childCompatWrapper.eq(FamilyMember::getFamilyId, id);
|
|
|
|
|
+ SortUtil.applySort(childCompatWrapper);
|
|
|
|
|
+ compatChildren.addAll(familyMemberMapper.selectList(childCompatWrapper));
|
|
|
|
|
+
|
|
|
|
|
+ result.put("parents", compatParents);
|
|
|
|
|
+ result.put("children", compatChildren);
|
|
|
|
|
|
|
|
return Result.success(result);
|
|
return Result.success(result);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @PostMapping("/families/{id}/members/set-admin")
|
|
|
|
|
+ public Result<Boolean> setMemberAdminRole(@PathVariable Long id,
|
|
|
|
|
+ @RequestBody Map<String, Object> body,
|
|
|
|
|
+ @RequestAttribute("role") String role) {
|
|
|
|
|
+ if (!"admin".equals(role)) {
|
|
|
|
|
+ return Result.error("无权限");
|
|
|
|
|
+ }
|
|
|
|
|
+ Family family = familyMapper.selectById(id);
|
|
|
|
|
+ if (family == null) {
|
|
|
|
|
+ return Result.error("家庭不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ Long memberId = ParamUtils.getLong(body.get("memberId"));
|
|
|
|
|
+ Long userId = ParamUtils.getLong(body.get("userId"));
|
|
|
|
|
+ boolean setAdmin = Boolean.TRUE.equals(body.get("isAdmin"));
|
|
|
|
|
+
|
|
|
|
|
+ FamilyMember target = null;
|
|
|
|
|
+ if (memberId != null) {
|
|
|
|
|
+ target = familyMemberMapper.selectById(memberId);
|
|
|
|
|
+ if (target == null || !id.equals(target.getFamilyId())) {
|
|
|
|
|
+ return Result.error("成员不存在或不属于该家庭");
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (userId != null) {
|
|
|
|
|
+ // users 来源成员:在 family_members 中查找或创建记录,以便持久化管理员角色
|
|
|
|
|
+ LambdaQueryWrapper<FamilyMember> q = new LambdaQueryWrapper<FamilyMember>()
|
|
|
|
|
+ .eq(FamilyMember::getFamilyId, id)
|
|
|
|
|
+ .eq(FamilyMember::getUserId, userId)
|
|
|
|
|
+ .last("LIMIT 1");
|
|
|
|
|
+ target = familyMemberMapper.selectOne(q);
|
|
|
|
|
+ if (target == null) {
|
|
|
|
|
+ User u = userMapper.selectById(userId);
|
|
|
|
|
+ if (u == null || !id.equals(u.getFamilyId())) {
|
|
|
|
|
+ return Result.error("用户不存在或不属于该家庭");
|
|
|
|
|
+ }
|
|
|
|
|
+ target = new FamilyMember();
|
|
|
|
|
+ target.setFamilyId(id);
|
|
|
|
|
+ target.setUserId(userId);
|
|
|
|
|
+ target.setNickname(u.getNickname() != null ? u.getNickname() : "成员");
|
|
|
|
|
+ target.setPhone(u.getPhone());
|
|
|
|
|
+ target.setAvatar(u.getAvatar());
|
|
|
|
|
+ target.setGender(u.getGender());
|
|
|
|
|
+ target.setGeneration(0);
|
|
|
|
|
+ target.setShowToFamily(1);
|
|
|
|
|
+ target.setTotalPoints(0);
|
|
|
|
|
+ target.setCreatedAt(new Date());
|
|
|
|
|
+ target.setUpdatedAt(new Date());
|
|
|
|
|
+ familyMemberMapper.insert(target);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return Result.error("缺少成员标识");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ target.setIsAdmin(setAdmin ? 1 : 0);
|
|
|
|
|
+ target.setUpdatedAt(new Date());
|
|
|
|
|
+ familyMemberMapper.updateById(target);
|
|
|
|
|
+ return Result.success(true);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@PostMapping("/families/{id}/update")
|
|
@PostMapping("/families/{id}/update")
|
|
|
public Result<Boolean> updateFamily(@PathVariable Long id, @RequestBody Family family,
|
|
public Result<Boolean> updateFamily(@PathVariable Long id, @RequestBody Family family,
|
|
|
@RequestAttribute("role") String role) {
|
|
@RequestAttribute("role") String role) {
|