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