fix(generate): Step5 完成按钮补调 finalize 接口,视频才真正入成品库 #2030
@@ -0,0 +1,26 @@
|
||||
import apiClient from "../client"
|
||||
|
||||
/** #2024 Step5 「完成」入库 —— 将 awaiting_cover 任务正式写入成品库 */
|
||||
export interface FinalizeGenerationRequest {
|
||||
/** 用户选定的封面图片 URL;为空则使用任务默认封面(自动截帧/智能封面) */
|
||||
cover_url?: string
|
||||
}
|
||||
|
||||
export interface FinalizeGenerationResponse {
|
||||
video_id: string
|
||||
cover_url: string
|
||||
file_url: string
|
||||
/** success=新建成功;already_finalized=幂等返回已有记录 */
|
||||
status: string
|
||||
}
|
||||
|
||||
export const finalizeGeneration = async (
|
||||
taskId: string,
|
||||
params: FinalizeGenerationRequest = {},
|
||||
): Promise<FinalizeGenerationResponse> => {
|
||||
const response = await apiClient.post<FinalizeGenerationResponse>(
|
||||
`/generation/tasks/${taskId}/finalize`,
|
||||
params,
|
||||
)
|
||||
return response.data
|
||||
}
|
||||
@@ -22,6 +22,7 @@ import { useGenerateFormState } from "./hooks/useGenerateFormState"
|
||||
import { useStepNavigation } from "./hooks/useStepNavigation"
|
||||
import { useGenerateVideo } from "./hooks/useGenerateVideo"
|
||||
import { confirmGeneration } from "@/api/generation/confirm"
|
||||
import { finalizeGeneration } from "@/api/generation/finalize"
|
||||
|
||||
import { useBatchVariantPlans } from "./hooks/useBatchVariantPlans"
|
||||
import { useTitleStyleUpdaters } from "./hooks/useStep4Title/useTitleStyleUpdaters"
|
||||
@@ -411,7 +412,7 @@ const GeneratePage: React.FC = () => {
|
||||
/* ── 最终成片(单视频) ── */
|
||||
const finalVideo = generatedVideos[0]
|
||||
|
||||
/* ── Step5 完成:调用 confirm 入库 + 跳转 ── */
|
||||
/* ── Step5 完成:先 confirm(同步标题/封面到任务)再 finalize(正式入库成品库) ── */
|
||||
const handleFinish = useCallback(async () => {
|
||||
if (finishing) return
|
||||
// 校验:单视频必须已生成;批量必须所有已选视频有封面或确认跳过
|
||||
@@ -436,24 +437,42 @@ const GeneratePage: React.FC = () => {
|
||||
? [finalVideo.generation_task_id]
|
||||
: []
|
||||
|
||||
// 单视频/批量:为每个任务调用 confirm(传入封面)
|
||||
// 第一步:confirm(同步封面+标题,把 is_preview 翻 false,任务进入/停留在 awaiting_cover)
|
||||
let confirmedTaskIds: string[] = []
|
||||
if (isBatch && previewCovers.length > 0) {
|
||||
await Promise.all(
|
||||
const results = await Promise.all(
|
||||
taskIds.map(async (taskId, idx) => {
|
||||
const coverUrl = previewCovers[idx] || ""
|
||||
return confirmGeneration(taskId, {
|
||||
const resp = await confirmGeneration(taskId, {
|
||||
cover_url: coverUrl || undefined,
|
||||
custom_title: previewTitles[idx] || titleSettings.title || "",
|
||||
})
|
||||
return resp.items?.[0]?.id || taskId
|
||||
}),
|
||||
)
|
||||
confirmedTaskIds = results
|
||||
} else if (finalVideo?.generation_task_id) {
|
||||
const coverUrl = coverSettings.thumbnail_url || coverSettings.upload_url || ""
|
||||
await confirmGeneration(finalVideo.generation_task_id, {
|
||||
const resp = await confirmGeneration(finalVideo.generation_task_id, {
|
||||
cover_url: coverUrl || undefined,
|
||||
custom_title: titleSettings.title || "",
|
||||
})
|
||||
confirmedTaskIds = [resp.items?.[0]?.id || finalVideo.generation_task_id]
|
||||
} else {
|
||||
confirmedTaskIds = taskIds
|
||||
}
|
||||
|
||||
// 第二步:finalize(真正入成品库,生成 GeneratedVideo 记录,任务推进到 completed)
|
||||
// 批量每个任务独立 finalize;单视频只 finalize 当前这一个
|
||||
const coverUrlList = isBatch
|
||||
? confirmedTaskIds.map((_, idx) => previewCovers[idx] || "")
|
||||
: [coverSettings.thumbnail_url || coverSettings.upload_url || ""]
|
||||
await Promise.all(
|
||||
confirmedTaskIds.map((tid, idx) =>
|
||||
finalizeGeneration(tid, { cover_url: coverUrlList[idx] || undefined }),
|
||||
),
|
||||
)
|
||||
|
||||
hide()
|
||||
message.success("已保存到视频库")
|
||||
navigate("/app/products")
|
||||
|
||||
Reference in New Issue
Block a user