gaoluyang
2026-06-24 712aa51536236d43e87273e4ce45ac5691dffad8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { requestClient } from '#/api/request';
 
export namespace ImRtcApi {
  /** 创建新通话请求 VO */
  export interface RtcCallCreateReqVO {
    conversationType: number;
    mediaType: number;
    groupId?: number;
    inviteeIds: number[]; // 被邀请的用户编号集合;私聊必传 1 个对端,群聊必传至少 1 人
  }
 
  /** 通话中追加邀请请求 VO;仅群通话可用 */
  export interface RtcCallInviteReqVO {
    room: string;
    inviteeIds: number[];
  }
 
  /** 通话会话 VO;create / join / accept / refreshToken 共用 */
  export interface RtcCallRespVO {
    room: string; // 业务通话编号(同时作为 LiveKit 房间名)
    livekitUrl: string;
    token?: string; // ENDED 状态时为 null(无需 connect LiveKit)
    conversationType: number;
    mediaType: number;
    status: number;
    endReason?: number; // 结束原因;仅 status=ENDED 时有值
    inviterId: number;
    groupId?: number;
    inviteeIds?: number[];
    joinedUserIds?: number[];
  }
 
  /** 群活跃通话查询响应;不含 token */
  export interface RtcGroupCallRespVO {
    room: string;
    groupId: number;
    mediaType: number;
    inviterId: number;
    joinedUserIds?: number[];
    inviteeIds?: number[];
  }
}
 
 
/** 创建新通话;私聊或群聊根据 conversationType 区分 */
export function createCall(data: ImRtcApi.RtcCallCreateReqVO) {
  return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/create', data);
}
 
/** 通话中追加邀请;仅群通话可用 */
export function inviteCall(data: ImRtcApi.RtcCallInviteReqVO) {
  return requestClient.post<boolean>('/im/rtc/invite', data);
}
 
/** 加入已有群通话;用于胶囊条「加入」按钮 */
export function joinCall(room: string) {
  return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/join', undefined, {
    params: { room },
  });
}
 
/** 接听通话 */
export function acceptCall(room: string) {
  return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/accept', undefined, {
    params: { room },
  });
}
 
/** 拒绝通话 */
export function rejectCall(room: string) {
  return requestClient.post<boolean>('/im/rtc/reject', undefined, {
    params: { room },
  });
}
 
/** 取消邀请;主叫接通前调用 */
export function cancelCall(room: string) {
  return requestClient.post<boolean>('/im/rtc/cancel', undefined, {
    params: { room },
  });
}
 
/** 离开通话;接通后调用 */
export function leaveCall(room: string) {
  return requestClient.post<boolean>('/im/rtc/leave', undefined, {
    params: { room },
  });
}
 
/** 振铃超时检查;RUNNING 端 timer 兜底,触发后端立即扫描该 room 的超时 INVITING(接口静默) */
export function noAnswerCallCheck(room: string) {
  return requestClient.post<boolean>(
    '/im/rtc/no-answer-call-check',
    undefined,
    { params: { room } },
  );
}
 
/** 查询当前进行中的通话;目前仅群聊场景(胶囊条),返回 null 表示无活跃通话 */
export function getActiveCall(groupId: number) {
  return requestClient.get<ImRtcApi.RtcGroupCallRespVO | null>(
    '/im/rtc/get-active-call',
    { params: { groupId } },
  );
}