7.7 KiB
员工采购交易信息管理功能实施计划
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 ✅
待执行任务 (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