Files
ccdi/doc/plans/2026-02-06-ccdi_purchase_transaction.md
2026-02-06 17:22:59 +08:00

7.7 KiB
Raw Blame History

员工采购交易信息管理功能实施计划

For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

目标: 构建完整的员工采购交易信息管理模块支持CRUD操作、分页查询、异步导入导出、批量删除等功能

架构: 基于若依框架前后端分离架构后端使用MyBatis Plus + EasyExcel + Redis实现异步导入前端使用Vue 2 + Element UI

技术栈:

  • 后端: Spring Boot 3.5.8, MyBatis Plus 3.5.10, EasyExcel, Redis
  • 前端: Vue 2.6.12, Element UI 2.15.14, Axios
  • 数据库: MySQL 8.2.0

实施进度

已完成 (2026-02-06):

  • Task 1-14: 后端核心功能开发
  • 导入失败记录VO优化

🔄 待完成:

  • Task 15-21: 前端开发、测试、文档

数据库表结构

CREATE TABLE `ccdi_purchase_transaction` (
  `purchase_id` VARCHAR(32) NOT NULL COMMENT '采购事项ID',
  `purchase_category` VARCHAR(50) NOT NULL COMMENT '采购类别',
  `project_name` VARCHAR(200) DEFAULT NULL COMMENT '项目名称',
  `subject_name` VARCHAR(200) NOT NULL COMMENT '标的物名称',
  `subject_desc` TEXT COMMENT '标的物描述',
  `purchase_qty` DECIMAL(12,4) NOT NULL DEFAULT 1 COMMENT '采购数量',
  `budget_amount` DECIMAL(18,2) NOT NULL COMMENT '预算金额',
  `bid_amount` DECIMAL(18,2) DEFAULT NULL COMMENT '中标金额',
  `actual_amount` DECIMAL(18,2) DEFAULT NULL COMMENT '实际采购金额',
  `contract_amount` DECIMAL(18,2) DEFAULT NULL COMMENT '合同金额',
  `settlement_amount` DECIMAL(18,2) DEFAULT NULL COMMENT '结算金额',
  `purchase_method` VARCHAR(50) NOT NULL COMMENT '采购方式',
  `supplier_name` VARCHAR(200) DEFAULT NULL COMMENT '中标供应商名称',
  `contact_person` VARCHAR(50) DEFAULT NULL COMMENT '供应商联系人',
  `contact_phone` VARCHAR(20) DEFAULT NULL COMMENT '供应商联系电话',
  `supplier_uscc` VARCHAR(18) DEFAULT NULL COMMENT '供应商统一信用代码',
  `supplier_bank_account` VARCHAR(50) DEFAULT NULL COMMENT '供应商银行账户',
  `apply_date` DATE NOT NULL COMMENT '采购申请日期',
  `plan_approve_date` DATE DEFAULT NULL COMMENT '采购计划批准日期',
  `announce_date` DATE DEFAULT NULL COMMENT '采购公告发布日期',
  `bid_open_date` DATE DEFAULT NULL COMMENT '开标日期',
  `contract_sign_date` DATE DEFAULT NULL COMMENT '合同签订日期',
  `expected_delivery_date` DATE DEFAULT NULL COMMENT '预计交货日期',
  `actual_delivery_date` DATE DEFAULT NULL COMMENT '实际交货日期',
  `acceptance_date` DATE DEFAULT NULL COMMENT '验收日期',
  `settlement_date` DATE DEFAULT NULL COMMENT '结算日期',
  `applicant_id` VARCHAR(7) NOT NULL COMMENT '申请人工号',
  `applicant_name` VARCHAR(50) NOT NULL COMMENT '申请人姓名',
  `apply_department` VARCHAR(100) NOT NULL COMMENT '申请部门',
  `purchase_leader_id` VARCHAR(7) DEFAULT NULL COMMENT '采购负责人工号',
  `purchase_leader_name` VARCHAR(50) DEFAULT NULL COMMENT '采购负责人姓名',
  `purchase_department` VARCHAR(100) DEFAULT NULL COMMENT '采购部门',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `created_by` VARCHAR(50) NOT NULL COMMENT '创建人',
  `updated_by` VARCHAR(50) DEFAULT NULL COMMENT '更新人',
  PRIMARY KEY (`purchase_id`),
  KEY `idx_applicant_id` (`applicant_id`),
  KEY `idx_apply_date` (`apply_date`),
  KEY `idx_supplier_uscc` (`supplier_uscc`),
  KEY `idx_category_method` (`purchase_category`, `purchase_method`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工采购交易信息表';

已完成的任务 (Task 1-14)

Task 1: 创建数据库表

  • Commit: d83732f (修复后的提交)
  • 包含4个业务索引优化查询性能

Task 2: 创建实体类

  • 文件: CcdiPurchaseTransaction.java
  • Commit: 913e5e5

Task 3-7: 创建DTO、VO、Excel类

  • QueryDTO, AddDTO, EditDTO (修复工号验证)
  • VO类
  • Excel类
  • Commits: f80a58f, ad369e7→ac3b9cd, c1de614→ac3b9cd, 39032eb, 1d09c88

Task 8-9: 创建Mapper

Task 10-11: 创建Service接口

Task 12-13: 创建Service实现

  • Service实现类 (修复Redis初始化)
  • 异步导入Service实现类
  • Commits: a2764fd→9df2b5a, a4c21b8

Task 14: 创建Controller

  • 10个REST API接口
  • Commit: 4ba0803

额外: 优化导入失败记录VO

  • 创建专门的 PurchaseTransactionImportFailureVO
  • 更新异步导入Service使用新VO
  • Commits: 1aa0d15, 4a560bd

待执行任务 (Task 15-21)

Task 15: 创建前端API文件

文件: ruoyi-ui/src/api/ccdiPurchaseTransaction.js

内容: 定义10个API方法

  • listTransaction - 分页查询
  • getTransaction - 查询详情
  • addTransaction - 新增
  • updateTransaction - 修改
  • delTransaction - 删除
  • exportTransaction - 导出
  • importTemplate - 下载模板
  • importData - 导入
  • getImportStatus - 查询导入状态
  • getImportFailures - 查询失败记录

Task 16: 创建前端页面组件

文件: ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue

功能:

  • 查询表单(项目名称、标的物名称、申请人、日期范围)
  • 列表表格13个主要字段 + 操作列)
  • 新增/编辑对话框
  • 导入对话框(异步轮询)
  • 删除确认

关键实现:

// 异步导入轮询逻辑
async handleImport(file, updateSupport) {
  const res = await importData(file, updateSupport)
  const taskId = res.data.taskId

  // 每2秒轮询状态
  const timer = setInterval(async () => {
    const status = await getImportStatus(taskId)
    if (status.data.status === 'SUCCESS' || status.data.status === 'PARTIAL_SUCCESS') {
      clearInterval(timer)
      if (status.data.status === 'PARTIAL_SUCCESS') {
        // 显示失败记录
        this.fetchFailures(taskId)
      }
      this.$message.success(status.data.message)
    }
  }, 2000)
}

Task 17: 配置菜单和权限

文件: sql/ccdi_purchase_transaction_menu.sql

内容:

  • 主菜单:采购交易管理
  • 6个按钮权限查询、新增、修改、删除、导出、导入

Task 18: 生成测试脚本(跳过)

文件: test/test_purchase_transaction_api.ps1

内容: PowerShell测试脚本

  • 登录 (admin/admin123)
  • 测试所有API接口
  • 包含异步导入流程测试

Task 19: 创建测试说明

文件: doc/test-data/purchase_transaction/README.md

内容: 测试运行说明

Task 20: 生成API文档

文件: doc/api/ccdi_purchase_transaction_api.md

内容: 接口文档

  • 接口列表
  • 请求参数
  • 响应格式
  • 示例

Task 21: 最终验证清单

文件: doc/plans/2026-02-06-ccdi_purchase_transaction-verification.md

内容:

  • 功能测试清单
  • 代码审查清单
  • 性能测试建议
  • 部署前检查项

技术要点

必填字段

purchaseId, purchaseCategory, subjectName, purchaseQty, budgetAmount, purchaseMethod, applyDate, applicantId, applicantName, applyDepartment

异步导入

  • 使用 @Async + @Transactional + Redis
  • taskId追踪导入进度
  • 每2秒轮询状态
  • 失败记录存储7天

更新策略

  • 先批量删除旧记录
  • 再批量插入新记录
  • 每批500条记录

数据验证

  • Jakarta Validation注解
  • 工号格式7位数字
  • 金额非负验证

参考文件

  • 员工招聘模块: CcdiStaffRecruitment*
  • 员工异步导入: CcdiEmployeeImportServiceImpl.java
  • 前端页面: ruoyi-ui/src/views/ccdiStaffRecruitment/index.vue
  • 测试脚本: test/test_employee_api.ps1