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)