From 14090be672d2302f9d76b2a01034d3dfc1a134c5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 5 May 2026 13:51:53 +0800 Subject: [PATCH] feat(im):将"免打扰"字段从 muted 全量重命名为 silent(DO/VO/Service/Mapper/测试/SQL + 前端 types/store/组件/管理后台),为后续 mute 禁言功能腾出词族 --- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java | 4 ++-- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java | 4 ++-- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/framework/config/ImProperties.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java | 16 +++++++--------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java | 10 +++++----- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java | 14 +++++--------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java | 2 +- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java | 4 ++-- yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java | 22 +++++++++++----------- yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImplTest.java | 4 ++-- yudao-module-im/src/test/resources/sql/create_tables.sql | 4 ++-- 20 files changed, 86 insertions(+), 54 deletions(-) create mode 100644 yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/framework/config/ImProperties.java diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java index af509b8..2e17b51 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendRespVO.java @@ -21,7 +21,7 @@ public class ImFriendRespVO { private Long friendUserId; @Schema(description = "是否免打扰", example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "好友展示备注(仅自己可见)", example = "老张") private String displayName; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java index f48266b..8eee96f 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/friend/vo/ImFriendUpdateReqVO.java @@ -14,7 +14,7 @@ public class ImFriendUpdateReqVO { private Long friendUserId; @Schema(description = "是否免打扰;不传表示不修改", example = "true") - private Boolean muted; + private Boolean silent; @Schema(description = "好友展示备注(仅自己可见);不传表示不修改,传空串表示清空", example = "老张") @Size(max = 16, message = "好友备注最多 16 个字符") diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java index 087bf6c..9aee3c4 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java @@ -25,7 +25,7 @@ public class ImGroupMemberRespVO { private String groupRemark; @Schema(description = "是否免打扰") - private Boolean muted; + private Boolean silent; @Schema(description = "成员状态", example = "0") private Integer status; diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java index 62c34fe..8c2c6fd 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberUpdateReqVO.java @@ -21,6 +21,6 @@ public class ImGroupMemberUpdateReqVO { private String groupRemark; @Schema(description = "是否免打扰") - private Boolean muted; + private Boolean silent; } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java index d31517e..54b5dcc 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerPageReqVO.java @@ -25,7 +25,7 @@ public class ImFriendManagerPageReqVO extends PageParam { private Integer status; // 参见 CommonStatusEnum 枚举类 @Schema(description = "是否免打扰", example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "添加好友时间", example = "[2026-04-01 00:00:00, 2026-04-30 23:59:59]") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java index 270b326..1b21920 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/friend/vo/ImFriendManagerRespVO.java @@ -28,7 +28,7 @@ public class ImFriendManagerRespVO { private String displayName; @Schema(description = "是否免打扰", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "好友状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") private Integer status; // 参见 CommonStatusEnum 枚举类 diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java index 5a6f56a..e564f1d 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/controller/admin/manager/group/vo/member/ImGroupMemberManagerRespVO.java @@ -25,7 +25,7 @@ public class ImGroupMemberManagerRespVO { private String groupRemark; @Schema(description = "是否免打扰", example = "false") - private Boolean muted; + private Boolean silent; @Schema(description = "成员状态", example = "0") private Integer status; // 参见 CommonStatusEnum 枚举类 diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java index 8832ebe..db9543a 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/friend/ImFriendDO.java @@ -15,7 +15,7 @@ import java.time.LocalDateTime; * 业务语义: * - 双向关系:A-B 互为好友会存 2 条记录(userId=A, friendUserId=B 和 userId=B, friendUserId=A) * - 状态管理:{@link #status} 使用 {@link CommonStatusEnum},ENABLE=正常,DISABLE=已删除 - * - 免打扰:{@link #muted} 控制是否屏蔽来自该好友的通知 + * - 免打扰:{@link #silent} 控制是否屏蔽来自该好友的通知 * - 联系人置顶:{@link #pinned} 单边,影响联系人 / 会话排序 * - 黑名单:{@link #blocked} 弱关联 friend,单边屏蔽对方消息(必须先是好友) * @@ -51,7 +51,7 @@ public class ImFriendDO extends BaseDO { /** * 是否免打扰 */ - private Boolean muted; + private Boolean silent; /** * 好友展示备注 */ diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java index 7af3412..dd8816f 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java @@ -53,7 +53,7 @@ public class ImGroupMemberDO extends BaseDO { /** * 是否免打扰 */ - private Boolean muted; + private Boolean silent; /** * 成员状态 *

diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java index 4714cc1..6268fb3 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/friend/ImFriendMapper.java @@ -50,7 +50,7 @@ public interface ImFriendMapper extends BaseMapperX { .eqIfPresent(ImFriendDO::getUserId, reqVO.getUserId()) .eqIfPresent(ImFriendDO::getFriendUserId, reqVO.getFriendUserId()) .eqIfPresent(ImFriendDO::getStatus, reqVO.getStatus()) - .eqIfPresent(ImFriendDO::getMuted, reqVO.getMuted()) + .eqIfPresent(ImFriendDO::getSilent, reqVO.getSilent()) .betweenIfPresent(ImFriendDO::getAddTime, reqVO.getAddTime()) .orderByDesc(ImFriendDO::getId)); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java index 4d85402..f65ca10 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageTypeEnum.java @@ -84,9 +84,9 @@ public enum ImMessageTypeEnum implements ArrayValuable { */ FRIEND_INFO_UPDATED(1209, "好友资料变更", false, false), /** - * 对应 OpenIM:FriendsInfoUpdateNotification 1210(窄化到 muted / pinned 单边属性) + * 对应 OpenIM:FriendsInfoUpdateNotification 1210(窄化到 silent / pinned 单边属性) * 对应自己的类:FriendUpdateNotification - * 场景:A 改了 muted / pinned 等单边属性,推 A 多端 + * 场景:A 改了 silent / pinned 等单边属性,推 A 多端 */ FRIEND_UPDATE(1210, "好友信息批量更新", false, false), diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/framework/config/ImProperties.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/framework/config/ImProperties.java new file mode 100644 index 0000000..574ebb9 --- /dev/null +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/framework/config/ImProperties.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.im.framework.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * IM 模块全局配置 + *

+ * 各子模块用嵌套 inner class 区分(friend / 后续 group / sensitive 等), + * yaml 路径保持 yudao.im.{module}.{key} 与原有部署保持兼容 + * + * @author 芋道源码 + */ +@Component +@ConfigurationProperties(prefix = "yudao.im") +@Data +public class ImProperties { + + private Friend friend = new Friend(); + + /** + * 好友模块配置 + */ + @Data + public static class Friend { + + /** + * 是否自动通过所有好友申请(全局开关) + *

+ * 默认 false,普通用户必须走申请-审批流程;开启后所有用户的好友申请会立即同意,主要用于全员开放型 IM 部署。 + * 如需细化到「仅特定用户自动通过」(如机器人 / AI 账号),请在 system 用户表加字段,并在 applyFriend 内按用户级开关短路 + */ + private boolean autoAccept = false; + + } + +} diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java index f6edef8..c47ad40 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImpl.java @@ -95,7 +95,7 @@ public class ImFriendServiceImpl implements ImFriendService { @Override public void updateFriend(Long userId, ImFriendUpdateReqVO reqVO) { // 1.1 校验:至少改一个字段(无字段变更,直接结束) - if (reqVO.getDisplayName() == null && reqVO.getMuted() == null && reqVO.getPinned() == null) { + if (reqVO.getDisplayName() == null && reqVO.getSilent() == null && reqVO.getPinned() == null) { return; } // 1.2 校验好友关系存在 @@ -106,13 +106,11 @@ public class ImFriendServiceImpl implements ImFriendService { // 2. 更新好友属性(备注 / 免打扰 / 联系人置顶) friendMapper.updateById(new ImFriendDO().setId(friend.getId()) - .setMuted(reqVO.getMuted()) - .setDisplayName(reqVO.getDisplayName()) - .setPinned(reqVO.getPinned())); + .setSilent(reqVO.getSilent()).setDisplayName(reqVO.getDisplayName()).setPinned(reqVO.getPinned())); // 3. 推 FRIEND_UPDATE 给 A 多端:所有单边属性变更合并为单条通知,避免多通知顺序竞争 FriendUpdateNotification payload = (FriendUpdateNotification) new FriendUpdateNotification() - .setDisplayName(reqVO.getDisplayName()).setMuted(reqVO.getMuted()).setPinned(reqVO.getPinned()) + .setDisplayName(reqVO.getDisplayName()).setSilent(reqVO.getSilent()).setPinned(reqVO.getPinned()) .setOperatorUserId(userId).setFriendUserId(reqVO.getFriendUserId()); websocketService.sendPrivateMessageAsync(userId, ImPrivateMessageDTO.ofFriendNotification( ImMessageTypeEnum.FRIEND_UPDATE.getType(), userId, userId, payload)); @@ -245,7 +243,7 @@ public class ImFriendServiceImpl implements ImFriendService { /** * 单向绑定好友关系(内部方法,被 {@link #becomeFriends} / {@link #silentReAddFriend} 调用): - * - 情况一:已存在记录(含 ENABLE / DISABLE)→ 复用并恢复 ENABLE,muted / pinned / blocked 一并重置为 false + * - 情况一:已存在记录(含 ENABLE / DISABLE)→ 复用并恢复 ENABLE,silent / pinned / blocked 一并重置为 false * - 情况二:不存在记录 → 直接插入新记录 *

* 并发安全:agree 路径由 {@code friend_request.handle_result} 的乐观锁单边推进; @@ -255,11 +253,11 @@ public class ImFriendServiceImpl implements ImFriendService { */ public void addFriend0(Long userId, Long friendUserId, String displayName, Integer addSource) { ImFriendDO exists = friendMapper.selectByUserIdAndFriendUserId(userId, friendUserId); - // 情况一:复用旧记录 → 恢复 ENABLE + 重置 muted / pinned / blocked 与首次新增对齐 + // 情况一:复用旧记录 → 恢复 ENABLE + 重置 silent / pinned / blocked 与首次新增对齐 if (exists != null) { ImFriendDO update = new ImFriendDO().setId(exists.getId()) .setStatus(CommonStatusEnum.ENABLE.getStatus()).setAddTime(LocalDateTime.now()) - .setMuted(false).setPinned(false).setBlocked(false); + .setSilent(false).setPinned(false).setBlocked(false); if (displayName != null) { update.setDisplayName(displayName); } @@ -271,7 +269,7 @@ public class ImFriendServiceImpl implements ImFriendService { } // 情况二:不存在记录 → 直接插入新记录 ImFriendDO friend = ImFriendDO.builder().userId(userId).friendUserId(friendUserId) - .muted(false).pinned(false).blocked(false) + .silent(false).pinned(false).blocked(false) .displayName(displayName).addSource(addSource) .status(CommonStatusEnum.ENABLE.getStatus()).addTime(LocalDateTime.now()).build(); friendMapper.insert(friend); diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java index b1ef7ca..8320ea5 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java @@ -222,14 +222,14 @@ public class ImGroupMemberServiceImpl implements ImGroupMemberService { groupMessageService.sendGroupMessage(userId, ImGroupMessageSendDTO.ofGroupMemberNicknameUpdate( groupId, userId, updateReqVO.getDisplayUserName())); } - // 3.2 muted / groupRemark 是个人字段,仅推自己做多端同步;与旧值都相同跳过 - boolean mutedChanged = updateReqVO.getMuted() != null - && ObjUtil.notEqual(updateReqVO.getMuted(), member.getMuted()); + // 3.2 silent / groupRemark 是个人字段,仅推自己做多端同步;与旧值都相同跳过 + boolean silentChanged = updateReqVO.getSilent() != null + && ObjUtil.notEqual(updateReqVO.getSilent(), member.getSilent()); boolean groupRemarkChanged = updateReqVO.getGroupRemark() != null && ObjUtil.notEqual(updateReqVO.getGroupRemark(), member.getGroupRemark()); - if (mutedChanged || groupRemarkChanged) { + if (silentChanged || groupRemarkChanged) { groupMessageService.sendGroupMessage(userId, List.of(userId), ImGroupMessageSendDTO.ofGroupMemberSettingUpdate( - groupId, userId, updateReqVO.getMuted(), updateReqVO.getGroupRemark())); + groupId, userId, updateReqVO.getSilent(), updateReqVO.getGroupRemark())); } } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java index 1403d51..d4f28db 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java @@ -136,8 +136,7 @@ public class ImGroupMessageSendDTO { public static ImGroupMessageSendDTO ofGroupNoticeUpdate(Long groupId, Long operatorUserId, String oldNotice, String newNotice) { GroupNoticeUpdateNotification notification = new GroupNoticeUpdateNotification(); notification.setOperatorUserId(operatorUserId); - notification.setOldNotice(oldNotice); - notification.setNewNotice(newNotice); + notification.setOldNotice(oldNotice).setNewNotice(newNotice); return new ImGroupMessageSendDTO().setGroupId(groupId) .setType(ImMessageTypeEnum.GROUP_NOTICE_UPDATE.getType()).setContent(notification); } @@ -145,17 +144,15 @@ public class ImGroupMessageSendDTO { public static ImGroupMessageSendDTO ofGroupNameUpdate(Long groupId, Long operatorUserId, String oldName, String newName) { GroupNameUpdateNotification notification = new GroupNameUpdateNotification(); notification.setOperatorUserId(operatorUserId); - notification.setOldName(oldName); - notification.setNewName(newName); + notification.setOldName(oldName).setNewName(newName); return new ImGroupMessageSendDTO().setGroupId(groupId) .setType(ImMessageTypeEnum.GROUP_NAME_UPDATE.getType()).setContent(notification); } - public static ImGroupMessageSendDTO ofGroupMemberSettingUpdate(Long groupId, Long operatorUserId, Boolean muted, String groupRemark) { + public static ImGroupMessageSendDTO ofGroupMemberSettingUpdate(Long groupId, Long operatorUserId, Boolean silent, String groupRemark) { GroupMemberSettingUpdateNotification notification = new GroupMemberSettingUpdateNotification(); notification.setOperatorUserId(operatorUserId); - notification.setMuted(muted); - notification.setGroupRemark(groupRemark); + notification.setSilent(silent).setGroupRemark(groupRemark); return new ImGroupMessageSendDTO().setGroupId(groupId) .setType(ImMessageTypeEnum.GROUP_MEMBER_SETTING_UPDATE.getType()).setContent(notification); } @@ -164,8 +161,7 @@ public class ImGroupMessageSendDTO { cn.iocoder.yudao.module.im.dal.dataobject.message.ImGroupMessageDO message) { GroupMessagePinNotification notification = new GroupMessagePinNotification(); notification.setOperatorUserId(operatorUserId); - notification.setMessageId(message.getId()); - notification.setMessage(message); + notification.setMessageId(message.getId()).setMessage(message); return new ImGroupMessageSendDTO().setGroupId(groupId) .setType(ImMessageTypeEnum.GROUP_MESSAGE_PIN.getType()).setContent(notification); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java index 24cf533..a1a52d6 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/friend/FriendUpdateNotification.java @@ -18,7 +18,7 @@ public class FriendUpdateNotification extends BaseFriendNotification { /** * 免打扰;不为空则更新 */ - private Boolean muted; + private Boolean silent; /** * 联系人置顶;不为空则更新 */ diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java index 949be97..e7eefcb 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/group/GroupMemberSettingUpdateNotification.java @@ -5,7 +5,7 @@ import lombok.Data; /** * 群成员个人设置变更事件通知(个人多端同步) *

- * muted / groupRemark 字段 null 表示本次未变更,前端按非 null 局部更新 + * silent / groupRemark 字段 null 表示本次未变更,前端按非 null 局部更新 */ @Data public class GroupMemberSettingUpdateNotification extends BaseGroupNotification { @@ -13,7 +13,7 @@ public class GroupMemberSettingUpdateNotification extends BaseGroupNotification /** * 群免打扰 */ - private Boolean muted; + private Boolean silent; /** * 群备注 */ diff --git a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java index ee95561..9edeedd 100644 --- a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java +++ b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/friend/ImFriendServiceImplTest.java @@ -81,19 +81,19 @@ public class ImFriendServiceImplTest extends BaseMockitoUnitTest { // 准备 ImFriendUpdateReqVO reqVO = new ImFriendUpdateReqVO(); reqVO.setFriendUserId(2L); - reqVO.setMuted(true); + reqVO.setSilent(true); ImFriendDO friend = ImFriendDO.builder().id(100L).userId(1L).friendUserId(2L) - .muted(false).status(CommonStatusEnum.ENABLE.getStatus()).build(); + .silent(false).status(CommonStatusEnum.ENABLE.getStatus()).build(); when(imFriendMapper.selectByUserIdAndFriendUserId(1L, 2L)).thenReturn(friend); // 调用 friendService.updateFriend(1L, reqVO); - // 断言:更新了 muted 字段 + // 断言:更新了 silent 字段 ArgumentCaptor captor = ArgumentCaptor.forClass(ImFriendDO.class); verify(imFriendMapper).updateById(captor.capture()); assertEquals(100L, captor.getValue().getId()); - assertTrue(captor.getValue().getMuted()); + assertTrue(captor.getValue().getSilent()); // 断言:推送了好友更新通知 verify(imWebSocketService).sendPrivateMessageAsync(eq(1L), any(ImPrivateMessageDTO.class)); } @@ -103,7 +103,7 @@ public class ImFriendServiceImplTest extends BaseMockitoUnitTest { // 准备 ImFriendUpdateReqVO reqVO = new ImFriendUpdateReqVO(); reqVO.setFriendUserId(2L); - reqVO.setMuted(true); + reqVO.setSilent(true); when(imFriendMapper.selectByUserIdAndFriendUserId(1L, 2L)).thenReturn(null); // 调用并断言 @@ -114,34 +114,34 @@ public class ImFriendServiceImplTest extends BaseMockitoUnitTest { @Test public void testUpdateFriend_displayNameOnly() { - // 准备:只传备注、不传 muted —— 走差量更新 + // 准备:只传备注、不传 silent —— 走差量更新 ImFriendUpdateReqVO reqVO = new ImFriendUpdateReqVO(); reqVO.setFriendUserId(2L); reqVO.setDisplayName("老张"); ImFriendDO friend = ImFriendDO.builder().id(100L).userId(1L).friendUserId(2L) - .muted(false).status(CommonStatusEnum.ENABLE.getStatus()).build(); + .silent(false).status(CommonStatusEnum.ENABLE.getStatus()).build(); when(imFriendMapper.selectByUserIdAndFriendUserId(1L, 2L)).thenReturn(friend); // 调用 friendService.updateFriend(1L, reqVO); - // 断言:updateById 收到 displayName 但没有 muted(MyBatis-Plus 靠 NOT_NULL 跳过) + // 断言:updateById 收到 displayName 但没有 silent(MyBatis-Plus 靠 NOT_NULL 跳过) ArgumentCaptor captor = ArgumentCaptor.forClass(ImFriendDO.class); verify(imFriendMapper).updateById(captor.capture()); assertEquals(100L, captor.getValue().getId()); assertEquals("老张", captor.getValue().getDisplayName()); - assertNull(captor.getValue().getMuted()); + assertNull(captor.getValue().getSilent()); // 断言:推送好友更新通知 verify(imWebSocketService).sendPrivateMessageAsync(eq(1L), any(ImPrivateMessageDTO.class)); } @Test public void testUpdateFriend_emptyRequest() { - // 准备:muted 和 displayName 都不传 —— 直接返回,不打 SQL 也不发推送 + // 准备:silent 和 displayName 都不传 —— 直接返回,不打 SQL 也不发推送 ImFriendUpdateReqVO reqVO = new ImFriendUpdateReqVO(); reqVO.setFriendUserId(2L); ImFriendDO friend = ImFriendDO.builder().id(100L).userId(1L).friendUserId(2L) - .muted(false).status(CommonStatusEnum.ENABLE.getStatus()).build(); + .silent(false).status(CommonStatusEnum.ENABLE.getStatus()).build(); when(imFriendMapper.selectByUserIdAndFriendUserId(1L, 2L)).thenReturn(friend); // 调用 diff --git a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImplTest.java b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImplTest.java index 82da567..b316826 100644 --- a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImplTest.java +++ b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImplTest.java @@ -233,14 +233,14 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest { when(groupMemberMapper.selectByGroupIdAndUserId(10L, 1L)).thenReturn(member); ImGroupMemberUpdateReqVO reqVO = new ImGroupMemberUpdateReqVO() - .setGroupId(10L).setMuted(true).setDisplayUserName("昵称"); + .setGroupId(10L).setSilent(true).setDisplayUserName("昵称"); groupMemberService.updateGroupMember(1L, reqVO); ArgumentCaptor captor = ArgumentCaptor.forClass(ImGroupMemberDO.class); verify(groupMemberMapper).updateById(captor.capture()); assertEquals(50L, captor.getValue().getId()); - assertTrue(captor.getValue().getMuted()); + assertTrue(captor.getValue().getSilent()); verify(webSocketService).sendGroupMessageAsync(eq(1L), any(ImGroupMessageDTO.class)); } diff --git a/yudao-module-im/src/test/resources/sql/create_tables.sql b/yudao-module-im/src/test/resources/sql/create_tables.sql index 57f6e75..1ffe858 100644 --- a/yudao-module-im/src/test/resources/sql/create_tables.sql +++ b/yudao-module-im/src/test/resources/sql/create_tables.sql @@ -64,7 +64,7 @@ CREATE TABLE IF NOT EXISTS "im_group_member" ( "user_id" bigint NOT NULL COMMENT '用户编号', "display_user_name" varchar(64) DEFAULT NULL COMMENT '组内显示名', "group_remark" varchar(64) DEFAULT NULL COMMENT '群备注', - "muted" bit DEFAULT FALSE COMMENT '是否免打扰', + "silent" bit DEFAULT FALSE COMMENT '是否免打扰', "status" tinyint NOT NULL COMMENT '成员状态', "role" tinyint NOT NULL DEFAULT 3 COMMENT '成员角色:1=群主 2=管理员 3=普通成员', "join_time" timestamp DEFAULT NULL COMMENT '入群时间', @@ -82,7 +82,7 @@ CREATE TABLE IF NOT EXISTS "im_friend" ( "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '编号', "user_id" bigint NOT NULL COMMENT '用户编号', "friend_user_id" bigint NOT NULL COMMENT '好友用户编号', - "muted" bit DEFAULT FALSE COMMENT '是否免打扰', + "silent" bit DEFAULT FALSE COMMENT '是否免打扰', "display_name" varchar(64) NOT NULL DEFAULT '' COMMENT '好友展示备注(仅自己可见)', "add_source" tinyint DEFAULT NULL COMMENT '添加来源', "pinned" bit DEFAULT FALSE COMMENT '是否置顶联系人', -- libgit2 0.21.4