237 lines
7.7 KiB
Markdown
237 lines
7.7 KiB
Markdown
# 员工采购交易信息管理功能实施计划
|
||
|
||
> **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`
|