fix: Step2素材选择后调用/clips/from-assets,修复片段数量不足+随机起始时间 #1515

Closed
xiaoxia wants to merge 1 commits from fix/call-clips-from-assets into develop
Owner

问题

前端在用户选择素材后,本地构建 clips(每素材1个片段,start_time=0)并调用 PUT /clips 批量替换,从未调用 POST /clips/from-assets 接口。

导致:

  • 模板要求4个片段但只选了3个素材时,只生成3个片段
  • 后端 PR #1512 的随机 start_time、同素材多片段、去重逻辑从未被触发
  • 片段时间段固定从0开始

修复

  1. createClipsFromAssets 增加 requiredClipsCount 可选参数,映射到后端 required_clips_count
  2. useStep2Materials clips 同步逻辑改为:
    • PUT /clips(空数组)清空旧片段
    • POST /clips/from-assets 创建片段,required_clips_count = template.segments.length
  3. 删除已废弃的 buildClipsFromAssets.ts(无其他引用)

后端 /clips/from-assets 自动处理:

  • 素材不够时同一素材轮询切多个片段
  • 随机 start_time,不重复
  • 保证片段数 = required_clips_count

测试

  • TypeScript
  • ESLint
  • Prettier
## 问题 前端在用户选择素材后,本地构建 clips(每素材1个片段,start_time=0)并调用 `PUT /clips` 批量替换,**从未调用** `POST /clips/from-assets` 接口。 导致: - 模板要求4个片段但只选了3个素材时,只生成3个片段 - 后端 PR #1512 的随机 start_time、同素材多片段、去重逻辑从未被触发 - 片段时间段固定从0开始 ## 修复 1. **`createClipsFromAssets`** 增加 `requiredClipsCount` 可选参数,映射到后端 `required_clips_count` 2. **`useStep2Materials`** clips 同步逻辑改为: - 先 `PUT /clips`(空数组)清空旧片段 - 再 `POST /clips/from-assets` 创建片段,`required_clips_count = template.segments.length` 3. 删除已废弃的 `buildClipsFromAssets.ts`(无其他引用) 后端 `/clips/from-assets` 自动处理: - 素材不够时同一素材轮询切多个片段 - 随机 start_time,不重复 - 保证片段数 = required_clips_count ## 测试 - TypeScript ✅ - ESLint ✅ - Prettier ✅
xiaoxia added 1 commit 2026-08-27 00:24:29 +08:00
fix: Step2素材选择后调用后端/clips/from-assets接口,支持required_clips_count
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 2m58s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m0s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m3s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m46s
AI Code Review / AI Code Review (pull_request) Successful in 4m48s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 2m5s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m54s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m20s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 3m33s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 11m17s
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 / CI Gate (pull_request) Successful in 4m23s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m40s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 7m21s
3aac9fc530
问题:前端在本地构建clips(每素材1个片段,start_time=0),
未调用后端/clips/from-assets,导致:
- 模板要求4个片段但只选了3个素材时只生成3个片段
- 后端随机start_time和多片段逻辑从未被触发
- 片段时间段固定从0开始,不随机

修复:
1. createClipsFromAssets增加requiredClipsCount可选参数
2. useStep2Materials改为:先PUT /clips清空旧片段,
   再POST /clips/from-assets创建片段,传入required_clips_count=模板segments数
3. 删除已废弃的buildClipsFromAssets工具函数(无其他引用)

后端/clips/from-assets自动处理:
- 素材不够时同一素材切多个片段
- 随机start_time,不重复
- 保证片段数=required_clips_count

🚀 预览环境已部署

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

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

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

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

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

代码审查结果 - PR #1515

⚠️ 问题(2个需要修改)

  1. apps/web/src/pages/generate/hooks/useStep2Materials.ts 第105行:缺少 AbortSignal 传递,存在竞态条件风险。

    • 问题描述:代码中创建了 AbortController 并在 updateEditPlanClips 中使用了 signal,但在随后的 createClipsFromAssets 调用中未传递signal。如果组件快速卸载或依赖项变更导致 useEffect 清理函数执行,第一个请求会被中止,但第二个请求仍会继续执行并在后台完成。这可能导致旧的数据覆盖新的状态,或者产生无效的副作用。
    • 后果:可能导致数据不一致,用户看到错误的片段数据,或产生“幽灵”API 请求。
  2. apps/web/src/pages/generate/hooks/useStep2Materials.ts 第104-105行:操作非原子性导致的数据损坏风险。

    • 问题描述:逻辑分为两步:先“清空旧片段” (updateEditPlanClips(tid, [])),再“创建新片段” (createClipsFromAssets)。如果第一步成功但第二步失败(如网络抖动、后端报错),后端将处于“空片段”状态,导致用户已选的数据丢失。
    • 后果:用户数据丢失,必须重新操作,严重影响体验。

💡 建议(1个可选)

  1. apps/web/src/api/template-editor/clips.ts 第93行:建议为请求体定义明确的 TypeScript 接口,而非使用 Record<string, unknown>
    • 具体内容:虽然 Record<string, unknown> 能够通过编译,但定义明确的接口(如 interface CreateClipsBody { asset_ids: string[]; clip_type: string; required_clips_count?: number })能提供更好的类型提示和 IDE 支持,减少拼写错误。

格式检查通过 | 逻辑审查需修改 | 性能无问题


🤖 由 AI 代码审查机器人自动生成 | 2026-08-26 16:29:15 | 模型:

## 代码审查结果 - PR #1515 ### ⚠️ 问题(2个需要修改) 1. **apps/web/src/pages/generate/hooks/useStep2Materials.ts 第105行**:缺少 `AbortSignal` 传递,存在竞态条件风险。 - 问题描述:代码中创建了 `AbortController` 并在 `updateEditPlanClips` 中使用了 `signal`,但在随后的 `createClipsFromAssets` 调用中**未传递**该 `signal`。如果组件快速卸载或依赖项变更导致 `useEffect` 清理函数执行,第一个请求会被中止,但第二个请求仍会继续执行并在后台完成。这可能导致旧的数据覆盖新的状态,或者产生无效的副作用。 - 后果:可能导致数据不一致,用户看到错误的片段数据,或产生“幽灵”API 请求。 2. **apps/web/src/pages/generate/hooks/useStep2Materials.ts 第104-105行**:操作非原子性导致的数据损坏风险。 - 问题描述:逻辑分为两步:先“清空旧片段” (`updateEditPlanClips(tid, [])`),再“创建新片段” (`createClipsFromAssets`)。如果第一步成功但第二步失败(如网络抖动、后端报错),后端将处于“空片段”状态,导致用户已选的数据丢失。 - 后果:用户数据丢失,必须重新操作,严重影响体验。 ### 💡 建议(1个可选) 1. **apps/web/src/api/template-editor/clips.ts 第93行**:建议为请求体定义明确的 TypeScript 接口,而非使用 `Record<string, unknown>`。 - 具体内容:虽然 `Record<string, unknown>` 能够通过编译,但定义明确的接口(如 `interface CreateClipsBody { asset_ids: string[]; clip_type: string; required_clips_count?: number }`)能提供更好的类型提示和 IDE 支持,减少拼写错误。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-26 16:29:15 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-08-27 00:42:46 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1515 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
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 2m58s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m0s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m3s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m46s
AI Code Review / AI Code Review (pull_request) Successful in 4m48s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 2m5s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m54s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m20s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 3m33s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 11m17s
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 / CI Gate (pull_request) Successful in 4m23s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m40s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 7m21s

Pull request closed

Sign in to join this conversation.