UserRelationshipsServiceImpl.java 11 KB

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