fix: 移除 previewTaskId 自动清除 + 从预览响应提取 source_edit_plan_id #1483

Merged
auto-approve-bot merged 1 commits from fix/preview-reuse-v2 into develop 2026-08-24 16:46:02 +08:00
Owner

问题

PR #1480 部署后,confirmGeneration 仍未被调用,任务直接走 fallback createGenerationTask 且没传 source_edit_plan_id,导致 worker 报错 "source_edit_plan_id is required"。

根因

  1. previewTaskId 被激进清除:useEffect 在素材/模板/时长/比例/标题/BGM 任一变化时清空 previewTaskId,用户修改任何设置后 previewTaskId 变 null,Step7 跳过 confirmGeneration
  2. sourceEditPlanId 始终为空:只从 URL 参数取,URL 没有 edit_plan_id 时为 null,fallback 路径不传 source_edit_plan_id

改动

  • GeneratePage: 移除清除 previewTaskId 的 useEffect,previewTaskId 持久保留直到用户明确创建新预览时才覆盖
  • GeneratePage: sourceEditPlanId 优先使用 storedSourceEditPlanId(从预览响应提取),fallback 到 URL 参数
  • CreatePreviewResponse: 新增 source_edit_plan_id? 字段
  • useStep6Cover: createPreview 成功后提取 source_edit_plan_id 并回调通知父组件
  • useGenerateFormState: 新增 storedSourceEditPlanId 状态
  • GenerateStepContent/Step6CoverSettings: 透传 onSourceEditPlanIdExtracted 回调

验证

  • Step6 自动生成封面后(createPreview 成功),previewTaskId 和 storedSourceEditPlanId 均被保存
  • 修改标题等设置后,previewTaskId 不会被清除
  • Step7 点击确认生成,走 confirmGeneration 路径复用预览产物
  • 如果 confirmGeneration 失败 fallback 到 createGenerationTask,请求中包含 source_edit_plan_id
## 问题 PR #1480 部署后,confirmGeneration 仍未被调用,任务直接走 fallback createGenerationTask 且没传 source_edit_plan_id,导致 worker 报错 "source_edit_plan_id is required"。 ## 根因 1. **previewTaskId 被激进清除**:useEffect 在素材/模板/时长/比例/标题/BGM 任一变化时清空 previewTaskId,用户修改任何设置后 previewTaskId 变 null,Step7 跳过 confirmGeneration 2. **sourceEditPlanId 始终为空**:只从 URL 参数取,URL 没有 edit_plan_id 时为 null,fallback 路径不传 source_edit_plan_id ## 改动 - **GeneratePage**: 移除清除 previewTaskId 的 useEffect,previewTaskId 持久保留直到用户明确创建新预览时才覆盖 - **GeneratePage**: sourceEditPlanId 优先使用 storedSourceEditPlanId(从预览响应提取),fallback 到 URL 参数 - **CreatePreviewResponse**: 新增 `source_edit_plan_id?` 字段 - **useStep6Cover**: createPreview 成功后提取 source_edit_plan_id 并回调通知父组件 - **useGenerateFormState**: 新增 storedSourceEditPlanId 状态 - **GenerateStepContent/Step6CoverSettings**: 透传 onSourceEditPlanIdExtracted 回调 ## 验证 - Step6 自动生成封面后(createPreview 成功),previewTaskId 和 storedSourceEditPlanId 均被保存 - 修改标题等设置后,previewTaskId 不会被清除 - Step7 点击确认生成,走 confirmGeneration 路径复用预览产物 - 如果 confirmGeneration 失败 fallback 到 createGenerationTask,请求中包含 source_edit_plan_id
xiaoxia added 1 commit 2026-08-24 16:35:16 +08:00
fix: 移除 previewTaskId 自动清除 + 从预览响应提取 source_edit_plan_id
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 26s
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
AI Code Review / AI Code Review (pull_request) Successful in 1m21s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m19s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m16s
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
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m30s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m18s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m0s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m23s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m5s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m15s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m40s
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 / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 1m13s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m27s
823a4a95ff
根因:
1. useEffect 在素材/模板/时长/比例/标题/BGM 任一变化时清空 previewTaskId,
   导致 Step7 点击确认生成时 previewTaskId 为空,跳过 confirmGeneration 直接走 fallback
2. sourceEditPlanId 只从 URL 参数取,如果 URL 没有 edit_plan_id 则为 null,
   fallback 路径 createGenerationTask 不传 source_edit_plan_id 导致 worker 报错

改动:
- GeneratePage: 移除清除 previewTaskId 的 useEffect,previewTaskId 持久保留
  直到用户明确创建新预览时才覆盖
- GeneratePage: sourceEditPlanId 优先使用 storedSourceEditPlanId(从预览响应提取),
  fallback 到 URL 参数 sourceEditPlanId
- CreatePreviewResponse: 新增 source_edit_plan_id? 字段
- useStep6Cover: createPreview 成功后提取 source_edit_plan_id 并回调通知父组件
- useGenerateFormState: 新增 storedSourceEditPlanId 状态
- GenerateStepContent/Step6CoverSettings: 透传 onSourceEditPlanIdExtracted 回调
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:0 个

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

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

良好实践

  1. [apps/web/src/pages/generate/hooks/useStep6Cover.ts] 竞态条件处理

    • 具体内容:在更新 previewTaskIdstoredSourceEditPlanId 时,使用了 previewParamsRef.current === currentFingerprint 进行校验。这有效地防止了因用户快速连续操作或网络请求乱序导致的状态不一致(即确保只处理最新请求的响应),是处理异步竞态问题的良好实践。
  2. [apps/web/src/pages/generate/GeneratePage.tsx] 向后兼容性处理

    • 具体内容:在传递 sourceEditPlanId 时使用了 storedSourceEditPlanId || sourceEditPlanId 的逻辑。这确保了如果后端旧版本未返回 source_edit_plan_idstored 为空),前端会自动降级使用原有的 sourceEditPlanId,保证了新旧接口兼容,不会破坏现有功能。
  3. [apps/web/src/api/generation/types.ts] 类型定义清晰

    • 具体内容:新增的 source_edit_plan_id 字段标记为可选 (?),并添加了清晰的 JSDoc 注释说明其用途,符合 TypeScript 最佳实践。

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


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

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:0 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 无 ### ✅ 良好实践 1. **[apps/web/src/pages/generate/hooks/useStep6Cover.ts] 竞态条件处理** - 具体内容:在更新 `previewTaskId` 和 `storedSourceEditPlanId` 时,使用了 `previewParamsRef.current === currentFingerprint` 进行校验。这有效地防止了因用户快速连续操作或网络请求乱序导致的状态不一致(即确保只处理最新请求的响应),是处理异步竞态问题的良好实践。 2. **[apps/web/src/pages/generate/GeneratePage.tsx] 向后兼容性处理** - 具体内容:在传递 `sourceEditPlanId` 时使用了 `storedSourceEditPlanId || sourceEditPlanId` 的逻辑。这确保了如果后端旧版本未返回 `source_edit_plan_id`(`stored` 为空),前端会自动降级使用原有的 `sourceEditPlanId`,保证了新旧接口兼容,不会破坏现有功能。 3. **[apps/web/src/api/generation/types.ts] 类型定义清晰** - 具体内容:新增的 `source_edit_plan_id` 字段标记为可选 (`?`),并添加了清晰的 JSDoc 注释说明其用途,符合 TypeScript 最佳实践。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-24 08:37:34 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1483 | | 预览链接 | [https://pr-1483.preview.xiaoxiajianji.com](https://pr-1483.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-08-24 16:45:31 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 2827bf5943 into develop 2026-08-24 16:46:02 +08:00
auto-approve-bot deleted branch fix/preview-reuse-v2 2026-08-24 16:46:02 +08:00

🗑️ 预览环境已清理

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

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

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