Commit 9ce816e247805acee441f245f6fb4b9e37b77b66

Authored by YunaiV
1 parent 70271c1c

✨ feat(im): 优化群邀请的 incoming、inviting 的交互

yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/service/rtc/ImRtcCallServiceImpl.java
... ... @@ -232,7 +232,7 @@ public class ImRtcCallServiceImpl implements ImRtcCallService {
232 232 AdminUserRespDTO inviterUser = adminUserApi.getUser(inviterId);
233 233 Map<Long, AdminUserRespDTO> inviteeMap = adminUserApi.getUserMap(invitees);
234 234 for (Long inviteeId : invitees) {
235   - pushCallInviteNotification(call, inviterUser, inviteeId, inviteeMap.get(inviteeId));
  235 + pushCallInviteNotification(call, inviterUser, inviteeId, inviteeMap.get(inviteeId), invitees);
236 236 }
237 237 // 3.2 群通话再向全群广播 RTC_CALL_START 入聊天流
238 238 if (ImConversationTypeEnum.isGroup(reqVO.getConversationType())) {
... ... @@ -303,7 +303,7 @@ public class ImRtcCallServiceImpl implements ImRtcCallService {
303 303 AdminUserRespDTO inviter = adminUserApi.getUser(inviterId);
304 304 Map<Long, AdminUserRespDTO> inviteeMap = adminUserApi.getUserMap(incomingUserIds);
305 305 for (Long inviteeId : incomingUserIds) {
306   - pushCallInviteNotification(call, inviter, inviteeId, inviteeMap.get(inviteeId));
  306 + pushCallInviteNotification(call, inviter, inviteeId, inviteeMap.get(inviteeId), incomingUserIds);
307 307 }
308 308 }
309 309  
... ... @@ -820,16 +820,18 @@ public class ImRtcCallServiceImpl implements ImRtcCallService {
820 820 /**
821 821 * RTC_CALL(INVITE):走 webSocketService 直推到被邀请人;persistent=false 不入消息流
822 822 *
823   - * @param call 通话主表
824   - * @param inviter 发起人;可空,缺失时 payload 的 inviterNickname / Avatar 留空
825   - * @param inviteeId 被邀请人用户编号
826   - * @param invitee 被邀请人;可空,缺失时 token 内 displayName 降级为 userId
  823 + * @param call 通话主表
  824 + * @param inviter 发起人;可空,缺失时 payload 的 inviterNickname / Avatar 留空
  825 + * @param inviteeId 被邀请人用户编号
  826 + * @param invitee 被邀请人;可空,缺失时 token 内 displayName 降级为 userId
  827 + * @param inviteeIds 本次被邀请人列表;前端来电界面展示「邀请的其他人」用,包含 inviteeId 自身
827 828 */
828 829 private void pushCallInviteNotification(ImRtcCallDO call, AdminUserRespDTO inviter,
829   - Long inviteeId, AdminUserRespDTO invitee) {
  830 + Long inviteeId, AdminUserRespDTO invitee,
  831 + Collection<Long> inviteeIds) {
830 832 String token = signToken(inviteeId, resolveDisplayName(invitee, inviteeId), call.getRoom());
831 833 ImRtcCallNotification payload = ImRtcCallNotification.ofInvite(
832   - call, inviter, imProperties.getRtc().getLivekitUrl(), token);
  834 + call, inviter, imProperties.getRtc().getLivekitUrl(), token, inviteeIds);
833 835 webSocketService.sendPrivateMessageAsync(inviteeId, ImPrivateMessageDTO.ofRtcNotification(
834 836 ImMessageTypeEnum.RTC_CALL.getType(), call.getInviterUserId(), inviteeId, payload));
835 837 }
... ...
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;
5 5 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
6 6 import lombok.Data;
7 7  
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
8 11 /**
9 12 * RTC_CALL 通话信令通知(通话信令统一入口)
10 13 * <p>
... ... @@ -63,6 +66,12 @@ public class ImRtcCallNotification {
63 66 * 发起人头像;INVITE 专属,前端来电界面展示
64 67 */
65 68 private String inviterAvatar;
  69 + /**
  70 + * 本次被邀请人列表;INVITE 专属,前端来电界面展示「邀请的其他人」
  71 + *
  72 + * 注意:包含收件人自身,前端按需过滤
  73 + */
  74 + private List<Long> inviteeIds;
66 75  
67 76 // ========== REJECT 专属字段 ==========
68 77  
... ... @@ -86,10 +95,12 @@ public class ImRtcCallNotification {
86 95 * @param inviter 发起人;可空,缺失时 inviterNickname / inviterAvatar 留空
87 96 * @param livekitUrl LiveKit Server WebSocket 地址
88 97 * @param token 被叫的接听 Token;按收件人单独签发
  98 + * @param inviteeIds 本次被邀请人列表;前端来电界面展示「邀请的其他人」用
89 99 * @return INVITE 信令
90 100 */
91 101 public static ImRtcCallNotification ofInvite(ImRtcCallDO call, AdminUserRespDTO inviter,
92   - String livekitUrl, String token) {
  102 + String livekitUrl, String token,
  103 + Collection<Long> inviteeIds) {
93 104 ImRtcCallNotification notification = baseOf(call, ImRtcParticipantStatusEnum.INVITING.getStatus());
94 105 notification.livekitUrl = livekitUrl;
95 106 notification.token = token;
... ... @@ -98,6 +109,7 @@ public class ImRtcCallNotification {
98 109 notification.inviterNickname = inviter.getNickname();
99 110 notification.inviterAvatar = inviter.getAvatar();
100 111 }
  112 + notification.inviteeIds = inviteeIds != null ? new java.util.ArrayList<>(inviteeIds) : null;
101 113 return notification;
102 114 }
103 115  
... ...