fix: previewTaskId 持久化 + 配音/BGM 参数完整传递 #1485

Merged
auto-approve-bot merged 1 commits from fix/persist-preview-params into develop 2026-08-24 22:56:31 +08:00
Owner

问题

  1. 刷新页面后 previewTaskId 丢失,confirmGeneration 无法触发
  2. createPreview 和 createGenerationTask 均未传 voice_library_id,预览和最终成片没有配音
  3. BGM 配置未传给后端,预览和成片 BGM 与模板设置不一致

改动

  • usePersistedState hook(新增):基于 localStorage,key 按 editPlanId/templateId 区分,不可用时降级为 useState
  • previewTaskId/storedSourceEditPlanId 持久化:刷新页面后恢复;生成成功后清除
  • 配音参数传递:createPreview 和 createGenerationTask 请求体新增 voice_library_id(clone 模式用 selectedClonedVoice,否则用 selectedVoice),无 voice_library_id 时兜底 voice_ids
  • BGM 配置传递:两个 API 请求体新增 bgm_config(从当前模板 bgm_config 派生,受 bgm 开关控制)
  • CreateGenerationTaskRequest 类型:补充 voice_library_id 和 bgm_config
  • 生成成功回调:清除 localStorage 中的预览状态,避免下次复用旧任务

验收

  • 刷新页面后点确认生成,Network 中看到 /tasks/{id}/confirm 请求
  • 预览请求 payload 包含 voice_library_id 和 bgm_config
  • 降级创建任务请求 payload 包含 voice_library_id、voice_ids、bgm_config
  • 选择了配音的视频,预览和最终成片都有配音
## 问题 1. 刷新页面后 previewTaskId 丢失,confirmGeneration 无法触发 2. createPreview 和 createGenerationTask 均未传 voice_library_id,预览和最终成片没有配音 3. BGM 配置未传给后端,预览和成片 BGM 与模板设置不一致 ## 改动 - **usePersistedState hook(新增)**:基于 localStorage,key 按 editPlanId/templateId 区分,不可用时降级为 useState - **previewTaskId/storedSourceEditPlanId 持久化**:刷新页面后恢复;生成成功后清除 - **配音参数传递**:createPreview 和 createGenerationTask 请求体新增 voice_library_id(clone 模式用 selectedClonedVoice,否则用 selectedVoice),无 voice_library_id 时兜底 voice_ids - **BGM 配置传递**:两个 API 请求体新增 bgm_config(从当前模板 bgm_config 派生,受 bgm 开关控制) - **CreateGenerationTaskRequest 类型**:补充 voice_library_id 和 bgm_config - **生成成功回调**:清除 localStorage 中的预览状态,避免下次复用旧任务 ## 验收 - 刷新页面后点确认生成,Network 中看到 /tasks/{id}/confirm 请求 - 预览请求 payload 包含 voice_library_id 和 bgm_config - 降级创建任务请求 payload 包含 voice_library_id、voice_ids、bgm_config - 选择了配音的视频,预览和最终成片都有配音

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1485 | | 预览链接 | [https://pr-1485.preview.xiaoxiajianji.com](https://pr-1485.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia force-pushed fix/persist-preview-params from 9a9f02b8b2 to 9e55e72ba6 2026-08-24 22:35:39 +08:00 Compare
Collaborator

【阻塞级判定】

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

📊 审查概览

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

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

  1. [apps/web/src/pages/generate/hooks/useGenerateVideo.ts: 146] 配音参数回退逻辑导致预览与生成不一致
    • 问题类型:逻辑bug
    • 问题描述:
      useGenerateVideo.ts 中,当 voiceMode 为 "clone" 但未选择克隆音色(selectedClonedVoice 为空)时,代码会回退发送 voice_ids: [props.selectedVoice](即预设音色 ID)。
      而在 useStep6Cover.ts(预览逻辑)中,相同情况仅发送 voice_library_id(为空),不会发送 voice_ids
    • 后果:
      1. 功能不一致:用户在“克隆”模式下未选音色时,预览视频可能使用默认/静默音色,而最终生成的视频却使用了旧的预设音色,导致“所见非所得”。
      2. 逻辑错误:在“克隆”模式下,系统不应静默回退到“预设”模式的音色,这属于逻辑混淆,应报错或保持静默。
    • 修改建议:
      删除 useGenerateVideo.ts 中第 146 行的 voice_ids 回退逻辑,确保生成逻辑与预览逻辑(useStep6Cover.ts)保持一致。如果 voiceLibraryId 为空,则不应发送任何配音参数,或者在前端校验中拦截未选择音色的情况。

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

  1. [apps/web/src/pages/generate/hooks/usePersistedState.ts: 27] 异常处理建议增加日志

    • 具体内容:在 readFromStoragesetPersistedStatecatch 块中,目前是静默忽略错误。建议增加 console.warn,以便在 localStorage 不可用(如隐私模式)或 JSON 解析失败时,开发阶段能更容易排查问题。
  2. [apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts: 176] localStorage Key 生成依赖类型安全

    • 具体内容:代码中使用 preview_task_id_tpl_${selectedTemplate} 生成 Key。请确保 selectedTemplate 变量在此处一定是字符串 ID。如果 selectedTemplate 是对象类型,会导致 Key 变为 [object Object],导致不同模板共享同一个持久化状态,造成数据污染。

良好实践

  • usePersistedState 实现了较为完善的 localStorage 持久化逻辑,处理了 SSR/隐私模式降级、Key 变化时的状态同步等细节。
  • 新增的 bgm_configvoice_library_id 类型定义清晰,接口扩展性良好。

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

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:1 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/web/src/pages/generate/hooks/useGenerateVideo.ts: 146] 配音参数回退逻辑导致预览与生成不一致** - 问题类型:逻辑bug - 问题描述: 在 `useGenerateVideo.ts` 中,当 `voiceMode` 为 "clone" 但未选择克隆音色(`selectedClonedVoice` 为空)时,代码会回退发送 `voice_ids: [props.selectedVoice]`(即预设音色 ID)。 而在 `useStep6Cover.ts`(预览逻辑)中,相同情况仅发送 `voice_library_id`(为空),不会发送 `voice_ids`。 - 后果: 1. **功能不一致**:用户在“克隆”模式下未选音色时,预览视频可能使用默认/静默音色,而最终生成的视频却使用了旧的预设音色,导致“所见非所得”。 2. **逻辑错误**:在“克隆”模式下,系统不应静默回退到“预设”模式的音色,这属于逻辑混淆,应报错或保持静默。 - 修改建议: 删除 `useGenerateVideo.ts` 中第 146 行的 `voice_ids` 回退逻辑,确保生成逻辑与预览逻辑(`useStep6Cover.ts`)保持一致。如果 `voiceLibraryId` 为空,则不应发送任何配音参数,或者在前端校验中拦截未选择音色的情况。 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/generate/hooks/usePersistedState.ts: 27] 异常处理建议增加日志** - 具体内容:在 `readFromStorage` 和 `setPersistedState` 的 `catch` 块中,目前是静默忽略错误。建议增加 `console.warn`,以便在 localStorage 不可用(如隐私模式)或 JSON 解析失败时,开发阶段能更容易排查问题。 2. **[apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts: 176] localStorage Key 生成依赖类型安全** - 具体内容:代码中使用 `preview_task_id_tpl_${selectedTemplate}` 生成 Key。请确保 `selectedTemplate` 变量在此处一定是字符串 ID。如果 `selectedTemplate` 是对象类型,会导致 Key 变为 `[object Object]`,导致不同模板共享同一个持久化状态,造成数据污染。 ### ✅ 良好实践 - `usePersistedState` 实现了较为完善的 localStorage 持久化逻辑,处理了 SSR/隐私模式降级、Key 变化时的状态同步等细节。 - 新增的 `bgm_config` 和 `voice_library_id` 类型定义清晰,接口扩展性良好。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-24 14:42:59 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia added 1 commit 2026-08-24 22:44:58 +08:00
fix: previewTaskId 持久化 + 配音/BGM 参数完整传递
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 42s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 47s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m56s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m11s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m15s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m30s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m24s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m10s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m19s
AI Code Review / AI Code Review (pull_request) Successful in 6m51s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m39s
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 54s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m6s
3c296b6811
问题:
1. 刷新页面后 previewTaskId 丢失,confirmGeneration 无法触发
2. createPreview 和 createGenerationTask 均未传 voice_library_id,
   导致预览和最终成片都没有用户选择的配音
3. BGM 配置未传给后端,预览和成片 BGM 与模板设置不一致

改动:
- 新增 usePersistedState hook:基于 localStorage 的 state,
  key 按 editPlanId/templateId 区分,localStorage 不可用时降级为 useState
- previewTaskId 和 storedSourceEditPlanId 使用 usePersistedState,
  刷新页面后自动恢复;生成成功后清除
- useStep6Cover/createPreview 请求体新增 voice_library_id 和 bgm_config
- useGenerateVideo/createGenerationTask fallback 请求体新增
  voice_library_id(或 voice_ids)和 bgm_config
- bgmConfig 从当前模板 bgm_config 派生,受 bgm 开关控制
- 生成成功后回调清除持久化状态
- CreateGenerationTaskRequest 类型补充 voice_library_id 和 bgm_config
xiaoxia force-pushed fix/persist-preview-params from 9e55e72ba6 to 3c296b6811 2026-08-24 22:44:58 +08:00 Compare
auto-approve-bot approved these changes 2026-08-24 22:56:00 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit ccb5ed816a into develop 2026-08-24 22:56:31 +08:00
auto-approve-bot deleted branch fix/persist-preview-params 2026-08-24 22:56:32 +08:00

🗑️ 预览环境已清理

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

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

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