feat: 员工柜员号优化 - 移除tellerNo,employeeId作为7位数字柜员号

## 数据库修改
- 删除teller_no字段
- employee_id改为非自增,手动输入7位数字
- 更新字段注释

## 后端修改
- Entity: 移除tellerNo,employeeId改为INPUT类型
- DTO: Add/Edit/Query/Excel全部使用employeeId
- VO: 移除tellerNo字段
- Service: 添加柜员号唯一性校验(使用selectById)
- Mapper XML: 移除teller_no查询和映射

## 前端修改
- 查询表单: tellerNo改为employeeId,添加7位数字限制
- 表格列: 显示employeeId作为柜员号
- 对话框: 新增可输入,编辑只读
- JavaScript: 数据结构和校验规则更新

## 文档更新
- API文档: 完整更新所有接口说明
- 实施报告: 生成详细实施报告

## 测试
- 生成测试脚本(9个测试用例)
- 测试账号: admin/admin123

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
wkc
2026-02-05 14:18:28 +08:00
parent 9c84af78f2
commit da663fb635
12 changed files with 375 additions and 333 deletions

View File

@@ -2,11 +2,13 @@
## 概述
员工信息管理模块提供员工及其亲属信息的增删改查、批量导入导出功能。
员工信息管理模块提供员工信息的增删改查、批量导入导出功能。
**基础路径**: `/ccdi/employee`
**权限标识前缀**: `dpc:employee`
**权限标识前缀**: `ccdi:employee`
**重要更新**: 自2026-02-05起,员工ID(employeeId)作为柜员号使用,为7位数字,手动输入,唯一不可重复。
---
@@ -16,19 +18,19 @@
**接口地址**: `GET /ccdi/employee/list`
**权限要求**: `dpc:employee:list`
**权限要求**: `ccdi:employee:list`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| name | String | 否 | 姓名模糊查询 |
| tellerNo | String | 否 | 柜员号精确查询 |
| name | String | 否 | 姓名(模糊查询) |
| employeeId | Long | 否 | 员工ID(柜员号,精确查询,7位数字) |
| deptId | Long | 否 | 所属部门ID |
| idCard | String | 否 | 身份证号精确查询 |
| status | String | 否 | 状态0=在职, 1=离职 |
| pageNum | Integer | 否 | 页码默认1 |
| pageSize | Integer | 否 | 每页数量默认10 |
| idCard | String | 否 | 身份证号(精确查询) |
| status | String | 否 | 状态(0=在职, 1=离职) |
| pageNum | Integer | 否 | 页码(默认1) |
| pageSize | Integer | 否 | 每页数量(默认10) |
**响应示例**:
```json
@@ -37,9 +39,8 @@
"msg": "操作成功",
"rows": [
{
"employeeId": 1,
"employeeId": 1000001,
"name": "张三",
"tellerNo": "001",
"deptId": 100,
"deptName": "总部",
"idCard": "110101199001011234",
@@ -58,15 +59,14 @@
| 字段名 | 类型 | 说明 |
|--------|------|------|
| employeeId | Long | 员工ID |
| employeeId | Long | 员工ID(柜员号,7位数字) |
| name | String | 姓名 |
| tellerNo | String | 柜员号 |
| deptId | Long | 所属部门ID |
| deptName | String | 所属部门名称关联 sys_dept 表 |
| deptName | String | 所属部门名称(关联 sys_dept 表) |
| idCard | String | 身份证号 |
| phone | String | 电话 |
| hireDate | Date | 入职时间 |
| status | String | 状态0=在职, 1=离职 |
| status | String | 状态(0=在职, 1=离职) |
| statusDesc | String | 状态描述 |
| createTime | Date | 创建时间 |
@@ -76,13 +76,13 @@
**接口地址**: `GET /ccdi/employee/{employeeId}`
**权限要求**: `dpc:employee:query`
**权限要求**: `ccdi:employee:query`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| employeeId | Long | 是 | 员工ID |
| employeeId | Long | 是 | 员工ID(柜员号) |
**响应示例**:
```json
@@ -90,26 +90,15 @@
"code": 200,
"msg": "操作成功",
"data": {
"employeeId": 1,
"employeeId": 1000001,
"name": "张三",
"tellerNo": "001",
"deptId": 100,
"idCard": "110101199001011234",
"phone": "13800138000",
"hireDate": "2020-01-01",
"status": "0",
"statusDesc": "在职",
"createTime": "2026-01-28 10:00:00",
"relatives": [
{
"relativeId": 1,
"employeeId": 1,
"relativeName": "李四",
"relativeIdCard": "110101199001011235",
"relativePhone": "13800138001",
"relationship": "配偶"
}
]
"createTime": "2026-01-28 10:00:00"
}
}
```
@@ -120,7 +109,7 @@
**接口地址**: `POST /ccdi/employee`
**权限要求**: `dpc:employee:add`
**权限要求**: `ccdi:employee:add`
**请求头**:
```
@@ -131,21 +120,13 @@ Authorization: Bearer {token}
**请求体**:
```json
{
"employeeId": 1000001,
"name": "张三",
"tellerNo": "001",
"deptId": 100,
"idCard": "110101199001011234",
"phone": "13800138000",
"hireDate": "2020-01-01",
"status": "0",
"relatives": [
{
"relativeName": "李四",
"relativeIdCard": "110101199001011235",
"relativePhone": "13800138001",
"relationship": "配偶"
}
]
"status": "0"
}
```
@@ -153,23 +134,13 @@ Authorization: Bearer {token}
| 字段名 | 类型 | 必填 | 说明 | 校验规则 |
|--------|------|------|------|----------|
| employeeId | Long | 是 | 员工ID(柜员号,7位数字) | 必填,7位数字,唯一 |
| name | String | 是 | 姓名 | 最大100字符 |
| tellerNo | String | 是 | 柜员号 | 最大50字符唯一 |
| deptId | Long | 否 | 所属部门ID | |
| idCard | String | 是 | 身份证号 | 18位符合国标唯一 |
| idCard | String | 是 | 身份证号 | 18位,符合国标,唯一 |
| phone | String | 否 | 电话 | 11位手机号 |
| hireDate | Date | 否 | 入职时间 | yyyy-MM-dd |
| status | String | 是 | 状态 | 0=在职, 1=离职 |
| relatives | Array | 否 | 亲属列表 | |
**亲属对象字段**:
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| relativeName | String | 是 | 亲属姓名 |
| relativeIdCard | String | 否 | 亲属身份证号 |
| relativePhone | String | 否 | 亲属手机号 |
| relationship | String | 是 | 与员工关系 |
**响应示例**:
```json
@@ -185,31 +156,22 @@ Authorization: Bearer {token}
**接口地址**: `PUT /ccdi/employee`
**权限要求**: `dpc:employee:edit`
**权限要求**: `ccdi:employee:edit`
**请求体**:
```json
{
"employeeId": 1,
"employeeId": 1000001,
"name": "张三",
"tellerNo": "001",
"deptId": 100,
"idCard": "110101199001011234",
"phone": "13800138000",
"hireDate": "2020-01-01",
"status": "0",
"relatives": [
{
"relativeName": "李四",
"relativeIdCard": "110101199001011235",
"relativePhone": "13800138001",
"relationship": "配偶"
}
]
"status": "0"
}
```
**字段说明**: 与新增接口相同employeeId 为必填项。
**字段说明**: 与新增接口相同,employeeId 为必填项,编辑时不可修改柜员号
**响应示例**:
```json
@@ -225,7 +187,7 @@ Authorization: Bearer {token}
**接口地址**: `DELETE /ccdi/employee/{employeeIds}`
**权限要求**: `dpc:employee:remove`
**权限要求**: `ccdi:employee:remove`
**路径参数**:
@@ -241,29 +203,27 @@ Authorization: Bearer {token}
}
```
**注意**: 删除员工时会级联删除该员工的所有亲属信息。
---
### 6. 导出员工信息
**接口地址**: `POST /ccdi/employee/export`
**权限要求**: `dpc:employee:export`
**权限要求**: `ccdi:employee:export`
**请求参数**: 与查询列表接口相同支持筛选条件
**请求参数**: 与查询列表接口相同(支持筛选条件)
**响应**: Excel 文件下载
---
### 7. 下载导入模板带字典下拉框
### 7. 下载导入模板(带字典下拉框)
**接口地址**: `POST /ccdi/employee/importTemplate`
**权限要求**: 无
**功能说明**: 下载的 Excel 模板中"状态"列会自动添加字典下拉框方便用户选择。
**功能说明**: 下载的 Excel 模板中,"状态"列会自动添加字典下拉框,方便用户选择。
**响应**: Excel 模板文件下载
@@ -272,14 +232,14 @@ Authorization: Bearer {token}
**Sheet1: 员工信息**
| 姓名 | 柜员号 | 所属部门ID | 身份证号 | 电话 | 入职时间 | 状态▼ |
|------|--------|------------|----------|------|----------|------|
| 张三 | 001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
**注**带 ▼ 标记的列包含下拉框选项来自字典 `ccdi_employee_status`
**注**: 带 ▼ 标记的列包含下拉框,选项来自字典 `ccdi_employee_status`
**使用 @DictDropdown 注解实现**:
- 状态字段使用 `@DictDropdown(dictType = "ccdi_employee_status")` 注解
- 系统自动从 Redis 缓存读取字典数据并生成下拉框
- 下拉选项可动态更新刷新字典缓存后生效
- 下拉选项可动态更新,刷新字典缓存后生效
---
@@ -287,32 +247,29 @@ Authorization: Bearer {token}
**接口地址**: `POST /ccdi/employee/importData`
**权限要求**: `dpc:employee:import`
**权限要求**: `ccdi:employee:import`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| file | File | 是 | Excel 文件 |
| updateSupport | Boolean | 否 | 是否更新已存在数据默认false |
| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) |
**Excel 格式**:
**Sheet1: 员工信息**
| 姓名 | 柜员号 | 所属部门ID | 身份证号 | 电话 | 入职时间 | 状态 |
|------|--------|------------|----------|------|----------|------|
| 张三 | 001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
**Sheet2: 亲属信息(可选)**
| 员工身份证号 | 亲属姓名 | 亲属身份证号 | 亲属手机号 | 与员工关系 |
|--------------|----------|--------------|------------|------------|
| 110101199001011234 | 李四 | 110101199001011235 | 13800138001 | 配偶 |
**说明**: 柜员号列为7位数字,必填,唯一。
**响应示例**:
```json
{
"code": 200,
"msg": "恭喜您数据已全部导入成功共 10 条"
"msg": "恭喜您,数据已全部导入成功!共 10 条"
}
```
@@ -323,7 +280,7 @@ Authorization: Bearer {token}
| 错误码 | 说明 |
|--------|------|
| 200 | 操作成功 |
| 401 | 未授权请先登录 |
| 401 | 未授权,请先登录 |
| 403 | 无权限访问 |
| 500 | 服务器内部错误 |
@@ -331,7 +288,9 @@ Authorization: Bearer {token}
| 错误信息 | 说明 |
|----------|------|
| 该柜员号已存在 | 新增/编辑时柜员号重复 |
| 该柜员号已存在 | 新增时柜员号重复 |
| 柜员号不能为空 | 新增时柜员号为空 |
| 柜员号必须为7位数字 | 柜员号格式不正确 |
| 该身份证号已存在 | 新增/编辑时身份证号重复 |
| 姓名不能为空 | 新增时姓名为空 |
| 身份证号格式不正确 | 身份证号不符合18位国标 |