diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImContentTypeEnum.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImContentTypeEnum.java index 4dffd36..2f68ad8 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImContentTypeEnum.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/enums/ImContentTypeEnum.java @@ -281,9 +281,9 @@ public enum ImContentTypeEnum implements ArrayValuable { /** * 对应 OpenIM:sdkws.GroupMemberInfoSetTips(GroupMemberInfoSetNotification 1516,窄化到 displayUserName) * 对应自己的类:GroupMemberNicknameUpdateNotification - * 场景:成员修改自己在群里的昵称,全员广播;前端按 displayUserName 局部更新对应 member + * 场景:成员修改自己在群里的昵称,在线成员同步对应 member */ - GROUP_MEMBER_NICKNAME_UPDATE(1516, "成员昵称变更", true, false), + GROUP_MEMBER_NICKNAME_UPDATE(1516, "成员昵称变更", false, false), /** * 对应 OpenIM:GroupMemberSetToAdminNotification 1517 * 对应自己的类:GroupAdminAddNotification 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 c0def09..c712a0b 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 @@ -258,7 +258,7 @@ public class ImGroupMemberServiceImpl implements ImGroupMemberService { .setId(member.getId()); groupMemberMapper.updateById(updateObj); - // 3.1 displayUserName 是公开字段,单独走 GROUP_MEMBER_NICKNAME_UPDATE 广播给全员;空串视为「清空昵称」也要广播;与旧值相同跳过 + // 3.1 displayUserName 是公开字段,单独走 GROUP_MEMBER_NICKNAME_UPDATE 在线同步给全员;空串视为「清空昵称」也要同步;与旧值相同跳过 if (updateReqVO.getDisplayUserName() != null && ObjUtil.notEqual(updateReqVO.getDisplayUserName(), member.getDisplayUserName())) { groupMessageService.sendGroupMessage(userId, ImGroupMessageSendDTO.ofGroupMemberNicknameUpdate( 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 5557c9b..ba4e0a8 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 @@ -242,7 +242,7 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest { verify(groupMemberMapper).updateById(captor.capture()); assertEquals(50L, captor.getValue().getId()); assertTrue(captor.getValue().getSilent()); - // 公开字段昵称变化 → 全员广播 GROUP_MEMBER_NICKNAME_UPDATE + // 公开字段昵称变化 → 全员在线同步 GROUP_MEMBER_NICKNAME_UPDATE verify(groupMessageService).sendGroupMessage(eq(1L), any(cn.iocoder.yudao.module.im.service.message.dto.ImGroupMessageSendDTO.class)); // 个人字段 silent 变化 → 仅自己多端同步 GROUP_MEMBER_SETTING_UPDATE verify(groupMessageService).sendGroupMessage(eq(1L), eq(ListUtil.of(1L)), diff --git a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java index 3192775..3fdf672 100644 --- a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java +++ b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java @@ -961,6 +961,20 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest { } @Test + public void testSendGroupMessage_dto_groupMemberNicknameUpdateNotInserted() { + // 准备:成员昵称变更只做在线同步,不入库 + ImGroupMessageSendDTO dto = ImGroupMessageSendDTO.ofGroupMemberNicknameUpdate(10L, 1L, "群昵称"); + when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(List.of(1L, 2L)); + + groupMessageService.sendGroupMessage(1L, dto); + + verify(groupMessageMapper, never()).insert(any(ImGroupMessageDO.class)); + verify(imWebSocketService).sendNotificationAsync(argThat((Collection ids) -> + ids.size() == 2 && ids.contains(1L) && ids.contains(2L)), + anyInt(), eq(ImContentTypeEnum.GROUP_MEMBER_NICKNAME_UPDATE.getType()), any()); + } + + @Test public void testSendGroupMessage_threeArg_explicitTargetsBypassActiveMembers() { // 准备:调用方传入显式 targets(解散场景成员已被批量 DISABLE,必须按移除前快照推送) Set targets = Set.of(1L, 2L, 3L);