Files
ccdi/openspec/changes/enhance-intermediary-with-detailed-fields/design.md
2026-01-29 13:39:47 +08:00

701 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Design: 增强中介黑名单字段并实现类型化模板导入
## 数据库设计
### 表扩展dpc_intermediary_blacklist
在现有表基础上添加以下字段:
```sql
-- ============================================================
-- 个人类型字段 (以 indiv_ 前缀标识individual 缩写)
-- ============================================================
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_type` VARCHAR(30) DEFAULT NULL COMMENT '人员类型(中介、职业背债人、房产中介等)';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_sub_type` VARCHAR(50) DEFAULT NULL COMMENT '人员子类型(本人、配偶等)';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_gender` CHAR(1) DEFAULT NULL COMMENT '性别M男 F女 O其他';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_cert_type` VARCHAR(30) DEFAULT '身份证' COMMENT '证件类型';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号码(加密存储)';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_wechat` VARCHAR(50) DEFAULT NULL COMMENT '微信号';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_address` VARCHAR(200) DEFAULT NULL COMMENT '联系地址';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_company` VARCHAR(100) DEFAULT NULL COMMENT '所在公司';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_position` VARCHAR(100) DEFAULT NULL COMMENT '职位/职务';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_related_id` VARCHAR(20) DEFAULT NULL COMMENT '关联人员ID';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `indiv_relation` VARCHAR(50) DEFAULT NULL COMMENT '关联关系';
-- ============================================================
-- 机构类型字段 (以 corp_ 前缀标识corporation 缩写)
-- ============================================================
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_credit_code` VARCHAR(18) DEFAULT NULL COMMENT '统一社会信用代码';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_type` VARCHAR(50) DEFAULT NULL COMMENT '主体类型(有限责任公司、股份有限公司等)';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_nature` VARCHAR(50) DEFAULT NULL COMMENT '企业性质(国企、民企、外企等)';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_industry_category` VARCHAR(100) DEFAULT NULL COMMENT '行业分类';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_industry` VARCHAR(100) DEFAULT NULL COMMENT '所属行业';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_establish_date` DATE DEFAULT NULL COMMENT '成立日期';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_address` VARCHAR(500) DEFAULT NULL COMMENT '注册地址';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_legal_rep` VARCHAR(50) DEFAULT NULL COMMENT '法定代表人';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_legal_cert_type` VARCHAR(30) DEFAULT NULL COMMENT '法定代表人证件类型';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_legal_cert_no` VARCHAR(30) DEFAULT NULL COMMENT '法定代表人证件号码';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_shareholder_1` VARCHAR(30) DEFAULT NULL COMMENT '股东1';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_shareholder_2` VARCHAR(30) DEFAULT NULL COMMENT '股东2';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_shareholder_3` VARCHAR(30) DEFAULT NULL COMMENT '股东3';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_shareholder_4` VARCHAR(30) DEFAULT NULL COMMENT '股东4';
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `corp_shareholder_5` VARCHAR(30) DEFAULT NULL COMMENT '股东5';
-- ============================================================
-- 通用字段
-- ============================================================
ALTER TABLE dpc_intermediary_blacklist ADD COLUMN `data_source` VARCHAR(30) DEFAULT 'MANUAL' COMMENT '数据来源MANUAL手动录入 SYSTEM系统同步 IMPORT批量导入 API接口获取';
```
### 完整表结构
```sql
CREATE TABLE `dpc_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/
│ │ └── DpcIntermediaryBlacklistController.java (修改)
│ ├── domain/
│ │ ├── DpcIntermediaryBlacklist.java (修改 - 添加新字段)
│ │ ├── dto/
│ │ │ ├── DpcIntermediaryBlacklistAddDTO.java (保留 - 兼容)
│ │ │ ├── DpcIntermediaryBlacklistEditDTO.java (保留 - 兼容)
│ │ │ ├── DpcIntermediaryBlacklistQueryDTO.java (保留)
│ │ │ ├── DpcIntermediaryPersonAddDTO.java (新增)
│ │ │ └── DpcIntermediaryEntityAddDTO.java (新增)
│ │ ├── vo/
│ │ │ ├── DpcIntermediaryBlacklistVO.java (保留 - 列表用)
│ │ │ ├── DpcIntermediaryPersonDetailVO.java (新增)
│ │ │ └── DpcIntermediaryEntityDetailVO.java (新增)
│ │ └── excel/
│ │ ├── DpcIntermediaryBlacklistExcel.java (保留 - 通用模板)
│ │ ├── DpcIntermediaryPersonExcel.java (新增)
│ │ └── DpcIntermediaryEntityExcel.java (新增)
│ ├── mapper/
│ │ └── DpcIntermediaryBlacklistMapper.java
│ └── service/
│ ├── IDpcIntermediaryBlacklistService.java (修改接口)
│ └── impl/
│ └── DpcIntermediaryBlacklistServiceImpl.java (修改实现)
└── src/main/resources/mapper/dpc/
└── DpcIntermediaryBlacklistMapper.xml
```
### Controller 层设计
**新增接口:**
```java
@RestController
@RequestMapping("/dpc/intermediary")
public class DpcIntermediaryBlacklistController extends BaseController {
// ... 现有接口保持不变 ...
/**
* 下载个人中介导入模板(带字典下拉框)
*/
@Operation(summary = "下载个人中介导入模板")
@PostMapping("/importPersonTemplate")
public void importPersonTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(
response,
DpcIntermediaryPersonExcel.class,
"个人中介黑名单"
);
}
/**
* 下载机构中介导入模板(带字典下拉框)
*/
@Operation(summary = "下载机构中介导入模板")
@PostMapping("/importEntityTemplate")
public void importEntityTemplate(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(
response,
DpcIntermediaryEntityExcel.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<DpcIntermediaryPersonExcel> list = EasyExcelUtil.importExcel(
file.getInputStream(), DpcIntermediaryPersonExcel.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<DpcIntermediaryEntityExcel> list = EasyExcelUtil.importExcel(
file.getInputStream(), DpcIntermediaryEntityExcel.class);
String message = intermediaryService.importEntityIntermediary(list, updateSupport);
return success(message);
}
}
```
### Service 层设计
**接口扩展:**
```java
public interface IDpcIntermediaryBlacklistService {
// ... 现有方法保持不变 ...
/**
* 根据中介类型获取详情(返回不同类型)
*/
Object selectIntermediaryDetailById(Long intermediaryId);
/**
* 导入个人中介数据
*/
String importPersonIntermediary(List<DpcIntermediaryPersonExcel> list, boolean isUpdateSupport);
/**
* 导入机构中介数据
*/
String importEntityIntermediary(List<DpcIntermediaryEntityExcel> list, boolean isUpdateSupport);
}
```
### Excel 类设计
**使用 @DictDropdown 注解实现字典下拉框**
项目已有现成的字典下拉框功能,详见:[doc/EasyExcel字典下拉框使用说明.md](../../../doc/EasyExcel字典下拉框使用说明.md)
**个人中介 Excel 类:**
```java
@Data
public class DpcIntermediaryPersonExcel 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 = "dpc_indiv_gender")
private String indivGender; // 对应 indiv_gender字典下拉框男/女/其他
@ExcelProperty(value = "证件类型", index = 4)
@ColumnWidth(15)
@DictDropdown(dictType = "dpc_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 类:**
```java
@Data
public class DpcIntermediaryEntityExcel 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 = "dpc_entity_type")
private String corpType; // 对应 corp_type字典下拉框有限责任公司/股份有限公司/合伙企业/个体工商户/外资企业
@ExcelProperty(value = "企业性质", index = 3)
@ColumnWidth(15)
@DictDropdown(dictType = "dpc_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**
```java
@Data
public class DpcIntermediaryPersonDetailVO 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**
```java
@Data
public class DpcIntermediaryEntityDetailVO 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 |
| 证件类型 | 身份证, 护照, 港澳通行证, 台胞证, 军官证 | 从字典 dpc_certificate_type 加载 |
#### 机构中介模板下拉框
| 列名 | 下拉框选项 | 说明 |
|------|-----------|------|
| 主体类型 | 有限责任公司, 股份有限公司, 合伙企业, 个体工商户, 外资企业 | 从字典 dpc_entity_type 加载 |
| 企业性质 | 国企, 民企, 外企, 合资, 其他 | 从字典 dpc_enterprise_nature 加载 |
**注意**
- **状态字段**:不在 Excel 模板中显示,导入时默认设置为"正常"0
- **数据来源字段**:不在 Excel 模板中显示,导入时默认设置为"批量导入"IMPORT
#### 下拉框实现方式
使用项目现有的 `@DictDropdown` 注解功能,详见:[doc/EasyExcel字典下拉框使用说明.md](../../../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
## 字典数据设计
### 人员类型dpc_person_type
| 字典值 | 字典标签 | 排序 | 状态 |
|-------|---------|-----|------|
| 中介 | 中介 | 1 | 正常 |
| 职业背债人 | 职业背债人 | 2 | 正常 |
| 房产中介 | 房产中介 | 3 | 正常 |
### 人员子类型dpc_person_sub_type
| 字典值 | 字典标签 | 排序 | 状态 |
|-------|---------|-----|------|
| 本人 | 本人 | 1 | 正常 |
| 配偶 | 配偶 | 2 | 正常 |
| 子女 | 子女 | 3 | 正常 |
| 其他 | 其他 | 9 | 正常 |
### 证件类型dpc_certificate_type
| 字典值 | 字典标签 | 排序 | 状态 |
|-------|---------|-----|------|
| 身份证 | 身份证 | 1 | 正常 |
| 护照 | 护照 | 2 | 正常 |
| 港澳通行证 | 港澳通行证 | 3 | 正常 |
| 台胞证 | 台胞证 | 4 | 正常 |
| 军官证 | 军官证 | 5 | 正常 |
### 主体类型dpc_entity_type
| 字典值 | 字典标签 | 排序 | 状态 |
|-------|---------|-----|------|
| 有限责任公司 | 有限责任公司 | 1 | 正常 |
| 股份有限公司 | 股份有限公司 | 2 | 正常 |
| 合伙企业 | 合伙企业 | 3 | 正常 |
| 个体工商户 | 个体工商户 | 4 | 正常 |
| 外资企业 | 外资企业 | 5 | 正常 |
### 企业性质dpc_enterprise_nature
| 字典值 | 字典标签 | 排序 | 状态 |
|-------|---------|-----|------|
| 国企 | 国企 | 1 | 正常 |
| 民企 | 民企 | 2 | 正常 |
| 外企 | 外企 | 3 | 正常 |
| 合资 | 合资 | 4 | 正常 |
| 其他 | 其他 | 9 | 正常 |
### 数据来源dpc_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()` 方法,可直接使用:
```java
// 生成个人中介模板(带字典下拉框)
EasyExcelUtil.importTemplateWithDictDropdown(
response,
DpcIntermediaryPersonExcel.class,
"个人中介黑名单"
);
// 生成机构中介模板(带字典下拉框)
EasyExcelUtil.importTemplateWithDictDropdown(
response,
DpcIntermediaryEntityExcel.class,
"机构中介黑名单"
);
```
**参考文档:** [doc/EasyExcel字典下拉框使用说明.md](../../../doc/EasyExcel字典下拉框使用说明.md)