# 采购交易导入失败记录接口修复说明 ## 问题描述 采购交易管理的导入失败记录列表无法展示。对话框能打开,但表格为空。 ## 根本原因 通过代码对比分析,发现采购交易管理的导入失败记录接口与项目中其他模块(员工、中介)的实现不一致: ### 问题代码 **文件**: `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiPurchaseTransactionController.java` **原代码 (第179-183行)**: ```java @GetMapping("/importFailures/{taskId}") public AjaxResult getImportFailures(@PathVariable String taskId) { List failures = transactionImportService.getImportFailures(taskId); return success(failures); // ❌ 直接返回所有数据,没有分页 } ``` **问题点**: 1. 返回类型是 `AjaxResult`,而不是 `TableDataInfo` 2. 没有 `pageNum` 和 `pageSize` 分页参数 3. 没有实现分页逻辑 4. 返回数据结构是 `{code: 200, data: [...]}` 而不是 `{code: 200, rows: [...], total: xxx}` ### 正确实现 (参考中介模块) **文件**: `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiIntermediaryController.java` ```java @GetMapping("/importPersonFailures/{taskId}") public TableDataInfo getPersonImportFailures( @PathVariable String taskId, @RequestParam(defaultValue = "1") Integer pageNum, // ✅ 支持分页 @RequestParam(defaultValue = "10") Integer pageSize) { List failures = personImportService.getImportFailures(taskId); // ✅ 手动分页 int fromIndex = (pageNum - 1) * pageSize; int toIndex = Math.min(fromIndex + pageSize, failures.size()); List pageData = failures.subList(fromIndex, toIndex); return getDataTable(pageData, failures.size()); // ✅ 返回TableDataInfo } ``` ## 修复方案 修改 `CcdiPurchaseTransactionController.java` 的 `getImportFailures` 方法: ### 修改后的代码 **文件**: `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiPurchaseTransactionController.java:173-196` ```java /** * 查询导入失败记录 */ @Operation(summary = "查询导入失败记录") @Parameter(name = "taskId", description = "任务ID", required = true) @Parameter(name = "pageNum", description = "页码", required = false) @Parameter(name = "pageSize", description = "每页条数", required = false) @PreAuthorize("@ss.hasPermi('ccdi:purchaseTransaction:import')") @GetMapping("/importFailures/{taskId}") public TableDataInfo getImportFailures( @PathVariable String taskId, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { List failures = transactionImportService.getImportFailures(taskId); // 手动分页 int fromIndex = (pageNum - 1) * pageSize; int toIndex = Math.min(fromIndex + pageSize, failures.size()); List pageData = failures.subList(fromIndex, toIndex); return getDataTable(pageData, failures.size()); } ``` ### 修改内容 1. ✅ 修改返回类型: `AjaxResult` → `TableDataInfo` 2. ✅ 添加分页参数: `pageNum` 和 `pageSize` 3. ✅ 实现手动分页逻辑 4. ✅ 使用 `getDataTable()` 方法返回标准分页结构 ### 返回数据结构对比 **修复前 (AjaxResult)**: ```json { "code": 200, "msg": "操作成功", "data": [ {...}, {...}, ... ] } ``` **修复后 (TableDataInfo)**: ```json { "code": 200, "msg": "查询成功", "rows": [ {...}, {...}, ... ], "total": 100 } ``` ## 测试验证 ### 方法1: 使用自动化测试脚本 1. **启动后端服务** ```bash mvn spring-boot:run ``` 2. **准备测试数据** - 准备一个包含错误数据的Excel文件 - 通过系统界面上传并导入 - 记录返回的 `taskId` 3. **运行测试脚本** ```bash cd doc/test-data/purchase_transaction node test-import-failures-api.js ``` 4. **查看测试结果** - 脚本会验证: - 响应状态码是否为 200 - `rows` 字段是否存在且为数组 - `total` 字段是否存在 - 分页功能是否正常工作 ### 方法2: 使用 Postman/curl 测试 ```bash # 1. 登录获取token curl -X POST "http://localhost:8080/login/test" \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}' # 2. 查询导入失败记录 (替换 ) curl -X GET "http://localhost:8080/ccdi/purchaseTransaction/importFailures/?pageNum=1&pageSize=10" \ -H "Authorization: Bearer " ``` **预期响应**: ```json { "code": 200, "msg": "查询成功", "rows": [ { "purchaseId": "PO001", "projectName": "测试项目", "subjectName": "测试标的物", "errorMessage": "采购数量必须大于0" } ], "total": 1 } ``` ### 方法3: 前端界面测试 1. 访问采购交易管理页面 2. 准备包含错误数据的Excel文件并导入 3. 等待导入完成 4. 点击"查看导入失败记录"按钮 5. 验证: - ✅ 对话框能正常打开 - ✅ 表格显示失败记录数据 - ✅ 顶部显示统计信息 - ✅ 分页组件正常显示和工作 ## 影响范围 - ✅ **后端代码**: `CcdiPurchaseTransactionController.java` - ✅ **前端代码**: 无需修改 (前端代码已正确处理 `TableDataInfo` 格式) - ✅ **数据库**: 无影响 - ✅ **其他模块**: 无影响 ## 兼容性说明 此修复使采购交易模块的导入失败记录接口与项目中其他模块(员工、中介)保持一致,符合项目的统一规范。 ## 相关文件 - **Controller**: `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiPurchaseTransactionController.java` - **前端页面**: `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue` - **前端API**: `ruoyi-ui/src/api/ccdiPurchaseTransaction.js` - **Service实现**: `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiPurchaseTransactionImportServiceImpl.java` - **测试脚本**: `doc/test-data/purchase_transaction/test-import-failures-api.js` ## 变更历史 | 日期 | 版本 | 变更内容 | 作者 | |------|------|----------|------| | 2026-02-09 | 1.0 | 初始版本,修复导入失败记录接口 | Claude |