diff --git a/sql/mysql/im/alter_message_content_8192.sql b/sql/mysql/im/alter_message_content_8192.sql new file mode 100644 index 0000000..cf7f7c4 --- /dev/null +++ b/sql/mysql/im/alter_message_content_8192.sql @@ -0,0 +1,4 @@ +-- 消息表 content 列长度与 MESSAGE_CONTENT_MAX_LENGTH 保持一致 + +ALTER TABLE `im_private_message` MODIFY COLUMN `content` varchar(8192) DEFAULT NULL COMMENT '消息内容,JSON 格式'; +ALTER TABLE `im_group_message` MODIFY COLUMN `content` varchar(8192) DEFAULT NULL COMMENT '消息内容,JSON 格式'; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImConversationTypeEnum.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImConversationTypeEnum.java new file mode 100644 index 0000000..ed40b37 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImConversationTypeEnum.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.im.enums; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; +import java.util.Objects; + +/** + * IM 会话类型枚举 + * + * @author 芋道源码 + */ +@RequiredArgsConstructor +@Getter +public enum ImConversationTypeEnum implements ArrayValuable { + + PRIVATE(1, "私聊"), // 私聊 + GROUP(2, "群聊"); // 群聊 + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImConversationTypeEnum::getType).toArray(Integer[]::new); + + /** + * 类型 + */ + private final Integer type; + /** + * 名字 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + + public static boolean isPrivate(Integer type) { + return Objects.equals(PRIVATE.type, type); + } + + public static boolean isGroup(Integer type) { + return Objects.equals(GROUP.type, type); + } + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java index c17e818..7de9c6f 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java @@ -44,9 +44,14 @@ public enum ImMessageTypeEnum implements ArrayValuable { */ FILE(105, "文件", true, true), /** - * 对应 OpenIM:Card 108 + * 对应 OpenIM:Merger 107 + * 对应自己的类:MergeMessage + */ + MERGE(107, "合并转发", true, true), + /** + * 对应 OpenIM:Card 108(OpenIM 仅用户名片;本系统扩展为用户 / 群双类型,按 targetType 区分) * 对应自己的类:CardMessage - * 场景:把好友名片推荐给其他会话,对端点击名片可打开 UserInfoCard + * 场景:把用户名片 / 群名片推荐给其他会话;用户名片点击打开 UserInfoCard,群名片点击「已加群跳会话 / 未加群弹申请加群」 */ CARD(108, "名片", true, true), /** diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/CardMessage.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/CardMessage.java index 72ef8ef..8a8decd 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/CardMessage.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/CardMessage.java @@ -1,25 +1,43 @@ package cn.iocoder.yudao.module.im.service.websocket.dto.message; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.im.enums.ImConversationTypeEnum; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; /** * 名片消息内容 + *

+ * 支持两类名片,按 targetType 区分: + * 1. 用户名片(targetType = PRIVATE):targetId = 用户编号,name = 用户昵称 + * 2. 群名片(targetType = GROUP):targetId = 群编号,name = 群名,可带 memberCount */ @Data public class CardMessage { /** - * 用户编号 + * 名片对象类型 + *

+ * 枚举 {@link ImConversationTypeEnum} */ - private Long userId; + private Integer targetType; /** - * 用户昵称 + * 目标对象编号:PRIVATE 时 = 用户编号;GROUP 时 = 群编号 */ - private String nickname; + private Long targetId; /** - * 用户头像 + * 显示名快照:PRIVATE 时 = 用户昵称;GROUP 时 = 群名 + */ + private String name; + /** + * 头像(快照) */ private String avatar; + /** + * 群成员数(仅 targetType = GROUP;接收端展示「N 人群聊」) + */ + private Integer memberCount; /** * 引用消息(可选) diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/MergeMessage.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/MergeMessage.java new file mode 100644 index 0000000..62a051d --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/message/MergeMessage.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.im.service.websocket.dto.message; + +import cn.iocoder.yudao.module.im.enums.message.ImMessageTypeEnum; +import lombok.Data; + +import java.util.List; + +/** + * 合并转发消息内容 + *

+ * payload 内嵌完整快照,原消息撤回 / 删除不影响已转发的合并消息 + */ +@Data +public class MergeMessage { + + /** + * 合并标题 + */ + private String title; + /** + * 内嵌的完整消息快照 + */ + private List messages; + + /** + * 单条内嵌消息快照 + */ + @Data + public static class Item { + + /** + * 原消息编号 + */ + private Long messageId; + /** + * 发送人编号 + */ + private Long senderId; + /** + * 发送人昵称快照;接收方可能不在原会话里,无法实时查到 + */ + private String senderNickname; + /** + * 发送人头像快照 + */ + private String senderAvatar; + /** + * 消息类型 + *

+ * 枚举 {@link ImMessageTypeEnum} + */ + private Integer type; + /** + * 原消息 content(JSON) + */ + private String content; + /** + * 发送时间戳(毫秒) + */ + private Long sendTime; + + } + +} diff --git a/yudao-module-im/src/test/resources/sql/create_tables.sql b/yudao-module-im/src/test/resources/sql/create_tables.sql index a62b4cf..e603461 100644 --- a/yudao-module-im/src/test/resources/sql/create_tables.sql +++ b/yudao-module-im/src/test/resources/sql/create_tables.sql @@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS "im_private_message" ( "sender_id" bigint NOT NULL COMMENT '发送人编号', "receiver_id" bigint NOT NULL COMMENT '接收人编号', "type" smallint NOT NULL COMMENT '消息类型', - "content" varchar(4096) DEFAULT NULL COMMENT '消息内容', + "content" varchar(8192) DEFAULT NULL COMMENT '消息内容', "status" tinyint NOT NULL COMMENT '消息状态', "send_time" timestamp NOT NULL COMMENT '发送时间', "creator" varchar(64) DEFAULT '', @@ -22,7 +22,7 @@ CREATE TABLE IF NOT EXISTS "im_group_message" ( "sender_id" bigint NOT NULL COMMENT '发送人编号', "group_id" bigint NOT NULL COMMENT '群编号', "type" smallint NOT NULL COMMENT '消息类型', - "content" varchar(4096) DEFAULT NULL COMMENT '消息内容', + "content" varchar(8192) DEFAULT NULL COMMENT '消息内容', "status" tinyint NOT NULL COMMENT '消息状态', "send_time" timestamp NOT NULL COMMENT '发送时间', "receiver_user_ids" varchar(1024) DEFAULT NULL COMMENT '定向接收用户编号列表',