UserRelationshipsServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. package com.zhentao.userRelationships.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.zhentao.shouye.domain.UserShouye;
  5. import com.zhentao.shouye.mapper.UserShouyeMapper;
  6. import com.zhentao.user.domain.UserLogin;
  7. import com.zhentao.user.mapper.UserLoginMapper;
  8. import com.zhentao.userRelationships.domain.UserRelationships;
  9. import com.zhentao.userRelationships.domain.UserRequest;
  10. import com.zhentao.userRelationships.domain.UserShouye;
  11. import com.zhentao.userRelationships.dto.FriendDto;
  12. import com.zhentao.userRelationships.dto.FriendsTDto;
  13. import com.zhentao.userRelationships.mapper.UserRequestMapper;
  14. import com.zhentao.userRelationships.mapper.UserShouyeMapper;
  15. import com.zhentao.userRelationships.service.UserRelationshipsService;
  16. import com.zhentao.userRelationships.mapper.UserRelationshipsMapper;
  17. import com.zhentao.userRelationships.util.PinyinUtil;
  18. import com.zhentao.userRelationships.util.SnowflakeUtil;
  19. import com.zhentao.vo.Result;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. import java.util.Date;
  25. import java.util.List;
  26. /**
  27. * @author lenovo
  28. * @description 针对表【user_relationships(用户好友关系表)】的数据库操作Service实现
  29. * @createDate 2025-06-10 20:29:55
  30. */
  31. @Service
  32. public class UserRelationshipsServiceImpl extends ServiceImpl<UserRelationshipsMapper, UserRelationships>
  33. implements UserRelationshipsService{
  34. @Autowired
  35. private UserRelationshipsMapper userRelationshipsMapper;
  36. @Autowired
  37. private UserLoginMapper userLoginMapper;
  38. @Autowired
  39. private UserRequestMapper userRequestMapper;
  40. @Autowired
  41. private UserShouyeMapper userShouyeMapper;
  42. //查询好友
  43. @Override
  44. public List<UserRelationships> getFriendIdsByUserId(Long userId) {
  45. QueryWrapper<UserRelationships> queryWrapper = new QueryWrapper<>();
  46. queryWrapper.eq("status", 1);
  47. queryWrapper.eq("user_id", userId);
  48. List<UserRelationships> list = this.list(queryWrapper);
  49. return list;
  50. }
  51. //添加好友
  52. @Override
  53. public Result sendFriendRequest(String senderId, Long receiverId, String message) {
  54. // 检查是否已经是好友关系
  55. QueryWrapper<UserRelationships> relationshipQuery = new QueryWrapper<>();
  56. relationshipQuery.eq("user_id", senderId);
  57. relationshipQuery.eq("friend_id", receiverId);
  58. relationshipQuery.eq("status", 1);
  59. UserRelationships existingRelationship = userRelationshipsMapper.selectOne(relationshipQuery);
  60. if (existingRelationship != null) {
  61. return Result.error(null,"已经是好友关系,无需重复申请");
  62. }
  63. // 检查是否已经有未处理的申请
  64. QueryWrapper<UserRequest> requestQuery = new QueryWrapper<>();
  65. requestQuery.eq("send_id", senderId);
  66. requestQuery.eq("receiver_id", receiverId);
  67. requestQuery.eq("status", 0);
  68. UserRequest existingRequest = userRequestMapper.selectOne(requestQuery);
  69. if (existingRequest != null) {
  70. return Result.error(null,"已经有未处理的好友申请,请勿重复发送");
  71. }
  72. UserLogin userLogin = userLoginMapper.selectById(senderId);
  73. // 创建新的好友申请记录
  74. UserRequest userRequest = new UserRequest();
  75. userRequest.setSendId(senderId);
  76. userRequest.setReceiverId(receiverId.toString());
  77. userRequest.setMessage(message);
  78. userRequest.setNickName(userLogin.getNickName());
  79. userRequest.setAvatar(userLogin.getAvatar()); // 设置头像
  80. userRequest.setStatus(0);
  81. userRequest.setCreateTime(new Date());
  82. // 插入记录
  83. int result = userRequestMapper.insert(userRequest);
  84. if (result > 0) {
  85. return Result.OK(userRequest, "好友申请发送成功");
  86. } else {
  87. return Result.error(null,"好友申请发送失败");
  88. }
  89. }
  90. // 查询好友申请表
  91. @Override
  92. public List<UserRequest> getFriendRequestsByUserId(String token) {
  93. QueryWrapper<UserRequest> queryWrapper = new QueryWrapper<>();
  94. queryWrapper.eq("receiver_id", token);
  95. // queryWrapper.eq("status", 0); // 只查询待处理的申请
  96. queryWrapper.orderByAsc("create_time"); // 按照创建时间倒序排列
  97. System.err.println(queryWrapper);
  98. return userRequestMapper.selectList(queryWrapper);
  99. }
  100. // 查询待处理的申请
  101. // @Override
  102. // public List<UserRequest> getPendingFriendRequests(Long userId) {
  103. // QueryWrapper<UserRequest> queryWrapper = new QueryWrapper<>();
  104. // queryWrapper.eq("receiver_id", userId.toString());
  105. // queryWrapper.eq("status", 0);
  106. // return userRequestMapper.selectList(queryWrapper);
  107. // }
  108. // 处理申请添加好友成功
  109. @Override
  110. public Result handleFriendRequest(Long requestId, boolean isAccepted) {
  111. // 查询好友申请记录
  112. UserRequest userRequest = userRequestMapper.selectById(requestId);
  113. if (userRequest == null) {
  114. return Result.error(null,"好友申请记录不存在");
  115. }
  116. if (userRequest.getStatus() != 0) {
  117. return Result.error(null,"该申请已处理,请勿重复操作");
  118. }
  119. if (isAccepted) {
  120. // 更新申请状态为已同意
  121. userRequest.setStatus(1);
  122. userRequest.setHandledTime(new Date());
  123. userRequestMapper.updateById(userRequest);
  124. // 创建好友关系记录
  125. Long senderId = Long.parseLong(userRequest.getSendId());
  126. Long receiverId = Long.parseLong(userRequest.getReceiverId());
  127. // 插入发送者的好友关系记录
  128. UserRelationships senderRelationship = new UserRelationships();
  129. senderRelationship.setUserId(senderId);
  130. senderRelationship.setFriendId(receiverId);
  131. senderRelationship.setStatus(1);
  132. senderRelationship.setCreatedAt(new Date());
  133. senderRelationship.setUpdatedAt(new Date());
  134. senderRelationship.setIsBlacklist(0);
  135. senderRelationship.setIsDel(0);
  136. senderRelationship.setIsMoments(0);
  137. userRelationshipsMapper.insert(senderRelationship);
  138. // 插入接收者的好友关系记录
  139. UserRelationships receiverRelationship = new UserRelationships();
  140. receiverRelationship.setUserId(receiverId);
  141. receiverRelationship.setFriendId(senderId);
  142. receiverRelationship.setStatus(1);
  143. receiverRelationship.setCreatedAt(new Date());
  144. receiverRelationship.setUpdatedAt(new Date());
  145. receiverRelationship.setIsBlacklist(0);
  146. receiverRelationship.setIsDel(0);
  147. receiverRelationship.setIsMoments(0);
  148. userRelationshipsMapper.insert(receiverRelationship);
  149. //插入首页的发送者的好友关系记录表
  150. UserShouye senduserShouye=new UserShouye();
  151. senduserShouye.setId(Long.valueOf(String.valueOf(SnowflakeUtil.nextId())));
  152. senduserShouye.setUid1(senderId);
  153. senduserShouye.setUid2(receiverId);
  154. senduserShouye.setStatus(0);
  155. userShouyeMapper.insert(senduserShouye);
  156. //插入接收者的好友关系记录
  157. UserShouye receiveuserShouye=new UserShouye();
  158. receiveuserShouye.setId(Long.valueOf(String.valueOf(SnowflakeUtil.nextId())));
  159. receiveuserShouye.setUid1(receiverId);
  160. receiveuserShouye.setUid2(senderId);
  161. receiveuserShouye.setStatus(0);
  162. userShouyeMapper.insert(receiveuserShouye);
  163. return Result.OK(null, "好友申请已同意,添加好友成功");
  164. } else {
  165. // 更新申请状态为已拒绝
  166. userRequest.setStatus(2);
  167. userRequest.setHandledTime(new Date());
  168. userRequestMapper.updateById(userRequest);
  169. return Result.OK(null, "好友申请已拒绝");
  170. }
  171. }
  172. //根据当前登录的用户获取所有好友并且按照首字母进行排序
  173. @Override
  174. public List<Map<String, Object>> getFriendsByUserIdAndSort(Long userId) {
  175. // 创建一个查询条件对象,用于后续查询用户关系状态为1(例如:好友关系有效)且用户ID为指定值的记录
  176. QueryWrapper<UserRelationships> queryWrapper=new QueryWrapper<>();
  177. queryWrapper.eq("status",1)
  178. .eq("user_id",userId);
  179. // 执行查询,获取用户的关系记录列表
  180. List<UserRelationships> relationships=this.list(queryWrapper);
  181. // 如果没有找到任何关系记录,则返回一个空列表
  182. if(relationships.isEmpty()){
  183. return Collections.emptyList();
  184. }
  185. // 从关系记录中提取所有好友ID
  186. List<Long> friendIds = relationships.stream()
  187. .map(UserRelationships::getFriendId)
  188. .collect(Collectors.toList());
  189. // 根据提取的好友ID列表,查询所有对应的好友登录信息
  190. List<UserLogin> friends = userLoginMapper.selectBatchIds(friendIds);
  191. // 如果没有找到任何好友信息,则返回一个空列表
  192. if (friends.isEmpty()) {
  193. return Collections.emptyList();
  194. }
  195. // 3. 转换为FriendDto并处理首字母
  196. // 使用Java Stream API对朋友列表进行处理,转换为FriendsTDto列表
  197. List<FriendsTDto> FriendsTDtos = friends.stream().map(friend -> {
  198. // 创建一个新的FriendsTDto对象
  199. FriendsTDto friendsTDto=new FriendsTDto();
  200. // 设置朋友的ID
  201. friendsTDto.setFriendId(friend.getId());
  202. // 设置朋友的昵称
  203. friendsTDto.setNickName(friend.getNickName());
  204. // 设置朋友的头像
  205. friendsTDto.setAvatar(friend.getAvatar());
  206. // 获取昵称首字母(拼音缩写)
  207. String firstLetter = PinyinUtil.getFirstLetter(friend.getNickName());
  208. // 设置昵称首字母
  209. friendsTDto.setFirstLetter(firstLetter);
  210. // 返回处理后的FriendsTDto对象
  211. return friendsTDto;
  212. }).collect(Collectors.toList());
  213. // 4. 按首字母分组(使用TreeMap保证字母顺序)
  214. Map<String, List<FriendsTDto>> groupByFirstLetter = FriendsTDtos.stream()
  215. .collect(Collectors.groupingBy(
  216. FriendsTDto::getFirstLetter,
  217. TreeMap::new,
  218. Collectors.toList()
  219. ));
  220. // 5. 整理结果(先A-Z,再#)
  221. List<Map<String, Object>> result = new ArrayList<>();
  222. // 处理A-Z字母分组
  223. for (char c = 'A'; c <= 'Z'; c++) {
  224. String letter = String.valueOf(c);
  225. if (groupByFirstLetter.containsKey(letter)) {
  226. // 对每组好友按昵称拼音排序
  227. groupByFirstLetter.get(letter).sort(
  228. Comparator.comparing(f -> PinyinUtil.getFullPinyin(f.getNickName()))
  229. );
  230. result.add(Collections.singletonMap(letter, groupByFirstLetter.get(letter)));
  231. }
  232. }
  233. // 处理特殊字符分组(#)
  234. if (groupByFirstLetter.containsKey("#")) {
  235. groupByFirstLetter.get("#").sort(
  236. Comparator.comparing(f -> PinyinUtil.getFullPinyin(f.getNickName()))
  237. );
  238. result.add(Collections.singletonMap("#", groupByFirstLetter.get("#")));
  239. }
  240. return result;
  241. }
  242. }