소스 검색

feat(story): 添加故事011.007 - 使用mini-charts包重构数据统计图表

- 创建新故事011.007,使用mini-charts包替换纯CSS图表实现
- 更新史诗011文档,故事拆分从6个增加到7个
- 详细规划6个图表的重构任务(残疾类型、性别、年龄、户籍、在职状态、薪资)
- 添加数据转换逻辑、组件使用指南和迁移策略
- 保持现有性能优化(懒加载、数据缓存)和交互功能(tooltip)

依赖:
- 故事011.005(数据统计功能实现)
- 史诗016(mini-charts 包)已完成016.001-016.009

🤖 Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 3 주 전
부모
커밋
5537058bc4
2개의 변경된 파일296개의 추가작업 그리고 3개의 파일을 삭제
  1. 35 3
      docs/prd/epic-011-employer-mini-program-implementation.md
  2. 261 0
      docs/stories/011.007.story.md

+ 35 - 3
docs/prd/epic-011-employer-mini-program-implementation.md

@@ -6,8 +6,8 @@
 ## 状态更新(2025-12-24)
 - **依赖状态**:史诗012完成5/6核心故事(83%),MVP API就绪
 - **启动建议**:史诗011可以立即开始开发
-- **调整说明**:故事011.006需调整企业设置页功能实现(系统设置API延期至P2优先级)
-- **故事拆分**:史诗拆分为6个故事,便于逐步开发和测试
+- **调整说明**:故事011.006需调整企业设置页功能实现(系统设置API延期至P2优先级),故事011.007使用 mini-charts 包重构数据统计图表
+- **故事拆分**:史诗拆分为7个故事,便于逐步开发和测试
 - **整体进度**:故事011.001已完成,故事011.002已完成,故事011.003已完成,故事011.004已完成(订单管理功能完整实现),故事011.005已完成(数据统计功能完整实现,布局渲染优化),故事011.006未开始
 - **故事011.001完成情况**:基础框架搭建完成,包含API客户端集成、路由配置、布局组件、企业认证框架,所有测试通过,现有功能适配为企业用户使用
 - **故事011.002完成情况**:登录页面UI更新完成(严格对照原型设计),首页仪表板实现完整,认证状态管理增强(自动token刷新),集成测试通过(23个测试),已集成Navbar导航栏组件,统一页面层级结构
@@ -15,6 +15,7 @@
 - **故事011.004完成情况**:订单管理功能完整实现,包含订单列表页(搜索、筛选、分页)、订单详情页(仅查看功能)、打卡日历视图、时间范围筛选、打卡数据导出、视频播放/下载/分享、批量视频下载、企业专用订单API客户端集成(enterpriseOrderClient)、RPC类型推断实现、Navbar导航栏组件集成、Taro适配优化,通过类型检查,故事状态为Ready for Review
 - **故事011.005完成情况**:数据统计功能完整实现,包含6个统计图表(残疾类型、性别、年龄、户籍、在职状态、薪资分布)、4个统计卡片(在职人数、平均薪资、在职率、新增人数)、Taro原生Picker日期选择器、布局渲染优化(所有View容器添加flex flex-col确保正确垂直排列)、图表标题间距优化(使用mt-3实现正确间距)、性能优化(懒加载、数据缓存、React.memo),严格对照原型设计实现,通过类型检查,故事状态为Ready for Review
 - **故事011.006完成情况**:视频与系统管理功能尚未开始,故事状态为Draft,依赖系统设置API延期(P2优先级),需调整实现计划
+- **故事011.007完成情况**:使用 mini-charts 包重构数据统计图表尚未开始,故事状态为Draft,依赖史诗016(mini-charts 包)和故事011.005
 - **导航栏集成状态**:所有用人小程序页面已完成Navbar组件集成,建立统一的页面层级结构规范,主页面使用YongrenTabBarLayout+Navbar(无返回按钮),二级页面使用Navbar(带返回按钮,移除YongrenTabBarLayout包裹),已验证类型检查通过
 - **布局渲染优化状态**:所有用人小程序页面已完成Taro小程序布局优化,确保View容器内的Text组件正确垂直排列,避免内联显示导致的布局问题
 
@@ -192,6 +193,36 @@
 - [ ] 账号管理、安全设置等高级功能标记为"后期优化"(因系统设置API延期)
 - [ ] 页面设计符合原型标准,与系统其他部分无缝集成
 
+### 故事011.007:使用 mini-charts 包重构数据统计图表
+**背景:** 依赖故事011.005完成的数据统计功能和史诗016提供的 mini-charts 图表组件包,使用专业的图表组件替换现有的纯CSS实现,提升数据可视化体验和交互功能。
+
+**任务列表:**
+1. 分析 mini-charts 包的可用组件和API(ColumnChart、PieChart、LineChart 等)
+2. 重构残疾类型分布图表,使用 ColumnChart 组件替换纯CSS实现
+3. 重构性别分布图表,使用 ColumnChart 组件替换纯CSS实现
+4. 重构年龄分布图表,使用 PieChart 组件替换纯CSS实现
+5. 重构户籍省份分布图表,使用横向 ColumnChart 组件替换纯CSS实现
+6. 重构在职状态统计图表,使用 PieChart(环形图)组件替换纯CSS实现
+7. 重构薪资分布图表,使用横向 ColumnChart 组件替换纯CSS实现
+8. 验证性能优化和用户体验(懒加载、数据缓存、tooltip 交互)
+9. 编写集成测试和文档更新
+
+**验收标准:**
+- [ ] 数据统计页使用 mini-charts 包的图表组件替换所有纯CSS实现
+- [ ] 残疾类型分布使用 ColumnChart 组件显示
+- [ ] 性别分布使用 ColumnChart 组件显示
+- [ ] 年龄分布使用 PieChart 组件显示
+- [ ] 户籍省份分布使用横向 ColumnChart 组件显示
+- [ ] 在职状态统计使用 PieChart(环形图)组件显示
+- [ ] 薪资分布使用横向 ColumnChart 组件显示
+- [ ] 图表支持 tooltip 交互,显示详细数据
+- [ ] 保持现有的性能优化(懒加载、数据缓存)
+- [ ] 通过类型检查和测试验证
+
+**依赖关系:**
+- 依赖故事011.005(数据统计功能实现)
+- 依赖史诗016(mini-charts 包)- 已完成 016.001-016.009 故事
+
 ## 兼容性要求
 
 - [x] 现有mini项目功能适配为企业用户使用(登录、个人资料页面已改造,注册功能由管理员管理)
@@ -230,7 +261,7 @@
 
 ## 完成定义
 
-- [ ] 所有6个故事完成,验收标准全部满足
+- [ ] 所有7个故事完成,验收标准全部满足
 - [ ] 8个页面功能完整,符合原型设计要求
 - [ ] API集成测试通过,包括正常流程和异常情况测试
 - [ ] 现有功能回归测试通过,确保无功能退化
@@ -258,6 +289,7 @@
 |------|----------|--------|
 | 2025-12-22 | 初始状态更新,故事011.001-011.004已完成 | Claude Code |
 | 2025-12-24 | 故事011.005完成:数据统计功能完整实现,布局渲染优化,日期选择器改进 | Claude Code |
+| 2025-12-24 | 添加故事011.007:使用 mini-charts 包重构数据统计图表 | Claude Code |
 
 ## 测试策略
 

+ 261 - 0
docs/stories/011.007.story.md

@@ -0,0 +1,261 @@
+# 故事 011.007:使用 mini-charts 包重构数据统计图表
+
+## 状态
+Draft
+
+## 故事
+**作为**企业用户,
+**我希望**使用专业的图表组件展示数据统计,
+**以便**获得更好的数据可视化体验和交互功能。
+
+## 验收标准
+
+1. [ ] 数据统计页使用 mini-charts 包的图表组件替换纯CSS实现
+2. [ ] 残疾类型分布使用 ColumnChart 组件显示
+3. [ ] 性别分布使用 ColumnChart 组件显示
+4. [ ] 年龄分布使用 PieChart 组件显示
+5. [ ] 户籍省份分布使用 ColumnChart(横向)组件显示
+6. [ ] 在职状态统计使用 PieChart 组件显示
+7. [ ] 薪资分布使用 ColumnChart(横向)组件显示
+8. [ ] 图表支持 tooltip 交互,显示详细数据
+9. [ ] 保持现有的性能优化(懒加载、数据缓存)
+10. [ ] 通过类型检查和测试验证
+
+## 任务 / 子任务
+
+- [ ] 任务1:分析 mini-charts 包的可用组件和API(AC:全部)
+  - [ ] 阅读 `mini-ui-packages/mini-charts` 包的文档和示例
+  - [ ] 了解 ColumnChart、PieChart、LineChart 等组件的 Props 接口
+  - [ ] 了解图表配置选项(颜色、字体、动画等)
+  - [ ] 确认组件支持的数据格式
+  - [ ] 创建组件使用示例和测试
+
+- [ ] 任务2:重构残疾类型分布图表(AC:2)
+  - [ ] 导入 ColumnChart 组件
+  - [ ] 转换现有数据格式为 mini-charts 支持的格式
+  - [ ] 配置图表选项(标题、颜色、轴标签)
+  - [ ] 启用 tooltip 交互
+  - [ ] 测试图表渲染和交互功能
+  - [ ] 删除原有的纯CSS实现代码
+
+- [ ] 任务3:重构性别分布图表(AC:3)
+  - [ ] 导入 ColumnChart 组件
+  - [ ] 转换现有数据格式
+  - [ ] 配置图表选项(双色柱状图)
+  - [ ] 启用 tooltip 交互
+  - [ ] 测试图表渲染和交互功能
+  - [ ] 删除原有的纯CSS实现代码
+
+- [ ] 任务4:重构年龄分布图表(AC:4)
+  - [ ] 导入 PieChart 组件
+  - [ ] 转换现有数据格式为饼图格式
+  - [ ] 配置图表选项(颜色、图例)
+  - [ ] 启用 tooltip 交互
+  - [ ] 测试图表渲染和交互功能
+  - [ ] 删除原有的纯CSS实现代码
+
+- [ ] 任务5:重构户籍省份分布图表(AC:5)
+  - [ ] 导入 ColumnChart 组件(横向柱状图)
+  - [ ] 转换现有数据格式
+  - [ ] 配置图表选项(横向、颜色)
+  - [ ] 启用 tooltip 交互
+  - [ ] 测试图表渲染和交互功能
+  - [ ] 删除原有的纯CSS实现代码
+
+- [ ] 任务6:重构在职状态统计图表(AC:6)
+  - [ ] 导入 PieChart 组件(环形图)
+  - [ ] 转换现有数据格式
+  - [ ] 配置图表选项(环形图样式)
+  - [ ] 启用 tooltip 交互
+  - [ ] 测试图表渲染和交互功能
+  - [ ] 删除原有的纯CSS实现代码
+
+- [ ] 任务7:重构薪资分布图表(AC:7)
+  - [ ] 导入 ColumnChart 组件(横向柱状图)
+  - [ ] 转换现有数据格式
+  - [ ] 配置图表选项(横向、颜色)
+  - [ ] 启用 tooltip 交互
+  - [ ] 测试图表渲染和交互功能
+  - [ ] 删除原有的纯CSS实现代码
+
+- [ ] 任务8:验证性能优化和用户体验(AC:8-10)
+  - [ ] 验证懒加载机制仍然有效(分阶段加载图表)
+  - [ ] 验证数据缓存机制正常工作
+  - [ ] 测试图表交互功能(tooltip 显示)
+  - [ ] 测试移动端显示效果
+  - [ ] 确保页面加载速度符合要求
+  - [ ] 运行类型检查验证(pnpm typecheck)
+
+- [ ] 任务9:编写测试和文档(AC:10)
+  - [ ] 编写图表组件集成测试
+  - [ ] 测试数据转换逻辑
+  - [ ] 测试图表渲染和交互
+  - [ ] 更新故事文档,记录实施细节
+  - [ ] 更新开发笔记,添加 mini-charts 使用说明
+
+## 开发笔记
+
+### 依赖关系
+**依赖故事**:
+- 011.005(数据统计功能实现):提供现有的数据统计页面和数据API集成
+- 史诗016(mini-charts 包):提供图表组件库,已完成 016.001-016.009 故事
+
+### mini-charts 包使用指南
+
+**安装依赖**:
+```bash
+# mini-charts 包已经在 workspace 中,无需额外安装
+# 确保包已正确构建
+cd mini-ui-packages/mini-charts
+pnpm build
+```
+
+**导入组件**:
+```typescript
+// 在 Statistics.tsx 中导入图表组件
+import { ColumnChart, PieChart } from '@d8d/mini-charts'
+import type { ColumnChartProps, PieChartProps } from '@d8d/mini-charts'
+```
+
+**组件使用示例**:
+```typescript
+// 柱状图示例
+const columnData = {
+  categories: ['肢体', '听力', '视力', '言语', '智力', '精神'],
+  series: [{
+    name: '人数',
+    data: [10, 8, 6, 4, 3, 2]
+  }]
+}
+
+<ColumnChart
+  data={columnData}
+  width={350}
+  height={200}
+  config={{
+    color: ['#3b82f6'],
+    xAxis: { type: 'category' },
+    yAxis: { type: 'value' }
+  }}
+/>
+
+// 饼图示例
+const pieData = [
+  { name: '18-25岁', value: 5 },
+  { name: '26-35岁', value: 12 },
+  { name: '36-45岁', value: 8 },
+  { name: '46-55岁', value: 4 },
+  { name: '55岁以上', value: 2 }
+]
+
+<PieChart
+  data={pieData}
+  width={300}
+  height={300}
+  config={{
+    color: ['#3b82f6', '#10b981', '#f59e0b', '#8b5cf6', '#ef4444']
+  }}
+/>
+```
+
+### 数据转换逻辑
+
+**现有数据格式**(来自 API):
+```typescript
+interface StatItem {
+  key: string      // 类别名称
+  value: number    // 数量
+  percentage: number // 百分比
+}
+
+interface DistributionResponse {
+  companyId: number
+  stats: StatItem[]
+  total: number
+}
+```
+
+**转换为 mini-charts 格式**:
+```typescript
+// 柱状图数据转换
+const convertToColumnData = (stats: StatItem[]) => ({
+  categories: stats.map(item => item.key),
+  series: [{
+    name: '人数',
+    data: stats.map(item => item.value)
+  }]
+})
+
+// 饼图数据转换
+const convertToPieData = (stats: StatItem[]) =>
+  stats.map(item => ({
+    name: item.key,
+    value: item.value
+  }))
+```
+
+### API规范
+**数据统计API**:沿用故事011.005已有的API集成
+- API 客户端:`enterpriseStatisticsClient`
+- 接口:6个分布统计接口(残疾类型、性别、年龄、户籍、在职状态、薪资)
+- 使用 React Query 进行数据获取,保持现有的缓存配置
+
+### 组件规范
+**保持现有布局结构**:
+- 继续使用 `YongrenTabBarLayout` + `Navbar` 组合
+- 保持 ScrollView 布局和内边距设置
+- 保持统计卡片的展示方式(4个卡片)
+- 保持时间筛选器功能
+
+**图表组件集成方式**:
+1. 为每个图表创建独立的容器组件(View)
+2. 使用数据转换函数处理 API 响应数据
+3. 配置图表选项,确保视觉效果符合原型设计
+4. 保持加载状态和错误处理逻辑
+
+### 技术约束
+- **性能要求**:保持现有的懒加载和缓存机制
+- **兼容性**:确保图表组件在 Taro 小程序环境正常工作
+- **类型安全**:使用 TypeScript 严格模式,确保类型检查通过
+- **响应式设计**:图表组件需要适配不同屏幕尺寸
+
+### 测试要求
+**测试框架**:Jest + Testing Library
+**关键测试场景**:
+1. **图表渲染测试**:
+   - 测试图表组件正确渲染
+   - 测试数据传递正确
+   - 测试图表选项生效
+2. **交互功能测试**:
+   - 测试 tooltip 显示
+   - 测试图表点击事件(如支持)
+3. **数据转换测试**:
+   - 测试数据转换函数正确性
+   - 测试边界情况(空数据、单条数据)
+4. **性能测试**:
+   - 测试懒加载机制
+   - 测试图表渲染性能
+5. **集成测试**:
+   - 测试与现有代码的集成
+   - 测试页面整体功能
+
+### 迁移策略
+**渐进式迁移**:
+1. 先迁移一个图表(如残疾类型分布),验证可行性
+2. 确认无误后,逐个迁移其他图表
+3. 每完成一个图表,删除对应的纯CSS实现代码
+4. 最后完成整体测试和优化
+
+**回滚计划**:
+如果 mini-charts 组件存在问题,可以:
+1. 保留原有代码在分支中,便于快速回滚
+2. 逐步迁移,出现问题可单独回滚某个图表
+3. 确保每个图表迁移后都经过充分测试
+
+## 变更日志
+| 日期 | 版本 | 描述 | 作者 |
+|------|------|------|------|
+| 2025-12-24 | 1.0 | 初始创建(使用 mini-charts 包重构数据统计图表) | Claude Code |
+
+## 开发代理记录
+*此部分由开发代理在实施过程中填充*