lzy 1 week ago
parent
commit
824ab27358

+ 6 - 1
src/main/java/com/zhentao/groups/controller/groupsController.java

@@ -67,7 +67,12 @@ public class groupsController {
     }
 
 
-
+    // 退出群聊
+    @PostMapping("/outGroup")
+    public Result outGroup(@RequestBody OutGroupDto outGroupDto, @RequestHeader("token") String token){
+        Long currentUserId = Long.valueOf(TokenUtils.getUserIdFromToken(token));
+        return groupsService.outGroup(outGroupDto, currentUserId);
+    }
 
 
 

+ 10 - 0
src/main/java/com/zhentao/groups/dto/OutGroupDto.java

@@ -0,0 +1,10 @@
+package com.zhentao.groups.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+@Data
+public class OutGroupDto {
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private Long groupsId;
+} 

+ 6 - 0
src/main/java/com/zhentao/groups/service/GroupsService.java

@@ -44,4 +44,10 @@ public interface GroupsService extends IService<Groupss> {
     // 更新群成员角色
     Result updateGroupMemberRole(UpdateGroupMemberRoleDto updateGroupMemberRoleDto);
 
+
+
+    //     退出群聊
+    Result outGroup(OutGroupDto outGroupDto, Long currentUserId);
+
+
 }

+ 49 - 0
src/main/java/com/zhentao/groups/service/impl/GroupsServiceImpl.java

@@ -370,6 +370,55 @@ public class GroupsServiceImpl extends ServiceImpl<GroupsMapper, Groupss>
             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, "退出群聊失败");
+        }
+    }
+
 }