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