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