中介类型修改

This commit is contained in:
wkc
2026-01-29 13:39:47 +08:00
parent 2c146c026a
commit 1b043fa2d6
36 changed files with 4373 additions and 145 deletions

View File

@@ -0,0 +1,226 @@
# EasyExcel字典下拉框使用说明
## 功能概述
本项目实现了EasyExcel自定义WriteHandler拦截器可以在生成Excel模板时自动添加基于若依框架字典数据的下拉框。
## 核心组件
### 1. @DictDropdown 注解
位置:`com.ruoyi.common.annotation.DictDropdown`
用于标注需要添加下拉框的字段。
**属性说明:**
| 属性 | 类型 | 默认值 | 说明 |
|-----|------|--------|------|
| dictType | String | 必填 | 字典类型编码,对应若依字典管理中的字典类型 |
| displayType | DisplayType | LABEL | 下拉框显示内容类型LABEL显示标签VALUE显示值 |
| strict | boolean | true | 是否仅允许选择下拉框中的值 |
| hiddenSheetName | String | "dict_hidden" | 隐藏Sheet名称用于存储大量下拉选项 |
### 2. DictDropdownWriteHandler 处理器
位置:`com.ruoyi.dpc.handler.DictDropdownWriteHandler`
核心功能:
- 解析实体类中的@DictDropdown注解
- 从若依字典缓存获取字典数据
- 为对应列添加下拉框验证
- 自动处理下拉选项超过Excel字符限制的情况使用隐藏Sheet
### 3. EasyExcelUtil 工具类扩展
位置:`com.ruoyi.dpc.utils.EasyExcelUtil`
新增方法:
- `importTemplateWithDictDropdown()` - 下载带字典下拉框的导入模板
- `exportExcelWithDictDropdown()` - 导出带字典下拉框的Excel
## 使用示例
### 步骤1在实体类上添加注解
```java
package com.ruoyi.dpc.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.ruoyi.common.annotation.DictDropdown;
import lombok.Data;
@Data
public class DpcEmployeeExcel {
@ExcelProperty(value = "姓名", index = 0)
@ColumnWidth(15)
private String name;
@ExcelProperty(value = "柜员号", index = 1)
@ColumnWidth(15)
private String tellerNo;
// 添加字典下拉框注解
@ExcelProperty(value = "状态", index = 6)
@ColumnWidth(10)
@DictDropdown(dictType = "dpc_employee_status")
private String status;
}
```
### 步骤2在Controller中使用
```java
@RestController
@RequestMapping("/dpc/employee")
public class DpcEmployeeController {
/**
* 下载带字典下拉框的导入模板
*/
@PostMapping("/importTemplateWithDropdown")
public void importTemplateWithDropdown(HttpServletResponse response) {
EasyExcelUtil.importTemplateWithDictDropdown(
response,
DpcEmployeeExcel.class,
"员工信息"
);
}
/**
* 导出带字典下拉框的Excel
*/
@PostMapping("/exportWithDropdown")
public void exportWithDropdown(HttpServletResponse response) {
List<DpcEmployeeExcel> list = employeeService.selectEmployeeList();
EasyExcelUtil.exportExcelWithDictDropdown(
response,
list,
DpcEmployeeExcel.class,
"员工信息"
);
}
}
```
## 高级用法
### 1. 显示字典键值而非标签
```java
@DictDropdown(dictType = "dpc_employee_status", displayType = DisplayType.VALUE)
private String status;
```
### 2. 允许手动输入(非严格模式)
```java
@DictDropdown(dictType = "dpc_employee_status", strict = false)
private String status;
```
### 3. 自定义隐藏Sheet名称
```java
@DictDropdown(dictType = "dpc_employee_status", hiddenSheetName = "employee_status_dict")
private String status;
```
## 注意事项
1. **必须指定@ExcelProperty的index属性**
- 字段必须指定@ExcelProperty注解的index值,否则无法正确映射列位置
2. **字典数据必须预先加载到缓存**
- 使用前需要确保字典数据已经加载到Redis缓存中
- 可通过若依系统的字典管理功能预热缓存
3. **下拉选项数量限制**
- 当下拉选项总长度超过255字符时自动使用隐藏Sheet存储
- 隐藏Sheet在Excel中不可见但下拉框功能正常
4. **字段必须标注@ExcelProperty注解**
- 只有同时标注了@ExcelProperty和@DictDropdown的字段才会添加下拉框
## 测试验证
### 接口测试
1. 启动项目后访问Swagger UI`http://localhost:8080/swagger-ui/index.html`
2. 找到员工信息管理相关接口:
- `POST /dpc/employee/importTemplateWithDropdown` - 下载带字典下拉框的模板
3. 调用接口下载模板检查Excel中的下拉框是否正常
### 手动验证
1. 打开下载的Excel模板
2. 点击标注了下拉框的列(如"状态"列)
3. 检查是否出现下拉箭头和选项列表
4. 尝试选择和输入,验证验证规则是否生效
## 技术实现细节
### Excel下拉列表限制处理
Excel对下拉列表的直接字符数有限制约255字符本项目采用以下策略
1. **选项较少时(<255字符**
- 直接使用 `DataValidationHelper.createExplicitListConstraint()` 创建下拉列表
- 下拉选项内联在单元格验证中
2. **选项较多时≥255字符**
- 创建隐藏Sheet存储所有选项
- 使用 `DataValidationHelper.createFormulaListConstraint()` 通过公式引用
- 自动隐藏Sheet`workbook.setSheetHidden()`
### 字典数据获取
```
┌─────────────┐ 缓存查询 ┌─────────────┐
│ DictDropdown │ ───────────▶ │ DictUtils │
│ 注解 │ │ .getDictCache() │
└─────────────┘ └─────────────┘
┌─────────────┐
│ Redis缓存 │
│ sys_dict:key │
└─────────────┘
```
### 列索引映射
通过反射获取字段的@ExcelProperty注解中的index值,确保下拉框添加到正确的列。
## 常见问题
### Q1下拉框没有显示
**可能原因:**
1. 字典数据未加载到缓存
2. 字段未指定@ExcelProperty的index值
3. 字典类型编码错误
**解决方法:**
1. 在若依系统字典管理中,进入对应字典类型,刷新缓存
2. 检查实体类字段注解是否正确
3. 确认dictType值与字典管理中的字典类型一致
### Q2下拉选项显示不完整
**原因:** 选项字符数超过255字符但隐藏Sheet创建失败
**解决方法:** 检查日志中的错误信息确保有权限创建隐藏Sheet
### Q3可以手动输入非下拉选项的值吗
**答案:** 可以,通过设置 `strict = false` 允许手动输入
## 更新日志
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0.0 | 2026-01-29 | 初始版本,支持字典下拉框功能 |

View File

@@ -0,0 +1,22 @@
字段中文名,数据类型,长度/精度,是否为空,默认值,说明
统一社会信用代码,VARCHAR,18,,-,统一社会信用代码
主体名称,VARCHAR,200,,-,企业注册名称
主体类型,VARCHAR,50,,-,企业类型:有限责任公司、股份有限公司、合伙企业、个体工商户、外资企业等
企业性质,VARCHAR,50,,-,国企、民企、外企、合资、其他
行业分类,VARCHAR,100,,-,行业分类代码或名称
所属行业,VARCHAR,100,,-,所属行业
成立日期,DATE,-,,-,企业成立日期
注册地址,VARCHAR,500,,-,工商注册地址
法定代表人,VARCHAR,50,,-,法定代表人姓名
法定代表人证件类型,VARCHAR,30,,-,法定代表人证件类型
法定代表人证件号码,VARCHAR,30,,-,法定代表人证件号码
股东1,VARCHAR,30,,-,股东姓名
股东2,VARCHAR,30,,-,股东姓名
股东3,VARCHAR,30,,-,股东姓名
股东4,VARCHAR,30,,-,股东姓名
股东5,VARCHAR,30,,-,股东姓名
创建时间,DATETIME,-,,当前时间,记录创建时间
更新时间,DATETIME,-,,当前时间,记录更新时间
创建人,VARCHAR,50,,-,记录创建人
更新人,VARCHAR,50,,-,记录更新人
数据来源,VARCHAR,30,,MANUAL,"MANUAL:手动录入, SYSTEM:系统同步, API:接口获取, IMPORT:批量导入"
1 字段中文名 数据类型 长度/精度 是否为空 默认值 说明
2 统一社会信用代码 VARCHAR 18 - 统一社会信用代码
3 主体名称 VARCHAR 200 - 企业注册名称
4 主体类型 VARCHAR 50 - 企业类型:有限责任公司、股份有限公司、合伙企业、个体工商户、外资企业等
5 企业性质 VARCHAR 50 - 国企、民企、外企、合资、其他
6 行业分类 VARCHAR 100 - 行业分类代码或名称
7 所属行业 VARCHAR 100 - 所属行业
8 成立日期 DATE - - 企业成立日期
9 注册地址 VARCHAR 500 - 工商注册地址
10 法定代表人 VARCHAR 50 - 法定代表人姓名
11 法定代表人证件类型 VARCHAR 30 - 法定代表人证件类型
12 法定代表人证件号码 VARCHAR 30 - 法定代表人证件号码
13 股东1 VARCHAR 30 - 股东姓名
14 股东2 VARCHAR 30 - 股东姓名
15 股东3 VARCHAR 30 - 股东姓名
16 股东4 VARCHAR 30 - 股东姓名
17 股东5 VARCHAR 30 - 股东姓名
18 创建时间 DATETIME - 当前时间 记录创建时间
19 更新时间 DATETIME - 当前时间 记录更新时间
20 创建人 VARCHAR 50 - 记录创建人
21 更新人 VARCHAR 50 - 记录更新人
22 数据来源 VARCHAR 30 MANUAL MANUAL:手动录入, SYSTEM:系统同步, API:接口获取, IMPORT:批量导入

View File

@@ -0,0 +1,20 @@
字段中文名,数据类型,长度/精度,是否为空,默认值,说明
人员ID,VARCHAR,20,,-,中介、职业背债人、房产中介等
人员类型,VARCHAR,30,,-,中介、职业背债人、房产中介等
人员子类型,VARCHAR,50,,-,如:本人、配偶等
姓名,VARCHAR,50,,-,人员姓名
性别,CHAR,1,,-,"M:男, F:女, O:其他"
证件类型,VARCHAR,30,,身份证,身份证、护照、港澳通行证、台胞证、军官证等
证件号码,VARCHAR,30,,-,证件号码(加密存储)
手机号码,VARCHAR,20,,-,手机号码(加密存储)
微信号,VARCHAR,50,,-,微信号
联系地址,VARCHAR,200,,-,详细联系地址
所在公司,VARCHAR,100,,-,当前就职公司
职位,VARCHAR,100,,-,职位/职务
关联人员ID,VARCHAR,20,,-,关联“人员ID”
关联关系,VARCHAR,50,,-,与关联员工的关系
创建时间,DATETIME,-,,当前时间,记录创建时间
更新时间,DATETIME,-,,当前时间,记录更新时间
创建人,VARCHAR,50,,-,记录创建人
更新人,VARCHAR,50,,-,记录更新人
数据来源,VARCHAR,30,,MANUAL,"MANUAL:手动录入, SYSTEM:系统同步, IMPORT:批量导入, API:接口获取"
1 字段中文名 数据类型 长度/精度 是否为空 默认值 说明
2 人员ID VARCHAR 20 - 中介、职业背债人、房产中介等
3 人员类型 VARCHAR 30 - 中介、职业背债人、房产中介等
4 人员子类型 VARCHAR 50 - 如:本人、配偶等
5 姓名 VARCHAR 50 - 人员姓名
6 性别 CHAR 1 - M:男, F:女, O:其他
7 证件类型 VARCHAR 30 身份证 身份证、护照、港澳通行证、台胞证、军官证等
8 证件号码 VARCHAR 30 - 证件号码(加密存储)
9 手机号码 VARCHAR 20 - 手机号码(加密存储)
10 微信号 VARCHAR 50 - 微信号
11 联系地址 VARCHAR 200 - 详细联系地址
12 所在公司 VARCHAR 100 - 当前就职公司
13 职位 VARCHAR 100 - 职位/职务
14 关联人员ID VARCHAR 20 - 关联“人员ID”
15 关联关系 VARCHAR 50 - 与关联员工的关系
16 创建时间 DATETIME - 当前时间 记录创建时间
17 更新时间 DATETIME - 当前时间 记录更新时间
18 创建人 VARCHAR 50 - 记录创建人
19 更新人 VARCHAR 50 - 记录更新人
20 数据来源 VARCHAR 30 MANUAL MANUAL:手动录入, SYSTEM:系统同步, IMPORT:批量导入, API:接口获取

View File

@@ -0,0 +1,404 @@
# 中介黑名单管理 API 文档
## 概述
中介黑名单管理模块提供个人和机构两类中介信息的增删改查、类型化模板下载和批量导入导出功能。
**基础路径**: `/dpc/intermediary`
**权限标识前缀**: `dpc:intermediary`
---
## API 接口列表
### 1. 查询中介黑名单列表
**接口地址**: `GET /dpc/intermediary/list`
**权限要求**: `dpc:intermediary:list`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| name | String | 否 | 姓名/机构名称(模糊查询) |
| certificateNo | String | 否 | 证件号/统一社会信用代码(精确查询) |
| intermediaryType | String | 否 | 中介类型1=个人, 2=机构) |
| status | String | 否 | 状态0=正常, 1=停用) |
| pageNum | Integer | 否 | 页码默认1 |
| pageSize | Integer | 否 | 每页数量默认10 |
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"rows": [
{
"intermediaryId": 1,
"name": "张三",
"certificateNo": "110101199001011234",
"intermediaryType": "1",
"intermediaryTypeName": "个人",
"status": "0",
"statusName": "正常",
"remark": "测试数据",
"createTime": "2026-01-29 10:00:00"
}
],
"total": 1
}
```
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| intermediaryId | Long | 中介ID |
| name | String | 姓名/机构名称 |
| certificateNo | String | 证件号/统一社会信用代码 |
| intermediaryType | String | 中介类型1=个人, 2=机构) |
| intermediaryTypeName | String | 中介类型名称 |
| status | String | 状态0=正常, 1=停用) |
| statusName | String | 状态名称 |
| remark | String | 备注 |
| createTime | Date | 创建时间 |
---
### 2. 获取中介黑名单详细信息
**接口地址**: `GET /dpc/intermediary/{intermediaryId}`
**权限要求**: `dpc:intermediary:query`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| intermediaryId | Long | 是 | 中介ID |
**功能说明**: 根据中介类型返回不同的详情结构
**个人类型响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"intermediaryId": 1,
"name": "张三",
"certificateNo": "110101199001011234",
"intermediaryType": "1",
"intermediaryTypeName": "个人",
"status": "0",
"statusName": "正常",
"dataSource": "IMPORT",
"dataSourceName": "批量导入",
"indivType": "中介",
"indivGender": "M",
"indivGenderName": "男",
"indivCertType": "身份证",
"indivPhone": "13800138000",
"indivCompany": "XX公司",
"indivPosition": "经纪人"
}
}
```
**机构类型响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"intermediaryId": 2,
"name": "XX中介公司",
"intermediaryType": "2",
"intermediaryTypeName": "机构",
"status": "0",
"statusName": "正常",
"dataSource": "MANUAL",
"dataSourceName": "手动录入",
"corpCreditCode": "91110000XXXXXXXXXX",
"corpType": "有限责任公司",
"corpNature": "民企",
"corpLegalRep": "张三",
"corpAddress": "北京市朝阳区"
}
}
```
---
### 3. 新增中介黑名单
**接口地址**: `POST /dpc/intermediary`
**权限要求**: `dpc:intermediary:add`
**请求体**:
```json
{
"name": "张三",
"certificateNo": "110101199001011234",
"intermediaryType": "1",
"status": "0",
"remark": "测试数据"
}
```
**字段说明**:
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| name | String | 是 | 姓名/机构名称 |
| certificateNo | String | 是 | 证件号/统一社会信用代码 |
| intermediaryType | String | 是 | 中介类型1=个人, 2=机构) |
| status | String | 是 | 状态0=正常, 1=停用) |
| remark | String | 否 | 备注 |
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
---
### 4. 修改中介黑名单
**接口地址**: `PUT /dpc/intermediary`
**权限要求**: `dpc:intermediary:edit`
**请求体**:
```json
{
"intermediaryId": 1,
"name": "张三",
"certificateNo": "110101199001011234",
"intermediaryType": "1",
"status": "0",
"remark": "测试数据"
}
```
**字段说明**: 与新增接口相同intermediaryId 为必填项。
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
---
### 5. 删除中介黑名单
**接口地址**: `DELETE /dpc/intermediary/{intermediaryIds}`
**权限要求**: `dpc:intermediary:remove`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| intermediaryIds | Long[] | 是 | 中介ID数组逗号分隔 |
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
---
### 6. 导出中介黑名单
**接口地址**: `POST /dpc/intermediary/export`
**权限要求**: `dpc:intermediary:export`
**请求参数**: 与查询列表接口相同(支持筛选条件)
**响应**: Excel 文件下载
---
### 7. 下载个人中介导入模板(带字典下拉框)
**接口地址**: `POST /dpc/intermediary/importPersonTemplate`
**权限要求**: 无
**功能说明**: 下载的 Excel 模板中,性别、证件类型列会自动添加字典下拉框。
**响应**: Excel 模板文件下载
**Excel 格式说明**:
**Sheet1: 个人中介黑名单**
| 姓名 | 人员类型 | 人员子类型 | 性别▼ | 证件类型▼ | 证件号码 | 手机号码 | 微信号 | 联系地址 | 所在公司 | 职位 | 关联人员ID | 关联关系 | 备注 |
|------|---------|-----------|-------|-----------|---------|---------|--------|---------|---------|-----|-----------|---------|------|
| 张三 | 中介 | 本人 | 男 | 身份证 | 110101199001011234 | 13800138000 | zhangsan | 北京市朝阳区 | XX公司 | 经纪人 | - | - | 测试 |
**注**:带 ▼ 标记的列包含下拉框,选项来自字典:
- 性别:`dpc_indiv_gender`
- 证件类型:`dpc_certificate_type`
---
### 8. 下载机构中介导入模板(带字典下拉框)
**接口地址**: `POST /dpc/intermediary/importEntityTemplate`
**权限要求**: 无
**功能说明**: 下载的 Excel 模板中,主体类型、企业性质列会自动添加字典下拉框。
**响应**: Excel 模板文件下载
**Excel 格式说明**:
**Sheet1: 机构中介黑名单**
| 机构名称 | 统一社会信用代码 | 主体类型▼ | 企业性质▼ | 行业分类 | 所属行业 | 成立日期 | 注册地址 | 法定代表人 | 法定代表人证件类型 | 法定代表人证件号码 | 股东1 | 股东2 | 股东3 | 股东4 | 股东5 | 备注 |
|---------|-----------------|-----------|-----------|---------|---------|---------|---------|-----------|-------------------|-------------------|-------|-------|-------|-------|-------|------|
| XX公司 | 91110000XXXXXXXXXX | 有限责任公司 | 民企 | 房地产 | 房地产业 | 2020-01-01 | 北京市朝阳区 | 张三 | 身份证 | 110101199001011234 | 李四 | 王五 | - | - | - | - |
**注**:带 ▼ 标记的列包含下拉框,选项来自字典:
- 主体类型:`dpc_entity_type`
- 企业性质:`dpc_enterprise_nature`
---
### 9. 导入个人中介黑名单
**接口地址**: `POST /dpc/intermediary/importPersonData`
**权限要求**: `dpc:intermediary:import`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| file | File | 是 | Excel 文件 |
| updateSupport | Boolean | 否 | 是否更新已存在数据默认false |
**Excel 格式**: 参见"下载个人中介导入模板"
**数据验证规则**:
1. **姓名**:必填,长度 1-100 字符
2. **证件号码**:必填,长度不超过 50 字符
3. **证件类型**:选填,默认"身份证"
4. **其他字段**:选填,按长度限制验证
5. **状态**:系统默认设置为"正常"0
6. **数据来源**:系统默认设置为"批量导入"IMPORT
**响应示例**:
```json
{
"code": 200,
"msg": "恭喜您,数据已全部导入成功!共 10 条"
}
```
---
### 10. 导入机构中介黑名单
**接口地址**: `POST /dpc/intermediary/importEntityData`
**权限要求**: `dpc:intermediary:import`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| file | File | 是 | Excel 文件 |
| updateSupport | Boolean | 否 | 是否更新已存在数据默认false |
**Excel 格式**: 参见"下载机构中介导入模板"
**数据验证规则**:
1. **机构名称**:必填,长度 1-200 字符
2. **统一社会信用代码**选填18 位
3. **其他字段**:选填,按长度限制验证
4. **状态**:系统默认设置为"正常"0
5. **数据来源**:系统默认设置为"批量导入"IMPORT
**响应示例**:
```json
{
"code": 200,
"msg": "恭喜您,数据已全部导入成功!共 10 条"
}
```
---
## 字典数据说明
导入模板中的下拉框选项来自系统字典管理,相关字典类型:
### 个人中介字典
| 字典类型 | 字典名称 | 用途 |
|---------|---------|------|
| dpc_indiv_gender | 个人中介性别 | 个人中介模板性别下拉框 |
| dpc_certificate_type | 证件类型 | 个人中介模板证件类型下拉框 |
### 机构中介字典
| 字典类型 | 字典名称 | 用途 |
|---------|---------|------|
| dpc_entity_type | 主体类型 | 机构中介模板主体类型下拉框 |
| dpc_enterprise_nature | 企业性质 | 机构中介模板企业性质下拉框 |
### 通用字典
| 字典类型 | 字典名称 | 用途 |
|---------|---------|------|
| dpc_data_source | 数据来源 | 数据来源字段映射 |
---
## 错误码说明
| 错误码 | 说明 |
|--------|------|
| 200 | 操作成功 |
| 401 | 未授权,请先登录 |
| 403 | 无权限访问 |
| 500 | 服务器内部错误 |
## 业务错误信息
| 错误信息 | 说明 |
|----------|------|
| 姓名不能为空 | 个人中介导入时姓名为空 |
| 机构名称不能为空 | 机构中介导入时机构名称为空 |
| 证件号码不能为空 | 个人中介导入时证件号码为空 |
| 该证件号已存在 | 新增/导入时证件号重复 |
| 该统一社会信用代码已存在 | 新增/导入时信用代码重复 |
## 测试账号
- 用户名: `admin`
- 密码: `admin123`
测试前请先调用 `/login/test` 接口获取 Token。
## 更新日志
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0.0 | 2026-01-29 | 初始版本,支持个人和机构分类管理 |
| 1.1.0 | 2026-01-29 | 添加字典下拉框功能,分离个人/机构模板 |

View File

@@ -257,14 +257,30 @@ Authorization: Bearer {token}
---
### 7. 下载导入模板
### 7. 下载导入模板(带字典下拉框)
**接口地址**: `POST /dpc/employee/importTemplate`
**权限要求**: 无
**功能说明**: 下载的 Excel 模板中,"状态"列会自动添加字典下拉框,方便用户选择。
**响应**: Excel 模板文件下载
**Excel 格式说明**:
**Sheet1: 员工信息**
| 姓名 | 柜员号 | 所属部门ID | 身份证号 | 电话 | 入职时间 | 状态▼ |
|------|--------|------------|----------|------|----------|------|
| 张三 | 001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
**注**:带 ▼ 标记的列包含下拉框,选项来自字典 `dpc_employee_status`
**使用 @DictDropdown 注解实现**:
- 状态字段使用 `@DictDropdown(dictType = "dpc_employee_status")` 注解
- 系统自动从 Redis 缓存读取字典数据并生成下拉框
- 下拉选项可动态更新,刷新字典缓存后生效
---
### 8. 导入员工信息