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

- 修复管理端消息内容搜索和私聊双向查询
- 加强 RTC 通话并发状态保护,去除重复接口错误提示
- 支持成员永久禁言
- 脱敏群消息 WebSocket 定向收件人字段
- 更新 IM bug 台账,剩余 P1/P2 共 35 个
This commit is contained in:
YunaiV
2026-05-25 00:29:00 +08:00
parent 36c30a431a
commit 9b44ed74e6
8 changed files with 31 additions and 9 deletions

View File

@ -17,10 +17,9 @@ public class ImGroupMuteMemberReqVO {
@NotNull(message = "用户编号不能为空")
private Long userId;
// TODO @AI是不是改成禁言结束时间更好因为禁言时长可能会比较大单位秒不太好理解。
@Schema(description = "禁言时长(秒)", requiredMode = Schema.RequiredMode.REQUIRED, example = "600")
@Schema(description = "禁言时长0 表示永久禁言", requiredMode = Schema.RequiredMode.REQUIRED, example = "600")
@NotNull(message = "禁言时长不能为空")
@Min(value = 1, message = "禁言时长至少 1")
@Min(value = 0, message = "禁言时长不能小于 0")
private Integer mutedSeconds;
}

View File

@ -24,6 +24,9 @@ public class ImGroupMessageManagerPageReqVO extends PageParam {
@Schema(description = "消息类型", example = "1")
private Integer type; // 参见 ImMessageTypeEnum 枚举类
@Schema(description = "消息内容", example = "你好")
private String content;
@Schema(description = "消息状态", example = "0")
private Integer status; // 参见 ImMessageStatusEnum 枚举类

View File

@ -24,6 +24,9 @@ public class ImPrivateMessageManagerPageReqVO extends PageParam {
@Schema(description = "消息类型", example = "1")
private Integer type; // 参见 ImMessageTypeEnum 枚举类
@Schema(description = "消息内容", example = "你好")
private String content;
@Schema(description = "消息状态", example = "0")
private Integer status; // 参见 ImMessageStatusEnum 枚举类

View File

@ -26,6 +26,11 @@ import java.time.LocalDateTime;
@AllArgsConstructor
public class ImGroupMemberDO extends BaseDO {
/**
* 永久禁言到期时间
*/
public static final LocalDateTime PERMANENT_MUTE_END_TIME = LocalDateTime.of(9999, 12, 31, 23, 59, 59);
/**
* 编号
*/
@ -94,4 +99,4 @@ public class ImGroupMemberDO extends BaseDO {
*/
private LocalDateTime muteEndTime;
}
}

View File

@ -119,6 +119,7 @@ public interface ImGroupMessageMapper extends BaseMapperX<ImGroupMessageDO> {
.eqIfPresent(ImGroupMessageDO::getGroupId, reqVO.getGroupId())
.eqIfPresent(ImGroupMessageDO::getSenderId, reqVO.getSenderId())
.eqIfPresent(ImGroupMessageDO::getType, reqVO.getType())
.likeIfPresent(ImGroupMessageDO::getContent, reqVO.getContent())
.eqIfPresent(ImGroupMessageDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ImGroupMessageDO::getSendTime, reqVO.getSendTime())
.orderByDesc(ImGroupMessageDO::getId));

View File

@ -87,10 +87,20 @@ public interface ImPrivateMessageMapper extends BaseMapperX<ImPrivateMessageDO>
}
default PageResult<ImPrivateMessageDO> selectPage(ImPrivateMessageManagerPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ImPrivateMessageDO>()
.eqIfPresent(ImPrivateMessageDO::getSenderId, reqVO.getSenderId())
.eqIfPresent(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId())
LambdaQueryWrapperX<ImPrivateMessageDO> query = new LambdaQueryWrapperX<>();
if (reqVO.getSenderId() != null && reqVO.getReceiverId() != null) {
query.and(w -> w.eq(ImPrivateMessageDO::getSenderId, reqVO.getSenderId())
.eq(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId())
.or()
.eq(ImPrivateMessageDO::getSenderId, reqVO.getReceiverId())
.eq(ImPrivateMessageDO::getReceiverId, reqVO.getSenderId()));
} else {
query.eqIfPresent(ImPrivateMessageDO::getSenderId, reqVO.getSenderId())
.eqIfPresent(ImPrivateMessageDO::getReceiverId, reqVO.getReceiverId());
}
return selectPage(reqVO, query
.eqIfPresent(ImPrivateMessageDO::getType, reqVO.getType())
.likeIfPresent(ImPrivateMessageDO::getContent, reqVO.getContent())
.eqIfPresent(ImPrivateMessageDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ImPrivateMessageDO::getSendTime, reqVO.getSendTime())
.orderByDesc(ImPrivateMessageDO::getId));

View File

@ -667,7 +667,8 @@ public class ImGroupServiceImpl implements ImGroupService {
validateMutePermission(operatorMember, targetMember);
// 2. 设置 muteEndTime
LocalDateTime muteEndTime = LocalDateTime.now().plusSeconds(reqVO.getMutedSeconds());
LocalDateTime muteEndTime = reqVO.getMutedSeconds() == 0
? ImGroupMemberDO.PERMANENT_MUTE_END_TIME : LocalDateTime.now().plusSeconds(reqVO.getMutedSeconds());
groupMemberService.updateGroupMemberMuteEndTime(reqVO.getGroupId(), reqVO.getUserId(), muteEndTime);
// 3. 广播通知

View File

@ -83,7 +83,7 @@ public class ImGroupMessageDTO {
* @return 群聊 DTO
*/
public static ImGroupMessageDTO ofSend(ImGroupMessageDO message) {
return BeanUtils.toBean(message, ImGroupMessageDTO.class);
return BeanUtils.toBean(message, ImGroupMessageDTO.class).setReceiverUserIds(null);
}
/**