Files
ccdi/doc/plans/2026-02-06-ccdi_purchase_transaction.md

237 lines
7.7 KiB
Markdown
Raw Normal View History

2026-02-06 17:22:59 +08:00
# 员工采购交易信息管理功能实施计划
> **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: 前端开发、测试、文档
---
## 数据库表结构
```sql
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 ✅
- Mapper接口
- Mapper XML映射
- Commits: b0bd66d, d9f1b52
### Task 10-11: 创建Service接口 ✅
- Service接口
- 异步导入Service接口
- Commits: 584581e, 1799017
### 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个主要字段 + 操作列)
- 新增/编辑对话框
- **导入对话框(异步轮询)**
- 删除确认
**关键实现:**
```javascript
// 异步导入轮询逻辑
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`