Commit 9b44ed74e68df53f0483ac956c4c48d9beb9abd4
1 parent
36c30a43
fix(im): 批量修复 P1/P2 问题
- 修复管理端消息内容搜索和私聊双向查询 - 加强 RTC 通话并发状态保护,去除重复接口错误提示 - 支持成员永久禁言 - 脱敏群消息 WebSocket 定向收件人字段 - 更新 IM bug 台账,剩余 P1/P2 共 35 个
Showing
8 changed files
with
31 additions
and
9 deletions
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 | /** | ... | ... |