# 员工信息管理 API 文档

## 概述

员工信息管理模块提供员工信息的增删改查、批量导入导出功能。

**基础路径**: `/ccdi/employee`

**权限标识前缀**: `ccdi:employee`

**重要更新**: 自2026-02-05起,员工ID(employeeId)作为柜员号使用,为7位数字,手动输入,唯一不可重复。

---

## API 接口列表

### 1. 查询员工列表

**接口地址**: `GET /ccdi/employee/list`

**权限要求**: `ccdi:employee:list`

**请求参数**:

| 参数名        | 类型      | 必填 | 说明                  |
|------------|---------|----|---------------------|
| name       | String  | 否  | 姓名(模糊查询)            |
| employeeId | Long    | 否  | 员工ID(柜员号,精确查询,7位数字) |
| deptId     | Long    | 否  | 所属部门ID              |
| idCard     | String  | 否  | 身份证号(精确查询)          |
| status     | String  | 否  | 状态(0=在职, 1=离职)      |
| pageNum    | Integer | 否  | 页码(默认1)             |
| pageSize   | Integer | 否  | 每页数量(默认10)          |

**响应示例**:

```json
{
  "code": 200,
  "msg": "操作成功",
  "rows": [
    {
      "employeeId": 1000001,
      "name": "张三",
      "deptId": 100,
      "deptName": "总部",
      "idCard": "110101199001011234",
      "phone": "13800138000",
      "hireDate": "2020-01-01",
      "status": "0",
      "statusDesc": "在职",
      "createTime": "2026-01-28 10:00:00"
    }
  ],
  "total": 1
}
```

**响应字段说明**:

| 字段名        | 类型     | 说明                    |
|------------|--------|-----------------------|
| employeeId | Long   | 员工ID(柜员号,7位数字)        |
| name       | String | 姓名                    |
| deptId     | Long   | 所属部门ID                |
| deptName   | String | 所属部门名称(关联 sys_dept 表) |
| idCard     | String | 身份证号                  |
| phone      | String | 电话                    |
| hireDate   | Date   | 入职时间                  |
| status     | String | 状态(0=在职, 1=离职)        |
| statusDesc | String | 状态描述                  |
| createTime | Date   | 创建时间                  |

---

### 2. 查询员工详情

**接口地址**: `GET /ccdi/employee/{employeeId}`

**权限要求**: `ccdi:employee:query`

**路径参数**:

| 参数名        | 类型   | 必填 | 说明        |
|------------|------|----|-----------|
| employeeId | Long | 是  | 员工ID(柜员号) |

**响应示例**:

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "employeeId": 1000001,
    "name": "张三",
    "deptId": 100,
    "idCard": "110101199001011234",
    "phone": "13800138000",
    "hireDate": "2020-01-01",
    "status": "0",
    "statusDesc": "在职",
    "createTime": "2026-01-28 10:00:00"
  }
}
```

---

### 3. 新增员工

**接口地址**: `POST /ccdi/employee`

**权限要求**: `ccdi:employee:add`

**请求头**:

```
Content-Type: application/json
Authorization: Bearer {token}
```

**请求体**:

```json
{
  "employeeId": 1000001,
  "name": "张三",
  "deptId": 100,
  "idCard": "110101199001011234",
  "phone": "13800138000",
  "hireDate": "2020-01-01",
  "status": "0"
}
```

**字段说明**:

| 字段名        | 类型     | 必填 | 说明             | 校验规则        |
|------------|--------|----|----------------|-------------|
| employeeId | Long   | 是  | 员工ID(柜员号,7位数字) | 必填,7位数字,唯一  |
| name       | String | 是  | 姓名             | 最大100字符     |
| deptId     | Long   | 是  | 所属部门ID         | 必填          |
| idCard     | String | 是  | 身份证号           | 18位,符合国标,唯一 |
| phone      | String | 是  | 电话             | 必填,11位手机号   |
| hireDate   | Date   | 否  | 入职时间           | yyyy-MM-dd  |
| status     | String | 是  | 状态             | 0=在职, 1=离职  |

**响应示例**:

```json
{
  "code": 200,
  "msg": "操作成功"
}
```

---

### 4. 编辑员工

**接口地址**: `PUT /ccdi/employee`

**权限要求**: `ccdi:employee:edit`

**请求体**:

```json
{
  "employeeId": 1000001,
  "name": "张三",
  "deptId": 100,
  "idCard": "110101199001011234",
  "phone": "13800138000",
  "hireDate": "2020-01-01",
  "status": "0"
}
```

**字段说明**: 与新增接口相同,employeeId 为必填项,编辑时不可修改柜员号。

**响应示例**:

```json
{
  "code": 200,
  "msg": "操作成功"
}
```

---

### 5. 删除员工

**接口地址**: `DELETE /ccdi/employee/{employeeIds}`

**权限要求**: `ccdi:employee:remove`

**路径参数**:

| 参数名         | 类型     | 必填 | 说明           |
|-------------|--------|----|--------------|
| employeeIds | Long[] | 是  | 员工ID数组（逗号分隔） |

**响应示例**:

```json
{
  "code": 200,
  "msg": "操作成功"
}
```

---

### 6. 导出员工信息

**接口地址**: `POST /ccdi/employee/export`

**权限要求**: `ccdi:employee:export`

**请求参数**: 与查询列表接口相同(支持筛选条件)

**响应**: Excel 文件下载

---

### 7. 下载导入模板(带字典下拉框)

**接口地址**: `POST /ccdi/employee/importTemplate`

**权限要求**: 无

**功能说明**: 下载的 Excel 模板中,"状态"列会自动添加字典下拉框,方便用户选择。

**响应**: Excel 模板文件下载

**Excel 格式说明**:

**Sheet1: 员工信息**
| 姓名* | 柜员号* | 所属部门ID* | 身份证号* | 电话* | 入职时间 | 状态▼* |
|------|--------|------------|----------|------|----------|------|
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |

**注**:

- 带 * 标记的列为必填项(姓名、柜员号、所属部门、身份证号、电话、状态)
- 带 ▼ 标记的列包含下拉框,选项来自字典 `ccdi_employee_status`

**使用 @DictDropdown 注解实现**:

- 状态字段使用 `@DictDropdown(dictType = "ccdi_employee_status")` 注解
- 系统自动从 Redis 缓存读取字典数据并生成下拉框
- 下拉选项可动态更新,刷新字典缓存后生效

---

### 8. 导入员工信息

**接口地址**: `POST /ccdi/employee/importData`

**权限要求**: `ccdi:employee:import`

**请求参数**:

| 参数名           | 类型      | 必填 | 说明                 |
|---------------|---------|----|--------------------|
| file          | File    | 是  | Excel 文件           |
| updateSupport | Boolean | 否  | 是否更新已存在数据(默认false) |

**Excel 格式**:

**Sheet1: 员工信息**
| 姓名* | 柜员号* | 所属部门ID* | 身份证号* | 电话* | 入职时间 | 状态* |
|------|--------|------------|----------|------|----------|------|
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |

**说明**:

- ***标记为必填项**: 姓名、柜员号、所属部门、身份证号、电话、状态**
- 柜员号: 7位数字,必填,唯一
- 所属部门: 必须填写有效的部门ID
- 电话: 必须填写11位手机号
- 入职时间: 选填,格式为 yyyy-MM-dd

**响应示例**:

```json
{
  "code": 200,
  "msg": "恭喜您,数据已全部导入成功!共 10 条"
}
```

---

## 错误码说明

| 错误码 | 说明       |
|-----|----------|
| 200 | 操作成功     |
| 401 | 未授权,请先登录 |
| 403 | 无权限访问    |
| 500 | 服务器内部错误  |

## 业务错误信息

| 错误信息            | 说明           |
|-----------------|--------------|
| 该柜员号已存在         | 新增时柜员号重复     |
| 柜员号不能为空         | 新增时柜员号为空     |
| 柜员号必须为7位数字      | 柜员号格式不正确     |
| 所属部门不能为空        | 新增时所属部门为空    |
| 该身份证号已存在        | 新增/编辑时身份证号重复 |
| 姓名不能为空          | 新增时姓名为空      |
| 身份证号格式不正确       | 身份证号不符合18位国标 |
| 电话不能为空          | 新增时电话为空      |
| 电话格式不正确         | 手机号不符合11位格式  |
| 状态只能填写'在职'或'离职' | 状态值不正确       |

---

## 测试账号

- 用户名: `admin`
- 密码: `admin123`

测试前请先调用 `/login/test` 接口获取 Token。
