Commit c52a49c7 by 罗长华

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

当临时会话创建者发送一条消息后,对方会话可见
当为朋友时,会话升级为单聊类型,双方可见
parent fb6ec7bc
...@@ -41,6 +41,7 @@ import com.wecloud.im.param.ChatContentVo; ...@@ -41,6 +41,7 @@ import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationQueryVo; import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.param.MsgVo; 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.FriendStateEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum; import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.MutedEnum; import com.wecloud.im.sdk.enums.MutedEnum;
...@@ -177,9 +178,17 @@ public class NormalChatAction { ...@@ -177,9 +178,17 @@ public class NormalChatAction {
continue; continue;
} }
// 入库 保存收件箱 // 入库 保存收件箱
saveImInbox(imApplication, data.getToConversation(), imMessageOnlineSend.getMsgId(), saveImInbox(imApplication, conversation, imMessageOnlineSend.getMsgId(),
conversationMembers, SnowflakeUtil.getId()); 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); sendMsgForOnline(imClientReceiver.getId(), imMessageOnlineSend);
...@@ -268,12 +277,13 @@ public class NormalChatAction { ...@@ -268,12 +277,13 @@ public class NormalChatAction {
* 入库 保存收件箱 * 入库 保存收件箱
* *
* @param imApplication * @param imApplication
* @param toConversationId * @param conversation
* @param messageId * @param messageId
* @param conversationMembers * @param conversationMembers
* @param imInboxId * @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 imInbox = new ImInbox();
imInbox.setId(imInboxId); imInbox.setId(imInboxId);
imInbox.setCreateTime(new Date()); imInbox.setCreateTime(new Date());
...@@ -282,7 +292,7 @@ public class NormalChatAction { ...@@ -282,7 +292,7 @@ public class NormalChatAction {
imInbox.setFkMsgId(messageId); imInbox.setFkMsgId(messageId);
imInbox.setReadMsgStatus(0); imInbox.setReadMsgStatus(0);
imInbox.setReceiverMsgStatus(0); imInbox.setReceiverMsgStatus(0);
imInbox.setFkConversationId(toConversationId); imInbox.setFkConversationId(conversation.getId());
imInboxService.save(imInbox); imInboxService.save(imInbox);
} }
......
...@@ -21,11 +21,14 @@ import org.springframework.stereotype.Service; ...@@ -21,11 +21,14 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
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.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImClient; 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.ImFriend;
import com.wecloud.im.friend.entity.ImFriendRecommend; import com.wecloud.im.friend.entity.ImFriendRecommend;
import com.wecloud.im.friend.mapper.ImFriendMapper; import com.wecloud.im.friend.mapper.ImFriendMapper;
...@@ -36,9 +39,12 @@ import com.wecloud.im.friend.param.ImFriendBaseDto; ...@@ -36,9 +39,12 @@ import com.wecloud.im.friend.param.ImFriendBaseDto;
import com.wecloud.im.friend.param.ImFriendPageParam; import com.wecloud.im.friend.param.ImFriendPageParam;
import com.wecloud.im.friend.param.ImFriendRecommendDto; import com.wecloud.im.friend.param.ImFriendRecommendDto;
import com.wecloud.im.friend.param.UnfriendParam; import com.wecloud.im.friend.param.UnfriendParam;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.FriendStateEnum; import com.wecloud.im.sdk.enums.FriendStateEnum;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
/** /**
...@@ -61,6 +67,11 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -61,6 +67,11 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
@Autowired @Autowired
private FriendEventSender friendEventSender; private FriendEventSender friendEventSender;
@Autowired
private ImConversationMapper imConversationMapper;
private ImConversationMembersService imConversationMembersService;
/** /**
* 查看朋友详情 * 查看朋友详情
* @param currentClientId * @param currentClientId
...@@ -161,7 +172,14 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> { ...@@ -161,7 +172,14 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
friend.setState(FriendStateEnum.UNSURE.getCode()); friend.setState(FriendStateEnum.UNSURE.getCode());
this.updateByKey(friend); 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(currentClient, Collections.singletonList(friendClient.getClientId()));
this.batchDeleteRecommend(friendClient, Collections.singletonList(currentClient.getClientId())); this.batchDeleteRecommend(friendClient, Collections.singletonList(currentClient.getClientId()));
......
...@@ -9,10 +9,26 @@ import io.geekidea.springbootplus.framework.common.enums.BaseEnum; ...@@ -9,10 +9,26 @@ import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
*/ */
public enum ChatTypeEnum implements BaseEnum { public enum ChatTypeEnum implements BaseEnum {
/**
* 单聊
*/
SINGLE(1, "单聊"), SINGLE(1, "单聊"),
/**
* 普通群
*/
NORMAL_GROUP(2, "普通群"), NORMAL_GROUP(2, "普通群"),
/**
* 万人群
*/
THOUSAND_GROUP(3, "万人群"), THOUSAND_GROUP(3, "万人群"),
CHAT_ROOM(4, "聊天室"); /**
* 聊天室
*/
CHAT_ROOM(4, "聊天室"),
/**
* 临时会话
*/
TEMP(5, "临时会话");
private final Integer code; private final Integer code;
private final String desc; private final String desc;
......
...@@ -30,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -30,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
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;
...@@ -45,6 +46,8 @@ import com.wecloud.im.entity.ImClient; ...@@ -45,6 +46,8 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage; 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.mapper.ImConversationMapper;
import com.wecloud.im.param.ChatRoomMemberPageParam; import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam; import com.wecloud.im.param.DisbandConversationParam;
...@@ -72,6 +75,7 @@ import com.wecloud.im.param.add.ServerImConversationCreate; ...@@ -72,6 +75,7 @@ import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.post.Couriers; import com.wecloud.im.post.Couriers;
import com.wecloud.im.post.MessageBuilder; import com.wecloud.im.post.MessageBuilder;
import com.wecloud.im.sdk.enums.ChatTypeEnum; 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.GroupChatSettingTypeEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum; import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.JoinConversationTypeEnum; import com.wecloud.im.sdk.enums.JoinConversationTypeEnum;
...@@ -137,6 +141,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -137,6 +141,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
private ContextService contextService; private ContextService contextService;
@Autowired @Autowired
private ImFriendService friendService;
@Autowired
private ChatRoomCacheManager chatRoomCacheManager; private ChatRoomCacheManager chatRoomCacheManager;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -148,163 +155,39 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -148,163 +155,39 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ImConversationCreateVo createImConversation(ImConversationCreate imConversationCreate) { 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) { if (BaseEnum.valueOf(ChatTypeEnum.class, imConversationCreate.getChatType()) == null) {
log.info("会话类型不存在"); log.info("会话类型不存在");
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION); 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())) { if (CollectionUtils.isEmpty(imConversationCreate.getClientIds())) {
log.info("未找到群成员信息"); log.info("未找到群成员信息");
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION); throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
} }
// 成员不存在,不能创建会话 Integer chatType = imConversationCreate.getChatType();
for (String clientId : imConversationCreate.getClientIds()) { String name = imConversationCreate.getName();
ImClient imClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda().select(ImClient::getId).eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, clientId)); String attributes = imConversationCreate.getAttributes();
if (imClient == null) { List<String> memberClientIds = imConversationCreate.getClientIds();
log.info("成员不存在,不能创建会话 clientId:{}", clientId); if (ChatTypeEnum.CHAT_ROOM.getCode().equals(chatType)) {
throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT); // 聊天室
} return this.createChatRoom(imConversationCreate, createClient);
} } else if (ChatTypeEnum.SINGLE.getCode().equals(chatType)) {
ImConversation conversation = this.createPrivateChat(createClient, memberClientIds.get(0), name,
// 根据appKey查询application attributes);
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 imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(repetitionConversationInfo.getId()); imConversationCreateVo.setId(conversation.getId());
return imConversationCreateVo; return imConversationCreateVo;
} } else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(chatType)) {
} ImConversation conversation = this.createGroupChat(imApplication, createClient, memberClientIds, name, attributes);
} 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 imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(repetitionConversation); imConversationCreateVo.setId(conversation.getId());
// 为重复
return imConversationCreateVo; return imConversationCreateVo;
} }
} return null;
}
// 会话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;
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -314,138 +197,26 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -314,138 +197,26 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 聊天室 // 聊天室
throw new BusinessException("不允许创建聊天室"); throw new BusinessException("不允许创建聊天室");
} }
ImApplication imApplication = imConversationCreate.getApplication();
ImClient creator = imConversationCreate.getCreator();
Long appId = creator.getFkAppid();
if (CollectionUtils.isEmpty(imConversationCreate.getMembers())) { if (CollectionUtils.isEmpty(imConversationCreate.getMembers())) {
log.info("未找到群成员信息"); log.info("未找到群成员信息");
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION); throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
} }
// 该应用 是否允许创建重复单聊类型会话 0不允许 1允许 ImApplication imApplication = imConversationCreate.getApplication();
if (imApplication.getRepeatSessionStatus() != null && imApplication.getRepeatSessionStatus() == 0) { ImClient creator = imConversationCreate.getCreator();
// 判断是否已经存在单聊类型会话 Long appId = creator.getFkAppid();
// 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());
// 加入会话方式固定为 邀请
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));
// 保存消息至消息表 ChatTypeEnum chatType = imConversationCreate.getChatType();
imMessage.setId(SnowflakeUtil.getId()); String name = imConversationCreate.getName();
imMessage.setMsgType(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION.getUriCode()); String attributes = imConversationCreate.getAttributes();
imMessage.setCreateTime(new Date()); List<String> memberClientIds = imConversationCreate.getMembers().stream().map(ImClient::getClientId).collect(Collectors.toList());
imMessage.setFkAppid(imApplication.getId()); if (ChatTypeEnum.SINGLE.equals(chatType)) {
imMessage.setSender(creator.getId()); return this.createPrivateChat(creator, memberClientIds.get(0), name, attributes);
imMessage.setWithdraw(false); } else if (ChatTypeEnum.NORMAL_GROUP.equals(chatType)) {
imMessage.setEvent(true); return this.createGroupChat(imApplication, creator, memberClientIds, name, attributes);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage);
// 投递消息
couriers.deliver(imMessage, content, creator, member, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
} }
} return null;
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId);
return imConversation;
} }
@Override @Override
...@@ -1469,4 +1240,225 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -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 @@ ...@@ -24,8 +24,9 @@
</select> </select>
<select id="getMyImConversationListAndMsgCount" resultType="com.wecloud.im.vo.ConversationVo"> <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.create_time,
imConversation.update_time,
imConversation.`name`, imConversation.`name`,
imConversation.chat_type, imConversation.chat_type,
imConversation.member_count, imConversation.member_count,
...@@ -59,13 +60,15 @@ ...@@ -59,13 +60,15 @@
FROM im_conversation_members AS imConversationMembers FROM im_conversation_members AS imConversationMembers
INNER JOIN im_conversation AS imConversation INNER JOIN im_conversation AS imConversation
ON imConversation.id = imConversationMembers.fk_conversation_id 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} WHERE imConversationMembers.fk_client_id = #{currentClientId}
AND imConversationMembers.display_status = 1 AND imConversationMembers.display_status = 1
<if test="conversationId != null"> <if test="conversationId != null">
AND imConversation.id = #{conversationId} AND imConversation.id = #{conversationId}
</if> </if>
GROUP BY imConversation.id GROUP BY imConversation.id) t
order by t.update_time desc
</select> </select>
<select id="getMyImConversationList" resultType="com.wecloud.im.entity.ImConversation"> <select id="getMyImConversationList" resultType="com.wecloud.im.entity.ImConversation">
......
...@@ -67,7 +67,7 @@ public class Conversation implements Serializable { ...@@ -67,7 +67,7 @@ public class Conversation implements Serializable {
private String members; private String members;
/** /**
* "会话属性,1:单聊,2:普通群,3:万人群,4:聊天室" * "会话属性,1:单聊,2:普通群,3:万人群,4:聊天室 5: 临时会话"
*/ */
private Integer chatType; 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