# 中介黑名单入库逻辑变更 - 测试验证计划 > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **目标:** 验证中介黑名单从单表切换到双表(cdi_biz_intermediary + ccdi_enterprise_base_info)的所有CRUD操作正确性 **架构:** 个人中介插入 ccdi_biz_intermediary 表,机构中介插入 ccdi_enterprise_base_info 表(自动设置高风险和中介来源标识),查询层合并两个表的数据返回 **技术栈:** Spring Boot 3.5.8, MyBatis Plus 3.5.10, MySQL 8.2.0, Maven, JUnit 5 --- ## 测试前准备 ### Task 1: 确认数据库连接和环境 **Files:** - Check: `ruoyi-admin/src/main/resources/application-dev.yml` **Step 1: 验证数据库连接配置** 检查配置文件中的数据库连接信息: ```yaml spring: datasource: druid: master: url: jdbc:mysql://116.62.17.81:3306/ccdi username: root password: Kfcx@1234 ``` **Step 2: 确认目标表存在** 通过MCP工具验证表存在: ```sql SHOW TABLES LIKE 'ccdi_biz_intermediary'; SHOW TABLES LIKE 'ccdi_enterprise_base_info'; ``` 预期: 两个表都存在 **Step 3: 检查表结构** ```sql DESCRIBE ccdi_biz_intermediary; DESCRIBE ccdi_enterprise_base_info; ``` 预期: 表结构与实体类字段匹配 --- ## 功能测试 - 个人中介 ### Task 2: 测试个人中介新增功能 **Files:** - Test API: `POST /ccdi/intermediary/person` - Backend: `CcdiIntermediaryBlacklistServiceImpl.insertPersonIntermediary()` **Step 1: 准备测试数据** 创建测试数据文件 `test_person_add.json`: ```json { "name": "测试个人中介", "certificateNo": "110101199001011234", "indivType": "中介", "indivSubType": "本人", "indivGender": "M", "indivCertType": "身份证", "indivPhone": "13800138000", "indivWechat": "test_wx001", "indivAddress": "北京市朝阳区测试路123号", "indivCompany": "测试公司", "indivPosition": "测试员", "indivRelatedId": "", "indivRelation": "", "status": "0", "remark": "自动化测试数据" } ``` **Step 2: 获取认证Token** ```bash curl -X POST http://localhost:8080/login/test \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"admin123"}' \ | jq -r '.data.token' ``` 保存token到环境变量: ```bash export TOKEN="获取到的token值" ``` **Step 3: 调用新增接口** ```bash curl -X POST http://localhost:8080/ccdi/intermediary/person \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_person_add.json ``` 预期响应: ```json { "code": 200, "msg": "操作成功" } ``` **Step 4: 验证数据插入到正确的表** 通过MCP查询数据库: ```sql SELECT * FROM ccdi_biz_intermediary WHERE person_id = '110101199001011234'; ``` 预期: - 找到1条记录 - name = '测试个人中介' - date_source = 'MANUAL' **Step 5: 验证旧表无数据** ```sql SELECT * FROM ccdi_intermediary_blacklist WHERE certificate_no = '110101199001011234'; ``` 预期: 0条记录(表可能不存在或为空) --- ### Task 3: 测试个人中介列表查询 **Files:** - Test API: `GET /ccdi/intermediary/list` **Step 1: 调用列表查询接口** ```bash curl -X GET "http://localhost:8080/ccdi/intermediary/list?name=测试个人中介" \ -H "Authorization: Bearer $TOKEN" ``` 预期响应: ```json { "code": 200, "msg": "查询成功", "rows": [ { "intermediaryId": 1, "name": "测试个人中介", "certificateNo": "110101199001011234", "intermediaryType": "1", "intermediaryTypeName": "个人", "status": "0", "statusName": "正常" } ], "total": 1 } ``` **Step 2: 验证查询结果来源** 确认数据来自 `ccdi_biz_intermediary` 表 **Step 3: 测试分页查询** ```bash curl -X GET "http://localhost:8080/ccdi/intermediary/list?pageNum=1&pageSize=10" \ -H "Authorization: Bearer $TOKEN" ``` 预期: 返回分页数据 --- ### Task 4: 测试个人中介详情查询 **Files:** - Test API: `GET /ccdi/intermediary/{id}` **Step 1: 获取个人中介详情** ```bash curl -X GET "http://localhost:8080/ccdi/intermediary/1" \ -H "Authorization: Bearer $TOKEN" ``` 预期响应: ```json { "code": 200, "data": { "intermediaryId": 1, "name": "测试个人中介", "certificateNo": "110101199001011234", "intermediaryType": "1", "indivType": "中介", "indivGender": "M", "indivGenderName": "男", "indivPhone": "13800138000", "indivWechat": "test_wx001", "indivAddress": "北京市朝阳区测试路123号", "indivCompany": "测试公司", "indivPosition": "测试员", "dataSource": "MANUAL", "dataSourceName": "手动录入" } } ``` **Step 2: 验证所有字段正确映射** 检查个人专属字段是否正确: - indivType → person_type ✅ - indivGender → gender ✅ - indivPhone → mobile ✅ - indivWechat → wechat_no ✅ - indivAddress → contact_address ✅ --- ### Task 5: 测试个人中介修改功能 **Files:** - Test API: `PUT /ccdi/intermediary/person` **Step 1: 准备修改数据** 创建 `test_person_edit.json`: ```json { "intermediaryId": 1, "name": "测试个人中介-已修改", "certificateNo": "110101199001011234", "indivType": "中介", "indivGender": "M", "indivPhone": "13900139000", "indivCompany": "新公司", "remark": "已修改" } ``` **Step 2: 调用修改接口** ```bash curl -X PUT http://localhost:8080/ccdi/intermediary/person \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_person_edit.json ``` 预期: `{ "code": 200, "msg": "操作成功" }` **Step 3: 验证数据已更新** ```sql SELECT * FROM ccdi_biz_intermediary WHERE biz_id = 1; ``` 预期: - name = '测试个人中介-已修改' - mobile = '13900139000' - company = '新公司' --- ### Task 6: 测试个人中介删除功能 **Files:** - Test API: `DELETE /ccdi/intermediary/{ids}` **Step 1: 调用删除接口** ```bash curl -X DELETE "http://localhost:8080/ccdi/intermediary/1" \ -H "Authorization: Bearer $TOKEN" ``` 预期: `{ "code": 200, "msg": "操作成功" }` **Step 2: 验证数据已删除** ```sql SELECT * FROM ccdi_biz_intermediary WHERE biz_id = 1; ``` 预期: 0条记录 --- ## 功能测试 - 机构中介 ### Task 7: 测试机构中介新增功能 **Files:** - Test API: `POST /ccdi/intermediary/entity` - Backend: `CcdiIntermediaryBlacklistServiceImpl.insertEntityIntermediary()` **Step 1: 准备测试数据** 创建 `test_entity_add.json`: ```json { "name": "测试机构中介有限公司", "corpCreditCode": "91110000123456789X", "corpType": "有限责任公司", "corpNature": "民营企业", "corpIndustryCategory": "制造业", "corpIndustry": "通用设备制造业", "corpEstablishDate": "2020-01-01T00:00:00", "corpAddress": "北京市海淀区测试大街456号", "corpLegalRep": "张三", "corpLegalCertType": "身份证", "corpLegalCertNo": "110101198001011234", "corpShareholder1": "股东A", "corpShareholder2": "股东B", "status": "0", "remark": "机构中介测试数据" } ``` **Step 2: 调用新增接口** ```bash curl -X POST http://localhost:8080/ccdi/intermediary/entity \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_entity_add.json ``` 预期: `{ "code": 200, "msg": "操作成功" }` **Step 3: 验证数据插入到正确的表** ```sql SELECT * FROM ccdi_enterprise_base_info WHERE social_credit_code = '91110000123456789X'; ``` 预期: - 找到1条记录 - enterprise_name = '测试机构中介有限公司' - **risk_level = '1' (高风险)** ✅ - **ent_source = 'INTERMEDIARY' (中介来源)** ✅ - data_source = 'MANUAL' **Step 4: 验证关键字段自动设置** 检查两个重要标识: ```sql SELECT social_credit_code, enterprise_name, risk_level, ent_source, data_source FROM ccdi_enterprise_base_info WHERE social_credit_code = '91110000123456789X'; ``` 预期: - risk_level = '1' ✅ - ent_source = 'INTERMEDIARY' ✅ --- ### Task 8: 测试机构中介列表查询 **Files:** - Test API: `GET /ccdi/intermediary/list` **Step 1: 查询机构中介** ```bash curl -X GET "http://localhost:8080/ccdi/intermediary/list?intermediaryType=2&name=测试机构" \ -H "Authorization: Bearer $TOKEN" ``` 预期响应: ```json { "code": 200, "rows": [ { "intermediaryId": 0, "name": "测试机构中介有限公司", "certificateNo": "91110000123456789X", "intermediaryType": "2", "intermediaryTypeName": "机构", "status": "0", "statusName": "正常" } ] } ``` **Step 2: 验证ent_source过滤** 查询应该只返回 ent_source='INTERMEDIARY' 的记录 **Step 3: 混合查询(个人+机构)** ```bash curl -X GET "http://localhost:8080/ccdi/intermediary/list" \ -H "Authorization: Bearer $TOKEN" ``` 预期: 返回个人和机构中介的合并列表 --- ### Task 9: 测试机构中介详情查询 **Files:** - Test API: `GET /ccdi/intermediary/{id}` **Step 1: 获取机构中介详情** 注意: 机构中介的ID需要特殊处理(社会信用代码) **Step 2: 验证机构字段映射** 检查字段映射: - corpCreditCode → social_credit_code ✅ - name → enterprise_name ✅ - corpType → enterprise_type ✅ - corpNature → enterprise_nature ✅ - corpIndustryCategory → industry_class ✅ --- ### Task 10: 测试机构中介修改功能 **Files:** - Test API: `PUT /ccdi/intermediary/entity` **Step 1: 准备修改数据** 创建 `test_entity_edit.json`: ```json { "corpCreditCode": "91110000123456789X", "name": "测试机构中介有限公司-已修改", "corpType": "股份有限公司", "corpNature": "国有企业", "status": "0", "remark": "已修改" } ``` **Step 2: 调用修改接口** ```bash curl -X PUT http://localhost:8080/ccdi/intermediary/entity \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_entity_edit.json ``` 预期: `{ "code": 200, "msg": "操作成功" }` **Step 3: 验证高风险和中介来源标识不变** ```sql SELECT social_credit_code, enterprise_name, risk_level, ent_source FROM ccdi_enterprise_base_info WHERE social_credit_code = '91110000123456789X'; ``` 预期: - enterprise_name = '测试机构中介有限公司-已修改' - risk_level 仍为 '1' ✅ (保持不变) - ent_source 仍为 'INTERMEDIARY' ✅ (保持不变) --- ## 导入功能测试 ### Task 11: 测试个人中介Excel导入 **Files:** - Test API: `POST /ccdi/intermediary/importPersonData` **Step 1: 下载导入模板** ```bash curl -X POST http://localhost:8080/ccdi/intermediary/importPersonTemplate \ -H "Authorization: Bearer $TOKEN" \ --output person_template.xlsx ``` 预期: 下载成功,文件包含所有个人字段 **Step 2: 准备测试Excel文件** 手动创建Excel文件或使用EasyExcel生成测试数据,包含: - 姓名: "导入测试个人" - 证件号: "110101199002022345" - 人员类型: "中介" - 性别: "M" - 手机号: "13800138001" - 微信号: "import_wx001" **Step 3: 执行导入** ```bash curl -X POST "http://localhost:8080/ccdi/intermediary/importPersonData?updateSupport=false" \ -H "Authorization: Bearer $TOKEN" \ -F "file=@person_test_data.xlsx" ``` 预期: ```json { "code": 200, "msg": "恭喜您,数据已全部导入成功!共 1 条" } ``` **Step 4: 验证导入数据** ```sql SELECT * FROM ccdi_biz_intermediary WHERE person_id = '110101199002022345'; ``` 预期: - 找到1条记录 - date_source = 'IMPORT' ✅ - name = '导入测试个人' --- ### Task 12: 测试机构中介Excel导入 **Files:** - Test API: `POST /ccdi/intermediary/importEntityData` **Step 1: 下载导入模板** ```bash curl -X POST http://localhost:8080/ccdi/intermediary/importEntityTemplate \ -H "Authorization: Bearer $TOKEN" \ --output entity_template.xlsx ``` 预期: 下载成功,文件包含所有机构字段 **Step 2: 准备测试Excel文件** 创建Excel文件,包含: - 机构名称: "导入测试机构有限公司" - 统一社会信用代码: "91110000987654321A" - 主体类型: "有限责任公司" - 企业性质: "民营企业" - 法定代表人: "李四" **Step 3: 执行导入** ```bash curl -X POST "http://localhost:8080/ccdi/intermediary/importEntityData?updateSupport=false" \ -H "Authorization: Bearer $TOKEN" \ -F "file=@entity_test_data.xlsx" ``` 预期: ```json { "code": 200, "msg": "恭喜您,数据已全部导入成功!共 1 条" } ``` **Step 4: 验证导入数据和自动设置标识** ```sql SELECT social_credit_code, enterprise_name, risk_level, ent_source, data_source FROM ccdi_enterprise_base_info WHERE social_credit_code = '91110000987654321A'; ``` 预期: - enterprise_name = '导入测试机构有限公司' - **risk_level = '1' (高风险)** ✅ - **ent_source = 'INTERMEDIARY' (中介来源)** ✅ - data_source = 'IMPORT' ✅ --- ## 导出功能测试 ### Task 13: 测试中介数据导出 **Files:** - Test API: `POST /ccdi/intermediary/export` **Step 1: 导出所有数据** ```bash curl -X POST "http://localhost:8080/ccdi/intermediary/export" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{}' \ --output intermediary_export.xlsx ``` 预期: 下载成功,Excel文件包含个人和机构数据 **Step 2: 验证导出数据完整性** 打开Excel文件,验证: - 包含个人中介字段(indivType, indivGender等) - 包含机构中介字段(corpType, corpNature等) - 数据正确映射 **Step 3: 测试条件导出** ```bash curl -X POST "http://localhost:8080/ccdi/intermediary/export" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"intermediaryType":"1"}' \ --output person_export.xlsx ``` 预期: 只导出个人中介数据 --- ## 边界条件测试 ### Task 14: 测试唯一性约束 **Step 1: 个人中介证件号重复插入** 尝试插入相同person_id的记录: ```bash # 使用Task 2的数据再次执行 curl -X POST http://localhost:8080/ccdi/intermediary/person \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_person_add.json ``` 预期: 根据实际业务逻辑,可能报唯一性约束错误或允许插入 **Step 2: 机构中介社会信用代码重复插入** ```bash # 使用Task 7的数据再次执行 curl -X POST http://localhost:8080/ccdi/intermediary/entity \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_entity_add.json ``` 预期: 报主键冲突错误(社会信用代码是主键) --- ### Task 15: 测试必填字段验证 **Step 1: 缺少姓名的个人中介** 创建 `test_person_no_name.json`: ```json { "certificateNo": "110101199003033456", "status": "0" } ``` ```bash curl -X POST http://localhost:8080/ccdi/intermediary/person \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_person_no_name.json ``` 预期: 返回验证错误,提示"姓名不能为空" **Step 2: 缺少统一社会信用代码的机构中介** 创建 `test_entity_no_code.json`: ```json { "name": "测试机构", "status": "0" } ``` ```bash curl -X POST http://localhost:8080/ccdi/intermediary/entity \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d @test_entity_no_code.json ``` 预期: 返回验证错误,提示"统一社会信用代码不能为空" --- ## 性能测试 ### Task 16: 批量数据导入性能测试 **Step 1: 准备批量测试数据** 创建包含100条个人中介的Excel文件 **Step 2: 执行批量导入** ```bash time curl -X POST "http://localhost:8080/ccdi/intermediary/importPersonData?updateSupport=false" \ -H "Authorization: Bearer $TOKEN" \ -F "file=@person_batch_100.xlsx" ``` 预期: - 导入成功 - 耗时 < 10秒 **Step 3: 验证数据一致性** ```sql SELECT COUNT(*) FROM ccdi_biz_intermediary WHERE date_source = 'IMPORT'; ``` 预期: 导入的记录数与Excel文件一致 --- ## 清理测试数据 ### Task 17: 清理测试数据 **Step 1: 删除测试个人中介数据** ```sql DELETE FROM ccdi_biz_intermediary WHERE person_id IN ( '110101199001011234', '110101199002022345' ); ``` **Step 2: 删除测试机构中介数据** ```sql DELETE FROM ccdi_enterprise_base_info WHERE social_credit_code IN ( '91110000123456789X', '91110000987654321A' ); ``` **Step 3: 验证清理完成** ```sql SELECT COUNT(*) FROM ccdi_biz_intermediary WHERE person_id LIKE '110101199%'; SELECT COUNT(*) FROM ccdi_enterprise_base_info WHERE social_credit_code LIKE '91110000%'; ``` 预期: 0条测试记录 --- ## 测试报告生成 ### Task 18: 生成测试报告 **Step 1: 汇总测试结果** 创建测试报告文件 `test_report.md`: ```markdown # 中介黑名单入库逻辑变更测试报告 ## 测试环境 - 数据库: MySQL 8.2.0 - 服务端口: 8080 - 测试时间: 2026-02-04 ## 功能测试结果 ### 个人中介 - ✅ 新增功能 - 数据正确插入 ccdi_biz_intermediary - ✅ 列表查询 - 正确返回个人中介数据 - ✅ 详情查询 - 所有字段正确映射 - ✅ 修改功能 - 数据正确更新 - ✅ 删除功能 - 数据正确删除 - ✅ Excel导入 - 批量导入成功,data_source='IMPORT' - ✅ Excel导出 - 数据完整导出 ### 机构中介 - ✅ 新增功能 - 数据正确插入 ccdi_enterprise_base_info - ✅ 自动设置标识 - risk_level='1', ent_source='INTERMEDIARY' - ✅ 列表查询 - 正确返回机构中介数据 - ✅ 详情查询 - 所有字段正确映射 - ✅ 修改功能 - 数据正确更新,标识保持不变 - ✅ Excel导入 - 批量导入成功,自动设置高风险和中介来源 - ✅ Excel导出 - 数据完整导出 ### 边界条件 - ✅ 唯一性约束 - 社会信用代码主键冲突 - ✅ 必填字段验证 - 姓名和证件号验证生效 ### 性能测试 - ✅ 100条数据导入 - 耗时 < 10秒 ## 数据映射验证 ### 个人中介字段映射 | 原字段 | 新字段 | 状态 | |--------|--------|------| | intermediary_id | biz_id | ✅ | | certificate_no | person_id | ✅ | | indiv_type | person_type | ✅ | | indiv_gender | gender | ✅ | | indiv_phone | mobile | ✅ | | indiv_wechat | wechat_no | ✅ | | indiv_address | contact_address | ✅ | ### 机构中介字段映射 | 原字段 | 新字段 | 状态 | |--------|--------|------| | corp_credit_code | social_credit_code | ✅ | | name | enterprise_name | ✅ | | corp_type | enterprise_type | ✅ | | corp_nature | enterprise_nature | ✅ | | - | risk_level='1' | ✅ 自动设置 | | - | ent_source='INTERMEDIARY' | ✅ 自动设置 | ## 结论 ✅ 所有测试通过,入库逻辑变更成功! ``` **Step 2: 提交测试报告** ```bash git add test_report.md git commit -m "test: 添加中介黑名单变更测试报告" ``` --- ## 注意事项 1. **机构中介ID处理**: 机构中介的主键是字符串类型(social_credit_code),查询详情时需要特殊处理 2. **自动设置标识**: 机构中介新增/导入时自动设置 `risk_level='1'` 和 `ent_source='INTERMEDIARY'`,修改时不应改变这两个值 3. **查询合并**: 列表查询需要从两个表获取数据并合并返回前端 4. **数据来源标识**: - 手动新增: date_source/data_source = 'MANUAL' - Excel导入: date_source/data_source = 'IMPORT' 5. **分页查询**: 当前实现是先查询所有数据再手动分页,大数据量时可能需要优化 6. **删除操作**: 当前只支持个人中介的数字ID删除,机构中介删除需要扩展支持