fix: Step7 确认生成优先调用 confirmGeneration 复用预览产物,解决卡 10% 问题 #1480

Merged
auto-approve-bot merged 4 commits from fix/confirm-generation-reuse-preview into develop 2026-08-24 15:31:01 +08:00
Owner

问题

Step7 点击"确认生成"后,进度卡在 10% 永远不结束。

根因

前端调用 createGenerationTask 创建全新渲染任务,后端 worker 因 source_edit_plan_id 为空进入 failed 分支但未更新 DB 状态,导致前端轮询永远停在 running。

修复策略

  • 主路径:Step6 封面流程创建预览时,将 previewTaskId 暴露给父组件;Step7 确认生成优先调用 confirmGeneration(previewTaskId) 复用预览产物,后端直接提升为正式任务(秒出 ≤3s)
  • Fallback:无预览任务或 confirmGeneration 失败时,退回 createGenerationTask 并传递 source_edit_plan_id,后端走全量渲染

改动文件(7 个)

  • useGenerateVideo.ts:导入 confirmGeneration,新增双路径逻辑
  • useGenerateFormState/index.ts:新增 previewTaskId 共享状态
  • useStep6Cover.ts:createPreview 后回调 onPreviewTaskCreated
  • Step6CoverSettings.tsx / GenerateStepContent.tsx:透传回调
  • generate-video/types.ts:UseGenerateVideoProps 新增 previewTaskId
## 问题 Step7 点击"确认生成"后,进度卡在 10% 永远不结束。 ## 根因 前端调用 `createGenerationTask` 创建全新渲染任务,后端 worker 因 `source_edit_plan_id` 为空进入 failed 分支但未更新 DB 状态,导致前端轮询永远停在 running。 ## 修复策略 - **主路径**:Step6 封面流程创建预览时,将 `previewTaskId` 暴露给父组件;Step7 确认生成优先调用 `confirmGeneration(previewTaskId)` 复用预览产物,后端直接提升为正式任务(秒出 ≤3s) - **Fallback**:无预览任务或 `confirmGeneration` 失败时,退回 `createGenerationTask` 并传递 `source_edit_plan_id`,后端走全量渲染 ## 改动文件(7 个) - `useGenerateVideo.ts`:导入 confirmGeneration,新增双路径逻辑 - `useGenerateFormState/index.ts`:新增 previewTaskId 共享状态 - `useStep6Cover.ts`:createPreview 后回调 onPreviewTaskCreated - `Step6CoverSettings.tsx` / `GenerateStepContent.tsx`:透传回调 - `generate-video/types.ts`:UseGenerateVideoProps 新增 previewTaskId
xiaoxia added 1 commit 2026-08-24 15:03:05 +08:00
fix: Step7 确认生成优先调用 confirmGeneration 复用预览产物,解决卡 10% 问题
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 49s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 49s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Failing after 1m48s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m48s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m55s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m8s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m13s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m19s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m35s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 3m44s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
dffb642a68
根因:前端调用 createGenerationTask 创建全新渲染任务,后端 worker
因 source_edit_plan_id 为空进入 failed 分支但未更新 DB 状态,
导致前端轮询永远停在 running(卡 10%)。

修复策略:
- 主路径:Step6 封面流程创建预览时,将 previewTaskId 暴露给父组件;
  Step7 确认生成优先调用 confirmGeneration(previewTaskId) 复用预览
  产物,后端直接提升为正式任务(秒出)。
- Fallback:无预览任务或 confirmGeneration 失败时,退回
  createGenerationTask 并传递 source_edit_plan_id,后端走全量渲染。

改动文件(7 个):
- useGenerateVideo.ts:导入 confirmGeneration,新增双路径逻辑
- useGenerateFormState:新增 previewTaskId 共享状态
- useStep6Cover:createPreview 后回调 onPreviewTaskCreated
- Step6CoverSettings / GenerateStepContent:透传回调
- generate-video/types.ts:UseGenerateVideoProps 新增 previewTaskId

🚀 预览环境已部署

项目 详情
PR号 #1480
预览链接 https://pr-1480.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1480 | | 预览链接 | [https://pr-1480.preview.xiaoxiajianji.com](https://pr-1480.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-08-24 15:08:11 +08:00
fix: 素材/模板变化时自动清除 previewTaskId,防止复用过期预览产物
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 40s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 48s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Failing after 1m44s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m30s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m37s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m40s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m32s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m19s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m53s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
bc18bf170e
AI Code Review 指出:用户 Step6 生成预览后若返回修改素材或模板,
previewTaskId 仍保留会导致 Step7 复用过期产物。

新增 useEffect:previewAssetIds 或 selectedTemplate 变化时
自动 setPreviewTaskId(null),确保 confirmGeneration 只在
预览产物与当前配置一致时才被调用。
xiaoxia added 1 commit 2026-08-24 15:12:10 +08:00
fix: 补全 previewTaskId 失效条件——duration/ratio/titleSettings 变化也清除
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 21s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m57s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m21s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m51s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Failing after 1m56s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m28s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m59s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m46s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m43s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
efa5d90f43
confirmGeneration 无法覆盖预览的 duration/video_ratio/title_config,
这些参数变化后必须重新渲染预览,否则最终视频会与用户当前配置不一致。
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:是
  • 阻塞级问题数量:1 个

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

  1. [apps/web/src/pages/generate/hooks/useStep6Cover.ts: 176] 预览任务竞态条件导致数据不一致
    • 问题类型:逻辑bug
    • 问题描述:当用户在预览生成过程中修改了参数(如 titleSettings),GeneratePage 中的 useEffect 会将 previewTaskId 重置为 null。然而,useStep6Cover 中正在进行的旧任务并未被取消。当旧任务完成时,它仍会调用 onPreviewTaskCreated,将 previewTaskId 更新为旧任务的 ID。此时如果用户点击生成,系统会复用这个与当前 UI 状态不匹配的旧预览产物,导致生成的视频内容与用户预期不符。
    • 修改建议:在 useStep6Cover 中引入请求版本控制或校验机制。可以在任务开始时记录当前的参数指纹(如 titleSettings 的哈希值),在 onPreviewTaskCreated 回调中校验当前指纹是否与任务启动时一致,若不一致则忽略回调,不更新 previewTaskId

💡 改进建议(不阻塞合并)

  1. [apps/web/src/pages/generate/GeneratePage.tsx: 103] 依赖项追踪方式不稳定
    • 具体内容:使用 JSON.stringify(titleSettings) 作为 useEffect 的依赖项存在隐患。如果对象属性的顺序在不同渲染中发生变化(例如某些字段重排或动态增删),会导致字符串不一致,从而意外触发 previewTaskId 清除,影响性能或用户体验。建议使用显式的字段依赖(如 titleSettings.title, titleSettings.font 等)或使用稳定的深比较函数。

良好实践

  1. 容错机制完善useGenerateVideo.ts 中实现了 confirmGeneration 失败后自动降级到 createGenerationTask 的逻辑,保证了功能的健壮性。
  2. 状态管理清晰:通过 useGenerateFormState 集中管理 previewTaskId,并在参数变更时自动清理,思路清晰。
  3. 类型定义规范:新增的接口和状态变量都有明确的 TypeScript 类型定义。

格式检查通过 | 逻辑审查需修改 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-08-24 07:18:50 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:1 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/web/src/pages/generate/hooks/useStep6Cover.ts: 176] 预览任务竞态条件导致数据不一致** - 问题类型:逻辑bug - 问题描述:当用户在预览生成过程中修改了参数(如 `titleSettings`),`GeneratePage` 中的 `useEffect` 会将 `previewTaskId` 重置为 `null`。然而,`useStep6Cover` 中正在进行的旧任务并未被取消。当旧任务完成时,它仍会调用 `onPreviewTaskCreated`,将 `previewTaskId` 更新为旧任务的 ID。此时如果用户点击生成,系统会复用这个与当前 UI 状态不匹配的旧预览产物,导致生成的视频内容与用户预期不符。 - 修改建议:在 `useStep6Cover` 中引入请求版本控制或校验机制。可以在任务开始时记录当前的参数指纹(如 `titleSettings` 的哈希值),在 `onPreviewTaskCreated` 回调中校验当前指纹是否与任务启动时一致,若不一致则忽略回调,不更新 `previewTaskId`。 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/generate/GeneratePage.tsx: 103] 依赖项追踪方式不稳定** - 具体内容:使用 `JSON.stringify(titleSettings)` 作为 `useEffect` 的依赖项存在隐患。如果对象属性的顺序在不同渲染中发生变化(例如某些字段重排或动态增删),会导致字符串不一致,从而意外触发 `previewTaskId` 清除,影响性能或用户体验。建议使用显式的字段依赖(如 `titleSettings.title`, `titleSettings.font` 等)或使用稳定的深比较函数。 ### ✅ 良好实践 1. **容错机制完善**:`useGenerateVideo.ts` 中实现了 `confirmGeneration` 失败后自动降级到 `createGenerationTask` 的逻辑,保证了功能的健壮性。 2. **状态管理清晰**:通过 `useGenerateFormState` 集中管理 `previewTaskId`,并在参数变更时自动清理,思路清晰。 3. **类型定义规范**:新增的接口和状态变量都有明确的 TypeScript 类型定义。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-24 07:18:50 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia added 1 commit 2026-08-24 15:21:38 +08:00
fix: Step7 确认生成优先调用 confirmGeneration 复用预览产物,解决卡 10% 问题
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 42s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m4s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m47s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m10s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m15s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m16s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m14s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m59s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m36s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m54s
AI Code Review / AI Code Review (pull_request) Successful in 6m55s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 29s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 38s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m1s
0f645b01e8
根因:前端调用 createGenerationTask 创建全新渲染任务,后端 worker
因 source_edit_plan_id 为空进入 failed 分支但未更新 DB 状态,
导致前端轮询永远停在 running(卡 10%)。

修复策略:
- 主路径:Step6 封面流程创建预览时,将 previewTaskId 暴露给父组件;
  Step7 确认生成优先调用 confirmGeneration(previewTaskId) 复用预览
  产物,后端会检查预览是否完成、分辨率是否一致,满足条件直接复用秒出。
- Fallback:无预览任务或 confirmGeneration 失败时,退回
  createGenerationTask 并传递 source_edit_plan_id。
- 防过期:素材、模板、时长、比例、标题样式或 BGM 任一变化时
  自动清除 previewTaskId,避免复用过期预览。
- 防竞态:useStep6Cover 用 useRef 指纹校验,参数变化后旧任务的
  回调不会污染新状态。
- generateCount > 1 时跳过 confirmGeneration,直接走批量创建。

改动文件(7 个):
- useGenerateVideo.ts:导入 confirmGeneration,新增双路径逻辑
- useGenerateFormState/index.ts:新增 previewTaskId 共享状态
- useStep6Cover.ts:createPreview 后回调 onPreviewTaskCreated,带指纹校验
- Step6CoverSettings.tsx / GenerateStepContent.tsx:透传回调
- GeneratePage.tsx:useEffect 监听参数变化自动清除 previewTaskId
- generate-video/types.ts:UseGenerateVideoProps 新增 previewTaskId
xiaoxia force-pushed fix/confirm-generation-reuse-preview from d2270fe3bd to 0f645b01e8 2026-08-24 15:21:38 +08:00 Compare
auto-approve-bot approved these changes 2026-08-24 15:24:38 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-24 15:24:38 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 726fb225c8 into develop 2026-08-24 15:31:01 +08:00
auto-approve-bot deleted branch fix/confirm-generation-reuse-preview 2026-08-24 15:31:01 +08:00

🗑️ 预览环境已清理

PR #1480 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1480 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.