政策标签功能重构总结
概述
本次重构将政策标签选择功能从单账户场景中提炼出来,创建了可复用的组件和工具函数,并新增了支持多账户批量操作的功能。
新增文件
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:
POST /api/v1/customers/policy_labels- 获取客户政策标签POST /api/v1/advertiser/batch_apply_policy_labels- 批量应用政策标签
兼容性
- ✅ 完全向后兼容,不影响现有功能
- ✅ 支持现有的单账户操作流程
- ✅ 新增的批量操作是可选功能
- ✅ 保持了原有的审批流程
测试建议
单元测试
- 工具函数的输入输出测试
- 组件的渲染测试
- 状态管理测试
集成测试
- 单账户设置流程
- 批量账户设置流程
- 审批流程
- 错误处理
边界情况
- 空标签列表
- 单个账户
- 大量账户(性能测试)
- 不同客户的账户混选
- 网络错误
- 权限不足
下一步优化建议
- 性能优化
- 对于大量账户的场景,添加虚拟滚动
-
优化 API 调用,添加请求缓存
-
功能增强
- 添加政策标签模板功能
- 添加变更预览功能
-
支持批量撤销操作
-
用户体验
- 添加操作历史记录
- 支持搜索和筛选标签
-
添加键盘快捷键
-
国际化
- 提取所有文本为常量
- 支持多语言
影响范围
直接影响
components/cellrender.tsx- ProductTagsRenderer 组件重构- 新增批量操作功能到广告账户页面
间接影响
- 其他需要政策标签选择的页面可以使用新组件
- 统一了政策标签相关的业务逻辑
不受影响
- 后端API保持不变
- 数据库结构保持不变
- 其他业务逻辑保持不变
总结
本次重构通过组件化和模块化的方式,提升了代码的可维护性和可扩展性,同时新增了批量操作功能,提高了用户的工作效率。重构遵循了以下原则:
- 最小化影响 - 保持向后兼容,不破坏现有功能
- 职责分离 - UI、业务逻辑、工具函数清晰分离
- 可复用性 - 组件和函数可在多个场景中使用
- 类型安全 - 完整的 TypeScript 类型定义
- 文档完善 - 提供详细的使用文档和示例
重构后的代码更加清晰、易维护,并为未来的功能扩展奠定了良好的基础。