5.8 KiB
中介黑名单导入功能修复说明
问题描述
在导入机构中介黑名单数据时,出现以下错误:
Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'certificate_no' cannot be null
问题原因
-
数据库约束:
dpc_intermediary_blacklist表的certificate_no字段设置为NOT NULL,不允许存储 null 值。 -
代码缺陷:在
DpcIntermediaryBlacklistServiceImpl.java的importEntityIntermediary方法中,导入机构中介时只设置了corpCreditCode(统一社会信用代码),但没有设置certificateNo字段,导致该字段为 null。 -
批量插入失败:
batchInsert方法明确插入certificate_no字段,当值为 null 时违反数据库约束。
解决方案
1. 代码修改
文件:DpcIntermediaryBlacklistServiceImpl.java
修改位置:第 390-394 行
修改前:
// 转换为实体
DpcIntermediaryBlacklist intermediary = new DpcIntermediaryBlacklist();
intermediary.setName(excel.getName());
intermediary.setIntermediaryType("2");
修改后:
// 转换为实体
DpcIntermediaryBlacklist intermediary = new DpcIntermediaryBlacklist();
intermediary.setName(excel.getName());
// 对于机构中介,使用统一社会信用代码作为证件号
intermediary.setCertificateNo(excel.getCorpCreditCode());
intermediary.setIntermediaryType("2");
2. 验证逻辑增强
文件:DpcIntermediaryBlacklistServiceImpl.java
修改位置:第 484-488 行
修改前:
private void validateEntityIntermediaryData(DpcIntermediaryEntityExcel excel) {
if (StringUtils.isEmpty(excel.getName())) {
throw new RuntimeException("机构名称不能为空");
}
}
修改后:
private void validateEntityIntermediaryData(DpcIntermediaryEntityExcel excel) {
if (StringUtils.isEmpty(excel.getName())) {
throw new RuntimeException("机构名称不能为空");
}
// 验证统一社会信用代码不能为空(因为会用作 certificate_no 字段)
if (StringUtils.isEmpty(excel.getCorpCreditCode())) {
throw new RuntimeException("统一社会信用代码不能为空");
}
}
3. 批量更新 XML 配置优化
文件:DpcIntermediaryBlacklistMapper.xml
修改位置:第 125-127 行
修改前:
<if test="item.dataSource != null">data_source = #{item.dataSource},</if>
update_by = #{item.updateBy},
update_time = #{item.updateTime}
修改后:
<if test="item.dataSource != null">data_source = #{item.dataSource},</if>
<if test="item.certificateNo != null">certificate_no = #{item.certificateNo},</if>
update_by = #{item.updateBy},
update_time = #{item.updateTime}
设计说明
为什么使用统一社会信用代码作为证件号?
-
数据一致性:统一社会信用代码本身就是机构的法定证件号,将其同时存储在
certificate_no字段中可以保持数据的一致性。 -
查询便利:
certificate_no字段有索引,设置后可以快速查询机构中介。 -
兼容性好:个人中介和机构中介都使用
certificate_no字段,查询逻辑更统一。 -
不破坏现有结构:不需要修改数据库表结构,只修改代码逻辑。
测试验证
测试用例
-
个人中介导入:正常导入个人中介数据,验证
certificate_no字段正确存储身份证号。 -
机构中介导入:导入机构中介数据,验证
certificate_no字段正确存储统一社会信用代码。 -
统一社会信用代码为空:验证当统一社会信用代码为空时,导入被正确拒绝并给出错误提示。
-
批量更新:验证批量更新时
certificate_no字段能够正确更新。
测试脚本
测试脚本位于:doc/test-data/test_import_fix.py
运行测试:
python doc/test-data/test_import_fix.py
影响范围
已影响的功能
- 机构中介批量导入功能
不影响的功能
- 个人中介导入功能
- 手动新增中介功能
- 中介查询功能
- 中介导出功能
注意事项
- 数据迁移:如果数据库中已存在机构中介数据且
certificate_no为 null,需要执行以下 SQL 进行数据修复:
UPDATE dpc_intermediary_blacklist
SET certificate_no = corp_credit_code
WHERE intermediary_type = '2' AND certificate_no IS NULL AND corp_credit_code IS NOT NULL;
-
Excel 模板:确保导入模板中统一社会信用代码字段设置为必填项。
-
前端验证:建议在前端表单中也添加统一社会信用代码的必填验证。
修改文件列表
- DpcIntermediaryBlacklistServiceImpl.java - 服务层实现
- DpcIntermediaryBlacklistMapper.xml - MyBatis 映射文件
- test_import_fix.py - 测试脚本
版本历史
| 版本 | 日期 | 作者 | 说明 |
|---|---|---|---|
| 1.0 | 2026-01-29 | ruoyi | 初始版本,修复机构中介导入时 certificate_no 为 null 的问题 |