|
@@ -1,22 +1,27 @@
|
|
|
package com.zhentao.groups.service.impl;
|
|
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
+import com.aliyuncs.endpoint.UserCustomizedEndpointResolver;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.zhentao.groups.dto.AddGroupMembers;
|
|
|
-import com.zhentao.groups.dto.AddGroupsDto;
|
|
|
-import com.zhentao.groups.dto.DelGroupMembers;
|
|
|
-import com.zhentao.groups.dto.GroupDto;
|
|
|
+import com.zhentao.groups.dto.*;
|
|
|
import com.zhentao.groups.mapper.GroupMembersMapper;
|
|
|
import com.zhentao.groups.pojo.GroupMembers;
|
|
|
import com.zhentao.groups.pojo.Groupss;
|
|
|
import com.zhentao.groups.service.GroupMembersService;
|
|
|
import com.zhentao.groups.service.GroupsService;
|
|
|
import com.zhentao.groups.mapper.GroupsMapper;
|
|
|
+import com.zhentao.groups.vo.GroupsVo;
|
|
|
+import com.zhentao.groups.vo.UserVo;
|
|
|
import com.zhentao.information.cache.GroupMemberCache;
|
|
|
import com.zhentao.shouye.domain.UserShouye;
|
|
|
import com.zhentao.shouye.mapper.UserShouyeMapper;
|
|
|
import com.zhentao.shouye.service.UserShouyeService;
|
|
|
+import com.zhentao.user.domain.UserLogin;
|
|
|
+import com.zhentao.user.dto.UserRegister;
|
|
|
+import com.zhentao.user.mapper.UserLoginMapper;
|
|
|
+import com.zhentao.userRelationships.domain.UserRelationships;
|
|
|
+import com.zhentao.userRelationships.mapper.UserRelationshipsMapper;
|
|
|
import com.zhentao.vo.Result;
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -25,10 +30,11 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
+
|
|
|
+import static io.lettuce.core.BitFieldArgs.Builder.set;
|
|
|
|
|
|
/**
|
|
|
* @author lzy
|
|
@@ -53,10 +59,15 @@ public class GroupsServiceImpl extends ServiceImpl<GroupsMapper, Groupss>
|
|
|
private UserShouyeService userShouyeService;
|
|
|
@Autowired
|
|
|
private GroupsMapper groupsMapper;
|
|
|
+ @Autowired
|
|
|
+ private UserLoginMapper userLoginMapper;
|
|
|
|
|
|
@Autowired
|
|
|
private GroupMemberCache groupMemberCache;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private UserRelationshipsMapper userRelationshipsMapper;
|
|
|
+// 穿件群聊
|
|
|
@Override
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 30)
|
|
|
public Result addGroup(AddGroupsDto addGroupsDto) {
|
|
@@ -152,10 +163,40 @@ public class GroupsServiceImpl extends ServiceImpl<GroupsMapper, Groupss>
|
|
|
|
|
|
return Result.ERR(null, "添加失败");
|
|
|
}
|
|
|
+// 查询拉人的用户
|
|
|
+ @Override
|
|
|
+ public Result selectAddGroup(AddUserLoginDto addUserLoginDto) {
|
|
|
+ List<UserRelationships> userRelationships = userRelationshipsMapper.selectList(new LambdaQueryWrapper<UserRelationships>().eq(UserRelationships::getUserId, addUserLoginDto.getUid()));
|
|
|
+ if (userRelationships.size()==0){
|
|
|
+ return Result.ERR(null,"请先添加好友");
|
|
|
+ }
|
|
|
+ List<Long> friendId = userRelationships.stream().map(UserRelationships::getFriendId).collect(Collectors.toList());
|
|
|
+ List<GroupMembers> list = groupMembersMapper.selectList(new LambdaQueryWrapper<GroupMembers>().eq(GroupMembers::getGroupId, addUserLoginDto.getId()).in(GroupMembers::getUserId, friendId));
|
|
|
+
|
|
|
+ List<Long> collect = list.stream().map(GroupMembers::getUserId).collect(Collectors.toList());
|
|
|
+ if (collect.contains(friendId)){
|
|
|
+ return Result.ERR(null,"你的好友都已经加入该群了");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Long> collect1 = Stream.concat(collect.stream(), friendId.stream())
|
|
|
+ .collect(Collectors.toList())
|
|
|
+ .stream()
|
|
|
+ .filter(e -> Collections.frequency(
|
|
|
+ Stream.concat(collect.stream(), friendId.stream()).collect(Collectors.toList()),
|
|
|
+ e
|
|
|
+ ) == 1)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (collect1.size()==0){
|
|
|
+ return Result.ERR(null,"你的好友都已经在群中了");
|
|
|
+ }
|
|
|
+ List<UserLogin> userLogins = userLoginMapper.selectBatchIds(collect1);
|
|
|
|
|
|
+ return Result.OK(userLogins,"查询成功");
|
|
|
+ }
|
|
|
|
|
|
|
|
|
-// 踢人
|
|
|
+ // 踢人
|
|
|
@Override
|
|
|
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 30)
|
|
|
public Result DelGroupMembers(DelGroupMembers delGroupMembers) {
|
|
@@ -214,29 +255,186 @@ public class GroupsServiceImpl extends ServiceImpl<GroupsMapper, Groupss>
|
|
|
}
|
|
|
|
|
|
}
|
|
|
-//查询所有的群ID和群里面成员ID
|
|
|
- @Override
|
|
|
- public List<GroupDto> getList() {
|
|
|
- List<Groupss> list = this.list();
|
|
|
- List<GroupDto> list3 = new ArrayList<>();
|
|
|
-// 所有的群ID
|
|
|
- List<Long> collect = list.stream().map(Groupss::getGroupId).collect(Collectors.toList());
|
|
|
- List<GroupMembers> list1 = groupMembersService.list();
|
|
|
- for (Long c:collect) {
|
|
|
- List<Long> list2 = new ArrayList<>();
|
|
|
- for (GroupMembers m: list1) {
|
|
|
- if (c.equals(m.getGroupId())){
|
|
|
- list2.add(m.getUserId());
|
|
|
+ //查询所有的群ID和群里面成员ID
|
|
|
+ @Override
|
|
|
+ public List<GroupDto> getList() {
|
|
|
+ List<Groupss> list = this.list();
|
|
|
+ List<GroupDto> list3 = new ArrayList<>();
|
|
|
+ // 所有的群ID
|
|
|
+ List<Long> collect = list.stream().map(Groupss::getGroupId).collect(Collectors.toList());
|
|
|
+ List<GroupMembers> list1 = groupMembersService.list();
|
|
|
+ for (Long c:collect) {
|
|
|
+ List<Long> list2 = new ArrayList<>();
|
|
|
+ for (GroupMembers m: list1) {
|
|
|
+ if (c.equals(m.getGroupId())){
|
|
|
+ list2.add(m.getUserId());
|
|
|
+ }
|
|
|
}
|
|
|
+ GroupDto groupDto = new GroupDto();
|
|
|
+ groupDto.setGroupId(c);
|
|
|
+ groupDto.setUid(list2);
|
|
|
+ list3.add(groupDto);
|
|
|
}
|
|
|
- GroupDto groupDto = new GroupDto();
|
|
|
- groupDto.setGroupId(c);
|
|
|
- groupDto.setUid(list2);
|
|
|
- list3.add(groupDto);
|
|
|
+ return list3;
|
|
|
+ }
|
|
|
+
|
|
|
+// 查询群成员
|
|
|
+ @Override
|
|
|
+ public Result getGroupUsers(AddUserLoginDto groupId) {
|
|
|
+ Groupss groupss = this.baseMapper.selectById(groupId.getId());
|
|
|
+ Long groupId1 = groupss.getGroupId();
|
|
|
+ List<GroupMembers> list = groupMembersMapper.selectList(new LambdaQueryWrapper<GroupMembers>().eq(GroupMembers::getGroupId, groupId1));
|
|
|
+
|
|
|
+ List<Long> uid = list.stream().map(GroupMembers::getUserId).collect(Collectors.toList());
|
|
|
+ List<UserLogin> userLogins = userLoginMapper.selectBatchIds(uid);
|
|
|
+
|
|
|
+ GroupsVo groupsVos = new GroupsVo();
|
|
|
+ groupsVos.setName(groupss.getName());
|
|
|
+ groupsVos.setAvatar(groupss.getAvatar());
|
|
|
+ groupsVos.setDescription(groupss.getDescription());
|
|
|
+ groupsVos.setMaxMembers(groupss.getMaxMembers());
|
|
|
+ groupsVos.setStatus(groupss.getStatus());
|
|
|
+ groupsVos.setCreatedAt(groupss.getCreatedAt());
|
|
|
+ groupsVos.setUpdatedAt(groupss.getUpdatedAt());
|
|
|
+ groupsVos.setGroupId(groupss.getGroupId());
|
|
|
+ groupsVos.setCreatorId(groupss.getCreatorId());
|
|
|
+ groupsVos.setAnnouncement(groupss.getAnnouncement());
|
|
|
+ List<UserVo> userVos = new ArrayList<>();
|
|
|
+
|
|
|
+ Map<Long,GroupMembers> map = list.stream().collect(Collectors.toMap(GroupMembers::getUserId, groupMembers -> groupMembers));
|
|
|
+
|
|
|
+ for (UserLogin userLogin:userLogins){
|
|
|
+ UserVo userVo = new UserVo();
|
|
|
+ userVo.setUserId(userLogin.getId());
|
|
|
+ userVo.setNickName(userLogin.getNickName());
|
|
|
+ userVo.setImg(userLogin.getAvatar());
|
|
|
+ GroupMembers groupMembers1 = map.get(userLogin.getId());
|
|
|
+ userVo.setRole(groupMembers1.getRole());
|
|
|
+ userVos.add(userVo);
|
|
|
+ }
|
|
|
+ groupsVos.setUser(userVos);
|
|
|
+
|
|
|
+
|
|
|
+ return Result.OK(groupsVos,"查询成功");
|
|
|
+ }
|
|
|
+// 获取群的信息
|
|
|
+ @Override
|
|
|
+ public Result getGroupDetails(Long groupId) {
|
|
|
+ Groupss groupss = this.baseMapper.selectById(groupId);
|
|
|
+ if (groupss != null) {
|
|
|
+ return Result.OK(groupss, "查询成功");
|
|
|
+ } else {
|
|
|
+ return Result.ERR(null, "群聊不存在");
|
|
|
}
|
|
|
- return list3;
|
|
|
}
|
|
|
|
|
|
+// 设置角色
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 30)
|
|
|
+ public Result updateGroupMemberRole(UpdateGroupMemberRoleDto updateGroupMemberRoleDto) {
|
|
|
+ if (updateGroupMemberRoleDto.getGroupssId() == null || updateGroupMemberRoleDto.getUserId() == null || updateGroupMemberRoleDto.getRole() == null) {
|
|
|
+ return Result.ERR(null, "参数不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找群成员
|
|
|
+ LambdaQueryWrapper<GroupMembers> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(GroupMembers::getGroupId, updateGroupMemberRoleDto.getGroupssId())
|
|
|
+ .eq(GroupMembers::getUserId, updateGroupMemberRoleDto.getUserId());
|
|
|
+ GroupMembers groupMember = groupMembersMapper.selectOne(queryWrapper);
|
|
|
+
|
|
|
+ if (groupMember == null) {
|
|
|
+ return Result.ERR(null, "群成员不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查新的角色值是否有效
|
|
|
+ if (updateGroupMemberRoleDto.getRole() < 0 || updateGroupMemberRoleDto.getRole() > 1) { // 0-普通成员, 1-管理员
|
|
|
+ return Result.ERR(null, "无效的角色值");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新角色
|
|
|
+ groupMember.setRole(updateGroupMemberRoleDto.getRole());
|
|
|
+ int rowsAffected = groupMembersMapper.updateById(groupMember);
|
|
|
+
|
|
|
+ if (rowsAffected > 0) {
|
|
|
+ // 更新群成员缓存 (如果需要的话,这里可以重新加载整个群的成员或者单独更新)
|
|
|
+ List<GroupMembers> remainingMembers = groupMembersService.list(
|
|
|
+ new LambdaQueryWrapper<GroupMembers>()
|
|
|
+ .eq(GroupMembers::getGroupId, updateGroupMemberRoleDto.getGroupssId())
|
|
|
+ );
|
|
|
+ List<Long> memberIds = remainingMembers.stream()
|
|
|
+ .map(GroupMembers::getUserId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ groupMemberCache.updateGroupMembers(updateGroupMemberRoleDto.getGroupssId(), memberIds);
|
|
|
+ return Result.OK(null, "成员角色更新成功");
|
|
|
+ } else {
|
|
|
+ return Result.ERR(null, "成员角色更新失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 30)
|
|
|
+ public Result outGroup(OutGroupDto outGroupDto, Long currentUserId) {
|
|
|
+ if (outGroupDto.getGroupsId() == null || currentUserId == null) {
|
|
|
+ return Result.ERR(null, "参数不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找群成员记录
|
|
|
+ LambdaQueryWrapper<GroupMembers> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(GroupMembers::getGroupId, outGroupDto.getGroupsId())
|
|
|
+ .eq(GroupMembers::getUserId, currentUserId);
|
|
|
+ GroupMembers memberToLeave = groupMembersMapper.selectOne(queryWrapper);
|
|
|
+
|
|
|
+ if (memberToLeave == null) {
|
|
|
+ return Result.ERR(null, "您不是该群的成员");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否为群主
|
|
|
+ if (memberToLeave.getRole() == 2) {
|
|
|
+ // 如果是群主,提示需要解散群聊
|
|
|
+ return Result.ERR(null, "群主不能直接退出群聊,请使用解散群聊功能");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除群成员记录
|
|
|
+ int rowsAffected = groupMembersMapper.deleteById(memberToLeave);
|
|
|
+ UserShouye userShouye = userShouyeMapper.selectOne(new LambdaQueryWrapper<UserShouye>().eq(UserShouye::getUid1, currentUserId).eq(UserShouye::getGid, outGroupDto.getGroupsId()));
|
|
|
+ if(userShouye != null) {
|
|
|
+ userShouyeMapper.deleteById(userShouye);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rowsAffected > 0) {
|
|
|
+ // 更新群成员缓存
|
|
|
+ List<GroupMembers> remainingMembers = groupMembersService.list(
|
|
|
+ new LambdaQueryWrapper<GroupMembers>()
|
|
|
+ .eq(GroupMembers::getGroupId, outGroupDto.getGroupsId())
|
|
|
+ );
|
|
|
+ List<Long> memberIds = remainingMembers.stream()
|
|
|
+ .map(GroupMembers::getUserId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ groupMemberCache.updateGroupMembers(outGroupDto.getGroupsId(), memberIds);
|
|
|
+ return Result.OK(null, "成功退出群聊");
|
|
|
+ } else {
|
|
|
+ return Result.ERR(null, "退出群聊失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 解散群聊
|
|
|
+ @Override
|
|
|
+ public Result delGroup(OutGroupsDto outGroupsDto) {
|
|
|
+ GroupMembers groupMembers = groupMembersMapper.selectOne(new LambdaQueryWrapper<GroupMembers>().eq(GroupMembers::getGroupId, outGroupsDto.getGroupsId()).eq(GroupMembers::getUserId, outGroupsDto.getUid()));
|
|
|
+ if (groupMembers.getRole()==2){
|
|
|
+ Groupss groupss = this.baseMapper.selectById(outGroupsDto.getGroupsId());
|
|
|
+ this.baseMapper.deleteById(groupss);
|
|
|
+ List<GroupMembers> list = groupMembersMapper.selectList(new LambdaQueryWrapper<GroupMembers>().eq(GroupMembers::getGroupId, outGroupsDto.getGroupsId()));
|
|
|
+ groupMembersMapper.deleteBatchIds(list);
|
|
|
+ List<UserShouye> userShouyes = userShouyeMapper.selectList(new LambdaQueryWrapper<UserShouye>().eq(UserShouye::getGid, outGroupsDto.getGroupsId()));
|
|
|
+ userShouyeMapper.deleteBatchIds(userShouyes);
|
|
|
+ return Result.OK(null,"解散成功");
|
|
|
+ }else{
|
|
|
+ return Result.ERR(null,"权限不足");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|