Commit 57f0ea87 by Future

解散群逻辑添加

parent d8cf426e
package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
......@@ -81,12 +82,23 @@ public class ImConversationController extends BaseController {
* 将client从会话移除
*/
@PostMapping("/delClient")
@ApiOperation(value = "将client从会话移除", notes = "权限:目前只有创建者有权限操作")
@ApiOperation(value = "将client从会话移除", notes = "权限:目前只有群主有权限操作")
public ApiResult<Boolean> delClientToConversation(@RequestBody ImClientToConversation imClientToConversation) throws Exception {
log.info("将client从会话移除入参 {}", JSON.toJSONString(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
* @param fkClientIds
*/
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
* @return
* @throws Exception
*/
boolean deleteImConversationMembers(Long id) throws Exception;
boolean deleteImConversationMembers(Long id);
/**
* 根据会话id做删除
* @param conversationId 会话id
*/
void deleteByConversationId(Long conversationId);
/**
* 根据ID获取查询对象
......
......@@ -2,6 +2,7 @@ package com.wecloud.im.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo;
......@@ -68,6 +69,13 @@ public interface ImConversationService extends BaseService<ImConversation> {
ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception;
/**
* 解散群聊
* @param param
* @return
*/
void disband(DisbandConversationParam param);
/**
* client退出会话
*/
ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception;
......
......@@ -197,11 +197,16 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
@Transactional(rollbackFor = Exception.class)
@Override
public boolean deleteImConversationMembers(Long id) throws Exception {
public boolean deleteImConversationMembers(Long id) {
return super.removeById(id);
}
@Override
public void deleteByConversationId(Long conversationId) {
imConversationMembersMapper.deleteByConversationId(conversationId);
}
@Override
public ImConversationMembersQueryVo getImConversationMembersById(Long id) throws Exception {
return imConversationMembersMapper.getImConversationMembersById(id);
}
......
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.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
......@@ -17,6 +18,7 @@ import com.wecloud.im.enums.ChatTypeEnum;
import com.wecloud.im.enums.GroupRoleEnum;
import com.wecloud.im.enums.MutedEnum;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.ImConversationPageParam;
......@@ -402,14 +404,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurrentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getCacheAppByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurrentClient();
// 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne(
new QueryWrapper<ImConversationMembers>().lambda()
......@@ -432,10 +431,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
int needAddCount = 0;
// 将client从会话移除
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::getClientId, clientId));
......@@ -443,26 +441,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, client2.getId())
.eq(ImConversationMembers::getFkClientId, clientToBeRemove.getId())
);
// 则跳过
if (members == null) {
continue;
}
imConversationMembersService.deleteImConversationMembers(members.getId());
// ws移除事件通知给群内其他人 ----------
needAddCount--;
// 生成消息id
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>();
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.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.REMOVE_CLIENT_CONVERSATION.getUriCode());
......@@ -476,9 +471,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setFkConversationId(imClientToConversation.getConversationId());
imMessageService.save(imMessage);
membersList.removeIf(e -> e.getId().equals(members.getId()));
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
......@@ -489,7 +484,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
......@@ -513,9 +507,89 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 将群成员数量减
imConversationMapper.addMemberCount(imApplication.getId(), imClientToConversation.getConversationId(), needAddCount);
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
......
......@@ -42,6 +42,9 @@ public enum MsgTypeEnum {
// 消息删除 -1017
MSG_DELETE(-1017),
// 解散群聊 -1018
CONVERSATION_DISBAND(-1018),
;
private final int uriCode;
......
......@@ -75,4 +75,8 @@
</foreach>
</update>
<delete id="deleteByConversationId">
DELETE FROM im_conversation_members WHERE fk_conversation_id = #{conversationId}
</delete>
</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