From 9ed7c050b03c696bf92cba5e2a5332ff29b82411 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 19 Jun 2026 10:05:37 -0700 Subject: [PATCH] feat(im):优化已读上报、群详情缓存与 RTC 通话状态 --- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java | 10 ++++++++-- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/message/dto/ImGroupMessageSendDTO.java | 6 +++++- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/notification/group/GroupInfoUpdateNotification.java | 10 +++++++++- yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImplTest.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java index 21e72f1..93fa996 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java @@ -149,7 +149,9 @@ public class ImGroupServiceImpl implements ImGroupService { boolean nameChanged = StrUtil.isNotEmpty(updateReqVO.getName()); boolean noticeChanged = updateReqVO.getNotice() != null; boolean avatarChanged = StrUtil.isNotEmpty(updateReqVO.getAvatar()); - if (nameChanged || noticeChanged || avatarChanged) { + boolean joinApprovalChanged = updateReqVO.getJoinApproval() != null + && ObjUtil.notEqual(group.getJoinApproval(), updateReqVO.getJoinApproval()); + if (nameChanged || noticeChanged || avatarChanged || joinApprovalChanged) { List memberUserIds = groupMemberService.getActiveGroupMemberUserIdsByGroupId(groupId); if (nameChanged) { groupMessageService.sendGroupMessage(userId, memberUserIds, ImGroupMessageSendDTO.ofGroupNameUpdate( @@ -161,7 +163,11 @@ public class ImGroupServiceImpl implements ImGroupService { } if (avatarChanged) { groupMessageService.sendGroupMessage(userId, memberUserIds, ImGroupMessageSendDTO.ofGroupInfoUpdate( - groupId, userId, group.getAvatar(), updateReqVO.getAvatar())); + groupId, userId, group.getAvatar(), updateReqVO.getAvatar(), null, null)); + } + if (joinApprovalChanged) { + groupMessageService.sendGroupMessage(userId, memberUserIds, ImGroupMessageSendDTO.ofGroupInfoUpdate( + groupId, userId, null, null, group.getJoinApproval(), updateReqVO.getJoinApproval())); } } 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 749b5c5..87a7f88 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 @@ -63,11 +63,15 @@ public class ImGroupMessageSendDTO { .setType(ImContentTypeEnum.GROUP_CREATE.getType()).setContent(notification); } - public static ImGroupMessageSendDTO ofGroupInfoUpdate(Long groupId, Long operatorUserId, String oldAvatar, String newAvatar) { + public static ImGroupMessageSendDTO ofGroupInfoUpdate(Long groupId, Long operatorUserId, + String oldAvatar, String newAvatar, + Boolean oldJoinApproval, Boolean newJoinApproval) { GroupInfoUpdateNotification notification = new GroupInfoUpdateNotification(); notification.setOperatorUserId(operatorUserId); notification.setOldAvatar(oldAvatar); notification.setNewAvatar(newAvatar); + notification.setOldJoinApproval(oldJoinApproval); + notification.setNewJoinApproval(newJoinApproval); return new ImGroupMessageSendDTO().setGroupId(groupId) .setType(ImContentTypeEnum.GROUP_INFO_UPDATE.getType()).setContent(notification); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/notification/group/GroupInfoUpdateNotification.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/notification/group/GroupInfoUpdateNotification.java index 976c0b7..7dbe87c 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/notification/group/GroupInfoUpdateNotification.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/notification/group/GroupInfoUpdateNotification.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.service.websocket.notification.group; import lombok.Data; /** - * 群信息变更事件通知(当前承载头像变更,NAME / NOTICE 走独立事件) + * 群信息变更事件通知(NAME / NOTICE 走独立事件) */ @Data public class GroupInfoUpdateNotification extends BaseGroupNotification { @@ -16,5 +16,13 @@ public class GroupInfoUpdateNotification extends BaseGroupNotification { * 新群头像 */ private String newAvatar; + /** + * 旧进群审批开关 + */ + private Boolean oldJoinApproval; + /** + * 新进群审批开关 + */ + private Boolean newJoinApproval; } diff --git a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImplTest.java b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImplTest.java index 5783776..d75e363 100644 --- a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImplTest.java +++ b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImplTest.java @@ -209,6 +209,58 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest { } } + @Test + public void testUpdateGroup_joinApprovalChanged() { + try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { + springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(ImGroupServiceImpl.class))) + .thenReturn(groupService); + + // 准备 + ImGroupDO group = ImGroupDO.builder().id(10L).name("群").ownerUserId(1L) + .joinApproval(false).status(CommonStatusEnum.ENABLE.getStatus()).build(); + when(groupMapper.selectById(10L)).thenReturn(group); + + ImGroupUpdateReqVO reqVO = new ImGroupUpdateReqVO(); + reqVO.setId(10L); + reqVO.setJoinApproval(true); + + // 调用 + ImGroupDO result = groupService.updateGroup(reqVO, 1L); + + // 断言 + verify(groupMapper).updateById(any(ImGroupDO.class)); + assertTrue(result.getJoinApproval()); + ArgumentCaptor dtoCaptor = ArgumentCaptor.forClass(ImGroupMessageSendDTO.class); + verify(groupMessageService).sendGroupMessage(eq(1L), anyCollection(), dtoCaptor.capture()); + assertEquals(ImContentTypeEnum.GROUP_INFO_UPDATE.getType(), dtoCaptor.getValue().getType()); + } + } + + @Test + public void testUpdateGroup_joinApprovalSame() { + try (MockedStatic springUtilMockedStatic = mockStatic(SpringUtil.class)) { + springUtilMockedStatic.when(() -> SpringUtil.getBean(eq(ImGroupServiceImpl.class))) + .thenReturn(groupService); + + // 准备 + ImGroupDO group = ImGroupDO.builder().id(10L).name("群").ownerUserId(1L) + .joinApproval(true).status(CommonStatusEnum.ENABLE.getStatus()).build(); + when(groupMapper.selectById(10L)).thenReturn(group); + + ImGroupUpdateReqVO reqVO = new ImGroupUpdateReqVO(); + reqVO.setId(10L); + reqVO.setJoinApproval(true); + + // 调用 + ImGroupDO result = groupService.updateGroup(reqVO, 1L); + + // 断言 + verify(groupMapper).updateById(any(ImGroupDO.class)); + assertTrue(result.getJoinApproval()); + verify(groupMessageService, never()).sendGroupMessage(anyLong(), anyCollection(), any()); + } + } + // ========== dissolveGroup ========== @Test -- libgit2 0.21.4