video-flow-b/app/service/Interaction/MovieProjectService.ts
2025-08-29 01:09:46 +08:00

90 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<T>(
mode: MovieProjectMode,
params: T
): Promise<CreateProjectResponse> {
try {
let apiCall: (p: T) => Promise<QueueResponse>;
switch (mode) {
case MovieProjectMode.NORMAL:
apiCall = createMovieProject as (p: T) => Promise<QueueResponse>;
break;
case MovieProjectMode.IMAGE:
apiCall = createMovieProjectV2 as (p: T) => Promise<QueueResponse>;
break;
case MovieProjectMode.TEMPLATE:
apiCall = createMovieProjectV3 as (p: T) => Promise<QueueResponse>;
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;
}
}
}