Commit 782314f17f2aaa68f95d1209f0c6ce3b1e0da84b

Authored by YunaiV
1 parent a4901a84

✨ feat(im): 增加群聊消息的管理

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;
26 26 import org.springframework.web.bind.annotation.RestController;
27 27  
28 28 import java.util.Map;
  29 +import java.util.Objects;
  30 +import java.util.Set;
  31 +import java.util.stream.Stream;
29 32  
30 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
31 35 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  36 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
  37 +import static cn.iocoder.yudao.module.im.enums.ImCommonConstants.AT_USER_ID_ALL;
32 38  
33 39 @Tag(name = "管理后台 - IM 群聊消息")
34 40 @RestController
... ... @@ -53,15 +59,24 @@ public class ImGroupMessageManagerController {
53 59 if (CollUtil.isEmpty(pageResult.getList())) {
54 60 return success(PageResult.empty(pageResult.getTotal()));
55 61 }
56   - // 2.1 批量查询群名称、发送人昵称
  62 + // 2.1 批量查询群名称、发送人昵称、@ 用户昵称(-1 表示 @所有人,跳过查询,由前端判断渲染)
57 63 Map<Long, ImGroupDO> groupMap = groupService.getGroupMap(
58 64 convertSet(pageResult.getList(), ImGroupMessageDO::getGroupId));
59   - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
60   - convertSet(pageResult.getList(), ImGroupMessageDO::getSenderId));
61   - // 2.2 转换为 VO,填充群名 / 发送人昵称
  65 + Set<Long> userIds = convertSetByFlatMap(pageResult.getList(), m -> Stream.concat(
  66 + Stream.of(m.getSenderId()),
  67 + CollUtil.emptyIfNull(m.getAtUserIds()).stream()
  68 + .filter(id -> !Objects.equals(id, AT_USER_ID_ALL))));
  69 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
  70 + // 2.2 转换为 VO,填充群名 / 发送人昵称 / @ 用户昵称(-1 位置留 null,由前端展示「@所有人」)
62 71 return success(BeanUtils.toBean(pageResult, ImGroupMessageManagerRespVO.class, vo -> {
63 72 MapUtils.findAndThen(groupMap, vo.getGroupId(), group -> vo.setGroupName(group.getName()));
64 73 MapUtils.findAndThen(userMap, vo.getSenderId(), user -> vo.setSenderNickname(user.getNickname()));
  74 + if (CollUtil.isNotEmpty(vo.getAtUserIds())) {
  75 + vo.setAtUserNicknames(convertList(vo.getAtUserIds(), id -> {
  76 + AdminUserRespDTO user = userMap.get(id);
  77 + return user != null ? user.getNickname() : null;
  78 + }));
  79 + }
65 80 }));
66 81 }
67 82  
... ...
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 {
37 37 @Schema(description = "消息状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
38 38 private Integer status; // 参见 ImMessageStatusEnum 枚举类
39 39  
40   - @Schema(description = "@ 目标用户编号列表")
  40 + @Schema(description = "@ 目标用户编号列表(-1 表示 @所有人)")
41 41 private List<Long> atUserIds;
  42 + @Schema(description = "@ 目标用户昵称列表(-1 位置为 null,前端根据 atUserIds 自行展示「@所有人」)")
  43 + private List<String> atUserNicknames;
42 44  
43 45 @Schema(description = "回执状态", example = "0")
44 46 private Integer receiptStatus; // 参见 ImGroupMessageReceiptStatusEnum 枚举类
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/sensitiveword/ImSensitiveWordManagerController.java
1 1 package cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  7 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
5 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 9 import cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword.vo.ImSensitiveWordPageReqVO;
7 10 import cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword.vo.ImSensitiveWordRespVO;
8 11 import cn.iocoder.yudao.module.im.controller.admin.manager.sensitiveword.vo.ImSensitiveWordSaveReqVO;
9 12 import cn.iocoder.yudao.module.im.dal.dataobject.sensitiveword.ImSensitiveWordDO;
10 13 import cn.iocoder.yudao.module.im.service.sensitiveword.ImSensitiveWordService;
  14 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  15 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
11 16 import io.swagger.v3.oas.annotations.Operation;
12 17 import io.swagger.v3.oas.annotations.Parameter;
13 18 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -18,8 +23,10 @@ import org.springframework.validation.annotation.Validated;
18 23 import org.springframework.web.bind.annotation.*;
19 24  
20 25 import java.util.List;
  26 +import java.util.Map;
21 27  
22 28 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  29 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
23 30  
24 31 @Tag(name = "管理后台 - IM 敏感词")
25 32 @RestController
... ... @@ -29,6 +36,8 @@ public class ImSensitiveWordManagerController {
29 36  
30 37 @Resource
31 38 private ImSensitiveWordService sensitiveWordService;
  39 + @Resource
  40 + private AdminUserApi adminUserApi;
32 41  
33 42 @PostMapping("/create")
34 43 @Operation(summary = "新增敏感词")
... ... @@ -68,8 +77,18 @@ public class ImSensitiveWordManagerController {
68 77 @PreAuthorize("@ss.hasPermission('im:manager:sensitive-word:query')")
69 78 public CommonResult<PageResult<ImSensitiveWordRespVO>> getSensitiveWordPage(
70 79 @Valid ImSensitiveWordPageReqVO pageReqVO) {
  80 + // 1. 分页查询
71 81 PageResult<ImSensitiveWordDO> pageResult = sensitiveWordService.getSensitiveWordPage(pageReqVO);
72   - return success(BeanUtils.toBean(pageResult, ImSensitiveWordRespVO.class));
  82 + if (CollUtil.isEmpty(pageResult.getList())) {
  83 + return success(PageResult.empty(pageResult.getTotal()));
  84 + }
  85 + // 2.1 批量查询创建人昵称
  86 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(pageResult.getList(),
  87 + word -> NumberUtils.parseLong(word.getCreator())));
  88 + // 2.2 转换为 VO,填充创建人昵称
  89 + return success(BeanUtils.toBean(pageResult, ImSensitiveWordRespVO.class, vo ->
  90 + MapUtils.findAndThen(userMap, NumberUtils.parseLong(vo.getCreator()),
  91 + user -> vo.setCreatorName(user.getNickname()))));
73 92 }
74 93  
75 94 @GetMapping("/get")
... ...
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 {
20 20  
21 21 @Schema(description = "创建人")
22 22 private String creator;
  23 + @Schema(description = "创建人昵称", example = "张三")
  24 + private String creatorName;
23 25  
24 26 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
25 27 private LocalDateTime createTime;
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImCommonConstants.java
... ... @@ -18,6 +18,11 @@ public interface ImCommonConstants {
18 18 int MAX_GROUP_MEMBER = 500;
19 19  
20 20 /**
  21 + * 群消息 @ 所有人的特殊用户编号
  22 + */
  23 + long AT_USER_ID_ALL = -1L;
  24 +
  25 + /**
21 26 * 消息撤回时间限制(分钟)
22 27 */
23 28 int MESSAGE_RECALL_TIMEOUT_MINUTES = 5;
... ...