feat: 员工信息必填项优化 - 柜员号、所属部门、电话设为必填

## 后端修改
- AddDTO: deptId和phone添加@NotNull/@NotBlank注解
- EditDTO: deptId和phone添加@NotNull/@NotBlank注解
- Service: 导入验证添加deptId和phone必填校验

## 前端修改
- 表单校验规则: deptId和phone添加required校验
- 自动显示必填标记(红色星号)

## API文档更新
- 新增接口字段说明: deptId和phone标记为必填
- 导入模板: 标注必填项(*标记)
- 业务错误信息: 添加部门和电话相关错误提示

## 必填字段清单
1. employeeId(柜员号) - 7位数字
2. name(姓名)
3. deptId(所属部门)
4. idCard(身份证号)
5. phone(电话) - 11位手机号
6. status(状态)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
wkc
2026-02-05 14:26:40 +08:00
parent da663fb635
commit 07dea1bf0c
7 changed files with 46 additions and 6 deletions

View File

@@ -136,9 +136,9 @@ Authorization: Bearer {token}
|--------|------|------|------|----------| |--------|------|------|------|----------|
| employeeId | Long | 是 | 员工ID(柜员号,7位数字) | 必填,7位数字,唯一 | | employeeId | Long | 是 | 员工ID(柜员号,7位数字) | 必填,7位数字,唯一 |
| name | String | 是 | 姓名 | 最大100字符 | | name | String | 是 | 姓名 | 最大100字符 |
| deptId | Long | | 所属部门ID | | | deptId | Long | | 所属部门ID | 必填 |
| idCard | String | 是 | 身份证号 | 18位,符合国标,唯一 | | idCard | String | 是 | 身份证号 | 18位,符合国标,唯一 |
| phone | String | | 电话 | 11位手机号 | | phone | String | | 电话 | 必填,11位手机号 |
| hireDate | Date | 否 | 入职时间 | yyyy-MM-dd | | hireDate | Date | 否 | 入职时间 | yyyy-MM-dd |
| status | String | 是 | 状态 | 0=在职, 1=离职 | | status | String | 是 | 状态 | 0=在职, 1=离职 |
@@ -230,11 +230,13 @@ Authorization: Bearer {token}
**Excel 格式说明**: **Excel 格式说明**:
**Sheet1: 员工信息** **Sheet1: 员工信息**
| 姓名 | 柜员号 | 所属部门ID | 身份证号 | 电话 | 入职时间 | 状态▼ | | 姓名* | 柜员号* | 所属部门ID* | 身份证号* | 电话* | 入职时间 | 状态▼* |
|------|--------|------------|----------|------|----------|------| |------|--------|------------|----------|------|----------|------|
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 | | 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
**注**: 带 ▼ 标记的列包含下拉框,选项来自字典 `ccdi_employee_status` **注**:
- 带 * 标记的列为必填项(姓名、柜员号、所属部门、身份证号、电话、状态)
- 带 ▼ 标记的列包含下拉框,选项来自字典 `ccdi_employee_status`
**使用 @DictDropdown 注解实现**: **使用 @DictDropdown 注解实现**:
- 状态字段使用 `@DictDropdown(dictType = "ccdi_employee_status")` 注解 - 状态字段使用 `@DictDropdown(dictType = "ccdi_employee_status")` 注解
@@ -259,11 +261,16 @@ Authorization: Bearer {token}
**Excel 格式**: **Excel 格式**:
**Sheet1: 员工信息** **Sheet1: 员工信息**
| 姓名 | 柜员号 | 所属部门ID | 身份证号 | 电话 | 入职时间 | 状态 | | 姓名* | 柜员号* | 所属部门ID* | 身份证号* | 电话* | 入职时间 | 状态* |
|------|--------|------------|----------|------|----------|------| |------|--------|------------|----------|------|----------|------|
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 | | 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
**说明**: 柜员号列为7位数字,必填,唯一。 **说明**:
- ***标记为必填项**: 姓名、柜员号、所属部门、身份证号、电话、状态**
- 柜员号: 7位数字,必填,唯一
- 所属部门: 必须填写有效的部门ID
- 电话: 必须填写11位手机号
- 入职时间: 选填,格式为 yyyy-MM-dd
**响应示例**: **响应示例**:
```json ```json
@@ -291,9 +298,11 @@ Authorization: Bearer {token}
| 该柜员号已存在 | 新增时柜员号重复 | | 该柜员号已存在 | 新增时柜员号重复 |
| 柜员号不能为空 | 新增时柜员号为空 | | 柜员号不能为空 | 新增时柜员号为空 |
| 柜员号必须为7位数字 | 柜员号格式不正确 | | 柜员号必须为7位数字 | 柜员号格式不正确 |
| 所属部门不能为空 | 新增时所属部门为空 |
| 该身份证号已存在 | 新增/编辑时身份证号重复 | | 该身份证号已存在 | 新增/编辑时身份证号重复 |
| 姓名不能为空 | 新增时姓名为空 | | 姓名不能为空 | 新增时姓名为空 |
| 身份证号格式不正确 | 身份证号不符合18位国标 | | 身份证号格式不正确 | 身份证号不符合18位国标 |
| 电话不能为空 | 新增时电话为空 |
| 电话格式不正确 | 手机号不符合11位格式 | | 电话格式不正确 | 手机号不符合11位格式 |
| 状态只能填写'在职'或'离职' | 状态值不正确 | | 状态只能填写'在职'或'离职' | 状态值不正确 |

View File

@@ -36,6 +36,7 @@ public class CcdiEmployeeAddDTO implements Serializable {
private Long employeeId; private Long employeeId;
/** 所属部门ID */ /** 所属部门ID */
@NotNull(message = "所属部门不能为空")
private Long deptId; private Long deptId;
/** 身份证号 */ /** 身份证号 */
@@ -44,6 +45,7 @@ public class CcdiEmployeeAddDTO implements Serializable {
private String idCard; private String idCard;
/** 电话 */ /** 电话 */
@NotBlank(message = "电话不能为空")
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "电话格式不正确") @Pattern(regexp = "^1[3-9]\\d{9}$", message = "电话格式不正确")
private String phone; private String phone;

View File

@@ -1,5 +1,6 @@
package com.ruoyi.ccdi.domain.dto; package com.ruoyi.ccdi.domain.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
@@ -30,13 +31,16 @@ public class CcdiEmployeeEditDTO implements Serializable {
private String name; private String name;
/** 所属部门ID */ /** 所属部门ID */
@NotNull(message = "所属部门不能为空")
private Long deptId; private Long deptId;
/** 身份证号 */ /** 身份证号 */
@NotBlank(message = "身份证号不能为空")
@Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$", message = "身份证号格式不正确") @Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$", message = "身份证号格式不正确")
private String idCard; private String idCard;
/** 电话 */ /** 电话 */
@NotBlank(message = "电话不能为空")
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "电话格式不正确") @Pattern(regexp = "^1[3-9]\\d{9}$", message = "电话格式不正确")
private String phone; private String phone;

View File

@@ -241,9 +241,15 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
if (addDTO.getEmployeeId() == null) { if (addDTO.getEmployeeId() == null) {
throw new RuntimeException("柜员号不能为空"); throw new RuntimeException("柜员号不能为空");
} }
if (addDTO.getDeptId() == null) {
throw new RuntimeException("所属部门不能为空");
}
if (StringUtils.isEmpty(addDTO.getIdCard())) { if (StringUtils.isEmpty(addDTO.getIdCard())) {
throw new RuntimeException("身份证号不能为空"); throw new RuntimeException("身份证号不能为空");
} }
if (StringUtils.isEmpty(addDTO.getPhone())) {
throw new RuntimeException("电话不能为空");
}
if (StringUtils.isEmpty(addDTO.getStatus())) { if (StringUtils.isEmpty(addDTO.getStatus())) {
throw new RuntimeException("状态不能为空"); throw new RuntimeException("状态不能为空");
} }

View File

@@ -315,11 +315,15 @@ export default {
{ required: true, message: "柜员号不能为空", trigger: "blur" }, { required: true, message: "柜员号不能为空", trigger: "blur" },
{ pattern: /^\d{7}$/, message: "柜员号必须为7位数字", trigger: "blur" } { pattern: /^\d{7}$/, message: "柜员号必须为7位数字", trigger: "blur" }
], ],
deptId: [
{ required: true, message: "所属部门不能为空", trigger: "change" }
],
idCard: [ idCard: [
{ required: true, message: "身份证号不能为空", trigger: "blur" }, { required: true, message: "身份证号不能为空", trigger: "blur" },
{ pattern: idCardPattern, message: "请输入正确的18位身份证号", trigger: "blur" } { pattern: idCardPattern, message: "请输入正确的18位身份证号", trigger: "blur" }
], ],
phone: [ phone: [
{ required: true, message: "电话不能为空", trigger: "blur" },
{ pattern: phonePattern, message: "请输入正确的11位手机号", trigger: "blur" } { pattern: phonePattern, message: "请输入正确的11位手机号", trigger: "blur" }
], ],
status: [ status: [

View File

@@ -0,0 +1,15 @@
-- ========================================
-- 员工状态字典类型和数据
-- ========================================
-- 插入字典类型
INSERT INTO sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark)
VALUES (109, '员工状态', 'ccdi_employee_status', '0', 'admin', NOW(), '员工状态列表');
-- 插入字典数据 - 在职
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
VALUES (143, 1, '在职', '1', 'ccdi_employee_status', '', 'primary', 'N', '0', 'admin', NOW(), '在职状态');
-- 插入字典数据 - 离职
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
VALUES (144, 2, '离职', '0', 'ccdi_employee_status', '', 'danger', 'N', '0', 'admin', NOW(), '离职状态');

Binary file not shown.