From 9ce816e247805acee441f245f6fb4b9e37b77b66 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 10:36:01 +0800 Subject: [PATCH] ✨ feat(im): 优化群邀请的 incoming、inviting 的交互 --- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/rtc/ImRtcCallServiceImpl.java | 18 ++++++++++-------- yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/rtc/ImRtcCallNotification.java | 14 +++++++++++++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/rtc/ImRtcCallServiceImpl.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/rtc/ImRtcCallServiceImpl.java index 5ef9ed5..2bf3cf3 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/rtc/ImRtcCallServiceImpl.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/rtc/ImRtcCallServiceImpl.java @@ -232,7 +232,7 @@ public class ImRtcCallServiceImpl implements ImRtcCallService { AdminUserRespDTO inviterUser = adminUserApi.getUser(inviterId); Map inviteeMap = adminUserApi.getUserMap(invitees); for (Long inviteeId : invitees) { - pushCallInviteNotification(call, inviterUser, inviteeId, inviteeMap.get(inviteeId)); + pushCallInviteNotification(call, inviterUser, inviteeId, inviteeMap.get(inviteeId), invitees); } // 3.2 群通话再向全群广播 RTC_CALL_START 入聊天流 if (ImConversationTypeEnum.isGroup(reqVO.getConversationType())) { @@ -303,7 +303,7 @@ public class ImRtcCallServiceImpl implements ImRtcCallService { AdminUserRespDTO inviter = adminUserApi.getUser(inviterId); Map inviteeMap = adminUserApi.getUserMap(incomingUserIds); for (Long inviteeId : incomingUserIds) { - pushCallInviteNotification(call, inviter, inviteeId, inviteeMap.get(inviteeId)); + pushCallInviteNotification(call, inviter, inviteeId, inviteeMap.get(inviteeId), incomingUserIds); } } @@ -820,16 +820,18 @@ public class ImRtcCallServiceImpl implements ImRtcCallService { /** * RTC_CALL(INVITE):走 webSocketService 直推到被邀请人;persistent=false 不入消息流 * - * @param call 通话主表 - * @param inviter 发起人;可空,缺失时 payload 的 inviterNickname / Avatar 留空 - * @param inviteeId 被邀请人用户编号 - * @param invitee 被邀请人;可空,缺失时 token 内 displayName 降级为 userId + * @param call 通话主表 + * @param inviter 发起人;可空,缺失时 payload 的 inviterNickname / Avatar 留空 + * @param inviteeId 被邀请人用户编号 + * @param invitee 被邀请人;可空,缺失时 token 内 displayName 降级为 userId + * @param inviteeIds 本次被邀请人列表;前端来电界面展示「邀请的其他人」用,包含 inviteeId 自身 */ private void pushCallInviteNotification(ImRtcCallDO call, AdminUserRespDTO inviter, - Long inviteeId, AdminUserRespDTO invitee) { + Long inviteeId, AdminUserRespDTO invitee, + Collection inviteeIds) { String token = signToken(inviteeId, resolveDisplayName(invitee, inviteeId), call.getRoom()); ImRtcCallNotification payload = ImRtcCallNotification.ofInvite( - call, inviter, imProperties.getRtc().getLivekitUrl(), token); + call, inviter, imProperties.getRtc().getLivekitUrl(), token, inviteeIds); webSocketService.sendPrivateMessageAsync(inviteeId, ImPrivateMessageDTO.ofRtcNotification( ImMessageTypeEnum.RTC_CALL.getType(), call.getInviterUserId(), inviteeId, payload)); } diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/rtc/ImRtcCallNotification.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/rtc/ImRtcCallNotification.java index 1608f9e..9279025 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/rtc/ImRtcCallNotification.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/websocket/dto/notification/rtc/ImRtcCallNotification.java @@ -5,6 +5,9 @@ import cn.iocoder.yudao.module.im.enums.rtc.ImRtcParticipantStatusEnum; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import lombok.Data; +import java.util.Collection; +import java.util.List; + /** * RTC_CALL 通话信令通知(通话信令统一入口) *

@@ -63,6 +66,12 @@ public class ImRtcCallNotification { * 发起人头像;INVITE 专属,前端来电界面展示 */ private String inviterAvatar; + /** + * 本次被邀请人列表;INVITE 专属,前端来电界面展示「邀请的其他人」 + * + * 注意:包含收件人自身,前端按需过滤 + */ + private List inviteeIds; // ========== REJECT 专属字段 ========== @@ -86,10 +95,12 @@ public class ImRtcCallNotification { * @param inviter 发起人;可空,缺失时 inviterNickname / inviterAvatar 留空 * @param livekitUrl LiveKit Server WebSocket 地址 * @param token 被叫的接听 Token;按收件人单独签发 + * @param inviteeIds 本次被邀请人列表;前端来电界面展示「邀请的其他人」用 * @return INVITE 信令 */ public static ImRtcCallNotification ofInvite(ImRtcCallDO call, AdminUserRespDTO inviter, - String livekitUrl, String token) { + String livekitUrl, String token, + Collection inviteeIds) { ImRtcCallNotification notification = baseOf(call, ImRtcParticipantStatusEnum.INVITING.getStatus()); notification.livekitUrl = livekitUrl; notification.token = token; @@ -98,6 +109,7 @@ public class ImRtcCallNotification { notification.inviterNickname = inviter.getNickname(); notification.inviterAvatar = inviter.getAvatar(); } + notification.inviteeIds = inviteeIds != null ? new java.util.ArrayList<>(inviteeIds) : null; return notification; } -- libgit2 0.21.4