# 中介导入功能重构测试报告 ## 测试目标 验证Service层重构后,使用 `importPersonBatch` 和 `importEntityBatch` 方法 (基于 `ON DUPLICATE KEY UPDATE`) 的导入功能是否正常工作。 ## 重构内容 ### Task 5: 重构个人中介导入Service **文件:** `CcdiIntermediaryPersonImportServiceImpl.java` **核心变更:** - 移除"先查询后分类再删除再插入"的逻辑 - 更新模式(`isUpdateSupport=true`): 直接调用 `intermediaryMapper.importPersonBatch(validRecords)` - 仅新增模式(`isUpdateSupport=false`): 先查询冲突,然后只插入无冲突数据 - 新增辅助方法: - `saveBatchWithUpsert()`: 使用 `importPersonBatch` 进行批量UPSERT - `getExistingPersonIdsFromDb()`: 从数据库获取已存在的证件号 - `createFailureVO()`: 创建失败记录VO(两个重载方法) ### Task 6: 重构实体中介导入Service **文件:** `CcdiIntermediaryEntityImportServiceImpl.java` **同样的重构逻辑** ## 测试场景 ### 场景1: 个人中介 - 更新模式(第一次导入) **目的:** 验证批量INSERT功能 **操作:** - 上传测试数据文件(1000条个人中介数据) - 设置 `updateSupport=true` **预期结果:** - 所有数据成功插入 - 状态: SUCCESS - 成功数 = 总数 - 失败数 = 0 **实际结果:** _待测试_ **状态:** ⏳ 待执行 --- ### 场景2: 个人中介 - 仅新增模式(重复导入) **目的:** 验证冲突检测功能 **操作:** - 再次上传相同的测试数据 - 设置 `updateSupport=false` **预期结果:** - 所有数据因为冲突而失败 - 状态: PARTIAL_SUCCESS 或 FAILURE - 成功数 = 0 - 失败数 = 总数 - 失败原因: "该证件号码已存在" **实际结果:** _待测试_ **状态:** ⏳ 待执行 --- ### 场景3: 实体中介 - 更新模式(第一次导入) **目的:** 验证实体中介批量INSERT功能 **操作:** - 上传测试数据文件(1000条实体中介数据) - 设置 `updateSupport=true` **预期结果:** - 所有数据成功插入 - 状态: SUCCESS - 成功数 = 总数 - 失败数 = 0 **实际结果:** _待测试_ **状态:** ⏳ 待执行 --- ### 场景4: 实体中介 - 仅新增模式(重复导入) **目的:** 验证实体中介冲突检测功能 **操作:** - 再次上传相同的测试数据 - 设置 `updateSupport=false` **预期结果:** - 所有数据因为冲突而失败 - 状态: PARTIAL_SUCCESS 或 FAILURE - 成功数 = 0 - 失败数 = 总数 - 失败原因: "该统一社会信用代码已存在" **实际结果:** _待测试_ **状态:** ⏳ 待执行 --- ### 场景5: 个人中介 - 再次更新模式 **目的:** 验证 `ON DUPLICATE KEY UPDATE` 功能 **操作:** - 第三次上传相同的测试数据 - 设置 `updateSupport=true` **预期结果:** - 所有数据成功更新(而不是先删除再插入) - 状态: SUCCESS - 成功数 = 总数 - 失败数 = 0 - 数据库中不会出现重复记录 **实际结果:** _待测试_ **状态:** ⏳ 待执行 --- ## 测试方法 ### 手动测试 1. **启动后端服务** ```bash cd ruoyi-ccdi mvn spring-boot:run ``` 2. **访问Swagger UI** - URL: http://localhost:8080/swagger-ui/index.html - 找到 `/ccdi/intermediary/importPersonData` 和 `/ccdi/intermediary/importEntityData` 接口 3. **执行测试场景** - 使用"Try it out"功能上传测试文件 - 观察响应结果 - 使用任务ID查询导入状态 - 查看失败记录 ### 自动化测试 运行测试脚本: ```bash cd doc/test-data/intermediary node test-import-upsert.js ``` 测试脚本会自动执行所有测试场景并生成报告。 ## 测试数据 ### 个人中介测试数据 - 文件: `doc/test-data/intermediary/个人中介黑名单测试数据_1000条_第1批.xlsx` - 记录数: 1000 - 特点: 包含有效的身份证号码 ### 实体中介测试数据 - 文件: `doc/test-data/intermediary/机构中介黑名单测试数据_1000条_第1批.xlsx` - 记录数: 1000 - 特点: 包含有效的统一社会信用代码 ## 关键验证点 ### 1. 数据库层面验证 **更新模式下的UPSERT操作:** - 检查 `ccdi_biz_intermediary` 表,确保持有相同 `person_id` 的记录只有1条 - 检查 `ccdi_enterprise_base_info` 表,确保持有相同 `social_credit_code` 的记录只有1条 **验证SQL:** ```sql -- 检查个人中介重复记录 SELECT person_id, COUNT(*) as cnt FROM ccdi_biz_intermediary GROUP BY person_id HAVING cnt > 1; -- 检查实体中介重复记录 SELECT social_credit_code, COUNT(*) as cnt FROM ccdi_enterprise_base_info GROUP BY social_credit_code HAVING cnt > 1; ``` ### 2. 性能验证 **对比重构前后的性能差异:** | 场景 | 重构前(先删后插) | 重构后(UPSERT) | 性能提升 | |------|----------------|---------------|---------| | 1000条首次导入 | _待测试_ | _待测试_ | _待计算_ | | 1000条重复导入 | _待测试_ | _待测试_ | _待计算_ | ### 3. 错误处理验证 **验证失败记录的正确性:** - 失败原因是否准确 - 失败记录的完整信息是否保留 - Redis中失败记录的存储和读取 ## 测试结果汇总 | 场景 | 状态 | 通过/失败 | 备注 | |------|------|----------|------| | 场景1 | ⏳ 待执行 | - | 个人中介首次导入 | | 场景2 | ⏳ 待执行 | - | 个人中介重复导入(仅新增) | | 场景3 | ⏳ 待执行 | - | 实体中介首次导入 | | 场景4 | ⏳ 待执行 | - | 实体中介重复导入(仅新增) | | 场景5 | ⏳ 待执行 | - | 个人中介重复导入(更新) | **总通过率:** 0/5 (0%) ## 问题记录 ### 问题1: _问题描述_ **场景:** _相关场景_ **现象:** _具体表现_ **原因:** _根本原因_ **解决方案:** _修复方法_ **状态:** ⏳ 待解决 / ✅ 已解决 --- ## 结论 _测试完成后填写总体结论_ ### 代码质量评估 - **可读性:** _评分_ / 10 - **可维护性:** _评分_ / 10 - **性能:** _评分_ / 10 - **错误处理:** _评分_ / 10 ### 优化建议 _根据测试结果提出优化建议_ ## 附录 ### A. 测试环境信息 - **操作系统:** Windows 11 - **Java版本:** 17 - **Spring Boot版本:** 3.5.8 - **MySQL版本:** 8.2.0 - **Redis版本:** _待填写_ ### B. 相关文件清单 - `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryPersonImportServiceImpl.java` - `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryEntityImportServiceImpl.java` - `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiBizIntermediaryMapper.java` - `ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiEnterpriseBaseInfoMapper.java` - `doc/test-data/intermediary/test-import-upsert.js` ### C. Git提交信息 ``` commit 7d534de refactor: 重构Service层使用ON DUPLICATE KEY UPDATE - 更新模式直接调用importPersonBatch/importEntityBatch - 移除'先删除再插入'逻辑,代码简化约50% - 添加辅助方法saveBatchWithUpsert/getExistingPersonIdsFromDb - 添加createFailureVO重载方法简化失败记录创建 变更详情: - CcdiIntermediaryPersonImportServiceImpl: 重构importPersonAsync方法 - CcdiIntermediaryEntityImportServiceImpl: 重构importEntityAsync方法 - 两个Service均采用统一的处理模式 Co-Authored-By: Claude Sonnet 4.5 ``` --- **报告生成时间:** 2026-02-08 **测试执行人:** _待填写_ **审核人:** _待填写_