From fa23ce144d9391c3b30b050c2ad80f6a21bcda82 Mon Sep 17 00:00:00 2001
From: 安浩浩 <1036606149@qq.com>
Date: Sun, 31 Mar 2024 22:47:18 +0800
Subject: [PATCH] 修改:代码优化
---
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java | 57 ---------------------------------------------------------
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java | 35 +++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java | 40 ++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageContentTypeEnum.java | 77 -----------------------------------------------------------------------------
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageSourceEnum.java | 37 -------------------------------------
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageStatusEnum.java | 46 ----------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java | 54 ------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java | 34 ----------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java | 35 -----------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java | 26 ++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java | 24 ++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java | 30 ++++++++----------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java | 8 ++++----
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveMessageReqVO.java | 43 -------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSendMessageReqVO.java | 42 ------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/package-info.java | 5 +++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java | 59 -----------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java | 33 +++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java | 36 ++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendRespVO.java | 26 ++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java | 30 ------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java | 52 ----------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageReqVO.java | 40 ----------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageRespVO.java | 28 ----------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java | 68 --------------------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupDO.java | 58 ----------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupMemberDO.java | 55 -------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java | 49 -------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java | 101 -----------------------------------------------------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/AudioMessage.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/CardMessage.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/FileMessage.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/ImageMessage.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/LocationMessage.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/TextMessage.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/VideoMessage.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java | 9 ++++-----
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/GroupMapper.java | 30 ++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMapper.java | 30 ------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/GroupMemberMapper.java | 35 +++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java | 35 -----------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java | 29 ++++++++---------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java | 18 +++++++-----------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDAO.java | 36 ++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDao.java | 37 -------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java | 14 ++++++++------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java | 74 +++++++++++++++++++++++++++++++++++++-------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupService.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupServiceImpl.java | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupService.java | 53 -----------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java | 71 -----------------------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java | 8 ++++----
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java | 30 +++++++++++++++---------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java | 6 +++---
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java | 75 +++++++++++++++++++++++++++++++++++++++++++--------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java | 25 +++++++++++++------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java | 115 ++++++++++++++++++++++++++++++++++++++++++++-----------------------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java | 49 -------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java | 39 ---------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java | 30 ------------------------------
70 files changed, 1278 insertions(+), 1566 deletions(-)
delete mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java
create mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java
create mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java
create mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java
create mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java
delete mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageContentTypeEnum.java
delete mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageSourceEnum.java
delete mode 100644 yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageStatusEnum.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveMessageReqVO.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSendMessageReqVO.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/package-info.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendRespVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageReqVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageRespVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupDO.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupMemberDO.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/GroupMapper.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMapper.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/GroupMemberMapper.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDAO.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDao.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupService.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupServiceImpl.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupService.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java
delete mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java
deleted file mode 100644
index bc12824..0000000
--- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package cn.iocoder.yudao.module.im.enums.conversation;
-
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-// TODO @anhaohao:IM 前缀还是要的哈
-/**
- * IM 会话类型枚举
- * 参考 “会话类型” 文档
- *
- * @author anhaohao
- */
-@Getter
-@AllArgsConstructor
-public enum ConversationTypeEnum implements IntArrayValuable {
-
- SINGLE(1, "单聊"),
- GROUP(3, "群聊"),
- NOTIFICATION(4, "通知会话");
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ConversationTypeEnum::getType).toArray();
-
- /**
- * 类型
- */
- private final Integer type;
-
- /**
- * 名字
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
- /**
- * 生成会话编号 TODO @anhaohao:方法注释,和下面参数之间,要有空格
- * @param fromUserId 发送者编号
- * @param receiverId 接收者编号
- * @param conversationType 会话类型
- * @return 会话编号
- */
- public static String generateConversationNo(Long fromUserId, Long receiverId, Integer conversationType) {
- if (conversationType.equals(ConversationTypeEnum.SINGLE.getType())) {
- return "s_" + fromUserId + "_" + receiverId;
- } else if (conversationType.equals(ConversationTypeEnum.GROUP.getType())) {
- return "g_" + receiverId;
- }
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java
new file mode 100644
index 0000000..a72ae7b
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.im.enums.conversation;
+
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * IM 会话类型枚举
+ * 参考 “会话类型” 文档
+ *
+ * @author anhaohao
+ */
+@Getter
+@AllArgsConstructor
+public enum ImConversationTypeEnum implements IntArrayValuable {
+
+ SINGLE(1, "单聊"),
+ GROUP(3, "群聊"),
+ NOTIFICATION(4, "通知会话");
+
+ public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImConversationTypeEnum::getType).toArray();
+
+ /**
+ * 类型
+ */
+ private final Integer type;
+
+ /**
+ * 名字
+ */
+ private final String name;
+
+ /**
+ * 生成会话编号
+ *
+ * @param fromUserId 发送者编号
+ * @param receiverId 接收者编号
+ * @param conversationType 会话类型
+ * @return 会话编号
+ */
+ public static String generateConversationNo(Long fromUserId, Long receiverId, Integer conversationType) {
+ if (conversationType.equals(ImConversationTypeEnum.SINGLE.getType())) {
+ return "s_" + fromUserId + "_" + receiverId;
+ } else if (conversationType.equals(ImConversationTypeEnum.GROUP.getType())) {
+ return "g_" + receiverId;
+ }
+ return null;
+ }
+
+ @Override
+ public int[] array() {
+ return ARRAYS;
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java
new file mode 100644
index 0000000..6d5c96f
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java
@@ -0,0 +1,76 @@
+package cn.iocoder.yudao.module.im.enums.message;
+
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * IM 消息的类型枚举
+ *
+ * 参考 “消息类型” 文档
+ *
+ * @author anhaohao
+ */
+@Getter
+@AllArgsConstructor
+public enum ImMessageContentTypeEnum implements IntArrayValuable {
+
+ TEXT(101, "文本消息"),
+ PICTURE(102, "图片消息"),
+ VOICE(103, "语音消息"),
+ VIDEO(104, "视频消息"),
+ FILE(105, "文件消息"),
+ AT_TEXT(106, "@消息"),
+ MERGE(107, "合并消息"),
+ CARD(108, "名片消息"),
+ LOCATION(109, "位置消息"),
+ CUSTOM(110, "自定义消息"),
+ REVOKE_RECEIPT(111, "撤回消息回执"),
+ C2C_RECEIPT(112, "单聊消息回执"),
+ TYPING(113, "输入状态"),
+ QUOTE(114, "引用消息"),
+ FACE(115, "表情消息"),
+ ADVANCED_REVOKE(118, "高级撤回消息"),
+ // ========== 好友通知 1200-1299 ===========
+ FRIEND_ADDED(1201, "双方成为好友通知"),
+ // ========== 系统通知 1400 ==========
+ OA_NOTIFICATION(1400, "系统通知"),
+ // ========== 群相关 1500-1599 ==========
+ GROUP_CREATED(1501, "群创建通知"),
+ GROUP_INFO_CHANGED(1502, "群信息改变通知"),
+ MEMBER_QUIT(1504, "群成员退出通知"),
+ GROUP_OWNER_CHANGED(1507, "群主更换通知"),
+ MEMBER_KICKED(1508, "群成员被踢通知"),
+ MEMBER_INVITED(1509, "邀请群成员通知"),
+ MEMBER_ENTER(1510, "群成员进群通知"),
+ GROUP_DISMISSED(1511, "解散群通知"),
+ GROUP_MEMBER_MUTED(1512, "群成员禁言通知"),
+ GROUP_MEMBER_CANCEL_MUTED(1513, "取消群成员禁言通知"),
+ GROUP_MUTED(1514, "群禁言通知"),
+ GROUP_CANCEL_MUTED(1515, "取消群禁言通知"),
+ GROUP_ANNOUNCEMENT_UPDATED(1519, "群公告改变通知"),
+ GROUP_NAME_UPDATED(1520, "群名称改变通知"),
+
+ BURN_CHANGE(1701, "阅后即焚开启或关闭通知"),
+ REVOKE(2101, "撤回消息通知");;
+
+ public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageContentTypeEnum::getType).toArray();
+
+ /**
+ * 类型
+ */
+ private final Integer type;
+
+ /**
+ * 名字
+ */
+ private final String name;
+
+ @Override
+ public int[] array() {
+ return ARRAYS;
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java
new file mode 100644
index 0000000..c1f2393
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.im.enums.message;
+
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Arrays;
+
+/**
+ * IM 消息的消息来源
+ */
+@RequiredArgsConstructor
+@Getter
+public enum ImMessageSourceEnum implements IntArrayValuable {
+
+ USER_SEND(100, "用户发送"),
+ SYSTEM_SEND(200, "系统发送");
+
+ public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageSourceEnum::getSource).toArray();
+
+ /**
+ * 状态
+ */
+ private final Integer source;
+ /**
+ * 名字
+ */
+ private final String name;
+
+ @Override
+ public int[] array() {
+ return ARRAYS;
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java
new file mode 100644
index 0000000..e9d8b9a
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.im.enums.message;
+
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Arrays;
+
+/**
+ * IM 消息的状态枚举
+ */
+@RequiredArgsConstructor
+@Getter
+public enum ImMessageStatusEnum implements IntArrayValuable {
+
+ DRAFT(0, "草稿"),
+ SENDING(1, "发送中"),
+ SUCCESS(2, "发送成功"),
+ FAILURE(3, "发送失败"),
+ DELETED(4, "已删除"),
+ RECALL(5, "已撤回");
+
+ public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageStatusEnum::getStatus).toArray();
+
+ /**
+ * 状态
+ */
+ private final Integer status;
+
+ /**
+ * 名字
+ */
+ private final String name;
+
+ @Override
+ public int[] array() {
+ return ARRAYS;
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageContentTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageContentTypeEnum.java
deleted file mode 100644
index f0e7569..0000000
--- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageContentTypeEnum.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package cn.iocoder.yudao.module.im.enums.message;
-
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-// TODO @anhaohao:IM 前缀还是要的哈
-/**
- * IM 消息的类型枚举
- *
- * 参考 “消息类型” 文档
- *
- * @author anhaohao
- */
-@Getter
-@AllArgsConstructor
-public enum MessageContentTypeEnum implements IntArrayValuable {
-
- TEXT(101, "文本消息"),
- PICTURE(102, "图片消息"),
- VOICE(103, "语音消息"),
- VIDEO(104, "视频消息"),
- FILE(105, "文件消息"),
- AT_TEXT(106, "@消息"),
- MERGE(107, "合并消息"),
- CARD(108, "名片消息"),
- LOCATION(109, "位置消息"),
- CUSTOM(110, "自定义消息"),
- REVOKE_RECEIPT(111, "撤回消息回执"),
- C2C_RECEIPT(112, "单聊消息回执"),
- TYPING(113, "输入状态"),
- QUOTE(114, "引用消息"),
- FACE(115, "表情消息"),
- ADVANCED_REVOKE(118, "高级撤回消息"),
- // ========== 好友通知 1200-1299 ===========
- FRIEND_ADDED(1201, "双方成为好友通知"),
- // ========== 系统通知 1400 ==========
- OA_NOTIFICATION(1400, "系统通知"),
- // ========== 群相关 1500-1599 ==========
- GROUP_CREATED(1501, "群创建通知"),
- GROUP_INFO_CHANGED(1502, "群信息改变通知"),
- MEMBER_QUIT(1504, "群成员退出通知"),
- GROUP_OWNER_CHANGED(1507, "群主更换通知"),
- MEMBER_KICKED(1508, "群成员被踢通知"),
- MEMBER_INVITED(1509, "邀请群成员通知"),
- MEMBER_ENTER(1510, "群成员进群通知"),
- GROUP_DISMISSED(1511, "解散群通知"),
- GROUP_MEMBER_MUTED(1512, "群成员禁言通知"),
- GROUP_MEMBER_CANCEL_MUTED(1513, "取消群成员禁言通知"),
- GROUP_MUTED(1514, "群禁言通知"),
- GROUP_CANCEL_MUTED(1515, "取消群禁言通知"),
- GROUP_ANNOUNCEMENT_UPDATED(1519, "群公告改变通知"),
- GROUP_NAME_UPDATED(1520, "群名称改变通知"),
-
- BURN_CHANGE(1701, "阅后即焚开启或关闭通知"),
- REVOKE(2101, "撤回消息通知");;
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageContentTypeEnum::getType).toArray();
-
- /**
- * 类型
- */
- private final Integer type;
-
- /**
- * 名字
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageSourceEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageSourceEnum.java
deleted file mode 100644
index caa81ab..0000000
--- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageSourceEnum.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package cn.iocoder.yudao.module.im.enums.message;
-
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-import java.util.Arrays;
-
-// TODO @anhaohao:IM 前缀还是要的哈
-/**
- * IM 消息的消息来源
- */
-@RequiredArgsConstructor
-@Getter
-public enum MessageSourceEnum implements IntArrayValuable {
-
- USER_SEND(100, "用户发送"),
- SYSTEM_SEND(200, "系统发送");
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageSourceEnum::getStatus).toArray();
-
- // TODO @anhaohao:应该是 source
- /**
- * 状态
- */
- private final Integer status;
- /**
- * 名字
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageStatusEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageStatusEnum.java
deleted file mode 100644
index fc70920..0000000
--- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageStatusEnum.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package cn.iocoder.yudao.module.im.enums.message;
-
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-import java.util.Arrays;
-
-// TODO @anhaohao:IM 前缀还是要的哈
-// TODO TODO 状态是这些哈,客户端的视角:
-//
-//- 草稿(预留) 0
-//- 发送中 1
-//- 发送成功 2
-//- 发送失败 3
-//- 已删除 4
-//- 已撤回 5
-/**
- * IM 消息的状态枚举
- */
-@RequiredArgsConstructor
-@Getter
-public enum MessageStatusEnum implements IntArrayValuable {
-
- SENDING(1, "发送中"),
- SUCCEED(2, "发送成功"),
- FAILED(3, "发送失败");
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageStatusEnum::getStatus).toArray();
-
- /**
- * 状态
- */
- private final Integer status;
-
- /**
- * 名字
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java
deleted file mode 100755
index 33cb857..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.conversation;
-
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO;
-import cn.iocoder.yudao.module.im.service.conversation.ConversationService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-
-// TODO @anhaohao:im 前缀少啦
-@Tag(name = "管理后台 - IM 会话")
-@RestController
-@RequestMapping("/im/conversation")
-@Validated
-public class ConversationController {
-
- @Resource
- private ConversationService conversationService;
-
- @GetMapping("/list")
- @Operation(summary = "获得用户的会话列表")
- public CommonResult> getConversationList() {
- List conversationList = conversationService.getConversationList();
- return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class));
- }
-
- // TODO @hao:这个接口,需要单独的 VO 哈;
- @PostMapping("/update-pinned")
- @Operation(summary = "置顶会话")
- public CommonResult updatePinned(@Valid @RequestBody ConversationPinnedReqVO updateReqVO) {
- conversationService.updatePinned(updateReqVO);
- return success(true);
- }
-
- // TODO @hao:这个接口,需要单独的 VO 哈;
- @PostMapping("/update-last-read-time")
- @Operation(summary = "更新最后已读时间")
- public CommonResult updateLastReadTime(@Valid @RequestBody ConversationLastTimeReqVO updateReqVO) {
- conversationService.updateLastReadTime(updateReqVO);
- return success(true);
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
new file mode 100755
index 0000000..ea83761
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.im.controller.admin.conversation;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO;
+import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
+import cn.iocoder.yudao.module.im.service.conversation.ConversationService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - IM 会话")
+@RestController
+@RequestMapping("/im/conversation")
+@Validated
+public class ImConversationController {
+
+ @Resource
+ private ConversationService conversationService;
+
+ @GetMapping("/list")
+ @Operation(summary = "获得用户的会话列表")
+ public CommonResult> getConversationList() {
+ List conversationList = conversationService.getConversationList();
+ return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class));
+ }
+
+ @PostMapping("/update-pinned")
+ @Operation(summary = "置顶会话")
+ public CommonResult updatePinned(@Valid @RequestBody ImConversationUpdatePinnedReqVO updateReqVO) {
+ conversationService.updatePinned(getLoginUserId(),updateReqVO);
+ return success(true);
+ }
+
+ @PostMapping("/update-last-read-time")
+ @Operation(summary = "更新最后已读时间")
+ public CommonResult updateLastReadTime(@Valid @RequestBody ImConversationUpdateLastReadTimeReqVO updateReqVO) {
+ conversationService.updateLastReadTime(getLoginUserId(),updateReqVO);
+ return success(true);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java
deleted file mode 100755
index dfd05a0..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-// TODO @anhaohao:改成 ConversationUpdateLastReadTimeReqVO,项目目前都是动名词哈。更新置顶
-@Schema(description = "管理后台 - 会话最后已读时间 Request VO")
-@Data
-public class ConversationLastTimeReqVO {
-
- // TODO @anhaohao:no 不用传递哈。因为 userId + targetId 可以推出来
- @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2")
- @NotEmpty(message = "会话标志不能为空")
- private String no;
-
- @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00")
- @NotNull(message = "最后已读时间不能为空")
- private LocalDateTime lastReadTime;
-
- // TODO @anhaohao:userId 不用传递,因为 token 已经能解析出当前用户
- @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Long userId;
-
- @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
- private Long targetId;
-
- @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer type; // 枚举 ConversationTypeEnum TODO ,这里可以使用 @InEnum 校验,这样这个注释就不用写了
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java
deleted file mode 100755
index f10ae27..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-// TODO @anhaohao:改成 ConversationUpdatePinnedReqVO,项目目前都是动名词哈。更新置顶
-@Schema(description = "管理后台 - 会话置顶 Request VO")
-@Data
-public class ConversationPinnedReqVO {
-
- // TODO @anhaohao:no 不用传递哈。因为 userId + targetId 可以推出来
- @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2")
- @NotEmpty(message = "会话标志不能为空")
- private String no;
-
- @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "是否置顶不能为空")
- private Boolean pinned;
-
- // TODO @anhaohao:userId 不用传递,因为 token 已经能解析出当前用户
- @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Long userId;
-
- @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
- private Long targetId;
-
- @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer type; // 枚举 ConversationTypeEnum TODO ,这里可以使用 @InEnum 校验,这样这个注释就不用写了
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java
new file mode 100755
index 0000000..cec9ad5
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
+
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 会话最后已读时间 Request VO")
+@Data
+public class ImConversationUpdateLastReadTimeReqVO {
+
+ @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00")
+ @NotNull(message = "最后已读时间不能为空")
+ private LocalDateTime lastReadTime;
+
+ @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ private Long targetId;
+
+ @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}")
+ private Integer type;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java
new file mode 100755
index 0000000..8c1e526
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
+
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 会话置顶 Request VO")
+@Data
+public class ImConversationUpdatePinnedReqVO {
+
+ @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "是否置顶不能为空")
+ private Boolean pinned;
+
+ @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ private Long targetId;
+
+ @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}")
+ private Integer type;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java
index 778b940..807093a 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java
@@ -25,8 +25,8 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO;
-import cn.iocoder.yudao.module.im.service.group.ImGroupService;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
+import cn.iocoder.yudao.module.im.service.group.GroupService;
// TODO @芋艿:得看看 create、update、delete、get、page 这几个接口,要保留哪些
@Tag(name = "管理后台 - 群")
@@ -36,20 +36,20 @@ import cn.iocoder.yudao.module.im.service.group.ImGroupService;
public class ImGroupController {
@Resource
- private ImGroupService imGroupService;
+ private GroupService groupService;
@PostMapping("/create")
@Operation(summary = "创建群")
@PreAuthorize("@ss.hasPermission('im:group:create')")
public CommonResult createGroup(@Valid @RequestBody ImGroupSaveReqVO createReqVO) {
- return success(imGroupService.createGroup(createReqVO));
+ return success(groupService.createGroup(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新群")
@PreAuthorize("@ss.hasPermission('im:group:update')")
public CommonResult updateGroup(@Valid @RequestBody ImGroupSaveReqVO updateReqVO) {
- imGroupService.updateGroup(updateReqVO);
+ groupService.updateGroup(updateReqVO);
return success(true);
}
@@ -58,7 +58,7 @@ public class ImGroupController {
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('im:group:delete')")
public CommonResult deleteGroup(@RequestParam("id") Long id) {
- imGroupService.deleteGroup(id);
+ groupService.deleteGroup(id);
return success(true);
}
@@ -67,7 +67,7 @@ public class ImGroupController {
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('im:group:query')")
public CommonResult getGroup(@RequestParam("id") Long id) {
- GroupDO group = imGroupService.getGroup(id);
+ ImGroupDO group = groupService.getGroup(id);
return success(BeanUtils.toBean(group, ImGroupRespVO.class));
}
@@ -75,22 +75,8 @@ public class ImGroupController {
@Operation(summary = "获得群分页")
@PreAuthorize("@ss.hasPermission('im:group:query')")
public CommonResult> getGroupPage(@Valid ImGroupPageReqVO pageReqVO) {
- PageResult pageResult = imGroupService.getGroupPage(pageReqVO);
+ PageResult pageResult = groupService.getGroupPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ImGroupRespVO.class));
}
- // TODO @anhaohao:导出可以先不做哈;
- @GetMapping("/export-excel")
- @Operation(summary = "导出群 Excel")
- @PreAuthorize("@ss.hasPermission('im:group:export')")
- @OperateLog(type = EXPORT)
- public void exportGroupExcel(@Valid ImGroupPageReqVO pageReqVO,
- HttpServletResponse response) throws IOException {
- pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
- List list = imGroupService.getGroupPage(pageReqVO).getList();
- // 导出 Excel
- ExcelUtils.write(response, "群.xls", "数据", ImGroupRespVO.class,
- BeanUtils.toBean(list, ImGroupRespVO.class));
- }
-
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java
index 285ea42..319031e 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java
@@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO;
import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -66,7 +66,7 @@ public class ImGroupMemberController {
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('im:group-member:query')")
public CommonResult getGroupMember(@RequestParam("id") Long id) {
- GroupMemberDO groupMember = groupMemberService.getGroupMember(id);
+ ImGroupMemberDO groupMember = groupMemberService.getGroupMember(id);
return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class));
}
@@ -74,7 +74,7 @@ public class ImGroupMemberController {
@Operation(summary = "获得群成员分页")
@PreAuthorize("@ss.hasPermission('im:group-member:query')")
public CommonResult> getGroupMemberPage(@Valid ImGroupMemberPageReqVO pageReqVO) {
- PageResult pageResult = groupMemberService.getGroupMemberPage(pageReqVO);
+ PageResult pageResult = groupMemberService.getGroupMemberPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ImGroupMemberRespVO.class));
}
@@ -85,7 +85,7 @@ public class ImGroupMemberController {
public void exportGroupMemberExcel(@Valid ImGroupMemberPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
- List list = groupMemberService.getGroupMemberPage(pageReqVO).getList();
+ List list = groupMemberService.getGroupMemberPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "群成员.xls", "数据", ImGroupMemberRespVO.class,
BeanUtils.toBean(list, ImGroupMemberRespVO.class));
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveMessageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveMessageReqVO.java
deleted file mode 100644
index 35691cb..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveMessageReqVO.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.inbox.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-// TODO @anhaohao:im 前缀哈
-@Schema(description = "管理后台 - 收件箱保存消息 Request VO")
-@Data
-public class InboxSaveMessageReqVO {
-
- @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer conversationType; // 对应 ImConversationTypeEnum 枚举
-
- @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long fromId; // 根据 conversationType 区分
-
- @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
- private String senderNickname;
-
- @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED)
- private String senderAvatar;
-
- @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
- private Long receiverId;
-
- @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
- private Long messageId;
-
- @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer contentType; // 参见 ImMessageTypeEnum 枚举
-
- @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
- private String content;
-
- @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime sendTime;
-
-// @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
-// private Long sequence;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSendMessageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSendMessageReqVO.java
deleted file mode 100644
index ae58c5e..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSendMessageReqVO.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.inbox.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 收件箱保存消息 Request VO")
-@Data
-public class InboxSendMessageReqVO {
-
- @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer conversationType; // 对应 ImConversationTypeEnum 枚举
-
- @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long fromId; // 根据 conversationType 区分
-
- @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
- private String senderNickname;
-
- @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED)
- private String senderAvatar;
-
- @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
- private Long receiverId;
-
- @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
- private Long messageId;
-
- @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer contentType; // 参见 ImMessageTypeEnum 枚举
-
- @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
- private String content;
-
- @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime sendTime;
-
- @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
- private Long sequence;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/package-info.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/package-info.java
new file mode 100644
index 0000000..2ec9086
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * @author anhaohao
+ * @since 2024/3/31 下午10:41
+ */
+package cn.iocoder.yudao.module.im.controller.admin.inbox.vo;
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
new file mode 100755
index 0000000..b246df0
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.im.controller.admin.message;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendRespVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
+import cn.iocoder.yudao.module.im.service.message.MessageService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - IM 消息")
+@RestController
+@RequestMapping("/im/message")
+@Validated
+public class ImMessageController {
+
+ @Resource
+ private MessageService messageService;
+
+ @PostMapping("/send")
+ @Operation(summary = "发送消息")
+ public CommonResult sendMessage(@Valid @RequestBody ImMessageSendReqVO imMessageSendReqVO) {
+ ImMessageDO message = messageService.sendMessage(getLoginUserId(), imMessageSendReqVO);
+ return success(BeanUtils.toBean(message, ImMessageSendRespVO.class));
+ }
+
+ @GetMapping("/pull")
+ @Operation(summary = "消息列表-拉取大于 sequence 的消息列表")
+ @Parameter(name = "sequence", description = "序号", required = true, example = "1")
+ @Parameter(name = "size", description = "条数", required = true, example = "10")
+ public CommonResult> pullMessageList(@RequestParam("sequence") Long sequence,
+ @RequestParam("size") Integer size) {
+ List messages = messageService.pullMessageList(getLoginUserId(), sequence, size);
+ return success(BeanUtils.toBean(messages, ImMessageRespVO.class));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "消息列表-根据接收人和发送时间进行分页查询")
+ public CommonResult> getMessageList(@Valid ImMessageListReqVO listReqVO) {
+ List messagePage = messageService.getMessageList(getLoginUserId(), listReqVO);
+ return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java
deleted file mode 100755
index 5923a93..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.message;
-
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
-import cn.iocoder.yudao.module.im.service.message.MessageService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - IM 消息")
-@RestController
-@RequestMapping("/im/message")
-@Validated
-public class MessageController {
-
- @Resource
- private MessageService messageService;
-
- @PostMapping("/send")
- @Operation(summary = "发送消息")
- public CommonResult sendMessage(@Valid @RequestBody SendMessageReqVO message) {
- return success(messageService.sendMessage(getLoginUserId(), message));
- }
-
- // TODO @anhaohao:我在想,这个接口,改成叫 pullMessageList,会不会更好理解?拉取消息列表
- @GetMapping("/list-by-sequence")
- @Operation(summary = "拉取大于 sequence 的消息列表")
- @Parameter(name = "sequence", description = "序号", required = true, example = "1")
- @Parameter(name = "size", description = "条数", required = true, example = "10")
- public CommonResult> getMessageListBySequence(@RequestParam("sequence") Long sequence,
- @RequestParam("size") Integer size) {
- List messages = messageService.getMessageListBySequence(getLoginUserId(), sequence, size);
- return success(BeanUtils.toBean(messages, MessageReqVO.class));
- }
-
- // TODO @anhaohao:直接叫 getMessageList,不叫历史哈;因为它只是给用户叫历史,对系统来说,就是消息列表
- @GetMapping("/history")
- @Operation(summary = "查询聊天记录-根据会话标志和发送时间进行分页查询")
- public CommonResult> getHistoryMessage(@Valid MessagePageReqVO pageReqVO) {
- //根据会话标志和发送时间进行分页查询
- List messagePage = messageService.getHistoryMessage(pageReqVO);
- return success(BeanUtils.toBean(messagePage, MessageReqVO.class));
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java
new file mode 100755
index 0000000..ee21ed0
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.im.controller.admin.message.vo;
+
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
+@Schema(description = "管理后台 - 消息列表 Request VO")
+@Data
+@ToString(callSuper = true)
+public class ImMessageListReqVO {
+
+ @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
+ @NotNull(message = "接收人编号不能为空")
+ private Long receiverId;
+
+ @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @InEnum(value = ImConversationTypeEnum.class,message = "会话类型必须是 {value}")
+ @NotNull(message = "会话类型不能为空")
+ private Integer conversationType;
+
+ @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+ private LocalDateTime sendTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java
new file mode 100755
index 0000000..10f0996
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java
@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.im.controller.admin.message.vo;
+
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 消息 Response VO")
+@Data
+public class ImMessageRespVO {
+
+ @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
+ private Long id;
+
+ @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @InEnum(value = ImConversationTypeEnum.class)
+ private Integer conversationType;
+
+ @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long senderId;
+
+ @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+ private String senderNickname;
+
+ @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://www.iocoder.cn/xxx.jpg")
+ private String senderAvatar;
+
+ @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ private Long receiverId;
+
+ @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @InEnum(value = ImMessageContentTypeEnum.class)
+ private Integer contentType;
+
+ @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好")
+ private String content;
+
+ @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00")
+ private LocalDateTime sendTime;
+
+ @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long sequence;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
new file mode 100755
index 0000000..fd04053
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.im.controller.admin.message.vo;
+
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 发送消息 Request VO")
+@Data
+public class ImMessageSendReqVO {
+
+ @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
+ @NotNull(message = "客户端消息编号不能为空")
+ private String clientMessageId;
+
+ @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
+ @NotNull(message = "接收人编号不能为空")
+ private Long receiverId;
+
+ @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @InEnum(value = ImConversationTypeEnum.class)
+ @NotNull(message = "会话类型不能为空")
+ private Integer conversationType;
+
+ @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @InEnum(ImMessageContentTypeEnum.class)
+ @NotNull(message = "消息类型不能为空")
+ private Integer contentType;
+
+ @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好")
+ @NotNull(message = "消息内容不能为空")
+ private String content;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendRespVO.java
new file mode 100755
index 0000000..188cddc
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendRespVO.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.im.controller.admin.message.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 发送消息 Response VO")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ImMessageSendRespVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
+ private Long id;
+
+ @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime sendTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java
deleted file mode 100755
index 2bac344..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.message.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-// TODO @anhaohao:这个类,不要交 Page,而是消息列表,MessageListReqVO
-@Schema(description = "管理后台 - 消息分页 Request VO")
-@Data
-@ToString(callSuper = true)
-public class MessagePageReqVO {
-
- // TODO @anhaohao:还是传递 targetId 和 conversationType,我们要弱化 no 的概念;
-
- @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "g_1000")
- private String conversationNo;
-
- // TODO @anhaohao:应该不传递时间范围,而是传递分页的时间,然后根据时间,查询消息
-
- @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] sendTime;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java
deleted file mode 100755
index 8dac88c..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.message.vo;
-
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-// TODO @anhaohao:MessageRespVO 消息响应 Response VO
-// TODO @anahaohao:每个 example 都写下;啊哈,漏了地方,要补下;因为 http mock 的时候,可以根据它去生成
-@Schema(description = "管理后台 - 消息 Request VO")
-@Data
-public class MessageReqVO {
-
- @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
- private Long id;
-
- @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer conversationType; // 对应 ImConversationTypeEnum 枚举
-
- // TODO @anhaohao:这个应该是 senderId
- @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long fromId; // 根据 conversationType 区分
-
- @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
- private String senderNickname;
-
- @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED)
- private String senderAvatar;
-
- @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
- private Long receiverId;
-
- @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer contentType; // 参见 ImMessageTypeEnum 枚举
-
- @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
- private String content;
-
- @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime sendTime;
-
- @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
- private Long sequence;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageReqVO.java
deleted file mode 100755
index 15f6e90..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageReqVO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.message.vo;
-
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-// TODO @anhaohao:MessageSendReqVO,消息发送
-
-// TODO @anhaohao:不应该有 excel 相关的注解
-
-@Schema(description = "管理后台 - 发送消息 Request VO")
-@Data
-@ExcelIgnoreUnannotated
-public class SendMessageReqVO {
-
- @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
- @ExcelProperty("客户端消息编号 uuid,用于排重")
- private String clientMessageId;
-
- @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
- @ExcelProperty("接收人编号")
- private Long receiverId;
-
- @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
- @ExcelProperty("会话类型")
- private Integer conversationType;
-
- @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @ExcelProperty("消息类型")
- @InEnum(MessageContentTypeEnum.class)
- private Integer contentType;
-
- @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
- @ExcelProperty("消息内容")
- private String content;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageRespVO.java
deleted file mode 100755
index 534cf25..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageRespVO.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package cn.iocoder.yudao.module.im.controller.admin.message.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-// TODO @anhaohao:MessageSendRespVO,消息发送结果
-
-@Schema(description = "管理后台 - 发送消息 Response VO")
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class SendMessageRespVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
- private Long id;
-
- @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime sendTime;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java
deleted file mode 100755
index 4342179..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.dataobject.conversation;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-// TODO @anhaohao:还是有 IM 前缀哈
-/**
- * IM 会话 DO
- *
- * @author 芋道源码
- */
-@TableName("im_conversation")
-@KeySequence("im_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class ConversationDO extends BaseDO {
-
- /**
- * 编号
- */
- @TableId
- private Long id;
-
- /**
- * 所属用户
- */
- private Long userId;
-
- /**
- * 会话类型
- *
- * 枚举 {@link ConversationTypeEnum}
- */
- private Integer type;
- /**
- * 聊天对象编号
- *
- * 1. 单聊时,用户编号;
- * 2. 群聊时,群编号
- */
- private Long targetId;
- /**
- * 会话标志
- *
- * 1. 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId
- * 2. 群聊:g_groupId
- */
- private String no;
- /**
- * 是否置顶
- */
- private Boolean pinned;
- /**
- * 最后已读时间
- */
- private LocalDateTime lastReadTime;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java
new file mode 100755
index 0000000..273b99a
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java
@@ -0,0 +1,67 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.conversation;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * IM 会话 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("im_conversation")
+@KeySequence("im_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ImConversationDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+
+ /**
+ * 所属用户
+ */
+ private Long userId;
+
+ /**
+ * 会话类型
+ *
+ * 枚举 {@link ImConversationTypeEnum}
+ */
+ private Integer type;
+ /**
+ * 聊天对象编号
+ *
+ * 1. 单聊时,用户编号;
+ * 2. 群聊时,群编号
+ */
+ private Long targetId;
+ /**
+ * 会话标志
+ *
+ * 1. 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId
+ * 2. 群聊:g_groupId
+ */
+ private String no;
+ /**
+ * 是否置顶
+ */
+ private Boolean pinned;
+ /**
+ * 最后已读时间
+ */
+ private LocalDateTime lastReadTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupDO.java
deleted file mode 100644
index 8f84693..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupDO.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.dataobject.group;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-// TODO @anhaohao:还是要有 IM
-/**
- * IM 群信息 DO
- *
- * @author 芋道源码
- */
-@TableName("im_group")
-@KeySequence("im_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class GroupDO extends BaseDO {
-
- /**
- * 编号
- */
- @TableId
- private Long id;
- // TODO @hao:name,如果这个表已经是 group 了,不用在带额外的
- /**
- * 群名字
- */
- private String groupName;
- // TODO @hao:关联字段;
- /**
- * 群主编号
- */
- private Long ownerId;
- // TODO @hao:头像使用 avatar 好了,整个项目统一;然后 Thumb 是不是不用存,这个更多是文件服务做裁剪
- /**
- * 群头像
- */
- private String headImage;
- /**
- * 群头像缩略图
- */
- private String headImageThumb;
- /**
- * 群公告
- */
- private String notice;
- /**
- * 群备注
- */
- private String remark;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupMemberDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupMemberDO.java
deleted file mode 100644
index 87db7ec..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupMemberDO.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.dataobject.group;
-
-import lombok.*;
-import com.baomidou.mybatisplus.annotation.*;
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-
-// TODO @anhaohao:还是要有 IM
-/**
- * IM 群成员 DO
- *
- * @author 芋道源码
- */
-@TableName("im_group_member")
-@KeySequence("im_group_member_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class GroupMemberDO extends BaseDO {
-
- /**
- * 编号
- */
- @TableId
- private Long id;
- // TODO @hao:groupId 和 userId 都写下关联字段哈
- /**
- * 群编号
- */
- private Long groupId;
- /**
- * 用户编号
- */
- private Long userId;
- // TODO @hao:nickname 和 avatar 是不是不用存储哈;
- /**
- * 昵称
- */
- private String nickname;
- /**
- * 头像
- */
- private String avatar;
- /**
- * 组内显示名称
- */
- private String aliasName;
- /**
- * 备注
- */
- private String remark;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java
new file mode 100644
index 0000000..727f1aa
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.group;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * IM 群信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("im_group")
+@KeySequence("im_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ImGroupDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ // TODO @hao:name,如果这个表已经是 group 了,不用在带额外的
+ /**
+ * 群名字
+ */
+ private String groupName;
+ // TODO @hao:关联字段;
+ /**
+ * 群主编号
+ */
+ private Long ownerId;
+ // TODO @hao:头像使用 avatar 好了,整个项目统一;然后 Thumb 是不是不用存,这个更多是文件服务做裁剪
+ /**
+ * 群头像
+ */
+ private String headImage;
+ /**
+ * 群头像缩略图
+ */
+ private String headImageThumb;
+ /**
+ * 群公告
+ */
+ private String notice;
+ /**
+ * 群备注
+ */
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java
new file mode 100644
index 0000000..6d7ada1
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java
@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.group;
+
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * IM 群成员 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("im_group_member")
+@KeySequence("im_group_member_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ImGroupMemberDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ // TODO @hao:groupId 和 userId 都写下关联字段哈
+ /**
+ * 群编号
+ */
+ private Long groupId;
+ /**
+ * 用户编号
+ */
+ private Long userId;
+ // TODO @hao:nickname 和 avatar 是不是不用存储哈;
+ /**
+ * 昵称
+ */
+ private String nickname;
+ /**
+ * 头像
+ */
+ private String avatar;
+ /**
+ * 组内显示名称
+ */
+ private String aliasName;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java
new file mode 100755
index 0000000..bea1f44
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.inbox;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+// TODO 我们要不要改成 ImMessageQueue 队列?从理解上,概念上,可能都更清晰一点哈。每个用户一个消息队列;
+
+/**
+ * IM 收件箱 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("im_inbox")
+@KeySequence("im_inbox_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ImInboxDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 用户编号
+ *
+ * 关联 {@link ImMessageDO#getSenderId()} 或者 {@link ImMessageDO#getReceiverId()}
+ */
+ private Long userId;
+ /**
+ * 消息编号
+ *
+ * 关联 {@link ImMessageDO#getId()}
+ */
+ private Long messageId;
+ /**
+ * 序号,按照 user 递增
+ */
+ private Long sequence;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java
deleted file mode 100755
index 11b8c09..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.dataobject.inbox;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-// TODO @anhaohao:还是要有 IM
-// TODO 我们要不要改成 ImMessageQueue 队列?从理解上,概念上,可能都更清晰一点哈。每个用户一个消息队列;
-/**
- * IM 收件箱 DO
- *
- * @author 芋道源码
- */
-@TableName("im_inbox")
-@KeySequence("im_inbox_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class InboxDO extends BaseDO {
-
- /**
- * 编号
- */
- @TableId
- private Long id;
- /**
- * 用户编号
- *
- * TODO @hao:写下 userId 和 messageId 的关联字段
- */
- private Long userId;
- /**
- * 消息编号
- *
- * 关联 {@link MessageDO#getId()}
- */
- private Long messageId;
- /**
- * 序号,按照 user 递增
- */
- private Long sequence;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java
new file mode 100755
index 0000000..93b4acf
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java
@@ -0,0 +1,100 @@
+package cn.iocoder.yudao.module.im.dal.dataobject.message;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum;
+import cn.iocoder.yudao.module.im.enums.message.ImMessageSourceEnum;
+import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * IM 消息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("im_message")
+@KeySequence("im_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ImMessageDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 客户端消息编号 uuid,用于排重
+ */
+ private String clientMessageId;
+ /**
+ * 发送人编号 存储的是用户编号
+ */
+ private Long senderId;
+ /**
+ * 接收人编号
+ *
+ * 1. 单聊时,用户编号;群聊时,群编号
+ */
+ private Long receiverId;
+ /**
+ * 消息发送者昵称
+ *
+ * 冗余 AdminUserDO 的 nickname 字段
+ */
+ private String senderNickname;
+ /**
+ * 消息发送者头像
+ *
+ * 冗余 AdminUserDO 的 avatar 字段
+ */
+ private String senderAvatar;
+ /**
+ * 会话类型 枚举 {@link ImConversationTypeEnum}
+ */
+ private Integer conversationType;
+ /**
+ * 会话标志
+ *
+ * 生成规则:{@link ImConversationTypeEnum#generateConversationNo(Long, Long, Integer)} 方法
+ */
+ private String conversationNo;
+ /**
+ * 消息类型
+ *
+ * 枚举 {@link ImMessageContentTypeEnum}
+ */
+ private Integer contentType;
+ /**
+ * 消息内容
+ *
+ * JSON 格式 对应 dal/dataobject/message/content 包
+ */
+ private String content;
+ /**
+ * 发送时间
+ */
+ private LocalDateTime sendTime;
+ /**
+ * 消息来源
+ *
+ * 枚举 {@link ImMessageSourceEnum}
+ */
+ private Integer sendFrom;
+ /**
+ * 消息状态
+ *
+ * 枚举 {@link ImMessageStatusEnum}
+ */
+ private Integer messageStatus;
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java
deleted file mode 100755
index d6b3f67..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.dataobject.message;
-
-import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
-import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageSourceEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageStatusEnum;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-// TODO @anhaohao:还是要有 IM
-/**
- * IM 消息 DO
- *
- * @author 芋道源码
- */
-@TableName("im_message")
-@KeySequence("im_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class MessageDO extends BaseDO {
-
- /**
- * 编号
- */
- @TableId
- private Long id;
- /**
- * 客户端消息编号 uuid,用于排重
- */
- private String clientMessageId;
- /**
- * 发送人编号 存储的是用户编号
- */
- private Long senderId;
- /**
- * 接收人编号
- *
- * 1. 单聊时,用户编号;群聊时,群编号
- */
- private Long receiverId;
- /**
- * 消息发送者昵称
- *
- * 冗余 AdminUserDO 的 nickname 字段
- */
- private String senderNickname;
- /**
- * 消息发送者头像
- *
- * 冗余 AdminUserDO 的 avatar 字段
- */
- private String senderAvatar;
- /**
- * 会话类型 枚举 {@link ConversationTypeEnum}
- */
- private Integer conversationType;
- /**
- * 会话标志
- *
- * 生成规则:{@link ConversationTypeEnum#generateConversationNo(Long, Long, Integer)} 方法
- */
- private String conversationNo;
- /**
- * 消息类型
- *
- * 枚举 {@link MessageContentTypeEnum}
- */
- private Integer contentType;
- /**
- * 消息内容
- *
- * JSON 格式 对应 dal/dataobject/message/content 包
- */
- private String content;
- /**
- * 发送时间
- */
- private LocalDateTime sendTime;
- /**
- * 消息来源
- *
- * 枚举 {@link MessageSourceEnum}
- */
- private Integer sendFrom;
- /**
- * 消息状态
- *
- * 枚举 {@link MessageStatusEnum}
- */
- private Integer messageStatus;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/AudioMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/AudioMessage.java
index 9258ce7..e6f6cfb 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/AudioMessage.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/AudioMessage.java
@@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -8,7 +8,7 @@ import lombok.NoArgsConstructor;
// TODO @anhaohao:要有 IM;
// TODO @芋艿:后续要挪到 api 包下,主要是给外部接口使用
/**
- * 语音消息的 {@link MessageDO 字段 content} 的内容
+ * 语音消息的 {@link ImMessageDO 字段 content} 的内容
*
* @author 芋道源码
*/
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/CardMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/CardMessage.java
index 3eff9bf..4199f79 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/CardMessage.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/CardMessage.java
@@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- * 名片消息的 {@link MessageDO 字段 content} 的内容
+ * 名片消息的 {@link ImMessageDO 字段 content} 的内容
*
* @author anhaohao
* @since 2024/3/23 下午5:53
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/FileMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/FileMessage.java
index 2dd2b6b..0cb112e 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/FileMessage.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/FileMessage.java
@@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- * 文件消息的 {@link MessageDO 字段 content} 的内容
+ * 文件消息的 {@link ImMessageDO 字段 content} 的内容
*
* @author 芋道源码
*/
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/ImageMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/ImageMessage.java
index cfdfcb1..2cd0dfb 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/ImageMessage.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/ImageMessage.java
@@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- * 图片消息的 {@link MessageDO 字段 content} 的内容
+ * 图片消息的 {@link ImMessageDO 字段 content} 的内容
*
* @author 芋道源码
*/
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/LocationMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/LocationMessage.java
index a95c2d8..439b18f 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/LocationMessage.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/LocationMessage.java
@@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- * 地址位置消息的 {@link MessageDO 字段 content} 的内容
+ * 地址位置消息的 {@link ImMessageDO 字段 content} 的内容
*
* @author 芋道源码
*/
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/TextMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/TextMessage.java
index b7f13a4..35edfff 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/TextMessage.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/TextMessage.java
@@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- * 文本消息的 {@link MessageDO 字段 content} 的内容
+ * 文本消息的 {@link ImMessageDO 字段 content} 的内容
*
* @author 芋道源码
*/
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/VideoMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/VideoMessage.java
index e757e50..166954c 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/VideoMessage.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/VideoMessage.java
@@ -1,10 +1,10 @@
package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import lombok.Data;
/**
- * 视频消息的 {@link MessageDO 字段 content} 的内容
+ * 视频消息的 {@link ImMessageDO 字段 content} 的内容
*
* @author 芋道源码
*/
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java
index 0121470..ed6fe15 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java
@@ -1,8 +1,7 @@
package cn.iocoder.yudao.module.im.dal.mysql.conversation;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
import org.apache.ibatis.annotations.Mapper;
/**
@@ -11,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper;
* @author 芋道源码
*/
@Mapper
-public interface ConversationMapper extends BaseMapperX {
+public interface ConversationMapper extends BaseMapperX {
- default ConversationDO selectByNo(String no){
- return selectOne(ConversationDO::getNo, no);
+ default ImConversationDO selectByNo(String no){
+ return selectOne(ImConversationDO::getNo, no);
}
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/GroupMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/GroupMapper.java
new file mode 100644
index 0000000..1e01de4
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/GroupMapper.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.im.dal.mysql.group;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
+
+/**
+ * 群 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface GroupMapper extends BaseMapperX {
+
+ default PageResult selectPage(ImGroupPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(ImGroupDO::getGroupName, reqVO.getGroupName())
+ .eqIfPresent(ImGroupDO::getOwnerId, reqVO.getOwnerId())
+ .eqIfPresent(ImGroupDO::getHeadImage, reqVO.getHeadImage())
+ .eqIfPresent(ImGroupDO::getHeadImageThumb, reqVO.getHeadImageThumb())
+ .eqIfPresent(ImGroupDO::getNotice, reqVO.getNotice())
+ .eqIfPresent(ImGroupDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ImGroupDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ImGroupDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMapper.java
deleted file mode 100644
index 6049550..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.mysql.group;
-
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO;
-import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
-
-/**
- * 群 Mapper
- *
- * @author 芋道源码
- */
-@Mapper
-public interface ImGroupMapper extends BaseMapperX {
-
- default PageResult selectPage(ImGroupPageReqVO reqVO) {
- return selectPage(reqVO, new LambdaQueryWrapperX()
- .likeIfPresent(GroupDO::getGroupName, reqVO.getGroupName())
- .eqIfPresent(GroupDO::getOwnerId, reqVO.getOwnerId())
- .eqIfPresent(GroupDO::getHeadImage, reqVO.getHeadImage())
- .eqIfPresent(GroupDO::getHeadImageThumb, reqVO.getHeadImageThumb())
- .eqIfPresent(GroupDO::getNotice, reqVO.getNotice())
- .eqIfPresent(GroupDO::getRemark, reqVO.getRemark())
- .betweenIfPresent(GroupDO::getCreateTime, reqVO.getCreateTime())
- .orderByDesc(GroupDO::getId));
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/GroupMemberMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/GroupMemberMapper.java
new file mode 100644
index 0000000..1ebf494
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/GroupMemberMapper.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.im.dal.mysql.groupmember;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 群成员 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface GroupMemberMapper extends BaseMapperX {
+
+ default PageResult selectPage(ImGroupMemberPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ImGroupMemberDO::getGroupId, reqVO.getGroupId())
+ .eqIfPresent(ImGroupMemberDO::getUserId, reqVO.getUserId())
+ .likeIfPresent(ImGroupMemberDO::getNickname, reqVO.getNickname())
+ .eqIfPresent(ImGroupMemberDO::getAvatar, reqVO.getAvatar())
+ .likeIfPresent(ImGroupMemberDO::getAliasName, reqVO.getAliasName())
+ .eqIfPresent(ImGroupMemberDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ImGroupMemberDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ImGroupMemberDO::getId));
+ }
+
+ default List selectListByGroupId(Long groupId) {
+ return selectList(new LambdaQueryWrapperX().eq(ImGroupMemberDO::getGroupId, groupId));
+ }
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java
deleted file mode 100644
index 505459a..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.mysql.groupmember;
-
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-/**
- * 群成员 Mapper
- *
- * @author 芋道源码
- */
-@Mapper
-public interface ImGroupMemberMapper extends BaseMapperX {
-
- default PageResult selectPage(ImGroupMemberPageReqVO reqVO) {
- return selectPage(reqVO, new LambdaQueryWrapperX()
- .eqIfPresent(GroupMemberDO::getGroupId, reqVO.getGroupId())
- .eqIfPresent(GroupMemberDO::getUserId, reqVO.getUserId())
- .likeIfPresent(GroupMemberDO::getNickname, reqVO.getNickname())
- .eqIfPresent(GroupMemberDO::getAvatar, reqVO.getAvatar())
- .likeIfPresent(GroupMemberDO::getAliasName, reqVO.getAliasName())
- .eqIfPresent(GroupMemberDO::getRemark, reqVO.getRemark())
- .betweenIfPresent(GroupMemberDO::getCreateTime, reqVO.getCreateTime())
- .orderByDesc(GroupMemberDO::getId));
- }
-
- default List selectListByGroupId(Long groupId) {
- return selectList(new LambdaQueryWrapperX().eq(GroupMemberDO::getGroupId, groupId));
- }
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java
index 73921fc..0f5ff07 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.inbox;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@@ -13,27 +13,14 @@ import java.util.List;
* @author 芋道源码
*/
@Mapper
-public interface InboxMapper extends BaseMapperX {
+public interface InboxMapper extends BaseMapperX {
- // TODO @anhaohao:返回 List ,转换成 messageId 交给上层;dao 尽量通用
- default List selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) {
- return selectList(new LambdaQueryWrapperX()
- .gt(InboxDO::getUserId, userId)
- .gt(InboxDO::getSequence, sequence)
- .orderByAsc(InboxDO::getSequence)
- .last("limit 0," + size)) // TODO @anhaohao:这里 limit 就可以了,不用从 limit 0 开始;
- .stream()
- .map(InboxDO::getMessageId)
- .toList();
+ default List selectListByUserIdAndSequence(Long userId, Long sequence, Integer size) {
+ return selectList(new LambdaQueryWrapperX()
+ .gt(ImInboxDO::getUserId, userId)
+ .gt(ImInboxDO::getSequence, sequence)
+ .orderByAsc(ImInboxDO::getSequence)
+ .last("LIMIT " + size));
}
-// default PageResult selectPage(ImInboxPageReqVO reqVO) {
-// return selectPage(reqVO, new LambdaQueryWrapperX()
-// .eqIfPresent(InboxDO::getUserId, reqVO.getUserId())
-// .eqIfPresent(InboxDO::getMessageId, reqVO.getMessageId())
-// .eqIfPresent(InboxDO::getSequence, reqVO.getSequence())
-// .betweenIfPresent(InboxDO::getCreateTime, reqVO.getCreateTime())
-// .orderByDesc(InboxDO::getId));
-// }
-
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java
index bd99fb6..a90b63e 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java
@@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.message;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@@ -16,13 +13,12 @@ import java.util.List;
* @author 芋道源码
*/
@Mapper
-public interface MessageMapper extends BaseMapperX {
+public interface MessageMapper extends BaseMapperX {
- default List getHistoryMessage(MessagePageReqVO pageReqVO) {
- return selectList(new LambdaQueryWrapperX()
- .eqIfPresent(MessageDO::getConversationNo, pageReqVO.getConversationNo())
- .betweenIfPresent(MessageDO::getSendTime, pageReqVO.getSendTime())
- .orderByAsc(MessageDO::getSendTime));
+ default List selectMessageList(ImMessageDO message) {
+ return selectList(new LambdaQueryWrapperX()
+ .eqIfPresent(ImMessageDO::getConversationNo, message.getConversationNo())
+ .eqIfPresent(ImMessageDO::getSendTime, message.getSendTime())
+ .orderByAsc(ImMessageDO::getSendTime));
}
-
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDAO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDAO.java
new file mode 100644
index 0000000..e3bd8fd
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDAO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.im.dal.redis.inbox;
+
+import jakarta.annotation.Resource;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Repository;
+
+import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUENCE;
+
+// TODO @芋艿:这个名字,需要在考虑下;
+
+/**
+ * 序号生成器 Redis DAO
+ *
+ * @author anhaohao
+ */
+@Repository
+public class SequenceRedisDAO {
+
+ @Resource
+ private RedisTemplate redisTemplate;
+
+ private static String formatKey(Long userId) {
+ return String.format(INBOX_SEQUENCE, userId);
+ }
+
+ /**
+ * 生成序号
+ *
+ * @param userId 用户编号
+ * @return 序号
+ */
+ public Long generateSequence(Long userId) {
+ return redisTemplate.opsForValue().increment(formatKey(userId), 1);
+ }
+
+}
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDao.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDao.java
deleted file mode 100644
index ddbab25..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDao.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package cn.iocoder.yudao.module.im.dal.redis.inbox;
-
-import jakarta.annotation.Resource;
-import org.redisson.api.RedissonClient;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.stereotype.Repository;
-
-import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUENCE;
-
-// TODO @芋艿:这个名字,需要在考虑下;
-
-/**
- * 序号生成器 Redis DAO
- *
- * @author anhaohao
- */
-@Repository
-public class SequenceRedisDao {
-
- @Resource
- private RedisTemplate redisTemplate;
-
- private static String formatKey(Long userId) {
- return String.format(INBOX_SEQUENCE, userId);
- }
-
- /**
- * 生成序号
- *
- * @param userId 用户编号
- * @return 序号
- */
- public Long generateSequence(Long userId) {
- return redisTemplate.opsForValue().increment(formatKey(userId), 1);
- }
-
-}
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java
index 200ae69..e76a793 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java
@@ -1,8 +1,8 @@
package cn.iocoder.yudao.module.im.service.conversation;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO;
+import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
import java.util.List;
@@ -18,20 +18,22 @@ public interface ConversationService {
*
* @return 会话列表
*/
- List getConversationList();
+ List getConversationList();
/**
* 置顶会话
*
+ * @param loginUserId 登录用户编号
* @param updateReqVO 更新信息
*/
- void updatePinned(ConversationPinnedReqVO updateReqVO);
+ void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO);
/**
* 更新最后已读时间
*
+ * @param loginUserId 登录用户编号
* @param updateReqVO 更新信息
*/
- void updateLastReadTime(ConversationLastTimeReqVO updateReqVO);
+ void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO);
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java
index 14c498a..49fd8b9 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java
@@ -1,10 +1,10 @@
package cn.iocoder.yudao.module.im.service.conversation;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO;
+import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
import cn.iocoder.yudao.module.im.service.inbox.InboxService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -27,50 +27,50 @@ public class ConversationServiceImpl implements ConversationService {
private InboxService inboxService;
@Override
- public List getConversationList() {
+ public List getConversationList() {
return conversationMapper.selectList();
}
@Override
- public void updatePinned(ConversationPinnedReqVO updateReqVO) {
- // TODO @hao:updateTop 和 updateLastReadTime 使用独立的逻辑实现,不使用统一的 ImConversationSaveReqVO;
- // TODO 大体步骤建议:
- // 1. 先 getOrderCreateConversation,查询会话,不存在则插入;
- // 2. 更新对应的字段
- // 3. 做对应更新的 notify 推送
- ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo());
+ public void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO) {
+ // 1. 获得会话编号
+ String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
+ // 2. 查询会话
+ ImConversationDO conversation = conversationMapper.selectByNo(no);
if (conversation == null) {
- ConversationDO conversationDO = new ConversationDO();
- // TODO @hao:no 不是前端传递哈,后端生成;另外,其实可以把 insert 写成一个公用方法;get会话,拿不到就 insert;接着处理 update 操作;首次多 update 一次,无所谓的;没多少量的
- conversationDO.setNo(updateReqVO.getNo());
- conversationDO.setPinned(updateReqVO.getPinned());
- conversationDO.setUserId(updateReqVO.getUserId());
- conversationDO.setTargetId(updateReqVO.getTargetId());
- conversationDO.setType(updateReqVO.getType());
- conversationMapper.insert(conversationDO);
- } else {
- // 更新 TODO @anhaohao:这里不要 toBean,因为这里逻辑偏 toc,new ConversationDO 对象,然后逐个 set 需要的值;
- ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class);
- conversationMapper.updateById(updateObj);
+ // 2.1. 不存在,则插入
+ conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
}
+ // 3. 更新会话
+ conversation.setPinned(updateReqVO.getPinned());
+ conversationMapper.updateById(conversation);
+ // 4. 做对应更新的 notify 推送
+ }
+
+ private ImConversationDO insertConversation(String no, Long userId, Long targetId, Integer type) {
+ ImConversationDO imConversationDO = new ImConversationDO();
+ imConversationDO.setNo(no);
+ imConversationDO.setUserId(userId);
+ imConversationDO.setTargetId(targetId);
+ imConversationDO.setType(type);
+ conversationMapper.insert(imConversationDO);
+ return imConversationDO;
}
@Override
- public void updateLastReadTime(ConversationLastTimeReqVO updateReqVO) {
- ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo());
+ public void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO) {
+ // 1. 获得会话编号
+ String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
+ // 2. 查询会话
+ ImConversationDO conversation = conversationMapper.selectByNo(no);
if (conversation == null) {
- ConversationDO conversationDO = new ConversationDO();
- conversationDO.setNo(updateReqVO.getNo());
- conversationDO.setLastReadTime(updateReqVO.getLastReadTime());
- conversationDO.setUserId(updateReqVO.getUserId());
- conversationDO.setTargetId(updateReqVO.getTargetId());
- conversationDO.setType(updateReqVO.getType());
- conversationMapper.insert(conversationDO);
- } else {
- // 更新
- ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class);
- conversationMapper.updateById(updateObj);
+ // 2.1. 不存在,则插入
+ conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
}
+ // 3. 更新会话
+ conversation.setLastReadTime(updateReqVO.getLastReadTime());
+ conversationMapper.updateById(conversation);
+ // 4. 做对应更新的 notify 推送
}
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupService.java
new file mode 100644
index 0000000..233af02
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupService.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.im.service.group;
+
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+/**
+ * 群 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface GroupService {
+
+ /**
+ * 创建群
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createGroup(@Valid ImGroupSaveReqVO createReqVO);
+
+ /**
+ * 更新群
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateGroup(@Valid ImGroupSaveReqVO updateReqVO);
+
+ /**
+ * 删除群
+ *
+ * @param id 编号
+ */
+ void deleteGroup(Long id);
+
+ /**
+ * 获得群
+ *
+ * @param id 编号
+ * @return 群
+ */
+ ImGroupDO getGroup(Long id);
+
+ /**
+ * 获得群分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 群分页
+ */
+ PageResult getGroupPage(ImGroupPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupServiceImpl.java
new file mode 100644
index 0000000..13d5c52
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupServiceImpl.java
@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.im.service.group;
+
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.im.dal.mysql.group.GroupMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
+
+/**
+ * 群 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class GroupServiceImpl implements GroupService {
+
+ @Resource
+ private GroupMapper groupMapper;
+
+ @Override
+ public Long createGroup(ImGroupSaveReqVO createReqVO) {
+ // 插入
+ ImGroupDO group = BeanUtils.toBean(createReqVO, ImGroupDO.class);
+ groupMapper.insert(group);
+ // 返回
+ return group.getId();
+ }
+
+ @Override
+ public void updateGroup(ImGroupSaveReqVO updateReqVO) {
+ // 校验存在
+ validateGroupExists(updateReqVO.getId());
+ // 更新
+ ImGroupDO updateObj = BeanUtils.toBean(updateReqVO, ImGroupDO.class);
+ groupMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteGroup(Long id) {
+ // 校验存在
+ validateGroupExists(id);
+ // 删除
+ groupMapper.deleteById(id);
+ }
+
+ private void validateGroupExists(Long id) {
+ if (groupMapper.selectById(id) == null) {
+ throw exception(GROUP_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public ImGroupDO getGroup(Long id) {
+ return groupMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getGroupPage(ImGroupPageReqVO pageReqVO) {
+ return groupMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupService.java
deleted file mode 100644
index cd395b8..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package cn.iocoder.yudao.module.im.service.group;
-
-import jakarta.validation.*;
-import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-
-/**
- * 群 Service 接口
- *
- * @author 芋道源码
- */
-public interface ImGroupService {
-
- /**
- * 创建群
- *
- * @param createReqVO 创建信息
- * @return 编号
- */
- Long createGroup(@Valid ImGroupSaveReqVO createReqVO);
-
- /**
- * 更新群
- *
- * @param updateReqVO 更新信息
- */
- void updateGroup(@Valid ImGroupSaveReqVO updateReqVO);
-
- /**
- * 删除群
- *
- * @param id 编号
- */
- void deleteGroup(Long id);
-
- /**
- * 获得群
- *
- * @param id 编号
- * @return 群
- */
- GroupDO getGroup(Long id);
-
- /**
- * 获得群分页
- *
- * @param pageReqVO 分页查询
- * @return 群分页
- */
- PageResult getGroupPage(ImGroupPageReqVO pageReqVO);
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java
deleted file mode 100644
index 5cc2e1b..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package cn.iocoder.yudao.module.im.service.group;
-
-import org.springframework.stereotype.Service;
-import jakarta.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-
-import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-
-import cn.iocoder.yudao.module.im.dal.mysql.group.ImGroupMapper;
-
-import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
-
-/**
- * 群 Service 实现类
- *
- * @author 芋道源码
- */
-@Service
-@Validated
-public class ImGroupServiceImpl implements ImGroupService {
-
- @Resource
- private ImGroupMapper imGroupMapper;
-
- @Override
- public Long createGroup(ImGroupSaveReqVO createReqVO) {
- // 插入
- GroupDO group = BeanUtils.toBean(createReqVO, GroupDO.class);
- imGroupMapper.insert(group);
- // 返回
- return group.getId();
- }
-
- @Override
- public void updateGroup(ImGroupSaveReqVO updateReqVO) {
- // 校验存在
- validateGroupExists(updateReqVO.getId());
- // 更新
- GroupDO updateObj = BeanUtils.toBean(updateReqVO, GroupDO.class);
- imGroupMapper.updateById(updateObj);
- }
-
- @Override
- public void deleteGroup(Long id) {
- // 校验存在
- validateGroupExists(id);
- // 删除
- imGroupMapper.deleteById(id);
- }
-
- private void validateGroupExists(Long id) {
- if (imGroupMapper.selectById(id) == null) {
- throw exception(GROUP_NOT_EXISTS);
- }
- }
-
- @Override
- public GroupDO getGroup(Long id) {
- return imGroupMapper.selectById(id);
- }
-
- @Override
- public PageResult getGroupPage(ImGroupPageReqVO pageReqVO) {
- return imGroupMapper.selectPage(pageReqVO);
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java
index e003a23..3188c2e 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.service.groupmember;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
import jakarta.validation.Valid;
import java.util.List;
@@ -43,7 +43,7 @@ public interface GroupMemberService {
* @param id 编号
* @return 群成员
*/
- GroupMemberDO getGroupMember(Long id);
+ ImGroupMemberDO getGroupMember(Long id);
/**
* 获得群成员分页
@@ -51,7 +51,7 @@ public interface GroupMemberService {
* @param pageReqVO 分页查询
* @return 群成员分页
*/
- PageResult getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO);
+ PageResult getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO);
/**
* 根据群组id查询群成员
@@ -59,5 +59,5 @@ public interface GroupMemberService {
* @param groupId 群组id
* @return 群成员列表
*/
- List selectByGroupId(Long groupId);
+ List selectByGroupId(Long groupId);
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java
index def3400..43df1b9 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java
@@ -5,11 +5,11 @@ import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.*;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.im.dal.mysql.groupmember.ImGroupMemberMapper;
+import cn.iocoder.yudao.module.im.dal.mysql.groupmember.GroupMemberMapper;
import java.util.List;
@@ -26,13 +26,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
public class GroupMemberServiceImpl implements GroupMemberService {
@Resource
- private ImGroupMemberMapper imGroupMemberMapper;
+ private GroupMemberMapper groupMemberMapper;
@Override
public Long createGroupMember(ImGroupMemberSaveReqVO createReqVO) {
// 插入
- GroupMemberDO groupMember = BeanUtils.toBean(createReqVO, GroupMemberDO.class);
- imGroupMemberMapper.insert(groupMember);
+ ImGroupMemberDO groupMember = BeanUtils.toBean(createReqVO, ImGroupMemberDO.class);
+ groupMemberMapper.insert(groupMember);
// 返回
return groupMember.getId();
}
@@ -42,8 +42,8 @@ public class GroupMemberServiceImpl implements GroupMemberService {
// 校验存在
validateGroupMemberExists(updateReqVO.getId());
// 更新
- GroupMemberDO updateObj = BeanUtils.toBean(updateReqVO, GroupMemberDO.class);
- imGroupMemberMapper.updateById(updateObj);
+ ImGroupMemberDO updateObj = BeanUtils.toBean(updateReqVO, ImGroupMemberDO.class);
+ groupMemberMapper.updateById(updateObj);
}
@Override
@@ -51,28 +51,28 @@ public class GroupMemberServiceImpl implements GroupMemberService {
// 校验存在
validateGroupMemberExists(id);
// 删除
- imGroupMemberMapper.deleteById(id);
+ groupMemberMapper.deleteById(id);
}
private void validateGroupMemberExists(Long id) {
- if (imGroupMemberMapper.selectById(id) == null) {
+ if (groupMemberMapper.selectById(id) == null) {
throw exception(GROUP_MEMBER_NOT_EXISTS);
}
}
@Override
- public GroupMemberDO getGroupMember(Long id) {
- return imGroupMemberMapper.selectById(id);
+ public ImGroupMemberDO getGroupMember(Long id) {
+ return groupMemberMapper.selectById(id);
}
@Override
- public PageResult getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO) {
- return imGroupMemberMapper.selectPage(pageReqVO);
+ public PageResult getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO) {
+ return groupMemberMapper.selectPage(pageReqVO);
}
@Override
- public List selectByGroupId(Long groupId) {
- return imGroupMemberMapper.selectListByGroupId(groupId);
+ public List selectByGroupId(Long groupId) {
+ return groupMemberMapper.selectListByGroupId(groupId);
}
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java
index e03db63..97b6b63 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java
@@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.im.service.inbox;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import java.util.List;
@@ -14,9 +14,9 @@ public interface InboxService {
/**
* 保存收件箱和发送消息
*
- * @param inboxSaveMessageReqVO 收件箱保存消息 Request VO
+ * @param imMessageDO 收件箱保存消息 Request VO
*/
- void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessageReqVO);
+ void saveInboxAndSendMessage(ImMessageDO imMessageDO);
/**
* 获得大于 sequence 的消息ids
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
index d7a43a0..537e427 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
@@ -2,18 +2,19 @@ package cn.iocoder.yudao.module.im.service.inbox;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSendMessageReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;
-import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper;
import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO;
-import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao;
-import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
+import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDAO;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import jakarta.annotation.Resource;
import org.dromara.hutool.core.date.DateUnit;
+import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@@ -33,50 +34,60 @@ public class InboxServiceImpl implements InboxService {
@Resource
private InboxMapper inboxMapper;
+
@Resource
- private SequenceRedisDao sequenceRedisDao; // 序列生成器Redis DAO
+ private SequenceRedisDAO sequenceRedisDAO;
@Resource
- private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO
+ private InboxLockRedisDAO inboxLockRedisDAO;
+
@Resource
private WebSocketSenderApi webSocketSenderApi;
@Resource
private GroupMemberService groupMemberService;
- // TODO @anhaohao:下面的逻辑,最好是,1. 保存收件箱 + 发送消息给用户; 2. xxx;这样看的人,会更有感觉哈;
@Override
- public void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessage) {
- // 保存收件箱 + 发送消息给用户
- saveInboxAndSendMessageForUser(inboxSaveMessage.getFromId(), inboxSaveMessage);
-
- if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.SINGLE.getType())) {
- saveInboxAndSendMessageForUser(inboxSaveMessage.getReceiverId(), inboxSaveMessage);
- } else if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) {
- List groupMembers = groupMemberService.selectByGroupId(inboxSaveMessage.getReceiverId());
- groupMembers.forEach(groupMemberDO -> saveInboxAndSendMessageForUser(groupMemberDO.getUserId(), inboxSaveMessage));
+ public void saveInboxAndSendMessage(ImMessageDO message) {
+ // 1. 保存收件箱 + 发送消息给发送人
+ saveInboxAndSendMessageForUser(message.getSenderId(), message);
+ // 2. 保存收件箱 + 发送消息给接收人
+ if (message.getConversationType().equals(ImConversationTypeEnum.SINGLE.getType())) {
+ // 2.1 如果是单聊,直接发送给接收人
+ saveInboxAndSendMessageForUser(message.getReceiverId(), message);
+ } else if (message.getConversationType().equals(ImConversationTypeEnum.GROUP.getType())) {
+ // 2.2 如果是群聊,发送给群聊的所有人
+ List groupMembers = groupMemberService.selectByGroupId(message.getReceiverId());
+ groupMembers.forEach(groupMemberDO -> saveInboxAndSendMessageForUser(groupMemberDO.getUserId(), message));
}
}
@Override
public List selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) {
- return inboxMapper.selectMessageIdsByUserIdAndSequence(userId, sequence, size);
+ List imInboxDOS = inboxMapper.selectListByUserIdAndSequence(userId, sequence, size);
+ return imInboxDOS.stream().map(ImInboxDO::getMessageId).toList();
}
- private void saveInboxAndSendMessageForUser(Long userId, InboxSaveMessageReqVO inboxSaveMessage) {
+
+ //TODO 多线程处理
+ public void saveInboxAndSendMessageForUser(Long userId, ImMessageDO message) {
inboxLockRedisDAO.lock(userId, INBOX_LOCK_TIMEOUT, () -> {
- Long userSequence = sequenceRedisDao.generateSequence(userId);
- // TODO @anhaohao:链式调用;
- InboxDO inbox = new InboxDO();
- inbox.setUserId(userId);
- inbox.setMessageId(inboxSaveMessage.getMessageId());
- inbox.setSequence(userSequence);
+ // 1. 生成序列号
+ Long userSequence = sequenceRedisDAO.generateSequence(userId);
+ // 2. 保存收件箱
+ ImInboxDO inbox = new ImInboxDO()
+ .setUserId(userId)
+ .setMessageId(message.getId())
+ .setSequence(userSequence);
inboxMapper.insert(inbox);
-
- // TODO @anhaohao:是不是 send 不用在加锁里面哈?!
- // TODO @anhaohao:再进一步,是不是用 spring @async 可以并发推送噢
- InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class);
- message.setSequence(userSequence);
- webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message);
+ // 3. 发送消息
+ sendAsyncMessage(userId, message, userSequence);
});
}
+ @Async
+ public void sendAsyncMessage(Long userId, ImMessageDO message, Long userSequence) {
+ ImMessageRespVO messageRespVO = BeanUtils.toBean(message, ImMessageRespVO.class);
+ messageRespVO.setSequence(userSequence);
+ webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, messageRespVO);
+ }
+
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java
index ee58f42..63277da 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java
@@ -1,9 +1,8 @@
package cn.iocoder.yudao.module.im.service.message;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import java.util.List;
@@ -17,26 +16,28 @@ public interface MessageService {
/**
* 获得历史消息
*
- * @param pageReqVO 分页查询
+ * @param loginUserId 登录用户编号
+ * @param listReqVO 分页查询
* @return 消息分页
*/
- List getHistoryMessage(MessagePageReqVO pageReqVO);
+ List getMessageList(Long loginUserId, ImMessageListReqVO listReqVO);
/**
* 拉取消息-大于 seq 的消息
*
- * @param userId 用户id
- * @param sequence 序列号
- * @param size 数量
+ * @param loginUserId 登录用户编号
+ * @param sequence 序列号
+ * @param size 数量
* @return 消息列表
*/
- List getMessageListBySequence(Long userId, Long sequence, Integer size);
+ List pullMessageList(Long loginUserId, Long sequence, Integer size);
/**
* 发送消息
+ *
* @param loginUserId 登录用户编号
- * @param message 消息
+ * @param message 消息
* @return 消息编号
*/
- SendMessageRespVO sendMessage(Long loginUserId, SendMessageReqVO message);
+ ImMessageDO sendMessage(Long loginUserId, ImMessageSendReqVO message);
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java
index 1203fa0..364e394 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java
@@ -1,15 +1,14 @@
package cn.iocoder.yudao.module.im.service.message;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;
-import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
+import cn.hutool.core.bean.BeanUtil;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
+import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper;
-import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageSourceEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageStatusEnum;
+import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
+import cn.iocoder.yudao.module.im.enums.message.ImMessageSourceEnum;
+import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum;
import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
import cn.iocoder.yudao.module.im.service.inbox.InboxService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -38,92 +37,66 @@ public class MessageServiceImpl implements MessageService {
@Resource
private MessageMapper messageMapper;
@Resource
- private InboxService inboxService;
- @Resource
private AdminUserApi adminUserApi;
@Resource
+ private InboxService inboxService;
+ @Resource
private GroupMemberService groupMemberService;
@Override
- public List getHistoryMessage(MessagePageReqVO pageReqVO) {
- return messageMapper.getHistoryMessage(pageReqVO);
+ public List getMessageList(Long loginUserId, ImMessageListReqVO listReqVO) {
+ // 1. 获得会话编号
+ String no = ImConversationTypeEnum.generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType());
+ // 2. 查询历史消息
+ ImMessageDO message = new ImMessageDO()
+ .setSendTime(listReqVO.getSendTime())
+ .setConversationNo(no);
+ return messageMapper.selectMessageList(message);
}
@Override
- public List getMessageListBySequence(Long userId, Long sequence, Integer size) {
+ public List pullMessageList(Long userId, Long sequence, Integer size) {
List messageIds = inboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size);
return messageMapper.selectBatchIds(messageIds);
}
@Override
- public SendMessageRespVO sendMessage(Long fromUserId, SendMessageReqVO message) {
- // 保存消息
- // TODO @anhaohao:InboxSaveMessageReqVO 不用 new 出来传递到 saveMessage 方法里;
- InboxSaveMessageReqVO inboxSaveMessageReqVO = new InboxSaveMessageReqVO();
- SendMessageRespVO sendMessageRespVO = saveMessage(fromUserId, message, inboxSaveMessageReqVO);
-
- // 保存收件箱 + 发送消息给用户
- // TODO @anhaohao:考虑到少定义一些 VO,直接传递 MessageDO 就完事了;反正这两者也是强耦合的;
- inboxService.saveInboxAndSendMessage(inboxSaveMessageReqVO);
- return sendMessageRespVO;
+ public ImMessageDO sendMessage(Long fromUserId, ImMessageSendReqVO imMessageSendReqVO) {
+ // 1. 保存消息
+ ImMessageDO message = saveMessage(fromUserId, imMessageSendReqVO);
+ // 2. 保存到收件箱,并发送消息
+ inboxService.saveInboxAndSendMessage(message);
+ return message;
}
- // TODO @anhaohao:这个方法,是不是定义成 private 哈;然后返回是 MessageDO 对象,设置最上面的 sendMessage 也是这个。最终 controller 转成 SendMessageRespVO
- public SendMessageRespVO saveMessage(Long fromUserId, SendMessageReqVO message, InboxSaveMessageReqVO inboxSaveMessageReqVO) {
- // 需要校验 receiverId 存在
+ private ImMessageDO saveMessage(Long fromUserId, ImMessageSendReqVO message) {
+ // 1. 校验接收人是否存在
validateReceiverIdExists(message);
- // 查询发送人昵称和发送人头像
+ // 2. 查询发送人信息
AdminUserRespDTO fromUser = adminUserApi.getUser(fromUserId);
- // 使用链式调用创建 MessageDO 对象
- // TODO @anhaohao:一部分字段,可以 beanutils tobean 搞定;
- // TODO @anhaohao:链式 set 的时候,要把相同的放在一行;例如说,setSenderNickname、setSenderAvatar;本质上,就是为了“同类”在一行,阅读起来简单;
- MessageDO messageDO = new MessageDO()
- .setClientMessageId(message.getClientMessageId())
+ // 3. 保存消息
+ ImMessageDO imMessageDO = BeanUtil.copyProperties(message, ImMessageDO.class)
+ .setSenderNickname(fromUser.getNickname()).setSenderAvatar(fromUser.getAvatar())
.setSenderId(fromUserId)
- .setReceiverId(message.getReceiverId())
- .setSenderNickname(fromUser.getNickname())
- .setSenderAvatar(fromUser.getAvatar())
- .setConversationType(message.getConversationType())
- .setContentType(message.getContentType())
- .setConversationNo(ConversationTypeEnum.generateConversationNo(fromUserId, message.getReceiverId(), message.getConversationType()))
- .setContent(message.getContent())
- .setSendFrom(MessageSourceEnum.USER_SEND.getStatus())
- .setSendTime(TimeUtil.now())
- .setMessageStatus(MessageStatusEnum.SENDING.getStatus());
- messageMapper.insert(messageDO);
-
- // 设置 InboxSaveMessageReqVO 对象
- inboxSaveMessageReqVO.setConversationType(message.getConversationType())
- .setFromId(fromUserId)
- .setReceiverId(message.getReceiverId())
- .setMessageId(messageDO.getId())
- .setContentType(message.getContentType())
- .setContent(message.getContent())
- .setSendTime(messageDO.getSendTime())
- .setSenderNickname(fromUser.getNickname())
- .setSenderAvatar(fromUser.getAvatar());
-
- // 返回 SendMessageRespVO 对象
- return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime());
+ .setConversationNo(ImConversationTypeEnum.generateConversationNo(fromUserId, message.getReceiverId(), message.getConversationType()))
+ .setSendFrom(ImMessageSourceEnum.USER_SEND.getSource())
+ .setMessageStatus(ImMessageStatusEnum.SENDING.getStatus())
+ .setSendTime(TimeUtil.now());
+ messageMapper.insert(imMessageDO);
+ return imMessageDO;
}
- // TODO @anhaohao:validateReceiver,更简单一点哈;不仅仅校验存在,未来还可以校验,自己是不是有好友关系、群聊是否在群聊里面等等
- private void validateReceiverIdExists(SendMessageReqVO message) {
- // TODO @anhaohao:这个不要这里校验,交给 validator 校验掉
- if (message.getReceiverId() == null) {
- throw exception(MESSAGE_RECEIVER_NOT_EXISTS);
- }
- if (message.getConversationType().equals(ConversationTypeEnum.SINGLE.getType())) {
- // TODO @anhaohao:// 之后要空一个空格,中英文协作习惯,中文和英文之间,不能连着;最后也不用 ;哈
- //校验用户是否存在;
+ private void validateReceiverIdExists(ImMessageSendReqVO message) {
+ if (message.getConversationType().equals(ImConversationTypeEnum.SINGLE.getType())) {
+ // 校验用户是否存在
AdminUserRespDTO receiverUser = adminUserApi.getUser(message.getReceiverId());
if (receiverUser == null) {
throw exception(MESSAGE_RECEIVER_NOT_EXISTS);
}
- } else if (message.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) {
- //校验群聊是否存在;
- List groupMemberDOS = groupMemberService.selectByGroupId(message.getReceiverId());
- if (groupMemberDOS.isEmpty()) {
+ } else if (message.getConversationType().equals(ImConversationTypeEnum.GROUP.getType())) {
+ // 校验群聊是否存在
+ List imGroupMemberDOS = groupMemberService.selectByGroupId(message.getReceiverId());
+ if (imGroupMemberDOS.isEmpty()) {
throw exception(MESSAGE_RECEIVER_NOT_EXISTS);
}
}
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java
deleted file mode 100644
index 21cbdbc..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package cn.iocoder.yudao.module.im.websocket;
-
-import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener;
-import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils;
-import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;
-import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
-import jakarta.annotation.Resource;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
-
-// TODO @hao:消息发送,使用 http 上行。因为在 cloud 框架下,我们比较难去 Listener。因为 im-server 不会自己启动 websocket 路径
-
-/**
- * WebSocket im
- *
- * @author 芋道源码
- */
-@Component
-@Slf4j
-public class ImWebSocketMessageListener implements WebSocketMessageListener {
-
- public static final String IM_MESSAGE_RECEIVE = "im-message-receive";
- @Resource
- private WebSocketSenderApi webSocketSenderApi; // WebSocket消息发送器
-
- /**
- * 处理WebSocket消息
- *
- * @param session WebSocket会话
- * @param message 发送的IM消息
- */
- @Override
- public void onMessage(WebSocketSession session, ImSendMessage message) {
- Long fromUserId = WebSocketFrameworkUtils.getLoginUserId(session); // 获取登录用户ID
- log.info(message.toString());
- }
-
- /**
- * 获取类型
- *
- * @return 类型
- */
- @Override
- public String getType() {
- return "im-message-send";
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java
deleted file mode 100644
index d270102..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package cn.iocoder.yudao.module.im.websocket.message;
-
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 消息发送 receive")
-@Data
-public class ImReceiveMessage {
-
- @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @InEnum(ConversationTypeEnum.class)
- private Integer conversationType;
-
- // TODO @anhaohao:我们应该是 senderId;因为它和 receiverId 是相对应的哈。
- @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long fromId; // 根据 conversationType 区分
-
- // TODO @hao:昵称和头像,也直接发给接收人好了;
-
- @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
- private Long messageId;
-
- @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer contentType; // 参见 ImMessageTypeEnum 枚举
-
- @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
- private String content;
-
- @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime sendTime;
-
- @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
- private Long sequence;
-
-}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java
deleted file mode 100644
index 77e37a3..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.iocoder.yudao.module.im.websocket.message;
-
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
-import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - IM 消息发送 send")
-@Data
-public class ImSendMessage {
-
- @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
- private String clientMessageId;
-
- @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @InEnum(ConversationTypeEnum.class)
- private Integer conversationType;
-
- @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long receiverId; // 根据 conversationType 区分
-
- @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @InEnum(MessageContentTypeEnum.class)
- private Integer contentType;
-
- @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
- private String content;
-
-}
\ No newline at end of file
--
libgit2 0.21.4