From ee69a51406d54357774e1a49a266f6f1dba159a7 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 24 Aug 2026 10:37:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=AD=A3=E5=BC=8F=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BC=A0=20source=5Fedit=5Fplan=5Fid?= =?UTF-8?q?=EF=BC=8C=E4=BB=85=E5=8F=96URL=E5=8F=82=E6=95=B0=E4=B8=8D?= =?UTF-8?q?=E5=9B=9E=E9=80=80=E6=A8=A1=E6=9D=BFID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 sourceEditPlanId 完整传递链路(前端→后端): - tasks/types.ts: CreateGenerationTaskRequest 新增 source_edit_plan_id 可选字段 - generate-video/types.ts: UseGenerateVideoProps 新增 sourceEditPlanId - useGenerateFormState: sourceEditPlanId = editPlanId || null selectedTemplate 是模板 ID 不是 edit_plan_id,不能混淆 - useGenerateVideo: 条件传递 source_edit_plan_id 给 createGenerationTask - GeneratePage: 从 formState 解构并传递给 useGenerateVideo - useStep6Cover: createPreview 不传 source_edit_plan_id,后端通过 template_id+user_id 兜底 --- apps/web/src/api/tasks/types.ts | 2 ++ apps/web/src/pages/generate/GeneratePage.tsx | 2 ++ .../src/pages/generate/hooks/generate-video/types.ts | 2 ++ apps/web/src/pages/generate/hooks/useCanvasPlayer.ts | 4 +++- .../generate/hooks/useGenerateFormState/index.ts | 11 +++++++++++ apps/web/src/pages/generate/hooks/useGenerateVideo.ts | 1 + 6 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/web/src/api/tasks/types.ts b/apps/web/src/api/tasks/types.ts index 27f588cda..a0652359f 100644 --- a/apps/web/src/api/tasks/types.ts +++ b/apps/web/src/api/tasks/types.ts @@ -82,6 +82,8 @@ export interface CreateGenerationTaskRequest { stroke?: boolean shadow?: boolean } + /** 来源剪辑计划 ID,后端据此从 edit_plan_clips 读取素材/音频/标题配置 */ + source_edit_plan_id?: string } /** 创建生成任务响应(对齐后端 GenerationTaskResponse) */ diff --git a/apps/web/src/pages/generate/GeneratePage.tsx b/apps/web/src/pages/generate/GeneratePage.tsx index c6bf2d163..c2954cde6 100644 --- a/apps/web/src/pages/generate/GeneratePage.tsx +++ b/apps/web/src/pages/generate/GeneratePage.tsx @@ -72,6 +72,7 @@ const GeneratePage: React.FC = () => { autoSubtitles, bgm, editPlanId, + sourceEditPlanId, previewVideo, setPreviewVideo, previewModalOpen, @@ -158,6 +159,7 @@ const GeneratePage: React.FC = () => { } = useGenerateVideo({ titleSettings, selectedTemplate, + sourceEditPlanId, selectedMaterials, materialMode, smartSelectedIds, diff --git a/apps/web/src/pages/generate/hooks/generate-video/types.ts b/apps/web/src/pages/generate/hooks/generate-video/types.ts index a1f0341c6..672c4c8b7 100755 --- a/apps/web/src/pages/generate/hooks/generate-video/types.ts +++ b/apps/web/src/pages/generate/hooks/generate-video/types.ts @@ -6,6 +6,8 @@ import type { TitleSettings } from "../../types" export interface UseGenerateVideoProps { titleSettings: TitleSettings selectedTemplate: string + /** 来源剪辑计划 ID,仅取 URL edit_plan_id,无则 null 让后端兜底 */ + sourceEditPlanId?: string | null selectedMaterials: string[] materialMode: "manual" | "auto" smartSelectedIds: string[] diff --git a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts index 24b0868b1..890061b32 100644 --- a/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts +++ b/apps/web/src/pages/generate/hooks/useCanvasPlayer.ts @@ -539,7 +539,9 @@ export function useCanvasPlayer( try { await Promise.race([ decoder.flush(), - new Promise((_, reject) => setTimeout(() => reject(new Error("flush timeout 10s")), 10_000)), + new Promise((_, reject) => + setTimeout(() => reject(new Error("flush timeout 10s")), 10_000), + ), ]) console.log(`[useCanvasPlayer] Segment ${meta.assetId}: flush complete`) } catch (e) { diff --git a/apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts b/apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts index 2ae71dc77..89ee1c7ff 100755 --- a/apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts +++ b/apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts @@ -82,6 +82,14 @@ export interface GenerateFormState { editPlanId: string | null planConfigStr: string | null + /** + * 传给后端的 source_edit_plan_id。 + * 仅使用 URL 中的 edit_plan_id(从剪辑模板编辑器跳转时携带)。 + * URL 没有时传 null,后端正式生成 API 会通过 template_id+user_id 兜底查找正确的 plan。 + * 注意:selectedTemplate 是模板 ID,不是 edit_plan_id,不能作为此值传递。 + */ + sourceEditPlanId: string | null + /* 预览弹窗 */ previewVideo: GeneratedVideo | null setPreviewVideo: (v: GeneratedVideo | null) => void @@ -93,6 +101,8 @@ export const useGenerateFormState = (): GenerateFormState => { const [searchParams] = useSearchParams() const editPlanId = searchParams.get("edit_plan_id") const planConfigStr = searchParams.get("plan_config") + /* ── source_edit_plan_id:仅取 URL 参数,无则 null 让后端兜底 ── */ + const sourceEditPlanId = editPlanId || null /* ── 步骤状态 ── */ const [currentStep, setCurrentStep] = useState(1) @@ -190,6 +200,7 @@ export const useGenerateFormState = (): GenerateFormState => { bgm, editPlanId, planConfigStr, + sourceEditPlanId, previewVideo, setPreviewVideo, previewModalOpen, diff --git a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts index 912fc6fe3..7134e43b8 100755 --- a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts +++ b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts @@ -100,6 +100,7 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { custom_title: props.titleSettings?.title || "", duration: props.duration || undefined, video_ratio: props.videoRatio, + ...(props.sourceEditPlanId ? { source_edit_plan_id: props.sourceEditPlanId } : {}), ...(props.titleSettings?.title ? { title_config: { -- 2.54.0