From 7d6c0cc67eebc2d9325b75291c8d8ddc47e57323 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Wed, 12 Aug 2026 00:07:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20cover.py=20step3=20=E6=94=B9=E7=94=A8=20?= =?UTF-8?q?user+template=20=E6=9F=A5=E6=89=BE=E9=A2=84=E8=A7=88=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=9B=E5=88=A0=E9=99=A4=20generation.py=20?= =?UTF-8?q?=E5=86=97=E4=BD=99=20rendered=5Furl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P0 修复:预览任务创建时 plan_id 尚未存在,source_edit_plan_id 始终为空, 导致封面生成第三步查找永远匹配不到。改为按 user_id + template_id + is_preview + status=completed 查找最近预览任务。 技术债:generation.py 复用预览产物分支删除冗余 rendered_url 写入, 统一只写 rendered_storage_key。 新增 repository 方法:list_latest_completed_preview(user_id, template_id) --- .../app/api/routes/templates_editor/cover.py | 22 +++++++++---------- .../api/routes/templates_editor/generation.py | 1 - .../generation_task_repository.py | 16 ++++++++++++++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/apps/api/app/api/routes/templates_editor/cover.py b/apps/api/app/api/routes/templates_editor/cover.py index c89c9387a..c05467224 100755 --- a/apps/api/app/api/routes/templates_editor/cover.py +++ b/apps/api/app/api/routes/templates_editor/cover.py @@ -79,32 +79,32 @@ def editor_generate_cover( exc_info=True, ) - # 第三步:如果还没有,通过 source_edit_plan_id 查找最近完成的预览任务 + # 第三步:按 user + template 查找最近的已完成预览任务(兜底) if not rendered_storage_key: try: gen_task_repo = SQLAlchemyGenerationTaskRepository(db) - preview_tasks = gen_task_repo.list_by_source_edit_plan(plan_id) - # 过滤 is_preview=True + is_completed,取最新的 - completed_preview = None - for t in preview_tasks: - if getattr(t, "is_preview", False) and t.is_completed: - completed_preview = t - break # list_by_source_edit_plan 已按创建时间倒序 - if completed_preview: + preview_tasks = gen_task_repo.list_latest_completed_preview( + user_id=str(current_user.user.id), + template_id=template_id, + ) + if preview_tasks: + completed_preview = preview_tasks[0] video_repo = get_generated_video_repository(db) use_case = ListGeneratedVideosByTaskUseCase(video_repo) videos = use_case.execute(completed_preview.id) if videos: rendered_storage_key = getattr(videos[0], "file_url", "") or "" logger.info( - "封面生成: 通过 source_edit_plan_id 找到视频: plan_id=%s task_id=%s", + "封面视频: 通过 user+template 找到预览任务: plan_id=%s template_id=%s task_id=%s", plan_id, + template_id, completed_preview.id, ) except Exception: logger.warning( - "封面生成: 通过 source_edit_plan_id 查找视频失败: plan_id=%s", + "封面警告: user+template 查找预览任务失败: plan_id=%s template_id=%s", plan_id, + template_id, exc_info=True, ) diff --git a/apps/api/app/api/routes/templates_editor/generation.py b/apps/api/app/api/routes/templates_editor/generation.py index 515db2ee1..84107e7d4 100755 --- a/apps/api/app/api/routes/templates_editor/generation.py +++ b/apps/api/app/api/routes/templates_editor/generation.py @@ -96,7 +96,6 @@ def generate_editor_draft( plan_id, { "generation_task_id": reusable_task.id, - "rendered_url": rendered_url, "rendered_storage_key": rendered_url, # 统一用 rendered_storage_key }, ) diff --git a/packages/adapters/sqlalchemy_impl/generation_task_repository.py b/packages/adapters/sqlalchemy_impl/generation_task_repository.py index 6f5e61709..b0ed071af 100755 --- a/packages/adapters/sqlalchemy_impl/generation_task_repository.py +++ b/packages/adapters/sqlalchemy_impl/generation_task_repository.py @@ -148,6 +148,22 @@ class SQLAlchemyGenerationTaskRepository: ) return [_to_domain(m) for m in models] + def list_latest_completed_preview(self, user_id: str, template_id: str, limit: int = 1) -> list[GenerationTask]: + """按用户+模板查找最近已完成的预览任务。""" + models = ( + self.session.query(GenerationTaskModel) + .filter( + GenerationTaskModel.created_by_user_id == user_id, + GenerationTaskModel.template_id == template_id, + GenerationTaskModel.is_preview, + GenerationTaskModel.status == "completed", + ) + .order_by(GenerationTaskModel.created_at.desc()) + .limit(limit) + .all() + ) + return [_to_domain(m) for m in models] + def list_by_source_edit_plan(self, plan_id: str) -> list[GenerationTask]: models = ( self.session.query(GenerationTaskModel)