Files
ccdi/openspec/changes/enhance-intermediary-with-detailed-fields/design.md
2026-01-30 14:15:21 +08:00

30 KiB
Raw Blame History

Design: 增强中介黑名单字段并实现类型化模板导入

数据库设计

表扩展ccdi_intermediary_blacklist

在现有表基础上添加以下字段:

-- ============================================================
-- 个人类型字段 (以 indiv_ 前缀标识individual 缩写)
-- ============================================================
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_type` VARCHAR(30) DEFAULT NULL COMMENT '人员类型(中介、职业背债人、房产中介等)';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_sub_type` VARCHAR(50) DEFAULT NULL COMMENT '人员子类型(本人、配偶等)';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_gender` CHAR(1) DEFAULT NULL COMMENT '性别M男 F女 O其他';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_cert_type` VARCHAR(30) DEFAULT '身份证' COMMENT '证件类型';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号码(加密存储)';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_wechat` VARCHAR(50) DEFAULT NULL COMMENT '微信号';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_address` VARCHAR(200) DEFAULT NULL COMMENT '联系地址';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_company` VARCHAR(100) DEFAULT NULL COMMENT '所在公司';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_position` VARCHAR(100) DEFAULT NULL COMMENT '职位/职务';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_related_id` VARCHAR(20) DEFAULT NULL COMMENT '关联人员ID';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `indiv_relation` VARCHAR(50) DEFAULT NULL COMMENT '关联关系';

-- ============================================================
-- 机构类型字段 (以 corp_ 前缀标识corporation 缩写)
-- ============================================================
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_credit_code` VARCHAR(18) DEFAULT NULL COMMENT '统一社会信用代码';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_type` VARCHAR(50) DEFAULT NULL COMMENT '主体类型(有限责任公司、股份有限公司等)';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_nature` VARCHAR(50) DEFAULT NULL COMMENT '企业性质(国企、民企、外企等)';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_industry_category` VARCHAR(100) DEFAULT NULL COMMENT '行业分类';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_industry` VARCHAR(100) DEFAULT NULL COMMENT '所属行业';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_establish_date` DATE DEFAULT NULL COMMENT '成立日期';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_address` VARCHAR(500) DEFAULT NULL COMMENT '注册地址';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_legal_rep` VARCHAR(50) DEFAULT NULL COMMENT '法定代表人';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_legal_cert_type` VARCHAR(30) DEFAULT NULL COMMENT '法定代表人证件类型';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_legal_cert_no` VARCHAR(30) DEFAULT NULL COMMENT '法定代表人证件号码';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_shareholder_1` VARCHAR(30) DEFAULT NULL COMMENT '股东1';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_shareholder_2` VARCHAR(30) DEFAULT NULL COMMENT '股东2';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_shareholder_3` VARCHAR(30) DEFAULT NULL COMMENT '股东3';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_shareholder_4` VARCHAR(30) DEFAULT NULL COMMENT '股东4';
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `corp_shareholder_5` VARCHAR(30) DEFAULT NULL COMMENT '股东5';

-- ============================================================
-- 通用字段
-- ============================================================
ALTER TABLE ccdi_intermediary_blacklist ADD COLUMN `data_source` VARCHAR(30) DEFAULT 'MANUAL' COMMENT '数据来源MANUAL手动录入 SYSTEM系统同步 IMPORT批量导入 API接口获取';

完整表结构

CREATE TABLE `ccdi_intermediary_blacklist` (
  `intermediary_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '中介ID',

  -- ============================================================
  -- 核心字段(原有)
  -- ============================================================
  `name` VARCHAR(100) NOT NULL COMMENT '姓名/机构名称',
  `certificate_no` VARCHAR(50) DEFAULT NULL COMMENT '证件号',
  `intermediary_type` CHAR(1) NOT NULL DEFAULT '1' COMMENT '中介类型1个人 2机构',
  `status` CHAR(1) NOT NULL DEFAULT '0' COMMENT '状态0正常 1停用',
  `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',

  -- ============================================================
  -- 个人类型字段(新增,以 indiv_ 前缀标识)
  -- ============================================================
  `indiv_type` VARCHAR(30) DEFAULT NULL COMMENT '人员类型',
  `indiv_sub_type` VARCHAR(50) DEFAULT NULL COMMENT '人员子类型',
  `indiv_gender` CHAR(1) DEFAULT NULL COMMENT '性别M男 F女 O其他',
  `indiv_cert_type` VARCHAR(30) DEFAULT '身份证' COMMENT '证件类型',
  `indiv_phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号码',
  `indiv_wechat` VARCHAR(50) DEFAULT NULL COMMENT '微信号',
  `indiv_address` VARCHAR(200) DEFAULT NULL COMMENT '联系地址',
  `indiv_company` VARCHAR(100) DEFAULT NULL COMMENT '所在公司',
  `indiv_position` VARCHAR(100) DEFAULT NULL COMMENT '职位/职务',
  `indiv_related_id` VARCHAR(20) DEFAULT NULL COMMENT '关联人员ID',
  `indiv_relation` VARCHAR(50) DEFAULT NULL COMMENT '关联关系',

  -- ============================================================
  -- 机构类型字段(新增,以 corp_ 前缀标识)
  -- ============================================================
  `corp_credit_code` VARCHAR(18) DEFAULT NULL COMMENT '统一社会信用代码',
  `corp_type` VARCHAR(50) DEFAULT NULL COMMENT '主体类型',
  `corp_nature` VARCHAR(50) DEFAULT NULL COMMENT '企业性质',
  `corp_industry_category` VARCHAR(100) DEFAULT NULL COMMENT '行业分类',
  `corp_industry` VARCHAR(100) DEFAULT NULL COMMENT '所属行业',
  `corp_establish_date` DATE DEFAULT NULL COMMENT '成立日期',
  `corp_address` VARCHAR(500) DEFAULT NULL COMMENT '注册地址',
  `corp_legal_rep` VARCHAR(50) DEFAULT NULL COMMENT '法定代表人',
  `corp_legal_cert_type` VARCHAR(30) DEFAULT NULL COMMENT '法定代表人证件类型',
  `corp_legal_cert_no` VARCHAR(30) DEFAULT NULL COMMENT '法定代表人证件号码',
  `corp_shareholder_1` VARCHAR(30) DEFAULT NULL COMMENT '股东1',
  `corp_shareholder_2` VARCHAR(30) DEFAULT NULL COMMENT '股东2',
  `corp_shareholder_3` VARCHAR(30) DEFAULT NULL COMMENT '股东3',
  `corp_shareholder_4` VARCHAR(30) DEFAULT NULL COMMENT '股东4',
  `corp_shareholder_5` VARCHAR(30) DEFAULT NULL COMMENT '股东5',

  -- ============================================================
  -- 通用字段(新增)
  -- ============================================================
  `data_source` VARCHAR(30) DEFAULT 'MANUAL' COMMENT '数据来源',

  -- ============================================================
  -- 审计字段(原有)
  -- ============================================================
  `create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
  `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
  `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',

  PRIMARY KEY (`intermediary_id`),
  KEY `idx_name` (`name`),
  KEY `idx_certificate_no` (`certificate_no`),
  KEY `idx_intermediary_type` (`intermediary_type`),
  KEY `idx_corp_credit_code` (`corp_credit_code`),
  KEY `idx_indiv_phone` (`indiv_phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='中介人员黑名单表';

新增字段说明

字段名 类型 说明 适用类型 必填 默认值
indiv_type VARCHAR(30) 人员类型(中介、职业背债人等) 个人 NULL
indiv_sub_type VARCHAR(50) 人员子类型(本人、配偶等) 个人 NULL
indiv_gender CHAR(1) 性别M男 F女 O其他 个人 NULL
indiv_cert_type VARCHAR(30) 证件类型 个人 身份证
indiv_phone VARCHAR(20) 手机号码 个人 NULL
indiv_wechat VARCHAR(50) 微信号 个人 NULL
indiv_address VARCHAR(200) 联系地址 个人 NULL
indiv_company VARCHAR(100) 所在公司 个人 NULL
indiv_position VARCHAR(100) 职位/职务 个人 NULL
indiv_related_id VARCHAR(20) 关联人员ID 个人 NULL
indiv_relation VARCHAR(50) 关联关系 个人 NULL
corp_credit_code VARCHAR(18) 统一社会信用代码 机构 NULL
corp_type VARCHAR(50) 主体类型 机构 NULL
corp_nature VARCHAR(50) 企业性质 机构 NULL
corp_industry_category VARCHAR(100) 行业分类 机构 NULL
corp_industry VARCHAR(100) 所属行业 机构 NULL
corp_establish_date DATE 成立日期 机构 NULL
corp_address VARCHAR(500) 注册地址 机构 NULL
corp_legal_rep VARCHAR(50) 法定代表人 机构 NULL
corp_legal_cert_type VARCHAR(30) 法定代表人证件类型 机构 NULL
corp_legal_cert_no VARCHAR(30) 法定代表人证件号码 机构 NULL
corp_shareholder_1 VARCHAR(30) 股东1 机构 NULL
corp_shareholder_2 VARCHAR(30) 股东2 机构 NULL
corp_shareholder_3 VARCHAR(30) 股东3 机构 NULL
corp_shareholder_4 VARCHAR(30) 股东4 机构 NULL
corp_shareholder_5 VARCHAR(30) 股东5 机构 NULL
data_source VARCHAR(30) 数据来源 全部 MANUAL

字段命名规则:

  • 个人字段:统一使用 indiv_ 前缀individual 缩写),便于快速识别
  • 机构字段:统一使用 corp_ 前缀corporation 缩写),便于快速识别
  • 通用字段:无前缀,适用于所有类型

后端设计

模块结构

ruoyi-dpc/
├── src/main/java/com/ruoyi/dpc/
│   ├── controller/
│   │   └── CcdiIntermediaryBlacklistController.java (修改)
│   ├── domain/
│   │   ├── CcdiIntermediaryBlacklist.java (修改 - 添加新字段)
│   │   ├── dto/
│   │   │   ├── CcdiIntermediaryBlacklistAddDTO.java (保留 - 兼容)
│   │   │   ├── CcdiIntermediaryBlacklistEditDTO.java (保留 - 兼容)
│   │   │   ├── CcdiIntermediaryBlacklistQueryDTO.java (保留)
│   │   │   ├── CcdiIntermediaryPersonAddDTO.java (新增)
│   │   │   └── CcdiIntermediaryEntityAddDTO.java (新增)
│   │   ├── vo/
│   │   │   ├── CcdiIntermediaryBlacklistVO.java (保留 - 列表用)
│   │   │   ├── CcdiIntermediaryPersonDetailVO.java (新增)
│   │   │   └── CcdiIntermediaryEntityDetailVO.java (新增)
│   │   └── excel/
│   │       ├── CcdiIntermediaryBlacklistExcel.java (保留 - 通用模板)
│   │       ├── CcdiIntermediaryPersonExcel.java (新增)
│   │       └── CcdiIntermediaryEntityExcel.java (新增)
│   ├── mapper/
│   │   └── CcdiIntermediaryBlacklistMapper.java
│   └── service/
│       ├── ICcdiIntermediaryBlacklistService.java (修改接口)
│       └── impl/
│           └── CcdiIntermediaryBlacklistServiceImpl.java (修改实现)
└── src/main/resources/mapper/dpc/
    └── CcdiIntermediaryBlacklistMapper.xml

Controller 层设计

新增接口:

@RestController
@RequestMapping("/dpc/intermediary")
public class CcdiIntermediaryBlacklistController extends BaseController {

    // ... 现有接口保持不变 ...

    /**
     * 下载个人中介导入模板(带字典下拉框)
     */
    @Operation(summary = "下载个人中介导入模板")
    @PostMapping("/importPersonTemplate")
    public void importPersonTemplate(HttpServletResponse response) {
        EasyExcelUtil.importTemplateWithDictDropdown(
            response,
            CcdiIntermediaryPersonExcel.class,
            "个人中介黑名单"
        );
    }

    /**
     * 下载机构中介导入模板(带字典下拉框)
     */
    @Operation(summary = "下载机构中介导入模板")
    @PostMapping("/importEntityTemplate")
    public void importEntityTemplate(HttpServletResponse response) {
        EasyExcelUtil.importTemplateWithDictDropdown(
            response,
            CcdiIntermediaryEntityExcel.class,
            "机构中介黑名单"
        );
    }

    /**
     * 导入个人中介黑名单
     */
    @Operation(summary = "导入个人中介黑名单")
    @PreAuthorize("@ss.hasPermi('dpc:intermediary:import')")
    @Log(title = "中介黑名单", businessType = BusinessType.IMPORT)
    @PostMapping("/importPersonData")
    public AjaxResult importPersonData(MultipartFile file, boolean updateSupport) throws Exception {
        List<CcdiIntermediaryPersonExcel> list = EasyExcelUtil.importExcel(
            file.getInputStream(), CcdiIntermediaryPersonExcel.class);
        String message = intermediaryService.importPersonIntermediary(list, updateSupport);
        return success(message);
    }

    /**
     * 导入机构中介黑名单
     */
    @Operation(summary = "导入机构中介黑名单")
    @PreAuthorize("@ss.hasPermi('dpc:intermediary:import')")
    @Log(title = "中介黑名单", businessType = BusinessType.IMPORT)
    @PostMapping("/importEntityData")
    public AjaxResult importEntityData(MultipartFile file, boolean updateSupport) throws Exception {
        List<CcdiIntermediaryEntityExcel> list = EasyExcelUtil.importExcel(
            file.getInputStream(), CcdiIntermediaryEntityExcel.class);
        String message = intermediaryService.importEntityIntermediary(list, updateSupport);
        return success(message);
    }
}

Service 层设计

接口扩展:

public interface ICcdiIntermediaryBlacklistService {

    // ... 现有方法保持不变 ...

    /**
     * 根据中介类型获取详情(返回不同类型)
     */
    Object selectIntermediaryDetailById(Long intermediaryId);

    /**
     * 导入个人中介数据
     */
    String importPersonIntermediary(List<CcdiIntermediaryPersonExcel> list, boolean isUpdateSupport);

    /**
     * 导入机构中介数据
     */
    String importEntityIntermediary(List<CcdiIntermediaryEntityExcel> list, boolean isUpdateSupport);
}

Excel 类设计

使用 @DictDropdown 注解实现字典下拉框

项目已有现成的字典下拉框功能,详见:doc/EasyExcel字典下拉框使用说明.md

个人中介 Excel 类:

@Data
public class CcdiIntermediaryPersonExcel implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @ExcelProperty(value = "姓名", index = 0)
    @ColumnWidth(15)
    private String name;

    @ExcelProperty(value = "人员类型", index = 1)
    @ColumnWidth(15)
    private String indivType;           // 对应 indiv_type

    @ExcelProperty(value = "人员子类型", index = 2)
    @ColumnWidth(15)
    private String indivSubType;         // 对应 indiv_sub_type

    @ExcelProperty(value = "性别", index = 3)
    @ColumnWidth(10)
    @DictDropdown(dictType = "ccdi_indiv_gender")
    private String indivGender;          // 对应 indiv_gender字典下拉框男/女/其他

    @ExcelProperty(value = "证件类型", index = 4)
    @ColumnWidth(15)
    @DictDropdown(dictType = "ccdi_certificate_type")
    private String indivCertType;        // 对应 indiv_cert_type字典下拉框身份证/护照/港澳通行证/台胞证/军官证

    @ExcelProperty(value = "证件号码", index = 5)
    @ColumnWidth(20)
    private String certificateNo;

    @ExcelProperty(value = "手机号码", index = 6)
    @ColumnWidth(15)
    private String indivPhone;           // 对应 indiv_phone

    @ExcelProperty(value = "微信号", index = 7)
    @ColumnWidth(15)
    private String indivWechat;          // 对应 indiv_wechat

    @ExcelProperty(value = "联系地址", index = 8)
    @ColumnWidth(30)
    private String indivAddress;         // 对应 indiv_address

    @ExcelProperty(value = "所在公司", index = 9)
    @ColumnWidth(20)
    private String indivCompany;         // 对应 indiv_company

    @ExcelProperty(value = "职位", index = 10)
    @ColumnWidth(15)
    private String indivPosition;        // 对应 indiv_position

    @ExcelProperty(value = "关联人员ID", index = 11)
    @ColumnWidth(15)
    private String indivRelatedId;       // 对应 indiv_related_id

    @ExcelProperty(value = "关联关系", index = 12)
    @ColumnWidth(15)
    private String indivRelation;        // 对应 indiv_relation

    @ExcelProperty(value = "备注", index = 13)
    @ColumnWidth(30)
    private String remark;

    // 以下字段不在 Excel 中显示,由系统自动设置
    // private String status;              // 默认正常0
    // private String dataSource;          // 默认批量导入IMPORT
}

机构中介 Excel 类:

@Data
public class CcdiIntermediaryEntityExcel implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @ExcelProperty(value = "机构名称", index = 0)
    @ColumnWidth(25)
    private String name;

    @ExcelProperty(value = "统一社会信用代码", index = 1)
    @ColumnWidth(20)
    private String corpCreditCode;       // 对应 corp_credit_code

    @ExcelProperty(value = "主体类型", index = 2)
    @ColumnWidth(20)
    @DictDropdown(dictType = "ccdi_entity_type")
    private String corpType;             // 对应 corp_type字典下拉框有限责任公司/股份有限公司/合伙企业/个体工商户/外资企业

    @ExcelProperty(value = "企业性质", index = 3)
    @ColumnWidth(15)
    @DictDropdown(dictType = "ccdi_enterprise_nature")
    private String corpNature;           // 对应 corp_nature字典下拉框国企/民企/外企/合资/其他

    @ExcelProperty(value = "行业分类", index = 4)
    @ColumnWidth(15)
    private String corpIndustryCategory; // 对应 corp_industry_category

    @ExcelProperty(value = "所属行业", index = 5)
    @ColumnWidth(15)
    private String corpIndustry;         // 对应 corp_industry

    @ExcelProperty(value = "成立日期", index = 6)
    @ColumnWidth(15)
    private String corpEstablishDate;    // 对应 corp_establish_date

    @ExcelProperty(value = "注册地址", index = 7)
    @ColumnWidth(40)
    private String corpAddress;          // 对应 corp_address

    @ExcelProperty(value = "法定代表人", index = 8)
    @ColumnWidth(15)
    private String corpLegalRep;         // 对应 corp_legal_rep

    @ExcelProperty(value = "法定代表人证件类型", index = 9)
    @ColumnWidth(20)
    private String corpLegalCertType;    // 对应 corp_legal_cert_type

    @ExcelProperty(value = "法定代表人证件号码", index = 10)
    @ColumnWidth(20)
    private String corpLegalCertNo;      // 对应 corp_legal_cert_no

    @ExcelProperty(value = "股东1", index = 11)
    @ColumnWidth(15)
    private String corpShareholder1;     // 对应 corp_shareholder_1

    @ExcelProperty(value = "股东2", index = 12)
    @ColumnWidth(15)
    private String corpShareholder2;     // 对应 corp_shareholder_2

    @ExcelProperty(value = "股东3", index = 13)
    @ColumnWidth(15)
    private String corpShareholder3;     // 对应 corp_shareholder_3

    @ExcelProperty(value = "股东4", index = 14)
    @ColumnWidth(15)
    private String corpShareholder4;     // 对应 corp_shareholder_4

    @ExcelProperty(value = "股东5", index = 15)
    @ColumnWidth(15)
    private String corpShareholder5;     // 对应 corp_shareholder_5

    @ExcelProperty(value = "备注", index = 16)
    @ColumnWidth(30)
    private String remark;

    // 以下字段不在 Excel 中显示,由系统自动设置
    // private String status;              // 默认正常0
    // private String dataSource;          // 默认批量导入IMPORT
}

VO 设计

个人详情 VO

@Data
public class CcdiIntermediaryPersonDetailVO implements Serializable {

    // 核心字段
    private Long intermediaryId;
    private String name;
    private String certificateNo;
    private String intermediaryType;
    private String intermediaryTypeName;
    private String status;
    private String statusName;
    private String remark;
    private String dataSource;

    // 个人专属字段(使用 indiv_ 前缀)
    private String indivType;           // 人员类型
    private String indivSubType;         // 人员子类型
    private String indivGender;          // 性别
    private String indivGenderName;      // 性别名称
    private String indivCertType;        // 证件类型
    private String indivPhone;           // 手机号码
    private String indivWechat;          // 微信号
    private String indivAddress;         // 联系地址
    private String indivCompany;         // 所在公司
    private String indivPosition;        // 职位/职务
    private String indivRelatedId;       // 关联人员ID
    private String indivRelation;        // 关联关系

    // 审计字段
    private String createBy;
    private Date createTime;
    private String updateBy;
    private Date updateTime;
}

机构详情 VO

@Data
public class CcdiIntermediaryEntityDetailVO implements Serializable {

    // 核心字段
    private Long intermediaryId;
    private String name;
    private String certificateNo;
    private String intermediaryType;
    private String intermediaryTypeName;
    private String status;
    private String statusName;
    private String remark;
    private String dataSource;

    // 机构专属字段(使用 corp_ 前缀)
    private String corpCreditCode;       // 统一社会信用代码
    private String corpType;             // 主体类型
    private String corpNature;           // 企业性质
    private String corpIndustryCategory; // 行业分类
    private String corpIndustry;         // 所属行业
    private String corpEstablishDate;    // 成立日期
    private String corpAddress;          // 注册地址
    private String corpLegalRep;         // 法定代表人
    private String corpLegalCertType;    // 法定代表人证件类型
    private String corpLegalCertNo;      // 法定代表人证件号码
    private String corpShareholder1;     // 股东1
    private String corpShareholder2;     // 股东2
    private String corpShareholder3;     // 股东3
    private String corpShareholder4;     // 股东4
    private String corpShareholder5;     // 股东5

    // 审计字段
    private String createBy;
    private Date createTime;
    private String updateBy;
    private Date updateTime;
}

Excel 导入导出设计

Excel 下拉框配置

为提高数据录入的准确性和一致性,以下字段在 Excel 模板中配置下拉框验证:

个人中介模板下拉框

列名 下拉框选项 说明
性别 男, 女, 其他 对应值M, F, O
证件类型 身份证, 护照, 港澳通行证, 台胞证, 军官证 从字典 ccdi_certificate_type 加载

机构中介模板下拉框

列名 下拉框选项 说明
主体类型 有限责任公司, 股份有限公司, 合伙企业, 个体工商户, 外资企业 从字典 ccdi_entity_type 加载
企业性质 国企, 民企, 外企, 合资, 其他 从字典 ccdi_enterprise_nature 加载

注意

  • 状态字段:不在 Excel 模板中显示,导入时默认设置为"正常"0
  • 数据来源字段:不在 Excel 模板中显示,导入时默认设置为"批量导入"IMPORT

下拉框实现方式

使用项目现有的 @DictDropdown 注解功能,详见:doc/EasyExcel字典下拉框使用说明.md

核心组件:

  • @DictDropdown 注解:com.ruoyi.common.annotation.DictDropdown
  • DictDropdownWriteHandler 处理器:com.ruoyi.dpc.handler.DictDropdownWriteHandler
  • EasyExcelUtil.importTemplateWithDictDropdown()com.ruoyi.dpc.utils.EasyExcelUtil

实现步骤:

  1. 在 Excel 类的对应字段上添加 @DictDropdown(dictType = "字典类型") 注解
  2. 在若依系统中配置对应的字典数据
  3. 使用 EasyExcelUtil.importTemplateWithDictDropdown() 生成模板
  4. 系统自动从 Redis 缓存读取字典数据并生成下拉框

优势:

  • 无需手动编写下拉框处理器代码
  • 字典数据统一管理,维护方便
  • 支持大量下拉选项(自动使用隐藏 Sheet
  • 下拉选项可动态更新

个人中介模板格式

姓名 人员类型 人员子类型 性别▼ 证件类型▼ 证件号码 手机号码 微信号 联系地址 所在公司 职位 关联人员ID 关联关系 备注
张三 中介 本人 身份证 110101199001011234 13800138000 zhangsan 北京市朝阳区 XX公司 经纪人 - - 测试

注:带 ▼ 标记的列包含下拉框;状态默认为"正常",数据来源默认为"批量导入"

机构中介模板格式

机构名称 统一社会信用代码 主体类型▼ 企业性质▼ 行业分类 所属行业 成立日期 注册地址 法定代表人 法定代表人证件类型 法定代表人证件号码 股东1 股东2 股东3 股东4 股东5 备注
XX中介公司 91110000XXXXXXXXXX 有限责任公司 民企 房地产 房地产业 2020-01-01 北京市朝阳区 张三 身份证 110101199001011234 李四 王五 - - - -

注:带 ▼ 标记的列包含下拉框;状态默认为"正常",数据来源默认为"批量导入"

导入数据验证规则

个人中介验证规则:

  1. 姓名:必填,长度 1-50 字符
  2. 证件号码:必填,长度不超过 30 字符
  3. 证件类型:选填,默认"身份证"
  4. 其他字段:选填,按长度限制验证
  5. 状态:系统默认设置为"正常"0
  6. 数据来源:系统默认设置为"批量导入"IMPORT

机构中介验证规则:

  1. 机构名称:必填,长度 1-200 字符
  2. 统一社会信用代码选填18 位
  3. 其他字段:选填,按长度限制验证
  4. 状态:系统默认设置为"正常"0
  5. 数据来源:系统默认设置为"批量导入"IMPORT

字典数据设计

人员类型ccdi_person_type

字典值 字典标签 排序 状态
中介 中介 1 正常
职业背债人 职业背债人 2 正常
房产中介 房产中介 3 正常

人员子类型ccdi_person_sub_type

字典值 字典标签 排序 状态
本人 本人 1 正常
配偶 配偶 2 正常
子女 子女 3 正常
其他 其他 9 正常

证件类型ccdi_certificate_type

字典值 字典标签 排序 状态
身份证 身份证 1 正常
护照 护照 2 正常
港澳通行证 港澳通行证 3 正常
台胞证 台胞证 4 正常
军官证 军官证 5 正常

主体类型ccdi_entity_type

字典值 字典标签 排序 状态
有限责任公司 有限责任公司 1 正常
股份有限公司 股份有限公司 2 正常
合伙企业 合伙企业 3 正常
个体工商户 个体工商户 4 正常
外资企业 外资企业 5 正常

企业性质ccdi_enterprise_nature

字典值 字典标签 排序 状态
国企 国企 1 正常
民企 民企 2 正常
外企 外企 3 正常
合资 合资 4 正常
其他 其他 9 正常

数据来源ccdi_data_source

字典值 字典标签 排序 状态
MANUAL 手动录入 1 正常
SYSTEM 系统同步 2 正常
IMPORT 批量导入 3 正常
API 接口获取 4 正常

技术约束

  1. 后端框架Spring Boot 3.5.8
  2. ORM 框架MyBatis Plus 3.5.10
  3. Excel 处理EasyExcel
  4. 数据库MySQL 8.2.0
  5. 字符编码UTF-8utf8mb4
  6. 向后兼容:保持现有接口和数据结构不变

工具类使用

EasyExcelUtil 现有方法

项目已有 EasyExcelUtil.importTemplateWithDictDropdown() 方法,可直接使用:

// 生成个人中介模板(带字典下拉框)
EasyExcelUtil.importTemplateWithDictDropdown(
    response,
    CcdiIntermediaryPersonExcel.class,
    "个人中介黑名单"
);

// 生成机构中介模板(带字典下拉框)
EasyExcelUtil.importTemplateWithDictDropdown(
    response,
    CcdiIntermediaryEntityExcel.class,
    "机构中介黑名单"
);

参考文档: doc/EasyExcel字典下拉框使用说明.md