Commit 9b44ed74e68df53f0483ac956c4c48d9beb9abd4

Authored by YunaiV
1 parent 36c30a43

fix(im): 批量修复 P1/P2 问题

- 修复管理端消息内容搜索和私聊双向查询
- 加强 RTC 通话并发状态保护,去除重复接口错误提示
- 支持成员永久禁言
- 脱敏群消息 WebSocket 定向收件人字段
- 更新 IM bug 台账,剩余 P1/P2 共 35 个
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/ImGroupMuteMemberReqVO.java
... ... @@ -17,10 +17,9 @@ public class ImGroupMuteMemberReqVO {
17 17 @NotNull(message = "用户编号不能为空")
18 18 private Long userId;
19 19  
20   - // TODO @AI:是不是改成禁言结束时间更好?因为禁言时长可能会比较大,单位秒不太好理解。
21   - @Schema(description = "禁言时长(秒)", requiredMode = Schema.RequiredMode.REQUIRED, example = "600")
  20 + @Schema(description = "禁言时长(秒),0 表示永久禁言", requiredMode = Schema.RequiredMode.REQUIRED, example = "600")
22 21 @NotNull(message = "禁言时长不能为空")
23   - @Min(value = 1, message = "禁言时长至少 1 秒")
  22 + @Min(value = 0, message = "禁言时长不能小于 0 秒")
24 23 private Integer mutedSeconds;
25 24  
26 25 }
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/vo/group/ImGroupMessageManagerPageReqVO.java
... ... @@ -24,6 +24,9 @@ public class ImGroupMessageManagerPageReqVO extends PageParam {
24 24 @Schema(description = "消息类型", example = "1")
25 25 private Integer type; // 参见 ImMessageTypeEnum 枚举类
26 26  
  27 + @Schema(description = "消息内容", example = "你好")
  28 + private String content;
  29 +
27 30 @Schema(description = "消息状态", example = "0")
28 31 private Integer status; // 参见 ImMessageStatusEnum 枚举类
29 32  
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/message/vo/privates/ImPrivateMessageManagerPageReqVO.java
... ... @@ -24,6 +24,9 @@ public class ImPrivateMessageManagerPageReqVO extends PageParam {
24 24 @Schema(description = "消息类型", example = "1")
25 25 private Integer type; // 参见 ImMessageTypeEnum 枚举类
26 26  
  27 + @Schema(description = "消息内容", example = "你好")
  28 + private String content;
  29 +
27 30 @Schema(description = "消息状态", example = "0")
28 31 private Integer status; // 参见 ImMessageStatusEnum 枚举类
29 32  
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java
... ... @@ -27,6 +27,11 @@ import java.time.LocalDateTime;
27 27 public class ImGroupMemberDO extends BaseDO {
28 28  
29 29 /**
  30 + * 永久禁言到期时间
  31 + */
  32 + public static final LocalDateTime PERMANENT_MUTE_END_TIME = LocalDateTime.of(9999, 12, 31, 23, 59, 59);
  33 +
  34 + /**
30 35 * 编号
31 36 */
32 37 @TableId
... ... @@ -94,4 +99,4 @@ public class ImGroupMemberDO extends BaseDO {
94 99 */
95 100 private LocalDateTime muteEndTime;
96 101  
97   -}
98 102 \ No newline at end of file
  103 +}
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImGroupMessageMapper.java
... ... @@ -119,6 +119,7 @@ public interface ImGroupMessageMapper extends BaseMapperX<ImGroupMessageDO> {
119 119 .eqIfPresent(ImGroupMessageDO::getGroupId, reqVO.getGroupId())
120 120 .eqIfPresent(ImGroupMessageDO::getSenderId, reqVO.getSenderId())
121 121 .eqIfPresent(ImGroupMessageDO::getType, reqVO.getType())
  122 + .likeIfPresent(ImGroupMessageDO::getContent, reqVO.getContent())
122 123 .eqIfPresent(ImGroupMessageDO::getStatus, reqVO.getStatus())
123 124 .betweenIfPresent(ImGroupMessageDO::getSendTime, reqVO.getSendTime())
124 125 .orderByDesc(ImGroupMessageDO::getId));
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImPrivateMessageMapper.java
... ... @@ -87,10 +87,20 @@ public interface ImPrivateMessageMapper extends BaseMapperX<ImPrivateMessageDO>
87 87 }
88 88  
89 89 default PageResult<ImPrivateMessageDO> selectPage(ImPrivateMessageManagerPageReqVO reqVO) {
90   - return selectPage(reqVO, new LambdaQueryWrapperX<ImPrivateMessageDO>()
91   - .eqIfPresent(ImPrivateMessageDO::getSenderId, reqVO.getSenderId())
92   - .eqIfPresent(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId())
  90 + LambdaQueryWrapperX<ImPrivateMessageDO> query = new LambdaQueryWrapperX<>();
  91 + if (reqVO.getSenderId() != null && reqVO.getReceiverId() != null) {
  92 + query.and(w -> w.eq(ImPrivateMessageDO::getSenderId, reqVO.getSenderId())
  93 + .eq(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId())
  94 + .or()
  95 + .eq(ImPrivateMessageDO::getSenderId, reqVO.getReceiverId())
  96 + .eq(ImPrivateMessageDO::getReceiverId, reqVO.getSenderId()));
  97 + } else {
  98 + query.eqIfPresent(ImPrivateMessageDO::getSenderId, reqVO.getSenderId())
  99 + .eqIfPresent(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId());
  100 + }
  101 + return selectPage(reqVO, query
93 102 .eqIfPresent(ImPrivateMessageDO::getType, reqVO.getType())
  103 + .likeIfPresent(ImPrivateMessageDO::getContent, reqVO.getContent())
94 104 .eqIfPresent(ImPrivateMessageDO::getStatus, reqVO.getStatus())
95 105 .betweenIfPresent(ImPrivateMessageDO::getSendTime, reqVO.getSendTime())
96 106 .orderByDesc(ImPrivateMessageDO::getId));
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java
... ... @@ -667,7 +667,8 @@ public class ImGroupServiceImpl implements ImGroupService {
667 667 validateMutePermission(operatorMember, targetMember);
668 668  
669 669 // 2. 设置 muteEndTime
670   - LocalDateTime muteEndTime = LocalDateTime.now().plusSeconds(reqVO.getMutedSeconds());
  670 + LocalDateTime muteEndTime = reqVO.getMutedSeconds() == 0
  671 + ? ImGroupMemberDO.PERMANENT_MUTE_END_TIME : LocalDateTime.now().plusSeconds(reqVO.getMutedSeconds());
671 672 groupMemberService.updateGroupMemberMuteEndTime(reqVO.getGroupId(), reqVO.getUserId(), muteEndTime);
672 673  
673 674 // 3. 广播通知
... ...
yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/ImGroupMessageDTO.java
... ... @@ -83,7 +83,7 @@ public class ImGroupMessageDTO {
83 83 * @return 群聊 DTO
84 84 */
85 85 public static ImGroupMessageDTO ofSend(ImGroupMessageDO message) {
86   - return BeanUtils.toBean(message, ImGroupMessageDTO.class);
  86 + return BeanUtils.toBean(message, ImGroupMessageDTO.class).setReceiverUserIds(null);
87 87 }
88 88  
89 89 /**
... ...