forked from 77media/video-flow
90 lines
2.7 KiB
TypeScript
90 lines
2.7 KiB
TypeScript
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;
|
||
}
|
||
}
|
||
} |