政策标签功能重构总结

概述

本次重构将政策标签选择功能从单账户场景中提炼出来,创建了可复用的组件和工具函数,并新增了支持多账户批量操作的功能。

新增文件

1. 工具函数库

文件: lib/policy-label-utils.ts

提供了政策标签相关的核心工具函数:

  • groupPolicyLabelsByType() - 按类型分组标签
  • getPolicyTypeLabel() - 获取类型显示名称
  • getPolicyTypeColor() - 获取类型颜色
  • initializeSelectedLabels() - 初始化选中状态
  • buildBatchOperations() - 构建单账户批量操作
  • buildMultiAccountBatchOperations() - 构建多账户批量操作
  • fetchCustomerPolicyLabels() - 获取客户政策标签
  • batchApplyPolicyLabels() - 批量应用政策标签

2. 政策标签选择器组件

文件: components/policy-label-selector.tsx

可复用的政策标签选择界面组件,特性:

  • 按类型分组展示(折扣、后返、扣点、奖励)
  • 支持单选(同类型只能选一个)
  • 2列网格布局,自动截断长文本
  • 支持"不选择"选项
  • 可配置ID前缀避免冲突
  • 自定义高度

3. 批量账户政策标签对话框

文件: components/batch-account-policy-label-dialog.tsx

支持多账户批量设置政策标签的对话框组件,特性:

  • 显示所有选中的账户信息
  • 自动获取账户共同的可用标签(取交集)
  • 支持批量确认和应用
  • 处理审批流程
  • 显示操作结果统计
  • 响应式布局

4. 统一导出

文件: components/policy-label/index.ts

统一导出所有政策标签相关的组件和工具函数。

5. 文档

  • components/policy-label/README.md - 组件使用文档
  • docs/batch-policy-label-integration.md - 集成指南
  • docs/policy-label-refactor-summary.md - 重构总结(本文件)

修改的文件

components/cellrender.tsx

重构了 ProductTagsRenderer 组件:

  • 移除了内联的工具函数和UI逻辑
  • 使用新的 PolicyLabelSelector 组件
  • 简化了代码结构
  • 保持了原有功能不变

主要改进

1. 代码复用性

  • 将300+行的单一组件拆分为多个可复用的小组件
  • 提取了通用的工具函数,避免重复代码
  • 组件化设计,易于在不同场景中使用

2. 功能扩展性

  • 新增了批量操作功能,支持多账户同时设置
  • 组件参数可配置,适应不同的使用场景
  • 易于扩展新的功能(如模板、预览等)

3. 代码可维护性

  • 清晰的职责分离(UI组件、业务逻辑、工具函数)
  • 完整的类型定义
  • 详细的文档和注释
  • 统一的错误处理

4. 用户体验

  • 2列网格布局,更好地利用空间
  • 文本自动截断,避免溢出
  • 清晰的操作反馈和提示
  • 支持审批流程的完整体验

使用场景

场景1: 单账户政策标签设置

cellrender.tsx 中的 ProductTagsRenderer 已经使用了新组件。

场景2: 批量账户政策标签设置

在广告账户列表页面中集成批量操作按钮:

import { BatchAccountPolicyLabelDialog, AccountInfo } from '@/components/policy-label';

// 选择多个账户后打开对话框
<BatchAccountPolicyLabelDialog
  open={showDialog}
  onClose={() => setShowDialog(false)}
  accounts={selectedAccounts}
  onSuccess={handleRefresh}
/>

详细集成步骤见 docs/batch-policy-label-integration.md

场景3: 自定义政策标签选择器

在任何需要选择政策标签的地方:

import { PolicyLabelSelector } from '@/components/policy-label';

<PolicyLabelSelector
  availableLabels={labels}
  onSelectionChange={handleChange}
/>

技术栈

  • React 18 - 组件开发
  • TypeScript - 类型安全
  • Tailwind CSS - 样式系统
  • Radix UI - 基础UI组件(Dialog, Alert, RadioGroup等)
  • Sonner - Toast通知
  • Lucide React - 图标

API 依赖

组件依赖以下后端API:

  1. POST /api/v1/customers/policy_labels - 获取客户政策标签
  2. POST /api/v1/advertiser/batch_apply_policy_labels - 批量应用政策标签

兼容性

  • ✅ 完全向后兼容,不影响现有功能
  • ✅ 支持现有的单账户操作流程
  • ✅ 新增的批量操作是可选功能
  • ✅ 保持了原有的审批流程

测试建议

单元测试

  • 工具函数的输入输出测试
  • 组件的渲染测试
  • 状态管理测试

集成测试

  • 单账户设置流程
  • 批量账户设置流程
  • 审批流程
  • 错误处理

边界情况

  • 空标签列表
  • 单个账户
  • 大量账户(性能测试)
  • 不同客户的账户混选
  • 网络错误
  • 权限不足

下一步优化建议

  1. 性能优化
  2. 对于大量账户的场景,添加虚拟滚动
  3. 优化 API 调用,添加请求缓存

  4. 功能增强

  5. 添加政策标签模板功能
  6. 添加变更预览功能
  7. 支持批量撤销操作

  8. 用户体验

  9. 添加操作历史记录
  10. 支持搜索和筛选标签
  11. 添加键盘快捷键

  12. 国际化

  13. 提取所有文本为常量
  14. 支持多语言

影响范围

直接影响

  • components/cellrender.tsx - ProductTagsRenderer 组件重构
  • 新增批量操作功能到广告账户页面

间接影响

  • 其他需要政策标签选择的页面可以使用新组件
  • 统一了政策标签相关的业务逻辑

不受影响

  • 后端API保持不变
  • 数据库结构保持不变
  • 其他业务逻辑保持不变

总结

本次重构通过组件化和模块化的方式,提升了代码的可维护性和可扩展性,同时新增了批量操作功能,提高了用户的工作效率。重构遵循了以下原则:

  1. 最小化影响 - 保持向后兼容,不破坏现有功能
  2. 职责分离 - UI、业务逻辑、工具函数清晰分离
  3. 可复用性 - 组件和函数可在多个场景中使用
  4. 类型安全 - 完整的 TypeScript 类型定义
  5. 文档完善 - 提供详细的使用文档和示例

重构后的代码更加清晰、易维护,并为未来的功能扩展奠定了良好的基础。