|
@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.etotem.cfc.entity.SocialCircle;
|
|
import com.etotem.cfc.entity.SocialCircle;
|
|
|
import com.etotem.cfc.entity.SocialCircleMember;
|
|
import com.etotem.cfc.entity.SocialCircleMember;
|
|
|
|
|
+import com.etotem.cfc.entity.User;
|
|
|
import com.etotem.cfc.mapper.SocialCircleMapper;
|
|
import com.etotem.cfc.mapper.SocialCircleMapper;
|
|
|
import com.etotem.cfc.mapper.SocialCircleMemberMapper;
|
|
import com.etotem.cfc.mapper.SocialCircleMemberMapper;
|
|
|
|
|
+import com.etotem.cfc.mapper.UserMapper;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -14,8 +16,10 @@ import javax.annotation.Resource;
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
|
|
+import java.util.HashSet;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
+import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
import com.etotem.cfc.util.SortUtil;
|
|
import com.etotem.cfc.util.SortUtil;
|
|
|
|
|
|
|
@@ -25,6 +29,9 @@ public class CircleService extends ServiceImpl<SocialCircleMapper, SocialCircle>
|
|
|
@Resource
|
|
@Resource
|
|
|
private SocialCircleMemberMapper socialCircleMemberMapper;
|
|
private SocialCircleMemberMapper socialCircleMemberMapper;
|
|
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private UserMapper userMapper;
|
|
|
|
|
+
|
|
|
@Resource
|
|
@Resource
|
|
|
@Lazy
|
|
@Lazy
|
|
|
private CircleMatchService circleMatchService;
|
|
private CircleMatchService circleMatchService;
|
|
@@ -259,10 +266,22 @@ public class CircleService extends ServiceImpl<SocialCircleMapper, SocialCircle>
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 审批成员加入申请
|
|
|
|
|
|
|
+ * 审批成员加入申请(仅圈主/管理员可操作)
|
|
|
|
|
+ * @param adminMemberId 当前操作者 memberId,用于权限校验(非 admin 直接拒绝)
|
|
|
*/
|
|
*/
|
|
|
@Transactional
|
|
@Transactional
|
|
|
- public boolean approveMember(Long circleId, Long memberId, boolean approved) {
|
|
|
|
|
|
|
+ public boolean approveMember(Long circleId, Long memberId, boolean approved, Long adminMemberId) {
|
|
|
|
|
+ // 权限校验:仅圈子 admin 可审批
|
|
|
|
|
+ if (adminMemberId != null) {
|
|
|
|
|
+ LambdaQueryWrapper<SocialCircleMember> adminCheck = new LambdaQueryWrapper<SocialCircleMember>()
|
|
|
|
|
+ .eq(SocialCircleMember::getCircleId, circleId)
|
|
|
|
|
+ .eq(SocialCircleMember::getMemberId, adminMemberId)
|
|
|
|
|
+ .eq(SocialCircleMember::getRole, "admin");
|
|
|
|
|
+ SortUtil.applySort(adminCheck);
|
|
|
|
|
+ if (socialCircleMemberMapper.selectCount(adminCheck) == 0) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
LambdaQueryWrapper<SocialCircleMember> wrapper = new LambdaQueryWrapper<SocialCircleMember>()
|
|
LambdaQueryWrapper<SocialCircleMember> wrapper = new LambdaQueryWrapper<SocialCircleMember>()
|
|
|
.eq(SocialCircleMember::getCircleId, circleId)
|
|
.eq(SocialCircleMember::getCircleId, circleId)
|
|
|
.eq(SocialCircleMember::getMemberId, memberId)
|
|
.eq(SocialCircleMember::getMemberId, memberId)
|
|
@@ -282,6 +301,82 @@ public class CircleService extends ServiceImpl<SocialCircleMapper, SocialCircle>
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取当前用户作为圈主/admin 的圈子中所有待审核成员申请
|
|
|
|
|
+ * 返回带圈子名 + 申请人昵称/头像,供前端"待审核卡片"展示
|
|
|
|
|
+ */
|
|
|
|
|
+ public List<Map<String, Object>> getPendingMembers(Long adminMemberId, String memberType) {
|
|
|
|
|
+ List<Map<String, Object>> result = new ArrayList<>();
|
|
|
|
|
+ if (adminMemberId == null) return result;
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 当前用户作为 admin 的圈子
|
|
|
|
|
+ LambdaQueryWrapper<SocialCircleMember> adminWrapper = new LambdaQueryWrapper<SocialCircleMember>()
|
|
|
|
|
+ .eq(SocialCircleMember::getMemberId, adminMemberId)
|
|
|
|
|
+ .eq(SocialCircleMember::getRole, "admin");
|
|
|
|
|
+ SortUtil.applySort(adminWrapper);
|
|
|
|
|
+ List<SocialCircleMember> adminMemberships = socialCircleMemberMapper.selectList(adminWrapper);
|
|
|
|
|
+ if (adminMemberships.isEmpty()) return result;
|
|
|
|
|
+
|
|
|
|
|
+ List<Long> adminCircleIds = adminMemberships.stream()
|
|
|
|
|
+ .map(SocialCircleMember::getCircleId)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 这些圈子中的 pending 成员
|
|
|
|
|
+ LambdaQueryWrapper<SocialCircleMember> pendingWrapper = new LambdaQueryWrapper<SocialCircleMember>()
|
|
|
|
|
+ .in(SocialCircleMember::getCircleId, adminCircleIds)
|
|
|
|
|
+ .eq(SocialCircleMember::getStatus, "pending");
|
|
|
|
|
+ SortUtil.applySort(pendingWrapper);
|
|
|
|
|
+ List<SocialCircleMember> pendingMembers = socialCircleMemberMapper.selectList(pendingWrapper);
|
|
|
|
|
+ if (pendingMembers.isEmpty()) return result;
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 圈子名 map
|
|
|
|
|
+ List<Long> circleIds = pendingMembers.stream()
|
|
|
|
|
+ .map(SocialCircleMember::getCircleId)
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ Map<Long, SocialCircle> circleMap = new HashMap<>();
|
|
|
|
|
+ if (!circleIds.isEmpty()) {
|
|
|
|
|
+ List<SocialCircle> circles = this.listByIds(circleIds);
|
|
|
|
|
+ for (SocialCircle c : circles) {
|
|
|
|
|
+ circleMap.put(c.getId(), c);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 申请人昵称/头像 map(memberId 即 users 表主键 userId)
|
|
|
|
|
+ Set<Long> applicantIds = new HashSet<>();
|
|
|
|
|
+ for (SocialCircleMember pm : pendingMembers) {
|
|
|
|
|
+ if (pm.getMemberId() != null) {
|
|
|
|
|
+ applicantIds.add(pm.getMemberId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<Long, User> applicantMap = new HashMap<>();
|
|
|
|
|
+ if (!applicantIds.isEmpty()) {
|
|
|
|
|
+ List<User> applicants = userMapper.selectBatchIds(applicantIds);
|
|
|
|
|
+ if (applicants != null) {
|
|
|
|
|
+ for (User u : applicants) {
|
|
|
|
|
+ applicantMap.put(u.getId(), u);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 组装返回
|
|
|
|
|
+ for (SocialCircleMember pm : pendingMembers) {
|
|
|
|
|
+ Map<String, Object> item = new HashMap<>();
|
|
|
|
|
+ item.put("id", pm.getId());
|
|
|
|
|
+ item.put("circleId", pm.getCircleId());
|
|
|
|
|
+ SocialCircle circle = circleMap.get(pm.getCircleId());
|
|
|
|
|
+ item.put("circleName", circle != null ? circle.getName() : "");
|
|
|
|
|
+ item.put("memberId", pm.getMemberId());
|
|
|
|
|
+ item.put("memberType", pm.getMemberType());
|
|
|
|
|
+ User applicant = applicantMap.get(pm.getMemberId());
|
|
|
|
|
+ item.put("applicantName", applicant != null ? applicant.getNickname() : "");
|
|
|
|
|
+ item.put("applicantAvatar", applicant != null ? applicant.getAvatar() : "");
|
|
|
|
|
+ item.put("appliedAt", pm.getJoinedAt());
|
|
|
|
|
+ result.add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 获取圈子成员列表
|
|
* 获取圈子成员列表
|
|
|
*/
|
|
*/
|
|
@@ -291,6 +386,24 @@ public class CircleService extends ServiceImpl<SocialCircleMapper, SocialCircle>
|
|
|
.eq(SocialCircleMember::getStatus, "approved");
|
|
.eq(SocialCircleMember::getStatus, "approved");
|
|
|
SortUtil.applySort(wrapper);
|
|
SortUtil.applySort(wrapper);
|
|
|
List<SocialCircleMember> members = socialCircleMemberMapper.selectList(wrapper);
|
|
List<SocialCircleMember> members = socialCircleMemberMapper.selectList(wrapper);
|
|
|
|
|
+
|
|
|
|
|
+ // 批量补成员昵称/头像(memberId 即 users 表主键 userId)
|
|
|
|
|
+ Set<Long> userIds = new HashSet<>();
|
|
|
|
|
+ for (SocialCircleMember m : members) {
|
|
|
|
|
+ if (m.getMemberId() != null) {
|
|
|
|
|
+ userIds.add(m.getMemberId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<Long, User> userMap = new HashMap<>();
|
|
|
|
|
+ if (!userIds.isEmpty()) {
|
|
|
|
|
+ List<User> users = userMapper.selectBatchIds(userIds);
|
|
|
|
|
+ if (users != null) {
|
|
|
|
|
+ for (User u : users) {
|
|
|
|
|
+ userMap.put(u.getId(), u);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
List<Map<String, Object>> result = new ArrayList<>();
|
|
List<Map<String, Object>> result = new ArrayList<>();
|
|
|
for (SocialCircleMember m : members) {
|
|
for (SocialCircleMember m : members) {
|
|
|
Map<String, Object> item = new HashMap<>();
|
|
Map<String, Object> item = new HashMap<>();
|
|
@@ -299,6 +412,9 @@ public class CircleService extends ServiceImpl<SocialCircleMapper, SocialCircle>
|
|
|
item.put("memberType", m.getMemberType());
|
|
item.put("memberType", m.getMemberType());
|
|
|
item.put("role", m.getRole());
|
|
item.put("role", m.getRole());
|
|
|
item.put("joinedAt", m.getJoinedAt());
|
|
item.put("joinedAt", m.getJoinedAt());
|
|
|
|
|
+ User user = userMap.get(m.getMemberId());
|
|
|
|
|
+ item.put("nickname", user != null ? user.getNickname() : null);
|
|
|
|
|
+ item.put("avatar", user != null ? user.getAvatar() : null);
|
|
|
result.add(item);
|
|
result.add(item);
|
|
|
}
|
|
}
|
|
|
return result;
|
|
return result;
|