import http from "../http"; import axios from "axios"; export interface MeetingVO { id: number; tenantId: number; creatorId: number; creatorName?: string; hostUserId?: number; hostName?: string; title: string; meetingTime: string; participants: string; participantIds?: number[]; tags: string; audioUrl: string; audioSaveStatus?: "NONE" | "SUCCESS" | "FAILED"; audioSaveMessage?: string; summaryContent: string; analysis?: { overview?: string; keywords?: string[]; chapters?: Array<{ time?: string; title?: string; summary?: string }>; speakerSummaries?: Array<{ speaker?: string; summary?: string }>; keyPoints?: Array<{ title?: string; summary?: string; speaker?: string; time?: string }>; todos?: string[]; }; status: number; displayStatus?: number; realtimeSessionStatus?: RealtimeMeetingSessionStatus["status"]; createdAt: string; } export interface CreateMeetingCommand { id?: number; title: string; meetingTime: string; participants: string; tags: string; hostUserId?: number; hostName?: string; audioUrl?: string; asrModelId: number; summaryModelId?: number; promptId: number; useSpkId?: number; enableTextRefine?: boolean; hotWords?: string[]; } export type MeetingDTO = CreateMeetingCommand; export interface CreateRealtimeMeetingCommand { title: string; meetingTime: string; participants: string; tags: string; hostUserId?: number; hostName?: string; asrModelId: number; summaryModelId?: number; promptId: number; mode?: string; language?: string; useSpkId?: number; enablePunctuation?: boolean; enableItn?: boolean; enableTextRefine?: boolean; saveAudio?: boolean; hotWords?: string[]; } export interface UpdateMeetingBasicCommand { meetingId: number; title?: string; meetingTime?: string; tags?: string; } export type MeetingUpdateBasicDTO = UpdateMeetingBasicCommand; export interface UpdateMeetingSummaryCommand { meetingId: number; summaryContent: string; } export type MeetingUpdateSummaryDTO = UpdateMeetingSummaryCommand; export const getMeetingPage = (params: { current: number; size: number; title?: string; viewType?: "all" | "created" | "involved"; }) => { return http.get<{ code: string; data: { records: MeetingVO[]; total: number }; msg: string }>( "/api/biz/meeting/page", { params } ); }; export const createMeeting = (data: CreateMeetingCommand) => { return http.post<{ code: string; data: MeetingVO; msg: string }>( "/api/biz/meeting", data ); }; export interface RealtimeTranscriptItemDTO { speakerId?: string; speakerName?: string; content: string; startTime?: number; endTime?: number; } export interface RealtimeSocketSessionVO { sessionToken: string; path: string; expiresInSeconds: number; startMessage: Record; } export interface RealtimeSocketSessionRequest { asrModelId: number; mode?: string; language?: string; useSpkId?: number; enablePunctuation?: boolean; enableItn?: boolean; enableTextRefine?: boolean; saveAudio?: boolean; hotwords?: Array<{ hotword: string; weight: number }>; } export interface RealtimeMeetingSessionStatus { meetingId: number; status: "IDLE" | "ACTIVE" | "PAUSED_EMPTY" | "PAUSED_RESUMABLE" | "COMPLETING" | "COMPLETED"; hasTranscript: boolean; canResume: boolean; remainingSeconds: number; resumeExpireAt?: number; activeConnection: boolean; resumeConfig?: RealtimeSocketSessionRequest; } export const createRealtimeMeeting = (data: CreateRealtimeMeetingCommand) => { return http.post<{ code: string; data: MeetingVO; msg: string }>( "/api/biz/meeting/realtime/start", data ); }; export const appendRealtimeTranscripts = (meetingId: number, data: RealtimeTranscriptItemDTO[]) => { return http.post<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${meetingId}/realtime/transcripts`, data ); }; export const getRealtimeMeetingSessionStatus = (meetingId: number) => { return http.get<{ code: string; data: RealtimeMeetingSessionStatus; msg: string }>( `/api/biz/meeting/${meetingId}/realtime/session-status` ); }; export const getRealtimeMeetingSessionStatuses = (meetingIds: number[]) => { return http.post<{ code: string; data: Record; msg: string }>( "/api/biz/meeting/realtime/session-status/batch", meetingIds ); }; export const pauseRealtimeMeeting = (meetingId: number) => { return http.post<{ code: string; data: RealtimeMeetingSessionStatus; msg: string }>( `/api/biz/meeting/${meetingId}/realtime/pause`, {} ); }; export const openRealtimeMeetingSocketSession = ( meetingId: number, data: RealtimeSocketSessionRequest, ) => { return http.post<{ code: string; data: RealtimeSocketSessionVO; msg: string }>( `/api/biz/meeting/${meetingId}/realtime/socket-session`, data ); }; export const completeRealtimeMeeting = (meetingId: number, data?: { audioUrl?: string; overwriteAudio?: boolean }) => { return http.post<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${meetingId}/realtime/complete`, data || {} ); }; export const deleteMeeting = (id: number) => { return http.delete<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${id}` ); }; export interface MeetingTranscriptVO { id: number; speakerId: string; speakerName: string; speakerLabel: string; content: string; startTime: number; endTime: number; } export const getMeetingDetail = (id: number) => { return http.get<{ code: string; data: MeetingVO; msg: string }>( `/api/biz/meeting/${id}` ); }; export const getTranscripts = (id: number) => { return http.get<{ code: string; data: MeetingTranscriptVO[]; msg: string }>( `/api/biz/meeting/${id}/transcripts` ); }; export interface MeetingSpeakerUpdateDTO { meetingId: number; speakerId: string; newName: string; label: string; } export interface MeetingTranscriptUpdateDTO { meetingId: number; transcriptId: number; content: string; } export const updateSpeakerInfo = (params: MeetingSpeakerUpdateDTO) => { return http.put<{ code: string; data: boolean; msg: string }>( "/api/biz/meeting/speaker", params ); }; export const updateMeetingTranscript = (params: MeetingTranscriptUpdateDTO) => { return http.put<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${params.meetingId}/transcripts/${params.transcriptId}`, params ); }; export interface MeetingResummaryDTO { meetingId: number; summaryModelId: number; promptId: number; } export const reSummary = (params: MeetingResummaryDTO) => { return http.post<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${params.meetingId}/summary/regenerate`, params ); }; export const updateMeetingBasic = (data: UpdateMeetingBasicCommand) => { return http.put<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${data.meetingId}/basic`, data ); }; export const updateMeetingSummary = (data: UpdateMeetingSummaryCommand) => { return http.put<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${data.meetingId}/summary`, data ); }; export interface UpdateMeetingParticipantsCommand { meetingId: number; participants: string; } export type MeetingParticipantsUpdateDTO = UpdateMeetingParticipantsCommand; export const updateMeetingParticipants = (params: UpdateMeetingParticipantsCommand) => { return http.put<{ code: string; data: boolean; msg: string }>( `/api/biz/meeting/${params.meetingId}/participants`, params ); }; export const uploadAudio = (file: File) => { const formData = new FormData(); formData.append("file", file); return http.post<{ code: string; data: string; msg: string }>( "/api/biz/meeting/upload", formData, { headers: { "Content-Type": "multipart/form-data" } } ); }; export interface MeetingProgress { percent: number; message: string; updateAt: number; eta?: number; } export const getMeetingProgress = (id: number) => { return http.get<{ code: string; data: MeetingProgress; msg: string }>( `/api/biz/meeting/${id}/progress` ); }; export const downloadMeetingSummary = (id: number, format: "pdf" | "word") => { const token = localStorage.getItem("accessToken"); return axios.get(`/api/biz/meeting/${id}/summary/export`, { params: { format }, responseType: "blob", headers: token ? { Authorization: `Bearer ${token}` } : {} }); };