fix: source_edit_plan_id 正确传递 + clips时长与预览一致 #1473

Merged
auto-approve-bot merged 1 commits from fix/source-edit-plan-id-and-clips-consistency into develop 2026-08-23 23:46:00 +08:00
Owner

任务一:正式生成任务 source_edit_plan_id 兜底

useGenerateFormStateeditPlanId 只从 URL edit_plan_id 读取,智能剪辑正常进入时 URL 没有该参数,导致传给 Worker 的 source_edit_plan_id 为空,Worker 回退到内存重建模式。

修复:

  • 新增 sourceEditPlanId = editPlanId || selectedTemplate || null
  • selectedTemplate 由 react-query 异步加载,加载完成后组件重渲染,sourceEditPlanId 自动更新为模板 ID
  • Step2 clips 写入用的就是 selectedTemplate,所以这是同一个 edit_plan
  • GeneratePage useGenerateVideo 改用 sourceEditPlanId
  • 原始 editPlanId 保留用于 fromEditPlan 标识和 usePlanConfigLoader

任务二:预览 createPreview 传 source_edit_plan_id

useStep6CovercreatePreview 调用之前只传 template_id/asset_ids/duration/title_config,后端虽有 template_id+user_id 兜底查找,但显式传入 source_edit_plan_id: selectedTemplate 与正式生成保持一致。

任务三:buildClipsFromAssets 时长截断对齐预览播放器

逐行对比发现差异:

FrontendPreviewPlayer.buildPlaybackSegments

endTime = Math.min(startTime + segDuration, assetDuration)

buildClipsFromAssets 直接用 segDuration 没有和 assetDuration 取 min。当素材实际时长比 clamp 后的 segDuration 短时(例如模板 segment 要求 3-10 秒,素材只有 2 秒),Worker 会尝试读取不存在的片段。

修复:duration = Math.min(segDuration, assetDuration),与预览完全一致。

验证

  • TypeScript 、ESLint 、Prettier
  • GeneratePage 测试
  • 不改变量名、组件名、路由、API 路径
## 任务一:正式生成任务 source_edit_plan_id 兜底 `useGenerateFormState` 中 `editPlanId` 只从 URL `edit_plan_id` 读取,智能剪辑正常进入时 URL 没有该参数,导致传给 Worker 的 `source_edit_plan_id` 为空,Worker 回退到内存重建模式。 修复: - 新增 `sourceEditPlanId = editPlanId || selectedTemplate || null` - `selectedTemplate` 由 react-query 异步加载,加载完成后组件重渲染,`sourceEditPlanId` 自动更新为模板 ID - Step2 clips 写入用的就是 `selectedTemplate`,所以这是同一个 edit_plan - `GeneratePage` useGenerateVideo 改用 `sourceEditPlanId` - 原始 `editPlanId` 保留用于 `fromEditPlan` 标识和 `usePlanConfigLoader` ## 任务二:预览 createPreview 传 source_edit_plan_id `useStep6Cover` 的 `createPreview` 调用之前只传 template_id/asset_ids/duration/title_config,后端虽有 template_id+user_id 兜底查找,但显式传入 `source_edit_plan_id: selectedTemplate` 与正式生成保持一致。 ## 任务三:buildClipsFromAssets 时长截断对齐预览播放器 逐行对比发现差异: `FrontendPreviewPlayer.buildPlaybackSegments`: ``` endTime = Math.min(startTime + segDuration, assetDuration) ``` 原 `buildClipsFromAssets` 直接用 `segDuration` 没有和 `assetDuration` 取 min。当素材实际时长比 clamp 后的 segDuration 短时(例如模板 segment 要求 3-10 秒,素材只有 2 秒),Worker 会尝试读取不存在的片段。 修复:`duration = Math.min(segDuration, assetDuration)`,与预览完全一致。 ## 验证 - TypeScript ✅、ESLint ✅、Prettier ✅ - GeneratePage 测试 ✅ - 不改变量名、组件名、路由、API 路径
xiaoxia added 1 commit 2026-08-23 23:38:46 +08:00
fix: 确保 source_edit_plan_id 正确传递 + clips时长与预览播放器一致
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 43s
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 / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 58s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m43s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m41s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m45s
AI Code Review / AI Code Review (pull_request) Successful in 2m18s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m26s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m7s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m56s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m31s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m54s
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 9s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 43s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 46s
7df38e3149
任务一:创建正式生成任务时 source_edit_plan_id 兜底
- useGenerateFormState 新增 sourceEditPlanId:URL edit_plan_id 优先,否则回退 selectedTemplate
- selectedTemplate 异步加载后会触发重渲染,sourceEditPlanId 自动更新为正确值
- GeneratePage useGenerateVideo 调用改用 sourceEditPlanId
- editPlanId 仍保留原始 URL 值用于 fromEditPlan 标识和 usePlanConfigLoader

任务二:预览创建任务传 source_edit_plan_id
- useStep6Cover createPreview 调用新增 source_edit_plan_id: selectedTemplate
- 与正式生成保持一致,不再依赖后端 template_id+user_id 兜底查找

任务三:buildClipsFromAssets 时长截断对齐预览播放器
- FrontendPreviewPlayer.buildPlaybackSegments 中
  endTime = Math.min(startTime + segDuration, assetDuration)
- 原 buildClipsFromAssets 缺少此截断,素材实际时长比 clamp 值短时 Worker 会读到不存在的片段
- 新增 duration = Math.min(segDuration, assetDuration),与预览完全一致
- 更新文件头注释说明数据流向(预览在内存构建segments,clips写DB给Worker)
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:有建议
  • 建议级问题数量:2 个

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

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

  1. [apps/web/src/pages/generate/hooks/useStep6Cover.ts: 157] 预览与生成的 source_edit_plan_id 逻辑一致性

    • 具体内容:在该文件中,source_edit_plan_id 被硬编码为 selectedTemplate。而在 useGenerateFormState/index.ts 中,sourceEditPlanId 的逻辑是 editPlanId || selectedTemplate。如果用户正在编辑一个已有计划(URL 中存在 editPlanId),最终生成会使用 editPlanId,但预览可能使用的是 selectedTemplate(原始模板)。这可能导致预览显示的内容与最终生成结果不一致。建议确认预览逻辑是否应与生成逻辑保持一致(即优先使用 editPlanId)。
  2. [apps/web/src/pages/generate/utils/buildClipsFromAssets.ts: 60] 边界条件防护

    • 具体内容:代码中使用了 Math.min(segDuration, assetDuration) 来计算 duration。如果 assetDurationundefinedNaN(例如资源元数据加载异常或缺失),计算结果将是 NaN,这可能导致 Worker 处理失败。建议增加对 assetDuration 有效性的校验,例如使用 Math.min(segDuration, assetDuration || 0) 或提前抛出错误。

良好实践

  • [apps/web/src/pages/generate/utils/buildClipsFromAssets.ts]:修复了时长计算逻辑,使用 Math.min 确保 duration 不超过素材实际时长,有效避免了 Worker 读取越界片段的风险,并添加了清晰的注释说明修改原因,保证预览与渲染的一致性。
  • [apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts]sourceEditPlanId 的回退逻辑(editPlanId || selectedTemplate)清晰合理,并添加了详细的注释解释了异步加载和数据依赖关系。

格式检查通过 | 逻辑审查需修改 | 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-08-23 15:41:01 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:有建议 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/generate/hooks/useStep6Cover.ts: 157] 预览与生成的 source_edit_plan_id 逻辑一致性** - 具体内容:在该文件中,`source_edit_plan_id` 被硬编码为 `selectedTemplate`。而在 `useGenerateFormState/index.ts` 中,`sourceEditPlanId` 的逻辑是 `editPlanId || selectedTemplate`。如果用户正在编辑一个已有计划(URL 中存在 `editPlanId`),最终生成会使用 `editPlanId`,但预览可能使用的是 `selectedTemplate`(原始模板)。这可能导致预览显示的内容与最终生成结果不一致。建议确认预览逻辑是否应与生成逻辑保持一致(即优先使用 `editPlanId`)。 2. **[apps/web/src/pages/generate/utils/buildClipsFromAssets.ts: 60] 边界条件防护** - 具体内容:代码中使用了 `Math.min(segDuration, assetDuration)` 来计算 duration。如果 `assetDuration` 为 `undefined` 或 `NaN`(例如资源元数据加载异常或缺失),计算结果将是 `NaN`,这可能导致 Worker 处理失败。建议增加对 `assetDuration` 有效性的校验,例如使用 `Math.min(segDuration, assetDuration || 0)` 或提前抛出错误。 ### ✅ 良好实践 - **[apps/web/src/pages/generate/utils/buildClipsFromAssets.ts]**:修复了时长计算逻辑,使用 `Math.min` 确保 duration 不超过素材实际时长,有效避免了 Worker 读取越界片段的风险,并添加了清晰的注释说明修改原因,保证预览与渲染的一致性。 - **[apps/web/src/pages/generate/hooks/useGenerateFormState/index.ts]**:`sourceEditPlanId` 的回退逻辑(`editPlanId || selectedTemplate`)清晰合理,并添加了详细的注释解释了异步加载和数据依赖关系。 --- ✅ 格式检查通过 | ✅ 逻辑审查需修改 | ✅ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-23 15:41:01 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

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

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 024aca3557 into develop 2026-08-23 23:46:00 +08:00
auto-approve-bot deleted branch fix/source-edit-plan-id-and-clips-consistency 2026-08-23 23:46:00 +08:00

🗑️ 预览环境已清理

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

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

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