refactor(products): 拆分 useProductList 为3个子Hook(202→91行, -55%) #1155

Merged
auto-approve-bot merged 4 commits from refactor/product-list-hook into develop 2026-07-30 01:15:19 +08:00
Owner

变更内容

useProductList.ts(202行)拆分为目录结构,按职责分离:

  • useProductFiltering - 筛选逻辑(搜索/状态/时间/时长/项目/复核)+ 项目选项
  • useBatchSelection - 批量选择逻辑(全选/切换/清空)
  • index.ts - 主入口,组合子Hook + useQuery数据获取

文件变化

  • 删除:hooks/useProductList.ts (202行)
  • 新增:hooks/useProductList/index.ts (91行)
  • 新增:hooks/useProductList/useProductFiltering.ts (127行)
  • 新增:hooks/useProductList/useBatchSelection.ts (42行)
  • 修改:test/pages/products/smoke.test.tsx +子模块导入

兼容性

  • 原导入路径 @/pages/products/hooks/useProductList 保持不变(目录解析到 index.ts)
  • Filters 类型从 index.ts re-export,保持向后兼容
### 变更内容 将 `useProductList.ts`(202行)拆分为目录结构,按职责分离: - **useProductFiltering** - 筛选逻辑(搜索/状态/时间/时长/项目/复核)+ 项目选项 - **useBatchSelection** - 批量选择逻辑(全选/切换/清空) - **index.ts** - 主入口,组合子Hook + useQuery数据获取 ### 文件变化 - 删除:`hooks/useProductList.ts` (202行) - 新增:`hooks/useProductList/index.ts` (91行) - 新增:`hooks/useProductList/useProductFiltering.ts` (127行) - 新增:`hooks/useProductList/useBatchSelection.ts` (42行) - 修改:`test/pages/products/smoke.test.tsx` +子模块导入 ### 兼容性 - 原导入路径 `@/pages/products/hooks/useProductList` 保持不变(目录解析到 index.ts) - `Filters` 类型从 index.ts re-export,保持向后兼容
xiaoxia added 1 commit 2026-07-29 19:08:26 +08:00
refactor(products): 拆分 useProductList 为3个子Hook(202→91行, -55%)
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 / Check if frontend-only change (pull_request) Successful in 20s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 33s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m23s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m7s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m21s
AI Code Review / AI Code Review (pull_request) Failing after 2m32s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m57s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m14s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
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 / Frontend Unit Tests (pull_request) Successful in 36s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 47s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 2m43s
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 / 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 / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 20s
39ff3c48ae
- useProductFiltering: 筛选逻辑(搜索/状态/时间/时长/项目/复核)
- useBatchSelection: 批量选择逻辑(全选/切换/清空)
- index.ts: 主入口,组合子Hook并获取数据
- 保持原路径向后兼容(目录index.ts)
- 补充 smoke test 子模块导入
xiaoxia added 1 commit 2026-07-29 21:50:56 +08:00
fix(lint): 移除未使用的 import
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 / Check if frontend-only change (pull_request) Successful in 47s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m31s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m1s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m41s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m33s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m11s
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 / Frontend Unit Tests (pull_request) Successful in 17s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 34s
AI Code Review / AI Code Review (pull_request) Failing after 4m39s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m20s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m35s
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 / 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 / CI Gate (pull_request) Successful in 19s
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
6204d28780

🚀 预览环境已部署

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

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

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

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

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

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-07-30 00:57:59 +08:00
xiaoxia added 1 commit 2026-07-30 00:58:00 +08:00
fix: products计算使用useMemo避免重复排序的性能回归
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 17s
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 / Validate - Type Check (mypy) (pull_request) Successful in 1m32s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m37s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m15s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m9s
AI Code Review / AI Code Review (pull_request) Successful in 1m53s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m49s
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m20s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m44s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m39s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m41s
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 / 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 / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 10s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 13s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 21s
6526c56bf5
Collaborator

【阻塞级判定】

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

📊 审查概览

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

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

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

  1. [apps/web/src/pages/products/hooks/useProductList/useBatchSelection.ts: 11] 性能优化:allSelected 计算建议使用 useMemo

    • 具体内容:当前 allSelected 是一个直接计算的派生状态,在组件每次渲染时都会执行 filteredProducts.every 遍历。如果产品列表较长,这会造成不必要的计算开销。建议使用 useMemo 包裹,依赖项为 [selectedIds, filteredProducts]
  2. [apps/web/src/pages/products/hooks/useProductList/useProductFiltering.ts: 40] 潜在的空指针异常风险

    • 具体内容:在搜索过滤逻辑中使用了 p.name.toLowerCase()。如果 ProductItem 中的 name 字段为 nullundefined,这将导致运行时报错。尽管这是重构代码,但建议增加防御性判断,如 p.name?.toLowerCase() ?? ""
  3. [apps/web/src/pages/products/hooks/useProductList/index.ts: 22] 日期解析的健壮性

    • 具体内容:在排序逻辑中,new Date(b.date).getTime() 假设日期字符串是有效的。如果 date 是无效格式(既不是空也不是 "—"),getTime() 将返回 NaN,导致排序结果不稳定。建议增加对 isNaN 的检查,确保无效日期被统一处理。

良好实践

  • 关注点分离:将原本庞大的 useProductList 拆分为 useProductFilteringuseBatchSelection,逻辑清晰,易于维护。
  • 状态管理优化:使用 Set<string> 管理选中 ID,查找和删除操作的时间复杂度为 O(1),性能优于数组。
  • 交互逻辑完善handleSelectAll 实现了在筛选状态下“全选/反选”时保留筛选外选中项的逻辑,符合复杂列表操作的用户体验预期。
  • 防御性编程:在 index.ts 中对 apiProducts 进行了数组类型检查,防止非数组数据导致的崩溃。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-29 17:04:03 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:有建议 - 建议级问题数量:3 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/products/hooks/useProductList/useBatchSelection.ts: 11] 性能优化:allSelected 计算建议使用 useMemo** - 具体内容:当前 `allSelected` 是一个直接计算的派生状态,在组件每次渲染时都会执行 `filteredProducts.every` 遍历。如果产品列表较长,这会造成不必要的计算开销。建议使用 `useMemo` 包裹,依赖项为 `[selectedIds, filteredProducts]`。 2. **[apps/web/src/pages/products/hooks/useProductList/useProductFiltering.ts: 40] 潜在的空指针异常风险** - 具体内容:在搜索过滤逻辑中使用了 `p.name.toLowerCase()`。如果 `ProductItem` 中的 `name` 字段为 `null` 或 `undefined`,这将导致运行时报错。尽管这是重构代码,但建议增加防御性判断,如 `p.name?.toLowerCase() ?? ""`。 3. **[apps/web/src/pages/products/hooks/useProductList/index.ts: 22] 日期解析的健壮性** - 具体内容:在排序逻辑中,`new Date(b.date).getTime()` 假设日期字符串是有效的。如果 `date` 是无效格式(既不是空也不是 "—"),`getTime()` 将返回 `NaN`,导致排序结果不稳定。建议增加对 `isNaN` 的检查,确保无效日期被统一处理。 ### ✅ 良好实践 - **关注点分离**:将原本庞大的 `useProductList` 拆分为 `useProductFiltering` 和 `useBatchSelection`,逻辑清晰,易于维护。 - **状态管理优化**:使用 `Set<string>` 管理选中 ID,查找和删除操作的时间复杂度为 O(1),性能优于数组。 - **交互逻辑完善**:`handleSelectAll` 实现了在筛选状态下“全选/反选”时保留筛选外选中项的逻辑,符合复杂列表操作的用户体验预期。 - **防御性编程**:在 `index.ts` 中对 `apiProducts` 进行了数组类型检查,防止非数组数据导致的崩溃。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-29 17:04:03 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit f15bc2f2a2 into develop 2026-07-30 01:15:19 +08:00
auto-approve-bot deleted branch refactor/product-list-hook 2026-07-30 01:15:19 +08:00

🗑️ 预览环境已清理

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

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

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