Commit 57f0ea87 by Future

解散群逻辑添加

parent d8cf426e
package com.wecloud.im.controller; package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImConversationQueryParam; import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.MutedGroupParam; import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam; import com.wecloud.im.param.SetAdminsParam;
...@@ -81,12 +82,23 @@ public class ImConversationController extends BaseController { ...@@ -81,12 +82,23 @@ public class ImConversationController extends BaseController {
* 将client从会话移除 * 将client从会话移除
*/ */
@PostMapping("/delClient") @PostMapping("/delClient")
@ApiOperation(value = "将client从会话移除", notes = "权限:目前只有创建者有权限操作") @ApiOperation(value = "将client从会话移除", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception { public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将client从会话移除入参 {}", JSON.toJSONString(imClientToConversation)); log.info("将client从会话移除入参 {}", JSON.toJSONString(imClientToConversation));
return imConversationService.delClientToConversation(imClientToConversation); return imConversationService.delClientToConversation(imClientToConversation);
} }
/**
* 解散群聊
*/
@PostMapping("/disband")
@ApiOperation(value = "解散群聊", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> disband(@RequestBody DisbandConversationParam param) throws Exception {
log.info("解散群聊入参 {}", JSON.toJSONString(param));
imConversationService.disband(param);
return ApiResult.ok();
}
/** /**
* 将用户添加进会话 * 将用户添加进会话
......
...@@ -60,4 +60,12 @@ public interface ImConversationMembersMapper extends BaseMapper<ImConversationMe ...@@ -60,4 +60,12 @@ public interface ImConversationMembersMapper extends BaseMapper<ImConversationMe
* @param fkClientIds * @param fkClientIds
*/ */
void setAdminsForConversation(@Param("conversationId") Long conversationId, @Param("fkClientIds") List<Long> fkClientIds, @Param("role") Integer role); void setAdminsForConversation(@Param("conversationId") Long conversationId, @Param("fkClientIds") List<Long> fkClientIds, @Param("role") Integer role);
/**
* 根据会话id删除群成员
* @param conversationId
*/
void deleteByConversationId(@Param("conversationId") Long conversationId);
} }
package com.wecloud.im.param;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author wenzhida
* @Date 2022/3/9 20:54
* @Description 解散群聊入参
*/
@Data
@ApiModel(value = "解散群聊入参")
public class DisbandConversationParam extends BaseEntity {
private static final long serialVersionUID = -354476295467898641L;
@ApiModelProperty("会话表id")
private Long conversationId;
}
...@@ -76,7 +76,13 @@ public interface ImConversationMembersService extends BaseService<ImConversation ...@@ -76,7 +76,13 @@ public interface ImConversationMembersService extends BaseService<ImConversation
* @return * @return
* @throws Exception * @throws Exception
*/ */
boolean deleteImConversationMembers(Long id) throws Exception; boolean deleteImConversationMembers(Long id);
/**
* 根据会话id做删除
* @param conversationId 会话id
*/
void deleteByConversationId(Long conversationId);
/** /**
* 根据ID获取查询对象 * 根据ID获取查询对象
......
...@@ -2,6 +2,7 @@ package com.wecloud.im.service; ...@@ -2,6 +2,7 @@ package com.wecloud.im.service;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImConversationPageParam; import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam; import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo; import com.wecloud.im.param.ImConversationQueryVo;
...@@ -68,6 +69,13 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -68,6 +69,13 @@ public interface ImConversationService extends BaseService<ImConversation> {
ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception; ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception;
/** /**
* 解散群聊
* @param param
* @return
*/
void disband(DisbandConversationParam param);
/**
* client退出会话 * client退出会话
*/ */
ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception; ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception;
......
...@@ -197,11 +197,16 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa ...@@ -197,11 +197,16 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean deleteImConversationMembers(Long id) throws Exception { public boolean deleteImConversationMembers(Long id) {
return super.removeById(id); return super.removeById(id);
} }
@Override @Override
public void deleteByConversationId(Long conversationId) {
imConversationMembersMapper.deleteByConversationId(conversationId);
}
@Override
public ImConversationMembersQueryVo getImConversationMembersById(Long id) throws Exception { public ImConversationMembersQueryVo getImConversationMembersById(Long id) throws Exception {
return imConversationMembersMapper.getImConversationMembersById(id); return imConversationMembersMapper.getImConversationMembersById(id);
} }
......
package com.wecloud.im.service.impl; package com.wecloud.im.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
...@@ -17,6 +18,7 @@ import com.wecloud.im.enums.ChatTypeEnum; ...@@ -17,6 +18,7 @@ import com.wecloud.im.enums.ChatTypeEnum;
import com.wecloud.im.enums.GroupRoleEnum; import com.wecloud.im.enums.GroupRoleEnum;
import com.wecloud.im.enums.MutedEnum; import com.wecloud.im.enums.MutedEnum;
import com.wecloud.im.mapper.ImConversationMapper; import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ListConversationMembersParam; import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.ImConversationPageParam; import com.wecloud.im.param.ImConversationPageParam;
...@@ -402,14 +404,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -402,14 +404,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception { public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
// shiro线程中获取当前token // shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken(); JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application // 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey()); ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurrentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 判断是否为群主 // 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne( ImConversationMembers conversationMember = imConversationMembersService.getOne(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
...@@ -432,10 +431,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -432,10 +431,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
int needAddCount = 0; int needAddCount = 0;
// 将client从会话移除 // 将client从会话移除
for (String clientId : imClientToConversation.getClientIds()) { for (String clientId : imClientToConversation.getClientIds()) {
ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient clientToBeRemove = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId()) .eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, clientId)); .eq(ImClient::getClientId, clientId));
...@@ -443,26 +441,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -443,26 +441,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda() ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId()) .eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()) .eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, client2.getId()) .eq(ImConversationMembers::getFkClientId, clientToBeRemove.getId())
); );
if (members == null) {
// 则跳过 continue;
}
imConversationMembersService.deleteImConversationMembers(members.getId()); imConversationMembersService.deleteImConversationMembers(members.getId());
// ws移除事件通知给群内其他人 ---------- // ws移除事件通知给群内其他人 ----------
needAddCount--; needAddCount--;
// 生成消息id // 生成消息id
long messageId = SnowflakeUtil.getId(); long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage(); ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", imClientSender.getClientId()); //操作的client ID content.put("operator", imClientSender.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID content.put("passivityOperator", clientToBeRemove.getClientId()); //被操作的client ID
imMessage.setContent(JsonUtils.encodeJson(content)); imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表 // 保存消息至消息表
imMessage.setId(messageId); imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.REMOVE_CLIENT_CONVERSATION.getUriCode()); imMessage.setMsgType(MsgTypeEnum.REMOVE_CLIENT_CONVERSATION.getUriCode());
...@@ -476,9 +471,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -476,9 +471,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setFkConversationId(imClientToConversation.getConversationId()); imMessage.setFkConversationId(imClientToConversation.getConversationId());
imMessageService.save(imMessage); imMessageService.save(imMessage);
membersList.removeIf(e -> e.getId().equals(members.getId()));
// 遍历发送 // 遍历发送
for (ImConversationMembers conversationMembers : membersList) { for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方 // 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId()) .eq(ImClient::getFkAppid, imApplication.getId())
...@@ -489,7 +484,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -489,7 +484,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 封装响应的实体 // 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend(); ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId); imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date()); imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType()); imMessageOnlineSend.setType(imMessage.getMsgType());
...@@ -513,9 +507,89 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -513,9 +507,89 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 将群成员数量减 // 将群成员数量减
imConversationMapper.addMemberCount(imApplication.getId(), imClientToConversation.getConversationId(), needAddCount); imConversationMapper.addMemberCount(imApplication.getId(), imClientToConversation.getConversationId(), needAddCount);
return ApiResult.ok(); return ApiResult.ok();
}
@Transactional(rollbackFor = Exception.class)
@Override
public void disband(DisbandConversationParam param) {
ImClient currentClient = imClientService.getCurrentClient();
// 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.eq(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (conversationMember == null || !GroupRoleEnum.OWNER.getCode().equals(conversationMember.getRole())) {
throw new BusinessException("非群主无权限解散群聊");
}
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.notIn(ImConversationMembers::getId, currentClient.getId())
);
if (membersList.isEmpty()) {
throw new BusinessException("群聊成员列表为空");
}
// 删除会话
imConversationService.removeById(param.getConversationId());
// 删除所有成员
imConversationMembersService.deleteByConversationId(param.getConversationId());
for (ImConversationMembers member : membersList) {
// 不关心事件是否发送成功
try {
// 保存事件消息
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>();
content.put("operator", currentClient.getClientId());
content.put("passivityOperator", member.getClientId());
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CONVERSATION_DISBAND.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(param.getConversationId());
imMessageService.save(imMessage);
// 给所有成员下发事件消息
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, member.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(param.getConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
} catch (Exception e) {
log.info("下发解散群事件失败,接收人 {}", JSON.toJSONString(member));
}
}
} }
@Override @Override
......
...@@ -42,6 +42,9 @@ public enum MsgTypeEnum { ...@@ -42,6 +42,9 @@ public enum MsgTypeEnum {
// 消息删除 -1017 // 消息删除 -1017
MSG_DELETE(-1017), MSG_DELETE(-1017),
// 解散群聊 -1018
CONVERSATION_DISBAND(-1018),
; ;
private final int uriCode; private final int uriCode;
......
...@@ -75,4 +75,8 @@ ...@@ -75,4 +75,8 @@
</foreach> </foreach>
</update> </update>
<delete id="deleteByConversationId">
DELETE FROM im_conversation_members WHERE fk_conversation_id = #{conversationId}
</delete>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment