feat: 成片库添加「重新查重」按钮,触发存量视频查重率重算 #1685

Merged
auto-approve-bot merged 1 commits from feature/recompute-dedup-button into develop 2026-09-04 13:55:37 +08:00
Owner

背景

后端已修复查重流程(PR #1884),新增 POST /api/v1/videos/recompute-dedup 接口。前端需要调用此接口让存量缺少查重率的视频触发重新计算。

改动

  1. api/products — 新增 recomputeDedup() 函数和 RecomputeDedupResponse 类型
  2. useRecomputeDedup hook — 封装 mutation,成功后刷新列表 + message 提示入队数量
  3. ProductLibrary 页面头部 — 「批量导出」旁新增「重新查重」按钮(ReloadOutlined 图标),带 loading 状态
  4. ProductLibrary test — mock 补充 ReloadOutlined

交互

  • 点击按钮 → 调用 POST /videos/recompute-dedup(不带 video_ids,后端扫描当前用户所有视频)
  • loading 中按钮转圈,禁用重复点击
  • 成功:已提交 N 个视频的查重任务,后台处理中所有视频查重率已是最新,无需重算
  • 失败:查重任务提交失败,请稍后重试
  • 成功后自动 invalidate products 列表 query
## 背景 后端已修复查重流程(PR #1884),新增 `POST /api/v1/videos/recompute-dedup` 接口。前端需要调用此接口让存量缺少查重率的视频触发重新计算。 ## 改动 1. **api/products** — 新增 `recomputeDedup()` 函数和 `RecomputeDedupResponse` 类型 2. **useRecomputeDedup hook** — 封装 mutation,成功后刷新列表 + message 提示入队数量 3. **ProductLibrary 页面头部** — 「批量导出」旁新增「重新查重」按钮(ReloadOutlined 图标),带 loading 状态 4. **ProductLibrary test** — mock 补充 ReloadOutlined ## 交互 - 点击按钮 → 调用 `POST /videos/recompute-dedup`(不带 video_ids,后端扫描当前用户所有视频) - loading 中按钮转圈,禁用重复点击 - 成功:`已提交 N 个视频的查重任务,后台处理中` 或 `所有视频查重率已是最新,无需重算` - 失败:`查重任务提交失败,请稍后重试` - 成功后自动 invalidate products 列表 query
xiaoxia added 1 commit 2026-09-04 13:49:14 +08:00
feat: 成片库添加「重新查重」按钮,调用 POST /videos/recompute-dedup
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped 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
AI Code Review / AI Code Review (pull_request) Successful in 1m2s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m25s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m58s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m1s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m7s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m8s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m14s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m33s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m36s
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 1s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m10s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 7s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 18s
de9b7a0e9a
- api/products: 新增 recomputeDedup() 函数和 RecomputeDedupResponse 类型
- useRecomputeDedup hook: 封装 mutation,成功后刷新列表 + 提示入队数量
- ProductLibrary 页面头部:批量导出旁增加「重新查重」按钮,带 loading 状态
- ProductLibrary test: mock 补充 ReloadOutlined
Collaborator

【阻塞级判定】

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

📊 审查概览

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

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

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

  1. [apps/web/src/pages/products/hooks/product-actions/useRecomputeDedup.ts:10] 缺少参数支持导致功能不完整

    • 具体内容:API 层 recomputeDedup 定义了可选参数 videoIds,支持对特定视频进行查重。但在 Hook 的 mutationFn 中调用时未传递任何参数,导致该功能目前只能全量重新计算,无法针对选中视频进行操作。如果用户期望选中部分视频后点击按钮只处理选中项,当前逻辑会导致行为不符。
    • 修改建议:Hook 应接收 videoIds 参数,或者从上下文中获取当前选中的视频 ID 列表传递给 API。
  2. [apps/web/src/pages/products/hooks/product-actions/useRecomputeDedup.ts:13] 无效的数据刷新策略

    • 具体内容:在 onSuccess 回调中直接调用了 queryClient.invalidateQueries({ queryKey: ["products"] })。根据 API 返回的提示信息“后台处理中”,这是一个异步耗时任务。此时立即刷新列表不仅无法获取到最新的查重结果(因为任务还在排队或处理中),还会造成不必要的网络请求和页面闪烁。
    • 修改建议:移除 invalidateQueries 调用,或者改为提示用户稍后手动刷新。如果必须自动更新,应考虑实现轮询或由后端推送更新状态。

良好实践

  • API 接口定义清晰,TypeScript 类型 RecomputeDedupResponse 完整。
  • 错误处理(onError)中包含了用户友好的提示信息。
  • UI 交互中增加了 loading 状态(isRecomputing),防止重复提交。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-09-04 05:50:16 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/products/hooks/product-actions/useRecomputeDedup.ts:10] 缺少参数支持导致功能不完整** - 具体内容:API 层 `recomputeDedup` 定义了可选参数 `videoIds`,支持对特定视频进行查重。但在 Hook 的 `mutationFn` 中调用时未传递任何参数,导致该功能目前只能全量重新计算,无法针对选中视频进行操作。如果用户期望选中部分视频后点击按钮只处理选中项,当前逻辑会导致行为不符。 - 修改建议:Hook 应接收 `videoIds` 参数,或者从上下文中获取当前选中的视频 ID 列表传递给 API。 2. **[apps/web/src/pages/products/hooks/product-actions/useRecomputeDedup.ts:13] 无效的数据刷新策略** - 具体内容:在 `onSuccess` 回调中直接调用了 `queryClient.invalidateQueries({ queryKey: ["products"] })`。根据 API 返回的提示信息“后台处理中”,这是一个异步耗时任务。此时立即刷新列表不仅无法获取到最新的查重结果(因为任务还在排队或处理中),还会造成不必要的网络请求和页面闪烁。 - 修改建议:移除 `invalidateQueries` 调用,或者改为提示用户稍后手动刷新。如果必须自动更新,应考虑实现轮询或由后端推送更新状态。 ### ✅ 良好实践 - API 接口定义清晰,TypeScript 类型 `RecomputeDedupResponse` 完整。 - 错误处理(`onError`)中包含了用户友好的提示信息。 - UI 交互中增加了 `loading` 状态(`isRecomputing`),防止重复提交。 --- ✅ 格式检查通过 | ⚠️ 逻辑审查需关注 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-09-04 05:50:16 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

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

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 475ee59408 into develop 2026-09-04 13:55:37 +08:00
auto-approve-bot deleted branch feature/recompute-dedup-button 2026-09-04 13:55:38 +08:00

🗑️ 预览环境已清理

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

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

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