/** * SSE 响应数据结构 * 对应 Python 后端的 sse_response.py */ import { TaskStatusEnum, FlowStageEnum } from './enums'; // 重新导出枚举以供其他模块使用 export { TaskStatusEnum, FlowStageEnum }; // 完成状态对象 export interface CompletionStatus { total: number; completed: number; all_completed: boolean; } // 预览图对象 export interface PreviewObj { scene_id: number; prompt: string; order: number; preview_pic_url?: string; status: string; updated_at?: string; } // 角色对象 export interface CharacterObj { name: string; desc: string; image_url?: string; voice_desc: string; voice_url?: string; } // 分镜视频对象 export interface ShotObj { scene_id: number; prompt: string; order: number; transition: string; volume: number; video_url?: string; status: string; updated_at?: string; } // 背景音乐对象 export interface BgmObj { bgm_id?: number; name?: string; url?: string; status: string; } // 后期制作对象 export interface PostProductionObj { episode_status: number; is_processing: boolean; all_completed: boolean; } // 最终视频对象 export interface FinalVideoObj { video_url?: string; is_completed: boolean; } // SSE 响应数据联合类型 export type SseResponseData = | PreviewObj | CharacterObj | ShotObj | BgmObj | PostProductionObj | FinalVideoObj | null; // SSE 响应对象 export interface SseResponse { code: number; message: string; data?: SseResponseData; stage: number; stage_index: number; status: string; completion_status?: CompletionStatus; } // 使用统一的枚举 export const WorkflowStageEnum = FlowStageEnum; export const WorkflowStatusEnum = TaskStatusEnum; // 类型守卫函数 export function isPreviewObj(data: SseResponseData): data is PreviewObj { return data !== null && typeof data === 'object' && 'scene_id' in data && 'preview_pic_url' in data; } export function isCharacterObj(data: SseResponseData): data is CharacterObj { return data !== null && typeof data === 'object' && 'name' in data && 'voice_desc' in data; } export function isShotObj(data: SseResponseData): data is ShotObj { return data !== null && typeof data === 'object' && 'scene_id' in data && 'video_url' in data; } export function isBgmObj(data: SseResponseData): data is BgmObj { return data !== null && typeof data === 'object' && 'bgm_id' in data; } export function isPostProductionObj(data: SseResponseData): data is PostProductionObj { return data !== null && typeof data === 'object' && 'episode_status' in data && 'is_processing' in data; } export function isFinalVideoObj(data: SseResponseData): data is FinalVideoObj { return data !== null && typeof data === 'object' && 'video_url' in data && 'is_completed' in data; } // 工厂函数 export class SseResponseFactory { static success( stage: number = 0, stage_index: number = 0, status: string = '', message: string = '操作成功', data?: SseResponseData, completion_status?: CompletionStatus ): SseResponse { return { code: 0, stage: stage, stage_index: stage_index, status: status, message: message, data: data, completion_status: completion_status }; } static fail( stage: number = 0, stage_index: number = 0, status: string = '', code: number = 1, message: string = '操作失败', data?: SseResponseData ): SseResponse { return { code: code, stage: stage, stage_index: stage_index, status: status, message: message, data: data }; } static withCompletionStatus( stage: number, stage_index: number, status: string, message: string, completion_status: CompletionStatus ): SseResponse { return { code: 0, stage: stage, stage_index: stage_index, status: status, message: message, data: null, completion_status: completion_status }; } }