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,10 +17,9 @@ public class ImGroupMuteMemberReqVO {
17 @NotNull(message = "用户编号不能为空") 17 @NotNull(message = "用户编号不能为空")
18 private Long userId; 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 @NotNull(message = "禁言时长不能为空") 21 @NotNull(message = "禁言时长不能为空")
23 - @Min(value = 1, message = "禁言时长至少 1 秒") 22 + @Min(value = 0, message = "禁言时长不能小于 0 秒")
24 private Integer mutedSeconds; 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,6 +24,9 @@ public class ImGroupMessageManagerPageReqVO extends PageParam {
24 @Schema(description = "消息类型", example = "1") 24 @Schema(description = "消息类型", example = "1")
25 private Integer type; // 参见 ImMessageTypeEnum 枚举类 25 private Integer type; // 参见 ImMessageTypeEnum 枚举类
26 26
  27 + @Schema(description = "消息内容", example = "你好")
  28 + private String content;
  29 +
27 @Schema(description = "消息状态", example = "0") 30 @Schema(description = "消息状态", example = "0")
28 private Integer status; // 参见 ImMessageStatusEnum 枚举类 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,6 +24,9 @@ public class ImPrivateMessageManagerPageReqVO extends PageParam {
24 @Schema(description = "消息类型", example = "1") 24 @Schema(description = "消息类型", example = "1")
25 private Integer type; // 参见 ImMessageTypeEnum 枚举类 25 private Integer type; // 参见 ImMessageTypeEnum 枚举类
26 26
  27 + @Schema(description = "消息内容", example = "你好")
  28 + private String content;
  29 +
27 @Schema(description = "消息状态", example = "0") 30 @Schema(description = "消息状态", example = "0")
28 private Integer status; // 参见 ImMessageStatusEnum 枚举类 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,6 +27,11 @@ import java.time.LocalDateTime;
27 public class ImGroupMemberDO extends BaseDO { 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 @TableId 37 @TableId
@@ -94,4 +99,4 @@ public class ImGroupMemberDO extends BaseDO { @@ -94,4 +99,4 @@ public class ImGroupMemberDO extends BaseDO {
94 */ 99 */
95 private LocalDateTime muteEndTime; 100 private LocalDateTime muteEndTime;
96 101
97 -}  
98 \ No newline at end of file 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,6 +119,7 @@ public interface ImGroupMessageMapper extends BaseMapperX<ImGroupMessageDO> {
119 .eqIfPresent(ImGroupMessageDO::getGroupId, reqVO.getGroupId()) 119 .eqIfPresent(ImGroupMessageDO::getGroupId, reqVO.getGroupId())
120 .eqIfPresent(ImGroupMessageDO::getSenderId, reqVO.getSenderId()) 120 .eqIfPresent(ImGroupMessageDO::getSenderId, reqVO.getSenderId())
121 .eqIfPresent(ImGroupMessageDO::getType, reqVO.getType()) 121 .eqIfPresent(ImGroupMessageDO::getType, reqVO.getType())
  122 + .likeIfPresent(ImGroupMessageDO::getContent, reqVO.getContent())
122 .eqIfPresent(ImGroupMessageDO::getStatus, reqVO.getStatus()) 123 .eqIfPresent(ImGroupMessageDO::getStatus, reqVO.getStatus())
123 .betweenIfPresent(ImGroupMessageDO::getSendTime, reqVO.getSendTime()) 124 .betweenIfPresent(ImGroupMessageDO::getSendTime, reqVO.getSendTime())
124 .orderByDesc(ImGroupMessageDO::getId)); 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,10 +87,20 @@ public interface ImPrivateMessageMapper extends BaseMapperX<ImPrivateMessageDO>
87 } 87 }
88 88
89 default PageResult<ImPrivateMessageDO> selectPage(ImPrivateMessageManagerPageReqVO reqVO) { 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 .eqIfPresent(ImPrivateMessageDO::getType, reqVO.getType()) 102 .eqIfPresent(ImPrivateMessageDO::getType, reqVO.getType())
  103 + .likeIfPresent(ImPrivateMessageDO::getContent, reqVO.getContent())
94 .eqIfPresent(ImPrivateMessageDO::getStatus, reqVO.getStatus()) 104 .eqIfPresent(ImPrivateMessageDO::getStatus, reqVO.getStatus())
95 .betweenIfPresent(ImPrivateMessageDO::getSendTime, reqVO.getSendTime()) 105 .betweenIfPresent(ImPrivateMessageDO::getSendTime, reqVO.getSendTime())
96 .orderByDesc(ImPrivateMessageDO::getId)); 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,7 +667,8 @@ public class ImGroupServiceImpl implements ImGroupService {
667 validateMutePermission(operatorMember, targetMember); 667 validateMutePermission(operatorMember, targetMember);
668 668
669 // 2. 设置 muteEndTime 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 groupMemberService.updateGroupMemberMuteEndTime(reqVO.getGroupId(), reqVO.getUserId(), muteEndTime); 672 groupMemberService.updateGroupMemberMuteEndTime(reqVO.getGroupId(), reqVO.getUserId(), muteEndTime);
672 673
673 // 3. 广播通知 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,7 +83,7 @@ public class ImGroupMessageDTO {
83 * @return 群聊 DTO 83 * @return 群聊 DTO
84 */ 84 */
85 public static ImGroupMessageDTO ofSend(ImGroupMessageDO message) { 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 /**