Files
ccdi/doc/other/中介黑名单导入功能修复说明.md
2026-02-09 14:34:27 +08:00

5.9 KiB
Raw Blame History

中介黑名单导入功能修复说明

问题描述

在导入机构中介黑名单数据时,出现以下错误:

Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'certificate_no' cannot be null

问题原因

  1. 数据库约束ccdi_intermediary_blacklist 表的 certificate_no 字段设置为 NOT NULL,不允许存储 null 值。

  2. 代码缺陷:在 CcdiIntermediaryBlacklistServiceImpl.javaimportEntityIntermediary 方法中,导入机构中介时只设置了 corpCreditCode(统一社会信用代码),但没有设置 certificateNo 字段,导致该字段为 null。

  3. 批量插入失败batchInsert 方法明确插入 certificate_no 字段,当值为 null 时违反数据库约束。

解决方案

1. 代码修改

文件CcdiIntermediaryBlacklistServiceImpl.java

修改位置:第 390-394 行

修改前

// 转换为实体
CcdiIntermediaryBlacklist intermediary = new CcdiIntermediaryBlacklist();
intermediary.setName(excel.getName());
intermediary.setIntermediaryType("2");

修改后

// 转换为实体
CcdiIntermediaryBlacklist intermediary = new CcdiIntermediaryBlacklist();
intermediary.setName(excel.getName());
// 对于机构中介,使用统一社会信用代码作为证件号
intermediary.setCertificateNo(excel.getCorpCreditCode());
intermediary.setIntermediaryType("2");

2. 验证逻辑增强

文件CcdiIntermediaryBlacklistServiceImpl.java

修改位置:第 484-488 行

修改前

private void validateEntityIntermediaryData(CcdiIntermediaryEntityExcel excel) {
    if (StringUtils.isEmpty(excel.getName())) {
        throw new RuntimeException("机构名称不能为空");
    }
}

修改后

private void validateEntityIntermediaryData(CcdiIntermediaryEntityExcel excel) {
    if (StringUtils.isEmpty(excel.getName())) {
        throw new RuntimeException("机构名称不能为空");
    }
    // 验证统一社会信用代码不能为空(因为会用作 certificate_no 字段)
    if (StringUtils.isEmpty(excel.getCorpCreditCode())) {
        throw new RuntimeException("统一社会信用代码不能为空");
    }
}

3. 批量更新 XML 配置优化

文件CcdiIntermediaryBlacklistMapper.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}

设计说明

为什么使用统一社会信用代码作为证件号?

  1. 数据一致性:统一社会信用代码本身就是机构的法定证件号,将其同时存储在 certificate_no 字段中可以保持数据的一致性。

  2. 查询便利certificate_no 字段有索引,设置后可以快速查询机构中介。

  3. 兼容性好:个人中介和机构中介都使用 certificate_no 字段,查询逻辑更统一。

  4. 不破坏现有结构:不需要修改数据库表结构,只修改代码逻辑。

测试验证

测试用例

  1. 个人中介导入:正常导入个人中介数据,验证 certificate_no 字段正确存储身份证号。

  2. 机构中介导入:导入机构中介数据,验证 certificate_no 字段正确存储统一社会信用代码。

  3. 统一社会信用代码为空:验证当统一社会信用代码为空时,导入被正确拒绝并给出错误提示。

  4. 批量更新:验证批量更新时 certificate_no 字段能够正确更新。

测试脚本

测试脚本位于:doc/test-data/test_import_fix.py

运行测试:

python doc/test-data/test_import_fix.py

影响范围

已影响的功能

  • 机构中介批量导入功能

不影响的功能

  • 个人中介导入功能
  • 手动新增中介功能
  • 中介查询功能
  • 中介导出功能

注意事项

  1. 数据迁移:如果数据库中已存在机构中介数据且 certificate_no 为 null需要执行以下 SQL 进行数据修复:
UPDATE ccdi_intermediary_blacklist
SET certificate_no = corp_credit_code
WHERE intermediary_type = '2' AND certificate_no IS NULL AND corp_credit_code IS NOT NULL;
  1. Excel 模板:确保导入模板中统一社会信用代码字段设置为必填项。

  2. 前端验证:建议在前端表单中也添加统一社会信用代码的必填验证。

修改文件列表

  1. CcdiIntermediaryBlacklistServiceImpl.java - 服务层实现
  2. CcdiIntermediaryBlacklistMapper.xml - MyBatis 映射文件
  3. test_import_fix.py - 测试脚本

版本历史

版本 日期 作者 说明
1.0 2026-01-29 ruoyi 初始版本,修复机构中介导入时 certificate_no 为 null 的问题