Commit 84cea03752ee67f6339b519dfe0e04a34060b459

Authored by 安浩浩
1 parent 51e724fc

修改: 发送消息使用WebSocketSenderApi

yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java
1 package cn.iocoder.yudao.module.im.enums.conversation; 1 package cn.iocoder.yudao.module.im.enums.conversation;
2 2
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
3 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
4 import lombok.Getter; 5 import lombok.Getter;
5 6
  7 +import java.util.Arrays;
  8 +
6 /** 9 /**
7 * IM 会话类型枚举 10 * IM 会话类型枚举
8 * 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档 11 * 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档
@@ -11,12 +14,14 @@ import lombok.Getter; @@ -11,12 +14,14 @@ import lombok.Getter;
11 */ 14 */
12 @Getter 15 @Getter
13 @AllArgsConstructor 16 @AllArgsConstructor
14 -public enum ConversationTypeEnum { 17 +public enum ConversationTypeEnum implements IntArrayValuable {
15 18
16 SINGLE(1, "单聊"), 19 SINGLE(1, "单聊"),
17 GROUP(3, "群聊"), 20 GROUP(3, "群聊"),
18 NOTIFICATION(4, "通知会话"); 21 NOTIFICATION(4, "通知会话");
19 22
  23 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ConversationTypeEnum::getType).toArray();
  24 +
20 /** 25 /**
21 * 类型 26 * 类型
22 */ 27 */
@@ -27,6 +32,11 @@ public enum ConversationTypeEnum { @@ -27,6 +32,11 @@ public enum ConversationTypeEnum {
27 */ 32 */
28 private final String name; 33 private final String name;
29 34
  35 + @Override
  36 + public int[] array() {
  37 + return ARRAYS;
  38 + }
  39 +
30 /** 40 /**
31 * 生成会话编号 41 * 生成会话编号
32 * @param fromUserId 发送者编号 42 * @param fromUserId 发送者编号
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
@@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO; @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO;
12 import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao; 12 import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao;
13 import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; 13 import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
14 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; 14 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
  15 +import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
15 import jakarta.annotation.Resource; 16 import jakarta.annotation.Resource;
16 import org.dromara.hutool.core.date.DateUnit; 17 import org.dromara.hutool.core.date.DateUnit;
17 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
@@ -38,7 +39,7 @@ public class InboxServiceImpl implements InboxService { @@ -38,7 +39,7 @@ public class InboxServiceImpl implements InboxService {
38 @Resource 39 @Resource
39 private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO 40 private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO
40 @Resource 41 @Resource
41 - private WebSocketMessageSender webSocketMessageSender; // WebSocket消息发送器 42 + private WebSocketSenderApi webSocketSenderApi;
42 @Resource 43 @Resource
43 private GroupMemberService groupMemberService; 44 private GroupMemberService groupMemberService;
44 45
@@ -71,7 +72,7 @@ public class InboxServiceImpl implements InboxService { @@ -71,7 +72,7 @@ public class InboxServiceImpl implements InboxService {
71 72
72 InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class); 73 InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class);
73 message.setSequence(userSequence); 74 message.setSequence(userSequence);
74 - webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message); 75 + webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message);
75 }); 76 });
76 } 77 }
77 78
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java
@@ -88,13 +88,15 @@ public class MessageServiceImpl implements MessageService { @@ -88,13 +88,15 @@ public class MessageServiceImpl implements MessageService {
88 messageMapper.insert(messageDO); 88 messageMapper.insert(messageDO);
89 89
90 // 设置 InboxSaveMessageReqVO 对象 90 // 设置 InboxSaveMessageReqVO 对象
91 - inboxSaveMessageReqVO.setConversationType(message.getConversationType());  
92 - inboxSaveMessageReqVO.setFromId(fromUserId);  
93 - inboxSaveMessageReqVO.setReceiverId(message.getReceiverId());  
94 - inboxSaveMessageReqVO.setMessageId(messageDO.getId());  
95 - inboxSaveMessageReqVO.setContentType(message.getContentType());  
96 - inboxSaveMessageReqVO.setContent(message.getContent());  
97 - inboxSaveMessageReqVO.setSendTime(messageDO.getSendTime()); 91 + inboxSaveMessageReqVO.setConversationType(message.getConversationType())
  92 + .setFromId(fromUserId)
  93 + .setReceiverId(message.getReceiverId())
  94 + .setMessageId(messageDO.getId())
  95 + .setContentType(message.getContentType())
  96 + .setContent(message.getContent())
  97 + .setSendTime(messageDO.getSendTime())
  98 + .setSenderNickname(fromUser.getNickname())
  99 + .setSenderAvatar(fromUser.getAvatar());
98 100
99 // 返回 SendMessageRespVO 对象 101 // 返回 SendMessageRespVO 对象
100 return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime()); 102 return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime());
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java 0 → 100644
  1 +package cn.iocoder.yudao.module.im.websocket;
  2 +
  3 +import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener;
  4 +import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils;
  5 +import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;
  6 +import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
  7 +import jakarta.annotation.Resource;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.springframework.stereotype.Component;
  10 +import org.springframework.web.socket.WebSocketSession;
  11 +
  12 +// TODO @hao:消息发送,使用 http 上行。因为在 cloud 框架下,我们比较难去 Listener。因为 im-server 不会自己启动 websocket 路径
  13 +
  14 +/**
  15 + * WebSocket im
  16 + *
  17 + * @author 芋道源码
  18 + */
  19 +@Component
  20 +@Slf4j
  21 +public class ImWebSocketMessageListener implements WebSocketMessageListener<ImSendMessage> {
  22 +
  23 + public static final String IM_MESSAGE_RECEIVE = "im-message-receive";
  24 + @Resource
  25 + private WebSocketSenderApi webSocketSenderApi; // WebSocket消息发送器
  26 +
  27 + /**
  28 + * 处理WebSocket消息
  29 + *
  30 + * @param session WebSocket会话
  31 + * @param message 发送的IM消息
  32 + */
  33 + @Override
  34 + public void onMessage(WebSocketSession session, ImSendMessage message) {
  35 + Long fromUserId = WebSocketFrameworkUtils.getLoginUserId(session); // 获取登录用户ID
  36 + log.info(message.toString());
  37 + }
  38 +
  39 + /**
  40 + * 获取类型
  41 + *
  42 + * @return 类型
  43 + */
  44 + @Override
  45 + public String getType() {
  46 + return "im-message-send";
  47 + }
  48 +
  49 +}
0 \ No newline at end of file 50 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java 0 → 100644
  1 +package cn.iocoder.yudao.module.im.websocket.message;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - 消息发送 receive")
  11 +@Data
  12 +public class ImReceiveMessage {
  13 +
  14 + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  15 + @InEnum(ConversationTypeEnum.class)
  16 + private Integer conversationType;
  17 +
  18 + @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  19 + private Long fromId; // 根据 conversationType 区分
  20 +
  21 + // TODO @hao:昵称和头像,也直接发给接收人好了;
  22 +
  23 + @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
  24 + private Long messageId;
  25 +
  26 + @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  27 + private Integer contentType; // 参见 ImMessageTypeEnum 枚举
  28 +
  29 + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
  30 + private String content;
  31 +
  32 + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
  33 + private LocalDateTime sendTime;
  34 +
  35 + @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
  36 + private Long sequence;
  37 +
  38 +}
0 \ No newline at end of file 39 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java 0 → 100644
  1 +package cn.iocoder.yudao.module.im.websocket.message;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
  5 +import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import lombok.Data;
  8 +
  9 +@Schema(description = "管理后台 - IM 消息发送 send")
  10 +@Data
  11 +public class ImSendMessage {
  12 +
  13 + @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
  14 + private String clientMessageId;
  15 +
  16 + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  17 + @InEnum(ConversationTypeEnum.class)
  18 + private Integer conversationType;
  19 +
  20 + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  21 + private Long receiverId; // 根据 conversationType 区分
  22 +
  23 + @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  24 + @InEnum(MessageContentTypeEnum.class)
  25 + private Integer contentType;
  26 +
  27 + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
  28 + private String content;
  29 +
  30 +}
0 \ No newline at end of file 31 \ No newline at end of file