Commit 094d7b19 by 罗长华

完成单聊消息、事件消息发送逻辑

parent e01365eb
package com.wecloud.im.mapper;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.apache.ibatis.annotations.Param;
......@@ -102,5 +103,5 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
* @Return
*/
List<ImConversation> getConversationBySenderAndReceivers(@Param("senderImClientId") Long senderImClientId, @Param(
"receiverImClientIds") List<Long> receiverImClientIds);
"receiverImClientIds") Collection<Long> receiverImClientIds);
}
......@@ -7,10 +7,10 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.List;
import javax.validation.constraints.NotNull;
/**
* 会话表
*
......
package com.wecloud.im.param.add;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.imserver.client.model.enums.DeviceTypeEnum;
/**
*
* @Author luozh
* @Date 2022年05月07日 10:13
* @Version 1.0
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "ImConversationCreate")
public class ServerImConversationCreate implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 可选 对话的名字,可为群组命名。")
*/
private String name;
/**
* tring格式,可选 自定义属性,供开发者扩展使用。")
*/
private String attributes;
/**
* 应用, 前端")
*/
private ImApplication application;
/**
* 创建者 前端请求不传")
*/
private ImClient creator;
/**
* 可选 成员列表
*/
private List<ImClient> members;
/**
* @see com.wecloud.im.sdk.enums.ChatTypeEnum
*/
/**
* 会话属性,1:单聊,2:普通群,3:万人群, 4:聊天室")
*/
private ChatTypeEnum chatType;
/**
* 客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs, 需与生成sign时的值一致")
*/
private DeviceTypeEnum platform;
}
package com.wecloud.im.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.*;
import com.wecloud.im.param.add.*;
import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
......@@ -14,6 +7,32 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging;
import java.util.Collection;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.param.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
import com.wecloud.im.param.TransferOwnerParam;
import com.wecloud.im.param.add.ImClientLeaveConversation;
import com.wecloud.im.param.add.ImClientToConversation;
import com.wecloud.im.param.add.ImConversationAttrUpdate;
import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
/**
* 会话表 服务类
*
......@@ -46,7 +65,7 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @param imConversationCreate
* @return
*/
ImConversation createImConversationForSdk(ImConversationCreate imConversationCreate);
ImConversation serverCreateImConversation(ServerImConversationCreate imConversationCreate);
/**
......
package com.wecloud.im.service.impl;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
......@@ -9,16 +34,49 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.wecloud.im.chatroom.cache.ChatRoomCacheManager;
import com.wecloud.im.entity.*;
import com.wecloud.im.entity.ImApplication;
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.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.*;
import com.wecloud.im.param.add.*;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
import com.wecloud.im.param.TransferOwnerParam;
import com.wecloud.im.param.add.ImClientLeaveConversation;
import com.wecloud.im.param.add.ImClientToConversation;
import com.wecloud.im.param.add.ImConversationAttrUpdate;
import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.MutedEnum;
import com.wecloud.im.service.*;
import com.wecloud.im.vo.*;
import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationMemberVo;
import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
......@@ -26,26 +84,15 @@ import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import static com.wecloud.im.ws.enums.MsgTypeEnum.*;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_ADD_FRIEND;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_ADD_FRIEND_CANCEL;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_LINK;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_LINK_CANCEL;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_PIC;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_PIC_CANCEL;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_RED_PACKETS;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_RED_PACKETS_CANCEL;
/**
* 会话表 服务实现类
......@@ -245,8 +292,133 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
@Override
public ImConversation createImConversationForSdk(ImConversationCreate imConversationCreate) {
return null;
public ImConversation serverCreateImConversation(ServerImConversationCreate imConversationCreate) {
if (ChatTypeEnum.CHAT_ROOM.equals(imConversationCreate.getChatType())) {
// 聊天室
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);
// 将创建者自己添加到会话
Long imConversationMembersId = SnowflakeUtil.getId();
ImConversationMembers conversationCreator = new ImConversationMembers();
conversationCreator.setId(imConversationMembersId);
conversationCreator.setCreateTime(new Date());
conversationCreator.setUpdateTime(new Date());
conversationCreator.setFkAppid(appId);
conversationCreator.setFkConversationId(imConversationId);
conversationCreator.setFkClientId(creatorImClientId);
conversationCreator.setClientId(creator.getClientId());
conversationCreator.setRole(GroupRoleEnum.OWNER.getCode());
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());
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);
// 发送消息
sendEventMsgToMember(imConversation.getId(), imApplication.getId(), creator.getClientId(),
member.getId(), content, imMessage);
}
}
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId);
return imConversation;
}
@Override
......
package com.wecloud.im.service.impl;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
......@@ -9,18 +36,43 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.wecloud.dispatch.common.BaseRequest;
import com.wecloud.im.entity.*;
import com.wecloud.im.entity.ImApiMessageOnlineSend;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImMessageMapper;
import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.*;
import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.GroupChatMessageParam;
import com.wecloud.im.param.GroupChatStatusMessageParam;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.MsgDeleteParam;
import com.wecloud.im.param.PrivateChatMessageParam;
import com.wecloud.im.param.PrivateChatStatusMessageParam;
import com.wecloud.im.param.PushExtParam;
import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.service.*;
import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.thousandchat.service.ThousandChatService;
import com.wecloud.im.vo.*;
import com.wecloud.im.vo.ImMessageOfflineListVo;
import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.vo.ReaderList;
import com.wecloud.im.vo.ReaderVo;
import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
......@@ -32,23 +84,6 @@ import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
......@@ -636,116 +671,177 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
public Boolean privateMessagePublish(PrivateChatMessageParam param) {
Long appId = SecurityUtils.getCurrentAppId();
ImApplication application = imApplicationService.getCacheById(appId);
// 获取发件人信息
String senderClientId = param.getFromUserId();
String toUserIdsStr = param.getToUserIds();
List<String> toUserIdList = Arrays.asList(toUserIdsStr.split(","));
// 获取发件人信息
ImClient sender = imClientService.getCacheImClient(appId, senderClientId);
if (sender == null) {
throw new BusinessException("id为 " + senderClientId + " 的发件人不存在");
}
// 获取收件人信息
Map<Long, ImConversation> conversationMapGroupById = new HashMap<>();
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId = new HashMap<>();
beforePublishPrivateMessage(application, sender, toUserIdList, conversationMapGroupById, conMembersMapGroupByConId);
// 开始发送消息
conversationMapGroupById.forEach((conversationId, conversation) -> {
List<ImConversationMembers> membersList = conMembersMapGroupByConId.getOrDefault(conversationId,
Collections.emptyList());
// 组装消息
ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), false, param.getContent());
// 持久化
this.save(message);
// 拼装发送消息体
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
// 发送消息
for (ImConversationMembers members : membersList) {
if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// 是否是发送者 且includeSender不为true
continue;
}
// 入库 保存收件箱
saveImInbox(application, conversation.getId(), imMessageOnlineSend.getMsgId(),
members, SnowflakeUtil.getId());
// 在线用户直接发消息
sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
// 离线消息推送
pushMsgToOfflineMembers(application, members, param.getPushContent(), param.getPushExt());
}
});
return true;
}
@Override
public Boolean privateStatusMessagePublish(PrivateChatStatusMessageParam param) {
Long appId = SecurityUtils.getCurrentAppId();
ImApplication application = imApplicationService.getCacheById(appId);
String senderClientId = param.getFromUserId();
String toUserIdsStr = param.getToUserIds();
List<String> toUserIdList = Arrays.asList(toUserIdsStr.split(","));
List<ImClient> clientList = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid,
// 获取发件人信息
ImClient sender = imClientService.getCacheImClient(appId, senderClientId);
if (sender == null) {
throw new BusinessException("id为 " + senderClientId + " 的发件人不存在");
}
Map<Long, ImConversation> conversationMapGroupById = new HashMap<>();
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId = new HashMap<>();
beforePublishPrivateMessage(application, sender, toUserIdList, conversationMapGroupById, conMembersMapGroupByConId);
// 开始发送消息
conversationMapGroupById.forEach((conversationId, conversation) -> {
List<ImConversationMembers> membersList = conMembersMapGroupByConId.getOrDefault(conversationId,
Collections.emptyList());
// 组装消息
ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), true,
param.getContent());
// 持久化
this.save(message);
// 拼装发送消息体
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
// 发送消息
for (ImConversationMembers members : membersList) {
if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// 是否是发送者 且includeSender不为true
continue;
}
// 在线用户直接发消息
sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
}
});
return true;
}
/**
* 私聊消息发送前
* @Author luozh
* @Date 2022年05月07日 11:28:59
* @param application
* @param sender
* @param toUserIdList
* @param conversationMapGroupById
* @param conMembersMapGroupByConId
* @Return
*/
private void beforePublishPrivateMessage(ImApplication application,
ImClient sender,
List<String> toUserIdList,
Map<Long, ImConversation> conversationMapGroupById,
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId) {
Long appId = application.getId();
// 获取收件人信息
List<ImClient> receiverList = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid,
appId).in(ImClient::getClientId, toUserIdList));
Map<Long, ImClient> clientMapById = clientList.stream().collect(Collectors.toMap(ImClient::getId, Function.identity()));
if (clientList.isEmpty()) {
Map<Long, ImClient> clientMapById = receiverList.stream().collect(Collectors.toMap(ImClient::getId, Function.identity()));
if (receiverList.isEmpty()) {
throw new BusinessException("收件人列表为空");
}
// 查找conversation列表
Long senderImClientId = sender.getId();
Set<Long> receiverImClientIds = clientList.stream().map(ImClient::getId).collect(Collectors.toSet());
Set<Long> receiverImClientIds = receiverList.stream().map(ImClient::getId).collect(Collectors.toSet());
List<ImConversation> conversationList =
imConversationService.getConversationBySenderAndReceivers(senderImClientId, receiverImClientIds);
Map<Long, ImConversation> conversationMapGroupById =
conversationList.stream().collect(Collectors.toMap(ImConversation::getId, Function.identity()));
conversationMapGroupById.putAll(conversationList.stream().collect(Collectors.toMap(ImConversation::getId,
Function.identity())));
// 查找会话成员
List<Long> conversationIdList = conversationList.stream().map(ImConversation::getId).collect(Collectors.toList());
List<ImConversationMembers> conversationMembersList =
imConversationMembersService.list(Wrappers.<ImConversationMembers>lambdaQuery().in(ImConversationMembers::getFkConversationId, conversationIdList));
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId =
conversationMembersList.stream().collect(Collectors.groupingBy(ImConversationMembers::getFkConversationId));
Map<Long, ImConversationMembers> receiverConversationMembersMap =
conMembersMapGroupByConId.putAll(conversationMembersList.stream().collect(Collectors.groupingBy(ImConversationMembers::getFkConversationId)));
if (conversationList.size() == receiverList.size()) {
// 如果会话数量和收件人数量一致,后面的逻辑就不需要走了
return;
}
Set<Long> hasExistConversationReceiverImClientIds =
conversationMembersList.stream()
.filter(member -> !member.getFkClientId().equals(senderImClientId))
.collect(Collectors.toMap(ImConversationMembers::getFkClientId, Function.identity()));
.map(ImConversationMembers::getFkClientId)
.filter(fkClientId -> !fkClientId.equals(senderImClientId)).collect(Collectors.toSet());
// 根据收件人imClientId对会话/会话成员进行分组
Set<Long> existConversationReceiverClientIds = receiverConversationMembersMap.keySet();
Set<Long> notExistConversationReceiverClientIds = new HashSet<>(receiverImClientIds);
notExistConversationReceiverClientIds.removeAll(existConversationReceiverClientIds);
notExistConversationReceiverClientIds.removeAll(hasExistConversationReceiverImClientIds);
// 不存在会话的先创建会话
notExistConversationReceiverClientIds.forEach(receiverImClientId -> {
for (Long receiverImClientId : notExistConversationReceiverClientIds) {
ImClient receiver = clientMapById.get(receiverImClientId);
List<String> clientIds = new ArrayList<>();
clientIds.add(sender.getClientId());
clientIds.add(receiver.getClientId());
ImConversationCreate conversationCreate = new ImConversationCreate();
List<ImClient> members = new ArrayList<>();
members.add(receiver);
// 创建会话
ServerImConversationCreate conversationCreate = new ServerImConversationCreate();
conversationCreate.setName(null);
conversationCreate.setAttributes(null);
conversationCreate.setClientIds(clientIds);
conversationCreate.setChatType(1);
ImConversationCreateVo createVo = imConversationService.createImConversation(conversationCreate);
ImConversation conversation = new ImConversation();
conversation.setId(createVo.getId());
});
// // 校验群聊信息
// if (conversationList.size() <= 0) {
// throw new BusinessException("群聊ids为 " + conversationIdsStr + " 的群聊列表不存在");
// }
//
// conversationList.forEach(conversation -> {
// // 获取群成员
// List<ImConversationMembers> membersList = imConversationMembersService.list(
// new QueryWrapper<ImConversationMembers>().lambda()
// .eq(ImConversationMembers::getFkConversationId, conversation.getId()));
//
// if (param.getToUserIds() != null && !param.getToUserIds().isEmpty()) {
// // 定向发送
// membersList =
// membersList.stream().filter(members -> param.getToUserIds().contains(members.getClientId())).collect(Collectors.toList());
// }
//
// // 组装消息
// ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), false, param.getContent());
// // 持久化
// this.save(message);
// // 拼装发送消息体
// ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
//
// // 发送消息
// for (ImConversationMembers members : membersList) {
// if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// // 是否是发送者 且includeSender不为true
// continue;
// }
// // 入库 保存收件箱
// saveImInbox(application, conversation.getId(), imMessageOnlineSend.getMsgId(),
// members, SnowflakeUtil.getId());
//
// // 在线用户直接发消息
// sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
//
// // 离线消息推送
// pushMsgToOfflineMembers(application, members, param.getPushContent(), param.getPushExt());
// }
//
// });
return true;
}
conversationCreate.setCreator(sender);
conversationCreate.setMembers(members);
conversationCreate.setChatType(ChatTypeEnum.SINGLE);
ImConversation conversation = imConversationService.serverCreateImConversation(conversationCreate);
// 构建ImConversationMembers(只保存必要信息)
ImConversationMembers receiverMember = new ImConversationMembers();
receiverMember.setClientId(receiver.getClientId());
receiverMember.setFkClientId(receiver.getId());
receiverMember.setFkConversationId(conversation.getId());
ImConversationMembers creatorMember = new ImConversationMembers();
receiverMember.setClientId(sender.getClientId());
receiverMember.setFkClientId(sender.getId());
receiverMember.setFkConversationId(conversation.getId());
List<ImConversationMembers> conversationMembers = new ArrayList<>();
conversationMembers.add(receiverMember);
conversationMembers.add(creatorMember);
conversationMapGroupById.put(conversation.getId(), conversation);
conMembersMapGroupByConId.put(conversation.getId(), conversationMembers);
}
@Override
public Boolean privateStatusMessagePublish(PrivateChatStatusMessageParam param) {
return null;
}
/**
......
......@@ -31,17 +31,22 @@ public class PublishPrivateChatMessageSample {
String toGroupIds = "1513691265777217536";
String messageType = "-1";
Map<String, Object> msg = new HashMap<>();
msg.put("toConversation", "1519985463165931520");
msg.put("type", -1);
msg.put("text", "这是测试消息: " + DateUtil.formatDateTime(new Date()));
Map<String, Object> content = new HashMap<>();
content.put("toConversation", "1519985463165931520");
content.put("type", -1);
content.put("text", "这是测试消息: " + DateUtil.formatDateTime(new Date()));
content.put("attrs", new HashMap<String, String>() {
{
put("test1", "");
}
});
boolean silent = true;
PrivateChatMessage privateChatMessage = new PrivateChatMessage();
privateChatMessage.setFromUserId(senderId);
privateChatMessage.setToUserIds(toGroupIds);
privateChatMessage.setMessageType(messageType);
privateChatMessage.setContent(JSONUtil.toJsonStr(msg));
privateChatMessage.setContent(JSONUtil.toJsonStr(content));
privateChatMessage.setPushContent("");
privateChatMessage.setIncludeSender(false);
privateChatMessage.setPersisted(true);
......
package com.wecloud.im.sdk.sample;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.wecloud.im.sdk.WecloudIm;
import com.wecloud.im.sdk.WecloudImClientBuilder;
import com.wecloud.im.sdk.model.PrivateChatStatusMessage;
/**
* 发布单聊消息
* @Author luozh
* @Date 2022年05月06日 01:37:29
* @Version 1.0
*/
public class PublishPrivateChatMessageStatusSample {
public static void main(String[] args) {
// WecloudIm im = new WecloudImClientBuilder().build("http://139.159.136.86:8082",
// "QizKVHcILRWp6Td2",
// "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
WecloudIm im = new WecloudImClientBuilder().build("http://127.0.0.1:8082",
"QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
String senderId = "1519984635566845952";
String toGroupIds = "1513691265777217536";
String messageType = "-1";
Map<String, Object> content = new HashMap<>();
content.put("toConversation", "1519985463165931520");
content.put("type", -1);
content.put("text", "这是测试消息: " + DateUtil.formatDateTime(new Date()));
content.put("attrs", new HashMap<String, String>() {
{
put("test1", "");
}
});
PrivateChatStatusMessage privateChatMessage = new PrivateChatStatusMessage();
privateChatMessage.setFromUserId(senderId);
privateChatMessage.setToUserIds(toGroupIds);
privateChatMessage.setMessageType(messageType);
privateChatMessage.setContent(JSONUtil.toJsonStr(content));
privateChatMessage.setIncludeBlacklist(false);
privateChatMessage.setIncludeSender(false);
Boolean result = im.publishPrivateStatusMessage(privateChatMessage);
}
}
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