diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/ImGroupMessageManagerController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/ImGroupMessageManagerController.java index 03b4a16..da49a9c 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/ImGroupMessageManagerController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/ImGroupMessageManagerController.java @@ -26,9 +26,15 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Map; +import java.util.Objects; +import java.util.Set; +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.convertList; 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.module.im.enums.ImCommonConstants.AT_USER_ID_ALL; @Tag(name = "管理后台 - IM 群聊消息") @RestController @@ -53,15 +59,24 @@ public class ImGroupMessageManagerController { if (CollUtil.isEmpty(pageResult.getList())) { return success(PageResult.empty(pageResult.getTotal())); } - // 2.1 批量查询群名称、发送人昵称 + // 2.1 批量查询群名称、发送人昵称、@ 用户昵称(-1 表示 @所有人,跳过查询,由前端判断渲染) Map groupMap = groupService.getGroupMap( convertSet(pageResult.getList(), ImGroupMessageDO::getGroupId)); - Map userMap = adminUserApi.getUserMap( - convertSet(pageResult.getList(), ImGroupMessageDO::getSenderId)); - // 2.2 转换为 VO,填充群名 / 发送人昵称 + Set userIds = convertSetByFlatMap(pageResult.getList(), m -> Stream.concat( + Stream.of(m.getSenderId()), + CollUtil.emptyIfNull(m.getAtUserIds()).stream() + .filter(id -> !Objects.equals(id, AT_USER_ID_ALL)))); + Map userMap = adminUserApi.getUserMap(userIds); + // 2.2 转换为 VO,填充群名 / 发送人昵称 / @ 用户昵称(-1 位置留 null,由前端展示「@所有人」) return success(BeanUtils.toBean(pageResult, ImGroupMessageManagerRespVO.class, vo -> { MapUtils.findAndThen(groupMap, vo.getGroupId(), group -> vo.setGroupName(group.getName())); MapUtils.findAndThen(userMap, vo.getSenderId(), user -> vo.setSenderNickname(user.getNickname())); + if (CollUtil.isNotEmpty(vo.getAtUserIds())) { + vo.setAtUserNicknames(convertList(vo.getAtUserIds(), id -> { + AdminUserRespDTO user = userMap.get(id); + return user != null ? user.getNickname() : null; + })); + } })); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/vo/group/ImGroupMessageManagerRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/vo/group/ImGroupMessageManagerRespVO.java index 10610da..836b3b3 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/vo/group/ImGroupMessageManagerRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/vo/group/ImGroupMessageManagerRespVO.java @@ -37,8 +37,10 @@ public class ImGroupMessageManagerRespVO { @Schema(description = "消息状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") private Integer status; // 参见 ImMessageStatusEnum 枚举类 - @Schema(description = "@ 目标用户编号列表") + @Schema(description = "@ 目标用户编号列表(-1 表示 @所有人)") private List atUserIds; + @Schema(description = "@ 目标用户昵称列表(-1 位置为 null,前端根据 atUserIds 自行展示「@所有人」)") + private List atUserNicknames; @Schema(description = "回执状态", example = "0") private Integer receiptStatus; // 参见 ImGroupMessageReceiptStatusEnum 枚举类 diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/ImSensitiveWordManagerController.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/ImSensitiveWordManagerController.java index febc9cb..629880c 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/ImSensitiveWordManagerController.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/ImSensitiveWordManagerController.java @@ -1,13 +1,18 @@ package cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword.vo.ImSensitiveWordPageReqVO; import cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword.vo.ImSensitiveWordRespVO; import cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword.vo.ImSensitiveWordSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.sensitiveword.ImSensitiveWordDO; import cn.iocoder.yudao.module.im.service.sensitiveword.ImSensitiveWordService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -18,8 +23,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - IM 敏感词") @RestController @@ -29,6 +36,8 @@ public class ImSensitiveWordManagerController { @Resource private ImSensitiveWordService sensitiveWordService; + @Resource + private AdminUserApi adminUserApi; @PostMapping("/create") @Operation(summary = "新增敏感词") @@ -68,8 +77,18 @@ public class ImSensitiveWordManagerController { @PreAuthorize("@ss.hasPermission('im:manager:sensitive-word:query')") public CommonResult> getSensitiveWordPage( @Valid ImSensitiveWordPageReqVO pageReqVO) { + // 1. 分页查询 PageResult pageResult = sensitiveWordService.getSensitiveWordPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, ImSensitiveWordRespVO.class)); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(PageResult.empty(pageResult.getTotal())); + } + // 2.1 批量查询创建人昵称 + Map userMap = adminUserApi.getUserMap(convertSet(pageResult.getList(), + word -> NumberUtils.parseLong(word.getCreator()))); + // 2.2 转换为 VO,填充创建人昵称 + return success(BeanUtils.toBean(pageResult, ImSensitiveWordRespVO.class, vo -> + MapUtils.findAndThen(userMap, NumberUtils.parseLong(vo.getCreator()), + user -> vo.setCreatorName(user.getNickname())))); } @GetMapping("/get") diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/vo/ImSensitiveWordRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/vo/ImSensitiveWordRespVO.java index e30fa79..578703f 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/vo/ImSensitiveWordRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/vo/ImSensitiveWordRespVO.java @@ -20,6 +20,8 @@ public class ImSensitiveWordRespVO { @Schema(description = "创建人") private String creator; + @Schema(description = "创建人昵称", example = "张三") + private String creatorName; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImCommonConstants.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImCommonConstants.java index 924b96f..4bde0aa 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImCommonConstants.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImCommonConstants.java @@ -18,6 +18,11 @@ public interface ImCommonConstants { int MAX_GROUP_MEMBER = 500; /** + * 群消息 @ 所有人的特殊用户编号 + */ + long AT_USER_ID_ALL = -1L; + + /** * 消息撤回时间限制(分钟) */ int MESSAGE_RECALL_TIMEOUT_MINUTES = 5;