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

237 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 员工采购交易信息管理功能实施计划
> **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`