mirror of
https://gitee.com/zhijiantianya/ruoyi-vue-pro.git
synced 2026-06-06 02:38:38 +08:00
fix(im): 批量修复 P1/P2 问题
- 修复管理端消息内容搜索和私聊双向查询 - 加强 RTC 通话并发状态保护,去除重复接口错误提示 - 支持成员永久禁言 - 脱敏群消息 WebSocket 定向收件人字段 - 更新 IM bug 台账,剩余 P1/P2 共 35 个
This commit is contained in:
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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 枚举类
|
||||
|
||||
|
||||
@ -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 枚举类
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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. 广播通知
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user