feat(generate): 编辑流程自动保存草稿+创建任务参数修复+轮询改新接口+清理幽灵API #1465

Merged
auto-approve-bot merged 2 commits from fix/auto-save-draft-and-api-cleanup into develop 2026-08-23 13:56:32 +08:00
Owner

改动清单

  1. Step2 自动保存草稿:选/取消素材后防抖500ms,PUT editor 保存 asset_ids
  2. Step4 自动保存草稿:标题内容/样式变化后防抖800ms,PUT editor 保存 title 对象
  3. Step6 封面带 title_config:generateCover 初始调用+预览缺失重试都带完整标题样式
  4. Step7 创建任务参数修复
    • 新增 source_edit_plan_id(来自 URL edit_plan_id)
    • cover_url 优先 thumbnail_url(AI封面),兜底 upload_url
    • CreateGenerationTaskResponse 对齐后端 {items,total},从 items[0].id 取 task_id
  5. 轮询改用新接口:GET /generation/tasks/{task_id},删除旧 GET /templates/{id}/editor/generation-status 调用;completed 后取 /results
  6. 清理7个幽灵API:getEditPlans/createEditPlan/deleteEditPlan/cancelGeneration/copyEditPlan/generateFromTemplate(@/api/templates);BGM 预设路径改为 /templates/{id}/editor/bgm/presets(templateId 透传至 BgmSelector)

不改动

  • 前5步现有交互/UI 一行不动,新增保存全部旁路静默(失败 console.warn)
  • Step5 纯前端预览不调后端
  • 保留 getEditPlan/updateEditPlan/generateEditPlan/getGenerationStatus 等仍在使用的函数
  • WebCodecs/Canvas 兜底代码保留

校验

  • TypeScript
  • ESLint --max-warnings 0
  • Prettier
  • Vitest 611 passed / 4 skipped
## 改动清单 1. **Step2 自动保存草稿**:选/取消素材后防抖500ms,PUT editor 保存 asset_ids 2. **Step4 自动保存草稿**:标题内容/样式变化后防抖800ms,PUT editor 保存 title 对象 3. **Step6 封面带 title_config**:generateCover 初始调用+预览缺失重试都带完整标题样式 4. **Step7 创建任务参数修复**: - 新增 source_edit_plan_id(来自 URL edit_plan_id) - cover_url 优先 thumbnail_url(AI封面),兜底 upload_url - CreateGenerationTaskResponse 对齐后端 {items,total},从 items[0].id 取 task_id 5. **轮询改用新接口**:GET /generation/tasks/{task_id},删除旧 GET /templates/{id}/editor/generation-status 调用;completed 后取 /results 6. **清理7个幽灵API**:getEditPlans/createEditPlan/deleteEditPlan/cancelGeneration/copyEditPlan/generateFromTemplate(@/api/templates);BGM 预设路径改为 /templates/{id}/editor/bgm/presets(templateId 透传至 BgmSelector) ## 不改动 - 前5步现有交互/UI 一行不动,新增保存全部旁路静默(失败 console.warn) - Step5 纯前端预览不调后端 - 保留 getEditPlan/updateEditPlan/generateEditPlan/getGenerationStatus 等仍在使用的函数 - WebCodecs/Canvas 兜底代码保留 ## 校验 - TypeScript ✅ - ESLint --max-warnings 0 ✅ - Prettier ✅ - Vitest 611 passed / 4 skipped ✅

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1465 | | 预览链接 | [https://pr-1465.preview.xiaoxiajianji.com](https://pr-1465.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia force-pushed fix/auto-save-draft-and-api-cleanup from fe635ef12a to 0e619a2da2 2026-08-23 13:23:37 +08:00 Compare
xiaoxia added 1 commit 2026-08-23 13:34:05 +08:00
feat(generate): 编辑流程自动保存草稿+创建任务参数修复+轮询改新接口+清理幽灵API
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 37s
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 / Validate - Migration (alembic) (pull_request) Successful in 1m4s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m13s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m59s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m31s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m19s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m30s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m1s
AI Code Review / AI Code Review (pull_request) Failing after 3m56s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 4m30s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m57s
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 15s
83491297f6
1. Step2选素材后防抖500ms自动保存asset_ids到草稿
2. Step4标题变化后防抖800ms自动保存title到草稿
3. Step6封面请求带上title_config(初始调用+预览缺失后重试)
4. Step7创建任务带source_edit_plan_id + cover_url优先thumbnail_url
5. 轮询改用GET /generation/tasks/{task_id},task_id从创建响应获取
6. 删除7个幽灵API函数:getEditPlans/createEditPlan/deleteEditPlan/
   cancelGeneration/copyEditPlan/generateFromTemplate,BGM预设路径改为
   /templates/{id}/editor/bgm/presets
7. CreateGenerationTaskResponse对齐后端批量结构{items,total}
8. 所有自动保存失败console.warn静默,不弹窗不阻塞
xiaoxia force-pushed fix/auto-save-draft-and-api-cleanup from 0e619a2da2 to 83491297f6 2026-08-23 13:34:05 +08:00 Compare
Collaborator

【阻塞级判定】

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

📊 审查概览

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

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

  1. [apps/web/src/pages/generate/hooks/useDraftAutoSave.ts: 45-71] 自动保存失败导致数据丢失
    • 问题类型:数据损坏风险
    • 问题描述:flush 函数在开始执行时将 pendingPatchRef.current 置为 null。如果在后续的 getEditPlanupdateEditPlan 过程中发生网络错误(非 AbortError),catch 块仅打印警告,而 finally 块中检查 pendingPatchRef.current 时为空(假设期间没有新的 scheduleSave 调用),导致本次需要保存的 patch 数据直接丢失,且不会触发重试。
    • 修改建议:应将 pendingPatchRef 的清空操作推迟到 updateEditPlan 成功之后;或者在 catch 块中将失败的 patch 重新放回 pendingPatchRef 以便下次重试。建议修改逻辑为:仅在 updateEditPlan 成功后才清除引用,失败时保留数据以便重试。

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

  1. [apps/web/src/pages/generate/hooks/generate-video/useGenerationPolling.ts: 32] 生成结果获取失败的提示不够明确

    • 具体内容:当 task.status === "completed"getGenerationTaskResults 请求失败时,代码会 catch 错误并调用 onComplete([])。这会导致用户看到“生成成功”但结果列表为空,容易产生困惑。建议在 getGenerationTaskResults 失败时,通过 onFailed 传递错误信息,或者在 UI 层区分“生成无结果”和“获取结果列表失败”的状态。
  2. [apps/web/src/pages/generate/hooks/useDraftAutoSave.ts: 57] GET 请求失败也导致数据丢失

    • 具体内容:与上述阻塞问题类似,如果 getEditPlan(读取当前配置)失败,代码也会直接退出,导致待保存的 patch 丢失。虽然读取失败的概率较低,但为了数据安全,建议同样实现失败重试或数据恢复机制。

良好实践

  • useGenerationPolling.ts: 重构后的轮询逻辑将 templateId 依赖改为 taskId,解耦了对草稿状态的依赖,逻辑更加健壮;且增加了对 4xx/5xx 错误的区分处理和最大重试次数限制,避免了无限轮询。
  • useDraftAutoSave.ts: 使用 AbortController 处理组件卸载时的请求取消,防止了内存泄漏和无效状态更新;使用 pendingPatchRef 合并多次快速变更,减少了不必要的网络请求。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-23 05:38:02 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:1 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/web/src/pages/generate/hooks/useDraftAutoSave.ts: 45-71] 自动保存失败导致数据丢失** - 问题类型:数据损坏风险 - 问题描述:`flush` 函数在开始执行时将 `pendingPatchRef.current` 置为 `null`。如果在后续的 `getEditPlan` 或 `updateEditPlan` 过程中发生网络错误(非 AbortError),`catch` 块仅打印警告,而 `finally` 块中检查 `pendingPatchRef.current` 时为空(假设期间没有新的 `scheduleSave` 调用),导致本次需要保存的 `patch` 数据直接丢失,且不会触发重试。 - 修改建议:应将 `pendingPatchRef` 的清空操作推迟到 `updateEditPlan` 成功之后;或者在 `catch` 块中将失败的 `patch` 重新放回 `pendingPatchRef` 以便下次重试。建议修改逻辑为:仅在 `updateEditPlan` 成功后才清除引用,失败时保留数据以便重试。 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/generate/hooks/generate-video/useGenerationPolling.ts: 32] 生成结果获取失败的提示不够明确** - 具体内容:当 `task.status === "completed"` 但 `getGenerationTaskResults` 请求失败时,代码会 `catch` 错误并调用 `onComplete([])`。这会导致用户看到“生成成功”但结果列表为空,容易产生困惑。建议在 `getGenerationTaskResults` 失败时,通过 `onFailed` 传递错误信息,或者在 UI 层区分“生成无结果”和“获取结果列表失败”的状态。 2. **[apps/web/src/pages/generate/hooks/useDraftAutoSave.ts: 57] GET 请求失败也导致数据丢失** - 具体内容:与上述阻塞问题类似,如果 `getEditPlan`(读取当前配置)失败,代码也会直接退出,导致待保存的 `patch` 丢失。虽然读取失败的概率较低,但为了数据安全,建议同样实现失败重试或数据恢复机制。 ### ✅ 良好实践 - **`useGenerationPolling.ts`**: 重构后的轮询逻辑将 `templateId` 依赖改为 `taskId`,解耦了对草稿状态的依赖,逻辑更加健壮;且增加了对 4xx/5xx 错误的区分处理和最大重试次数限制,避免了无限轮询。 - **`useDraftAutoSave.ts`**: 使用 `AbortController` 处理组件卸载时的请求取消,防止了内存泄漏和无效状态更新;使用 `pendingPatchRef` 合并多次快速变更,减少了不必要的网络请求。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-23 05:38:02 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia added 1 commit 2026-08-23 13:45:21 +08:00
fix: auto-save failure preserves patch for retry; results fetch retries before failing
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 / Validate - Type Check (mypy) (pull_request) Successful in 1m49s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m56s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m34s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m25s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m28s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m32s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m5s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m12s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m4s
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 Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web 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 7s
AI Code Review / AI Code Review (pull_request) Successful in 7m0s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m32s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 16s
9176284a78
- useDraftAutoSave: only clear pendingPatch after successful PUT;
  on GET/PUT failure merge patch back and retry with exponential
  backoff (max 5 retries), patch retained after exhaustion for
  next scheduleSave to pick up
- useGenerationPolling: getGenerationTaskResults now retries up to
  3 times before treating it as a failure; no longer silently
  returns empty list when result fetching fails
auto-approve-bot approved these changes 2026-08-23 13:55:58 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit ab381b2e74 into develop 2026-08-23 13:56:32 +08:00
auto-approve-bot deleted branch fix/auto-save-draft-and-api-cleanup 2026-08-23 13:56:32 +08:00

🗑️ 预览环境已清理

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

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

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