Files
ccdi/doc/test-data/purchase_transaction/FIX_IMPORT_FAILURES_API.md
2026-02-09 00:13:32 +08:00

6.2 KiB

采购交易导入失败记录接口修复说明

问题描述

采购交易管理的导入失败记录列表无法展示。对话框能打开,但表格为空。

根本原因

通过代码对比分析,发现采购交易管理的导入失败记录接口与项目中其他模块(员工、中介)的实现不一致:

问题代码

文件: ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiPurchaseTransactionController.java

原代码 (第179-183行):

@GetMapping("/importFailures/{taskId}")
public AjaxResult getImportFailures(@PathVariable String taskId) {
    List<PurchaseTransactionImportFailureVO> failures = transactionImportService.getImportFailures(taskId);
    return success(failures);  // ❌ 直接返回所有数据,没有分页
}

问题点:

  1. 返回类型是 AjaxResult,而不是 TableDataInfo
  2. 没有 pageNumpageSize 分页参数
  3. 没有实现分页逻辑
  4. 返回数据结构是 {code: 200, data: [...]} 而不是 {code: 200, rows: [...], total: xxx}

正确实现 (参考中介模块)

文件: ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiIntermediaryController.java

@GetMapping("/importPersonFailures/{taskId}")
public TableDataInfo getPersonImportFailures(
        @PathVariable String taskId,
        @RequestParam(defaultValue = "1") Integer pageNum,  // ✅ 支持分页
        @RequestParam(defaultValue = "10") Integer pageSize) {

    List<IntermediaryPersonImportFailureVO> failures = personImportService.getImportFailures(taskId);

    // ✅ 手动分页
    int fromIndex = (pageNum - 1) * pageSize;
    int toIndex = Math.min(fromIndex + pageSize, failures.size());
    List<IntermediaryPersonImportFailureVO> pageData = failures.subList(fromIndex, toIndex);

    return getDataTable(pageData, failures.size());  // ✅ 返回TableDataInfo
}

修复方案

修改 CcdiPurchaseTransactionController.javagetImportFailures 方法:

修改后的代码

文件: ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/controller/CcdiPurchaseTransactionController.java:173-196

/**
 * 查询导入失败记录
 */
@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<PurchaseTransactionImportFailureVO> failures = transactionImportService.getImportFailures(taskId);

    // 手动分页
    int fromIndex = (pageNum - 1) * pageSize;
    int toIndex = Math.min(fromIndex + pageSize, failures.size());

    List<PurchaseTransactionImportFailureVO> pageData = failures.subList(fromIndex, toIndex);

    return getDataTable(pageData, failures.size());
}

修改内容

  1. 修改返回类型: AjaxResultTableDataInfo
  2. 添加分页参数: pageNumpageSize
  3. 实现手动分页逻辑
  4. 使用 getDataTable() 方法返回标准分页结构

返回数据结构对比

修复前 (AjaxResult):

{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {...},
    {...},
    ...
  ]
}

修复后 (TableDataInfo):

{
  "code": 200,
  "msg": "查询成功",
  "rows": [
    {...},
    {...},
    ...
  ],
  "total": 100
}

测试验证

方法1: 使用自动化测试脚本

  1. 启动后端服务

    mvn spring-boot:run
    
  2. 准备测试数据

    • 准备一个包含错误数据的Excel文件
    • 通过系统界面上传并导入
    • 记录返回的 taskId
  3. 运行测试脚本

    cd doc/test-data/purchase_transaction
    node test-import-failures-api.js <taskId>
    
  4. 查看测试结果

    • 脚本会验证:
      • 响应状态码是否为 200
      • rows 字段是否存在且为数组
      • total 字段是否存在
      • 分页功能是否正常工作

方法2: 使用 Postman/curl 测试

# 1. 登录获取token
curl -X POST "http://localhost:8080/login/test" \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin123"}'

# 2. 查询导入失败记录 (替换 <taskId> 和 <token>)
curl -X GET "http://localhost:8080/ccdi/purchaseTransaction/importFailures/<taskId>?pageNum=1&pageSize=10" \
  -H "Authorization: Bearer <token>"

预期响应:

{
  "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