tasks.md 7.3 KB

Implementation Plan: Supplier Management

Overview

本实现计划将供应商管理功能分解为可执行的编码任务,按照数据库迁移 → 后端模型 → API → 前端的顺序实现。

Tasks

  • [x] 1. 数据库迁移脚本

    • 1.1 创建迁移脚本文件 backend/migrations/add_supplier_and_settlement.py
    • 创建 suppliers 表(id, name, created_at, updated_at)
    • 为 suppliers.name 添加唯一索引
    • 为 persons.name 添加唯一索引
    • 为 items.name 添加唯一索引
    • 为 items 表添加 supplier_id 外键字段
    • 为 work_records 表添加 is_settled 字段(默认 False)
    • 确保兼容 PostgreSQL 和 SQLite
    • Requirements: 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7
  • [x] 2. 后端 Supplier 模型和 API

    • 2.1 创建 Supplier 模型 backend/app/models/supplier.py
    • 定义 Supplier 类,包含 id, name, created_at, updated_at
    • 添加 to_dict() 方法
    • __init__.py 中注册模型
    • Requirements: 3.1, 3.6
    • 2.2 创建 Supplier 路由 backend/app/routes/supplier.py
    • GET /api/suppliers - 获取所有供应商
    • GET /api/suppliers/:id - 获取单个供应商
    • POST /api/suppliers - 创建供应商(验证名称唯一性)
    • PUT /api/suppliers/:id - 更新供应商(验证名称唯一性)
    • DELETE /api/suppliers/:id - 删除供应商
    • __init__.py 中注册蓝图
    • Requirements: 3.2, 3.3, 3.4
    • [ ]* 2.3 编写 Supplier 单元测试 backend/tests/test_supplier.py
    • 测试 CRUD 操作
    • 测试名称唯一性约束
    • Requirements: 3.2, 3.3, 3.4
    • [ ]* 2.4 编写供应商名称唯一性属性测试
    • Property 3: Supplier Name Uniqueness
    • Validates: Requirements 3.2, 3.3, 3.6
  • [x] 3. 更新 Person 模型和 API

    • 3.1 更新 Person 模型添加唯一约束验证
    • 在创建和更新时验证名称唯一性
    • Requirements: 1.1, 1.2, 1.3
    • 3.2 更新 Person 路由添加唯一性错误处理
    • POST /api/persons - 验证名称唯一性
    • PUT /api/persons/:id - 验证名称唯一性
    • Requirements: 1.1, 1.2
    • [ ]* 3.3 编写人员名称唯一性属性测试
    • Property 1: Person Name Uniqueness
    • Validates: Requirements 1.1, 1.2, 1.3
  • [x] 4. 更新 Item 模型和 API

    • 4.1 更新 Item 模型
    • 添加 supplier_id 外键字段
    • 添加 supplier 关系
    • 更新 to_dict() 返回 supplier_name(无供应商时为空字符串)
    • 添加唯一约束验证
    • Requirements: 2.1, 2.2, 2.3, 4.1, 4.2
    • 4.2 更新 Item 路由
    • POST /api/items - 支持 supplier_id,验证名称唯一性
    • PUT /api/items/:id - 支持 supplier_id,验证名称唯一性
    • Requirements: 2.1, 2.2, 4.1
    • [ ]* 4.3 编写物品名称唯一性属性测试
    • Property 2: Item Name Uniqueness
    • Validates: Requirements 2.1, 2.2, 2.3
    • [ ]* 4.4 编写空供应商显示属性测试
    • Property 4: Empty Supplier Name Display
    • Validates: Requirements 4.2, 6.4, 7.3, 8.2
  • [x] 5. Checkpoint - 确保所有测试通过

    • 运行所有后端测试
    • 确保迁移脚本正确执行
    • 如有问题请询问用户
  • [x] 6. 更新 WorkRecord 模型和 API

    • 6.1 更新 WorkRecord 模型
    • 添加 is_settled 字段(默认 False)
    • 更新 to_dict() 返回 is_settled 和 supplier_name
    • Requirements: 5.1, 5.2
    • 6.2 添加结算状态 API
    • PUT /api/work-records/:id/settlement - 切换单条记录结算状态
    • POST /api/work-records/batch-settlement - 批量更新结算状态
      • 参数:person_id(可选), year, month, supplier_id(可选), is_settled
    • Requirements: 5.3, 5.7, 5.8
    • [ ]* 6.3 编写结算状态属性测试
    • Property 5: Work Record Settlement Default
    • Property 6: Settlement Status Toggle
    • Validates: Requirements 5.1, 5.3
    • [ ]* 6.4 编写批量结算筛选属性测试
    • Property 7: Batch Settlement Filter Intersection
    • Validates: Requirements 5.5, 5.7
  • [x] 7. 更新导出服务

    • 7.1 更新 ExportService 明细表
    • 修改 DETAIL_HEADERS 为 ['人员', '日期', '供应商', '物品', '单价', '数量', '总价']
    • 更新 _create_detail_sheet() 添加供应商列
    • Requirements: 6.1, 6.4
    • 7.2 更新 ExportService 月度汇总表
    • 修改 _create_monthly_summary_sheet() 按人员+供应商分组
    • Headers: ['人员', '供应商', '总金额']
    • Requirements: 6.2
    • [ ]* 7.3 编写导出服务单元测试
    • 测试明细表包含供应商列
    • 测试月度汇总按人员+供应商分组
    • 测试无供应商时显示空字符串
    • Requirements: 6.1, 6.2, 6.3, 6.4
  • [x] 8. 更新仪表盘 API

    • 8.1 更新月度统计 API
    • 修改 item_breakdown 返回 supplier_name
    • 添加 supplier_breakdown 返回人员按供应商的收入明细
    • Requirements: 7.1, 7.2, 7.3
    • 8.2 更新日统计 API
    • 修改 summary 返回 supplier_name
    • Requirements: 8.1, 8.2
    • [ ]* 8.3 编写仪表盘 API 单元测试
    • 测试月度统计包含供应商数据
    • 测试日统计包含供应商数据
    • Requirements: 7.1, 7.2, 8.1
  • [x] 9. Checkpoint - 确保后端功能完整

    • 运行所有后端测试
    • 验证 API 响应格式正确
    • 如有问题请询问用户
  • [x] 10. 前端 Supplier 管理页面

    • 10.1 创建 Supplier API 服务 frontend/src/services/api.js
    • 添加 supplierApi 对象(getAll, getById, create, update, delete)
    • Requirements: 3.4
    • 10.2 创建 SupplierManagement 组件 frontend/src/components/SupplierManagement.jsx
    • 供应商列表表格
    • 新增/编辑模态框
    • 删除确认对话框
    • 名称唯一性错误提示
    • Requirements: 3.5
    • 10.3 更新路由配置添加供应商管理页面
    • 在 App.jsx 添加 /suppliers 路由
    • 在导航菜单添加供应商管理入口
    • Requirements: 3.5
  • [x] 11. 前端 Item 管理页面更新

    • 11.1 更新 ItemManagement 组件
    • 物品表单添加供应商下拉选择
    • 物品列表添加供应商列
    • Requirements: 4.3, 4.4
  • [x] 12. 前端 WorkRecord 管理页面更新

    • 12.1 更新 WorkRecordManagement 组件
    • 工作记录列表添加结算状态列
    • 添加单条记录结算状态切换按钮
    • Requirements: 5.2, 5.3
    • 12.2 添加批量结算操作模态框
    • 人员选择器
    • 月份选择器
    • 供应商选择器
    • "设为已结算"和"设为未结算"按钮
    • Requirements: 5.4, 5.5, 5.6, 5.7
  • [x] 13. 前端 Dashboard 更新

    • 13.1 更新月度报告部分
    • 物品收入明细表格添加供应商列
    • 添加人员按供应商收入明细表格
    • Requirements: 7.1, 7.2
    • 13.2 更新工作统计详情
    • 表格添加供应商列
    • Requirements: 8.1
    • 13.3 更新系统统计卡片
    • 修改标题为"系统人员/物品/供应商"
    • 显示供应商总数
    • Requirements: 9.1, 9.2
  • [x] 14. Final Checkpoint - 完整功能验证

    • 确保所有测试通过
    • 验证前后端集成正常
    • 如有问题请询问用户

Notes

  • 任务标记 * 为可选测试任务,可跳过以加快 MVP 开发
  • 每个任务引用具体的需求编号以便追溯
  • Checkpoint 任务用于阶段性验证
  • 属性测试验证核心正确性属性