import { CreateMovieProjectV2Request, CreateMovieProjectV3Request } from "@/api/DTO/movie_start_dto"; import { createMovieProject, createMovieProjectV2, createMovieProjectV3 } from "@/api/create_movie"; import { QueueResponse, QueueStatus, withQueuePolling, QueueResponseData } from "@/api/movie_queue"; import { message } from "antd"; /** * 电影项目创建模式 */ export enum MovieProjectMode { /** 普通模式 */ NORMAL = "normal", /** 照片生成模式 */ IMAGE = "image", /** 模板生成模式 */ TEMPLATE = "template" } /** 创建项目响应数据 */ export interface CreateProjectResponse { project_id: string; } /** * 统一的电影项目创建服务 */ export class MovieProjectService { /** * 创建电影项目 */ static async createProject( mode: MovieProjectMode, params: T ): Promise { try { let apiCall: (p: T) => Promise; switch (mode) { case MovieProjectMode.NORMAL: apiCall = createMovieProject as (p: T) => Promise; break; case MovieProjectMode.IMAGE: apiCall = createMovieProjectV2 as (p: T) => Promise; break; case MovieProjectMode.TEMPLATE: apiCall = createMovieProjectV3 as (p: T) => Promise; break; default: throw new Error(`不支持的创建模式: ${mode}`); } // 使用 withQueuePolling 包装 API 调用 const result = await withQueuePolling(apiCall, params, { interval: 5000, // 5秒轮询一次 maxAttempts: 120, // 最多轮询10分钟 onPolling: (data: QueueResponseData) => { console.log("轮询状态:", data); }, onError: (error: Error) => { if (error.message === '操作已取消') { message.info('已取消排队'); } else { message.error(error instanceof Error ? error.message : "创建项目失败"); } }, onCancel: () => { message.info('已取消排队'); } }); // 处理其他错误状态 if (result.code !== 0 && result.code !== 202) { throw new Error(result.message || "创建项目失败"); } // 从响应中提取 project_id const projectId = (result.data as any).project_id; if (!projectId) { throw new Error("创建项目失败:未返回项目ID"); } return { project_id: projectId }; } catch (error) { if (error instanceof Error && error.message === '操作已取消') { throw error; } message.error(error instanceof Error ? error.message : "创建项目失败"); throw error; } } }