From 4d2f470499f38894d040055747544ff699a7f626 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 3 May 2026 12:53:25 +0800 Subject: [PATCH] ✨ feat(im): 增加群消息的置顶 --- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java | 33 ++++++++------------------------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java | 3 +-- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java | 9 ++++++--- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java index 16605c6..33cc6e2 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java @@ -2,15 +2,8 @@ package cn.iocoder.yudao.module.im.controller.admin.group; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupAdminAddReqVO; -import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupAdminRemoveReqVO; -import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupCreateReqVO; -import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupMessagePinReqVO; -import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupRespVO; -import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupTransferOwnerReqVO; -import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupUpdateReqVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberInviteReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberRemoveReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.group.ImGroupMessageRespVO; @@ -28,17 +21,11 @@ import jakarta.validation.Valid; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; +import java.util.*; import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 群") @@ -175,25 +162,21 @@ public class ImGroupController { if (CollUtil.isEmpty(groups)) { return Collections.emptyList(); } - // 仅当前用户是有效成员的群才允许回填置顶消息(按 groupId 一次性 IN 查成员关系) + // 仅当前用户是有效成员的群才允许回填置顶消息 Set activeGroupIds = convertSet( groupMemberService.getActiveGroupMemberListByUserId(loginUserId), ImGroupMemberDO::getGroupId); - // 把 active 群的 pinnedMessageIds 一次性聚合 IN 查询,避免 N+1 Set allMessageIds = convertSetByFlatMap(groups, group -> activeGroupIds.contains(group.getId()) ? CollUtil.emptyIfNull(group.getPinnedMessageIds()).stream() : Stream.empty()); Map messageMap = groupMessageService.getGroupMessageMap(allMessageIds); - return CollectionUtils.convertList(groups, group -> { + // 转换输出 + return convertList(groups, group -> { ImGroupRespVO vo = BeanUtils.toBean(group, ImGroupRespVO.class); if (!activeGroupIds.contains(group.getId()) || CollUtil.isEmpty(group.getPinnedMessageIds())) { return vo; } // 按 pin 顺序输出,已被删除的消息(messageMap 没命中)跳过 - // TODO @AI:使用 CollUtils convert 进一步简化。 - List pinned = group.getPinnedMessageIds().stream() - .map(messageMap::get).filter(Objects::nonNull) - .map(msg -> BeanUtils.toBean(msg, ImGroupMessageRespVO.class)) - .collect(Collectors.toList()); - return vo.setPinnedMessages(pinned); + List pinnedMesages = convertList(group.getPinnedMessageIds(), messageMap::get); + return vo.setPinnedMessages(BeanUtils.toBean(pinnedMesages, ImGroupMessageRespVO.class)); }); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java index d3e5608..78296ee 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java @@ -64,8 +64,7 @@ public class ImGroupMessageController { return success(BeanUtils.toBean(message, ImGroupMessageRespVO.class)); } - // TODO @AI:改成 get-read-user-ids - @GetMapping("/read-users") + @GetMapping("/get-read-user-ids") @Operation(summary = "获取群消息已读用户列表") @Parameter(name = "groupId", description = "群编号", required = true, example = "1") @Parameter(name = "messageId", description = "消息编号", required = true, example = "1") 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 f292de9..cf2d52e 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 @@ -160,13 +160,16 @@ public enum ImMessageTypeEnum implements ArrayValuable { * 场景:用户改自己的群免打扰 / 群备注,仅推该用户其他在线终端做多端同步 */ GROUP_MEMBER_SETTING_UPDATE(1530, "群成员个人设置变更", false, false), - // TODO @AI:注释风格,还是参考上面的 /** - * 自有扩展:群主 / 管理员置顶一条群消息,全员广播;前端把 messageId 加入 group.pinnedMessageIds + * 对应 OpenIM:无(OpenIM 无群消息置顶功能,自有扩展) + * 对应自己的类:GroupMessagePinNotification + * 场景:群主 / 管理员置顶一条群消息,全员广播;payload 直接带消息对象,前端把 message push 进 group.pinnedMessages */ GROUP_MESSAGE_PIN(1531, "群消息置顶", true, false), /** - * 自有扩展:群主 / 管理员取消置顶,全员广播;前端把 messageId 从 group.pinnedMessageIds 移除 + * 对应 OpenIM:无(OpenIM 无群消息置顶功能,自有扩展) + * 对应自己的类:GroupMessageUnpinNotification + * 场景:群主 / 管理员取消置顶,全员广播;前端按 messageId 从 group.pinnedMessages 移除 */ GROUP_MESSAGE_UNPIN(1532, "群消息取消置顶", true, false); -- libgit2 0.21.4