Commit c52a49c7 by 罗长华

如果双方还不是好友,此时创建的会话,会话类型为临时会话,且对方会话不可见

当临时会话创建者发送一条消息后,对方会话可见
当为朋友时,会话升级为单聊类型,双方可见
parent fb6ec7bc
......@@ -41,6 +41,7 @@ import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.param.MsgVo;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.FriendStateEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.MutedEnum;
......@@ -177,9 +178,17 @@ public class NormalChatAction {
continue;
}
// 入库 保存收件箱
saveImInbox(imApplication, data.getToConversation(), imMessageOnlineSend.getMsgId(),
saveImInbox(imApplication, conversation, imMessageOnlineSend.getMsgId(),
conversationMembers, SnowflakeUtil.getId());
// 入库成功后 判断是否是临时会话 如果是,检查接受方的会话display状态是否是1(显示),如果不是,需要修改为是
if (ChatTypeEnum.TEMP.getCode().equals(conversation.getChatType())) {
if (conversationMembers.getDisplayStatus().equals(0L)) {
conversationMembers.setDisplayStatus(1L);
imConversationMembersService.updateById(conversationMembers);
}
}
// 在线用户直接发消息
sendMsgForOnline(imClientReceiver.getId(), imMessageOnlineSend);
......@@ -268,12 +277,13 @@ public class NormalChatAction {
* 入库 保存收件箱
*
* @param imApplication
* @param toConversationId
* @param conversation
* @param messageId
* @param conversationMembers
* @param imInboxId
*/
private void saveImInbox(ImApplication imApplication, Long toConversationId, long messageId, ImConversationMembers conversationMembers, long imInboxId) {
private void saveImInbox(ImApplication imApplication, ImConversationQueryVo conversation, long messageId,
ImConversationMembers conversationMembers, long imInboxId) {
ImInbox imInbox = new ImInbox();
imInbox.setId(imInboxId);
imInbox.setCreateTime(new Date());
......@@ -282,7 +292,7 @@ public class NormalChatAction {
imInbox.setFkMsgId(messageId);
imInbox.setReadMsgStatus(0);
imInbox.setReceiverMsgStatus(0);
imInbox.setFkConversationId(toConversationId);
imInbox.setFkConversationId(conversation.getId());
imInboxService.save(imInbox);
}
......
......@@ -21,11 +21,14 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.friend.entity.ImFriend;
import com.wecloud.im.friend.entity.ImFriendRecommend;
import com.wecloud.im.friend.mapper.ImFriendMapper;
......@@ -36,9 +39,12 @@ import com.wecloud.im.friend.param.ImFriendBaseDto;
import com.wecloud.im.friend.param.ImFriendPageParam;
import com.wecloud.im.friend.param.ImFriendRecommendDto;
import com.wecloud.im.friend.param.UnfriendParam;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.FriendStateEnum;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.utils.SnowflakeUtil;
/**
......@@ -61,6 +67,11 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
@Autowired
private FriendEventSender friendEventSender;
@Autowired
private ImConversationMapper imConversationMapper;
private ImConversationMembersService imConversationMembersService;
/**
* 查看朋友详情
* @param currentClientId
......@@ -161,7 +172,14 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
friend.setState(FriendStateEnum.UNSURE.getCode());
this.updateByKey(friend);
}
// 检查是否存在会话,如果存在 将会话类型修改为1 单聊 双方都显示
ImConversation existConversation = imConversationMapper.getRepetitionConversationSingle(currentClient.getId(), friendClient.getId());
if (existConversation != null && ChatTypeEnum.TEMP.getCode().equals(existConversation.getChatType())) {
existConversation.setChatType(ChatTypeEnum.SINGLE.getCode());
imConversationMapper.updateById(existConversation);
imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>().set("display_status",
1).eq("fk_conversation_id", existConversation.getId()).eq("fk_appid", existConversation.getFkAppid()));
}
//既然申请好友了,就删除好友推荐
this.batchDeleteRecommend(currentClient, Collections.singletonList(friendClient.getClientId()));
this.batchDeleteRecommend(friendClient, Collections.singletonList(currentClient.getClientId()));
......
......@@ -9,10 +9,26 @@ import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
*/
public enum ChatTypeEnum implements BaseEnum {
/**
* 单聊
*/
SINGLE(1, "单聊"),
/**
* 普通群
*/
NORMAL_GROUP(2, "普通群"),
/**
* 万人群
*/
THOUSAND_GROUP(3, "万人群"),
CHAT_ROOM(4, "聊天室");
/**
* 聊天室
*/
CHAT_ROOM(4, "聊天室"),
/**
* 临时会话
*/
TEMP(5, "临时会话");
private final Integer code;
private final String desc;
......
......@@ -30,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
......@@ -45,6 +46,8 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.friend.entity.ImFriend;
import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
......@@ -72,6 +75,7 @@ import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.post.Couriers;
import com.wecloud.im.post.MessageBuilder;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.FriendStateEnum;
import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.JoinConversationTypeEnum;
......@@ -137,6 +141,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
private ContextService contextService;
@Autowired
private ImFriendService friendService;
@Autowired
private ChatRoomCacheManager chatRoomCacheManager;
@Transactional(rollbackFor = Exception.class)
......@@ -148,163 +155,39 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
@Transactional(rollbackFor = Exception.class)
public ImConversationCreateVo createImConversation(ImConversationCreate imConversationCreate) {
ImClient createClient = contextService.getImClientIfNotNullOrThrow();
// 根据appKey查询application
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid());
if (BaseEnum.valueOf(ChatTypeEnum.class, imConversationCreate.getChatType()) == null) {
log.info("会话类型不存在");
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
}
ImClient createClient = contextService.getImClientIfNotNullOrThrow();
if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationCreate.getChatType())) {
// 聊天室
return this.createChatRoom(imConversationCreate, createClient);
}
if (CollectionUtils.isEmpty(imConversationCreate.getClientIds())) {
log.info("未找到群成员信息");
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
}
// 成员不存在,不能创建会话
for (String clientId : imConversationCreate.getClientIds()) {
ImClient imClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda().select(ImClient::getId).eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, clientId));
if (imClient == null) {
log.info("成员不存在,不能创建会话 clientId:{}", clientId);
throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
}
}
// 根据appKey查询application
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid());
// 该应用 是否允许创建重复单聊类型会话 0不允许 1允许
if (imApplication.getRepeatSessionStatus() != null && imApplication.getRepeatSessionStatus() == 0) {
// 判断是否已经存在单聊类型会话
// size() == 1 为单聊不允许重复创建 两个用户如果已经创建过会话,不能重复创建会话
if (imConversationCreate.getClientIds().size() == 1) {
ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0)));
// 如果存在重复单聊类型会话,则不会为空
ImConversation repetitionConversationInfo = imConversationMapper.getRepetitionConversationSingle(createClient.getId(), client2.getId());
if (repetitionConversationInfo != null) {
log.info("存在重复的单聊会话,返回已存在的单聊类型会话id: {}", repetitionConversationInfo.getId());
// 返回已存在的单聊类型会话id
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(repetitionConversationInfo.getId());
return imConversationCreateVo;
}
}
} else {
//创建重复一对一会话时对比扩展字段 1是
if (imApplication.getContrastExtendedFieldStatus() == 1) {
// 被邀请client
ImClient inviteClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0)));
log.info("RequestAttributes:" + imConversationCreate.getAttributes());
Long repetitionConversation = getRepetitionConversationAttributes(createClient.getId(), inviteClient.getId(), imConversationCreate.getAttributes());
// 存在重复会话
if (repetitionConversation != null) {
log.info("出现Attributes重复");
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(repetitionConversation);
// 为重复
return imConversationCreateVo;
}
}
}
// 会话id
Long imConversationId = SnowflakeUtil.getId();
// 创建者
Long creator = createClient.getId();
// 创建会话
ImConversation imConversation = new ImConversation();
imConversation.setId(imConversationId);
imConversation.setCreateTime(new Date());
imConversation.setLastMessage(null);
imConversation.setFkAppid(createClient.getFkAppid());
imConversation.setCreator(creator);
imConversation.setMemberCount(imConversationCreate.getClientIds().size() + 1);
imConversation.setChatType(imConversationCreate.getChatType());
imConversation.setName(imConversationCreate.getName());
imConversation.setSystemFlag(false);
// 拓展数据
String attributesStr = JsonUtils.encodeJson(imConversationCreate.getAttributes());
imConversation.setAttributes(attributesStr);
imConversationService.save(imConversation);
Date now = new Date();
// 将创建者自己添加到会话
Long imConversationMembersId = SnowflakeUtil.getId();
ImConversationMembers imConversationMembers = new ImConversationMembers();
imConversationMembers.setId(imConversationMembersId);
imConversationMembers.setCreateTime(now);
imConversationMembers.setUpdateTime(now);
imConversationMembers.setFkAppid(createClient.getFkAppid());
imConversationMembers.setFkConversationId(imConversationId);
imConversationMembers.setFkClientId(creator);
imConversationMembers.setClientId(createClient.getClientId());
imConversationMembers.setRole(GroupRoleEnum.OWNER.getCode());
// 会话拥有者加入会话方式固定
imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.OWNER.getCode());
String joinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>创建了该会话";
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversationCreate.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>创建了该群聊";
;
} else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>创建了该聊天室";
;
}
imConversationMembers.setJoinTypeMsg(joinTypeMsg);
imConversationMembersService.save(imConversationMembers);
// 将他人添加到会话
for (String id : imConversationCreate.getClientIds()) {
ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, id));
ImConversationMembers imConversationMembers2 = new ImConversationMembers();
imConversationMembers2.setId(SnowflakeUtil.getId());
imConversationMembers2.setCreateTime(new Date());
imConversationMembers2.setUpdateTime(new Date());
imConversationMembers2.setFkAppid(createClient.getFkAppid());
imConversationMembers2.setFkConversationId(imConversationId);
imConversationMembers2.setFkClientId(client2.getId());
imConversationMembers2.setClientId(client2.getClientId());
imConversationMembers2.setRole(GroupRoleEnum.NORMAL.getCode());
// 加入会话方式固定为 邀请
imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode());
String memberJoinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = "由 <@>" + createClient.getClientId() + "<@>邀请加入该会话";
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversationCreate.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>邀请进聊";
;
} else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>邀请进入聊天室";
;
}
imConversationMembersService.save(imConversationMembers2);
if (imConversationCreate.getClientIds().size() > 1) {
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
Map<String, Object> content = Maps.newHashMap();
content.put("operator", createClient.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID
ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION, imApplication, createClient, imConversation, JsonUtils.encodeJson(content));
imMessageService.save(imMessage);
// 投递消息
couriers.deliver(imMessage, content, createClient, client2, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
}
}
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId);
return imConversationCreateVo;
Integer chatType = imConversationCreate.getChatType();
String name = imConversationCreate.getName();
String attributes = imConversationCreate.getAttributes();
List<String> memberClientIds = imConversationCreate.getClientIds();
if (ChatTypeEnum.CHAT_ROOM.getCode().equals(chatType)) {
// 聊天室
return this.createChatRoom(imConversationCreate, createClient);
} else if (ChatTypeEnum.SINGLE.getCode().equals(chatType)) {
ImConversation conversation = this.createPrivateChat(createClient, memberClientIds.get(0), name,
attributes);
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(conversation.getId());
return imConversationCreateVo;
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(chatType)) {
ImConversation conversation = this.createGroupChat(imApplication, createClient, memberClientIds, name, attributes);
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(conversation.getId());
return imConversationCreateVo;
}
return null;
}
@Transactional(rollbackFor = Exception.class)
......@@ -314,138 +197,26 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 聊天室
throw new BusinessException("不允许创建聊天室");
}
ImApplication imApplication = imConversationCreate.getApplication();
ImClient creator = imConversationCreate.getCreator();
Long appId = creator.getFkAppid();
if (CollectionUtils.isEmpty(imConversationCreate.getMembers())) {
log.info("未找到群成员信息");
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
}
// 该应用 是否允许创建重复单聊类型会话 0不允许 1允许
if (imApplication.getRepeatSessionStatus() != null && imApplication.getRepeatSessionStatus() == 0) {
// 判断是否已经存在单聊类型会话
// size() == 1 为单聊不允许重复创建 两个用户如果已经创建过会话,不能重复创建会话
if (imConversationCreate.getMembers().size() == 1) {
ImClient member = imConversationCreate.getMembers().get(0);
// 如果存在重复单聊类型会话,则不会为空
ImConversation repetitionConversationInfo = imConversationMapper.getRepetitionConversationSingle(creator.getId(), member.getId());
if (repetitionConversationInfo != null) {
log.info("存在重复的单聊会话,返回已存在的单聊类型会话id: {}", repetitionConversationInfo.getId());
// 返回已存在的会话
return repetitionConversationInfo;
}
}
} else {
//创建重复一对一会话时对比扩展字段 1是
if (imApplication.getContrastExtendedFieldStatus() == 1) {
// 被邀请client
ImClient member = imConversationCreate.getMembers().get(0);
log.info("RequestAttributes:" + imConversationCreate.getAttributes());
Long repetitionConversation = getRepetitionConversationAttributes(creator.getId(), member.getId(), imConversationCreate.getAttributes());
// 存在重复会话
if (repetitionConversation != null) {
log.info("出现Attributes重复");
// 为重复
return getById(repetitionConversation);
}
}
}
// 会话id
Long imConversationId = SnowflakeUtil.getId();
// 创建者
Long creatorImClientId = creator.getId();
// 创建会话
ImConversation imConversation = new ImConversation();
imConversation.setId(imConversationId);
imConversation.setCreateTime(new Date());
imConversation.setLastMessage(null);
imConversation.setFkAppid(appId);
imConversation.setCreator(creatorImClientId);
imConversation.setMemberCount(imConversationCreate.getMembers().size() + 1);
imConversation.setChatType(imConversationCreate.getChatType().getCode());
imConversation.setName(imConversationCreate.getName());
imConversation.setSystemFlag(false);
// 拓展数据
String attributesStr = JsonUtils.encodeJson(imConversationCreate.getAttributes());
imConversation.setAttributes(attributesStr);
imConversationService.save(imConversation);
// 将创建者自己添加到会话
Date now = new Date();
Long imConversationMembersId = SnowflakeUtil.getId();
ImConversationMembers conversationCreator = new ImConversationMembers();
conversationCreator.setId(imConversationMembersId);
conversationCreator.setCreateTime(now);
conversationCreator.setUpdateTime(now);
conversationCreator.setFkAppid(appId);
conversationCreator.setFkConversationId(imConversationId);
conversationCreator.setFkClientId(creatorImClientId);
conversationCreator.setClientId(creator.getClientId());
conversationCreator.setRole(GroupRoleEnum.OWNER.getCode());
conversationCreator.setJoinTypeCode(JoinConversationTypeEnum.OWNER.getCode());
String joinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + creatorImClientId + "<@>创建了该会话";
}
imConversationMembersService.save(conversationCreator);
// 将他人添加到会话
for (ImClient member : imConversationCreate.getMembers()) {
ImConversationMembers imConversationMember = new ImConversationMembers();
imConversationMember.setId(SnowflakeUtil.getId());
imConversationMember.setCreateTime(new Date());
imConversationMember.setUpdateTime(new Date());
imConversationMember.setFkAppid(appId);
imConversationMember.setFkConversationId(imConversationId);
imConversationMember.setFkClientId(member.getId());
imConversationMember.setClientId(member.getClientId());
imConversationMember.setRole(GroupRoleEnum.NORMAL.getCode());
ImApplication imApplication = imConversationCreate.getApplication();
ImClient creator = imConversationCreate.getCreator();
Long appId = creator.getFkAppid();
// 加入会话方式固定为 邀请
imConversationMember.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode());
String memberJoinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = "由 <@>" + creatorImClientId + "<@>邀请加入该会话";
}
imConversationMembersService.save(imConversationMember);
if (imConversationCreate.getMembers().size() > 1) {
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
ImMessage imMessage = new ImMessage();
Map<String, Object> content = Maps.newHashMap();
content.put("operator", creator.getClientId()); //操作的client ID
content.put("passivityOperator", member.getClientId()); //被操作的client ID
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(creator.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage);
// 投递消息
couriers.deliver(imMessage, content, creator, member, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
}
ChatTypeEnum chatType = imConversationCreate.getChatType();
String name = imConversationCreate.getName();
String attributes = imConversationCreate.getAttributes();
List<String> memberClientIds = imConversationCreate.getMembers().stream().map(ImClient::getClientId).collect(Collectors.toList());
if (ChatTypeEnum.SINGLE.equals(chatType)) {
return this.createPrivateChat(creator, memberClientIds.get(0), name, attributes);
} else if (ChatTypeEnum.NORMAL_GROUP.equals(chatType)) {
return this.createGroupChat(imApplication, creator, memberClientIds, name, attributes);
}
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId);
return imConversation;
return null;
}
@Override
......@@ -1469,4 +1240,225 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
}
/**
* 创建私聊会话
* @Author luozh
* @Date 2022年05月20日 01:36:33
* @param
* @Return
*/
private ImConversation createPrivateChat(ImClient creator, String memberUserId, String name, String attributes) {
Long appId = creator.getFkAppid();
ImClient memberClient = imClientService.getOne(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getClientId,
memberUserId).eq(ImClient::getFkAppid, appId));
if (memberClient == null) {
log.info("成员不存在,不能创建会话 clientId:{}", memberUserId);
throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
}
// 查看好友关系
ImFriend my = friendService.getByKey(creator.getClientId(), memberUserId);
Boolean isStranger = false;
if (my == null || !(FriendStateEnum.CONFORM.getCode().equals(my.getState()))) {
isStranger = true;
}
// 如果存在重复单聊类型会话,则不会为空
ImConversation existConversation = imConversationMapper.getRepetitionConversationSingle(creator.getId(), memberClient.getId());
if (existConversation != null) {
// 双方可见
List<ImConversationMembers> memberList =
imConversationMembersService.list(Wrappers.<ImConversationMembers>lambdaQuery().eq(ImConversationMembers::getFkConversationId, existConversation.getId()));
for (ImConversationMembers members : memberList) {
members.setDisplayStatus(1L);
}
imConversationMembersService.updateBatchById(memberList);
log.info("存在重复的单聊会话,返回已存在的单聊类型会话id: {}", existConversation.getId());
// 返回已存在的单聊类型会话id
return existConversation;
}
// 创建会话
ImConversation conversation = buildConversation(creator, ChatTypeEnum.SINGLE, name, 2, attributes);
// 创建成员
List<ImConversationMembers> conversationMemberList = buildPrivateChatMembers(conversation, creator,
memberClient);
if (isStranger) {
// 如果是陌生人,刚创建会话的时候,只有创建者可见会话 会话类型设置为临时会话
conversation.setChatType(ChatTypeEnum.TEMP.getCode());
ImConversationMembers strangerConversationMember = conversationMemberList.get(1);
strangerConversationMember.setDisplayStatus(0L);
}
this.save(conversation);
this.imConversationMembersService.saveBatch(conversationMemberList);
return conversation;
}
/**
* 创建群聊会话
* @return
*/
private ImConversation createGroupChat(ImApplication application, ImClient creator,
List<String> memberUserIds,
String name,
String attributes) {
// 判断client是否都存在
List<ImClient> memberClients =
imClientService.list(Wrappers.<ImClient>lambdaQuery()
.select(ImClient::getClientId)
.eq(ImClient::getFkAppid, creator.getFkAppid())
.in(ImClient::getClientId, memberUserIds));
if (memberClients.size() != memberUserIds.size()) {
memberUserIds.removeAll(memberClients.stream().map(ImClient::getClientId).collect(Collectors.toList()));
log.info("成员不存在,不能创建会话 clientIds:{}", JSONObject.toJSONString(memberUserIds));
throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
}
// 创建会话
ImConversation conversation = buildConversation(creator, ChatTypeEnum.NORMAL_GROUP, name, memberClients.size() + 1,
attributes);
// 创建成员
List<ImConversationMembers> conversationMemberList = buildGroupChatMembers(conversation, creator,
memberClients);
this.save(conversation);
this.imConversationMembersService.saveBatch(conversationMemberList);
// 给被拉入群的成员下发事件消息
for (ImClient member : memberClients) {
Map<String, Object> content = Maps.newHashMap();
content.put("operator", creator.getClientId()); //操作的client ID
content.put("passivityOperator", member.getClientId()); //被操作的client ID
ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION, application, creator, conversation, JsonUtils.encodeJson(content));
imMessageService.save(imMessage);
// 投递消息
couriers.deliver(imMessage, content, creator, member, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
}
return conversation;
}
private ImConversation buildConversation(ImClient creator, ChatTypeEnum chatType,
String name, Integer memberCount, String attributes) {
// 创建会话
Long imConversationId = SnowflakeUtil.getId();
ImConversation imConversation = new ImConversation();
imConversation.setId(imConversationId);
imConversation.setCreateTime(new Date());
imConversation.setLastMessage(null);
imConversation.setFkAppid(creator.getFkAppid());
imConversation.setCreator(creator.getId());
imConversation.setMemberCount(memberCount);
imConversation.setChatType(chatType.getCode());
imConversation.setName(name);
imConversation.setSystemFlag(false);
// 拓展数据
String attributesStr = JsonUtils.encodeJson(attributes);
imConversation.setAttributes(attributesStr);
return imConversation;
}
/**
* 构建群聊天成员
* @Author luozh
* @Date 2022年05月20日 02:39:32
* @param conversation
* @param creator
* @param memberClient
* @Return
*/
private List<ImConversationMembers> buildGroupChatMembers(ImConversation conversation, ImClient creator,
List<ImClient> memberClient) {
List<ImConversationMembers> conversationMembers = new ArrayList<>();
ImConversationMembers creatorMember = buildConversationMember(conversation, creator, GroupRoleEnum.OWNER);
conversationMembers.add(creatorMember);
for (ImClient client : memberClient) {
ImConversationMembers otherMember = buildConversationMember(conversation, client, GroupRoleEnum.NORMAL);
conversationMembers.add(otherMember);
}
return conversationMembers;
}
/**
* 构建私聊成员
* @Author luozh
* @Date 2022年05月20日 02:39:43
* @param conversation
* @param creator
* @param memberClient
* @Return
*/
private List<ImConversationMembers> buildPrivateChatMembers(ImConversation conversation, ImClient creator,
ImClient memberClient) {
List<ImConversationMembers> conversationMembers = new ArrayList<>();
ImConversationMembers creatorMember = buildConversationMember(conversation, creator, GroupRoleEnum.OWNER);
ImConversationMembers anotherMember = buildConversationMember(conversation, memberClient, GroupRoleEnum.NORMAL);
conversationMembers.add(creatorMember);
conversationMembers.add(anotherMember);
return conversationMembers;
}
/**
* 构建会话成员
* @Author luozh
* @Date 2022年05月20日 02:39:52
* @param conversation
* @param member
* @param role
* @Return
*/
private ImConversationMembers buildConversationMember(ImConversation conversation, ImClient member,
GroupRoleEnum role) {
Long appId = conversation.getFkAppid();
Long conversationId = conversation.getId();
Integer chatType = conversation.getChatType();
String memberUserId = member.getClientId();
Date now = new Date();
Long imConversationMembersId = SnowflakeUtil.getId();
ImConversationMembers imConversationMembers = new ImConversationMembers();
imConversationMembers.setId(imConversationMembersId);
imConversationMembers.setCreateTime(now);
imConversationMembers.setUpdateTime(now);
imConversationMembers.setFkAppid(appId);
imConversationMembers.setFkConversationId(conversationId);
imConversationMembers.setFkClientId(member.getId());
imConversationMembers.setClientId(member.getClientId());
imConversationMembers.setDisplayStatus(1L);
if (role.equals(GroupRoleEnum.OWNER)) {
imConversationMembers.setRole(GroupRoleEnum.OWNER.getCode());
// 会话拥有者加入会话方式固定
imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.OWNER.getCode());
String joinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(chatType)) {
joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + memberUserId + "<@>创建了该会话";
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(chatType) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(chatType)) {
joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + memberUserId + "<@>创建了该群聊";
} else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(chatType)) {
joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + memberUserId + "<@>创建了该聊天室";
}
imConversationMembers.setJoinTypeMsg(joinTypeMsg);
} else {
imConversationMembers.setRole(GroupRoleEnum.NORMAL.getCode());
// 加入会话方式固定为 邀请
imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode());
String memberJoinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(chatType)) {
memberJoinTypeMsg = "由 <@>" + memberUserId + "<@>邀请加入该会话";
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(chatType) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(chatType)) {
memberJoinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + memberUserId + "<@>邀请进聊";
} else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(chatType)) {
memberJoinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + memberUserId + "<@>邀请进入聊天室";
}
imConversationMembers.setJoinTypeMsg(memberJoinTypeMsg);
}
return imConversationMembers;
}
}
......@@ -24,8 +24,9 @@
</select>
<select id="getMyImConversationListAndMsgCount" resultType="com.wecloud.im.vo.ConversationVo">
SELECT imConversation.id as id,
select * from (SELECT imConversation.id as id,
imConversation.create_time,
imConversation.update_time,
imConversation.`name`,
imConversation.chat_type,
imConversation.member_count,
......@@ -59,13 +60,15 @@
FROM im_conversation_members AS imConversationMembers
INNER JOIN im_conversation AS imConversation
ON imConversation.id = imConversationMembers.fk_conversation_id
INNER JOIN im_client AS im_client ON im_client.id = imConversation.creator
INNER JOIN im_client ON im_client.id = imConversation.creator
WHERE imConversationMembers.fk_client_id = #{currentClientId}
AND imConversationMembers.display_status = 1
<if test="conversationId != null">
AND imConversation.id = #{conversationId}
</if>
GROUP BY imConversation.id
GROUP BY imConversation.id) t
order by t.update_time desc
</select>
<select id="getMyImConversationList" resultType="com.wecloud.im.entity.ImConversation">
......
......@@ -67,7 +67,7 @@ public class Conversation implements Serializable {
private String members;
/**
* "会话属性,1:单聊,2:普通群,3:万人群,4:聊天室"
* "会话属性,1:单聊,2:普通群,3:万人群,4:聊天室 5: 临时会话"
*/
private Integer chatType;
......
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