From 07dea1bf0cb3b5502a1b8d44cc175cfcd9de496c Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Thu, 5 Feb 2026 14:26:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=91=98=E5=B7=A5=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=BF=85=E5=A1=AB=E9=A1=B9=E4=BC=98=E5=8C=96=20-=20=E6=9F=9C?= =?UTF-8?q?=E5=91=98=E5=8F=B7=E3=80=81=E6=89=80=E5=B1=9E=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E3=80=81=E7=94=B5=E8=AF=9D=E8=AE=BE=E4=B8=BA=E5=BF=85=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 后端修改 - 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 --- doc/api/员工信息管理API文档.md | 21 +++++++++++++----- .../ccdi/domain/dto/CcdiEmployeeAddDTO.java | 2 ++ .../ccdi/domain/dto/CcdiEmployeeEditDTO.java | 4 ++++ .../service/impl/CcdiEmployeeServiceImpl.java | 6 +++++ ruoyi-ui/src/views/ccdiEmployee/index.vue | 4 ++++ sql/ccdi_employee_status_dict.sql | 15 +++++++++++++ 员工信息导入模板.xlsx | Bin 0 -> 3810 bytes 7 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 sql/ccdi_employee_status_dict.sql create mode 100644 员工信息导入模板.xlsx diff --git a/doc/api/员工信息管理API文档.md b/doc/api/员工信息管理API文档.md index f82cd09..27fb92e 100644 --- a/doc/api/员工信息管理API文档.md +++ b/doc/api/员工信息管理API文档.md @@ -136,9 +136,9 @@ Authorization: Bearer {token} |--------|------|------|------|----------| | employeeId | Long | 是 | 员工ID(柜员号,7位数字) | 必填,7位数字,唯一 | | name | String | 是 | 姓名 | 最大100字符 | -| deptId | Long | 否 | 所属部门ID | | +| deptId | Long | 是 | 所属部门ID | 必填 | | idCard | String | 是 | 身份证号 | 18位,符合国标,唯一 | -| phone | String | 否 | 电话 | 11位手机号 | +| phone | String | 是 | 电话 | 必填,11位手机号 | | hireDate | Date | 否 | 入职时间 | yyyy-MM-dd | | status | String | 是 | 状态 | 0=在职, 1=离职 | @@ -230,11 +230,13 @@ Authorization: Bearer {token} **Excel 格式说明**: **Sheet1: 员工信息** -| 姓名 | 柜员号 | 所属部门ID | 身份证号 | 电话 | 入职时间 | 状态▼ | +| 姓名* | 柜员号* | 所属部门ID* | 身份证号* | 电话* | 入职时间 | 状态▼* | |------|--------|------------|----------|------|----------|------| | 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 | -**注**: 带 ▼ 标记的列包含下拉框,选项来自字典 `ccdi_employee_status`。 +**注**: +- 带 * 标记的列为必填项(姓名、柜员号、所属部门、身份证号、电话、状态) +- 带 ▼ 标记的列包含下拉框,选项来自字典 `ccdi_employee_status` **使用 @DictDropdown 注解实现**: - 状态字段使用 `@DictDropdown(dictType = "ccdi_employee_status")` 注解 @@ -259,11 +261,16 @@ Authorization: Bearer {token} **Excel 格式**: **Sheet1: 员工信息** -| 姓名 | 柜员号 | 所属部门ID | 身份证号 | 电话 | 入职时间 | 状态 | +| 姓名* | 柜员号* | 所属部门ID* | 身份证号* | 电话* | 入职时间 | 状态* | |------|--------|------------|----------|------|----------|------| | 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 | -**说明**: 柜员号列为7位数字,必填,唯一。 +**说明**: +- ***标记为必填项**: 姓名、柜员号、所属部门、身份证号、电话、状态** +- 柜员号: 7位数字,必填,唯一 +- 所属部门: 必须填写有效的部门ID +- 电话: 必须填写11位手机号 +- 入职时间: 选填,格式为 yyyy-MM-dd **响应示例**: ```json @@ -291,9 +298,11 @@ Authorization: Bearer {token} | 该柜员号已存在 | 新增时柜员号重复 | | 柜员号不能为空 | 新增时柜员号为空 | | 柜员号必须为7位数字 | 柜员号格式不正确 | +| 所属部门不能为空 | 新增时所属部门为空 | | 该身份证号已存在 | 新增/编辑时身份证号重复 | | 姓名不能为空 | 新增时姓名为空 | | 身份证号格式不正确 | 身份证号不符合18位国标 | +| 电话不能为空 | 新增时电话为空 | | 电话格式不正确 | 手机号不符合11位格式 | | 状态只能填写'在职'或'离职' | 状态值不正确 | diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeAddDTO.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeAddDTO.java index 3909138..201a0cf 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeAddDTO.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeAddDTO.java @@ -36,6 +36,7 @@ public class CcdiEmployeeAddDTO implements Serializable { private Long employeeId; /** 所属部门ID */ + @NotNull(message = "所属部门不能为空") private Long deptId; /** 身份证号 */ @@ -44,6 +45,7 @@ public class CcdiEmployeeAddDTO implements Serializable { private String idCard; /** 电话 */ + @NotBlank(message = "电话不能为空") @Pattern(regexp = "^1[3-9]\\d{9}$", message = "电话格式不正确") private String phone; diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeEditDTO.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeEditDTO.java index eaf0b46..2cfcdb1 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeEditDTO.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiEmployeeEditDTO.java @@ -1,5 +1,6 @@ package com.ruoyi.ccdi.domain.dto; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; @@ -30,13 +31,16 @@ public class CcdiEmployeeEditDTO implements Serializable { private String name; /** 所属部门ID */ + @NotNull(message = "所属部门不能为空") 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 = "身份证号格式不正确") private String idCard; /** 电话 */ + @NotBlank(message = "电话不能为空") @Pattern(regexp = "^1[3-9]\\d{9}$", message = "电话格式不正确") private String phone; diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java index 5f61013..f563ac7 100644 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java +++ b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiEmployeeServiceImpl.java @@ -241,9 +241,15 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService { if (addDTO.getEmployeeId() == null) { throw new RuntimeException("柜员号不能为空"); } + if (addDTO.getDeptId() == null) { + throw new RuntimeException("所属部门不能为空"); + } if (StringUtils.isEmpty(addDTO.getIdCard())) { throw new RuntimeException("身份证号不能为空"); } + if (StringUtils.isEmpty(addDTO.getPhone())) { + throw new RuntimeException("电话不能为空"); + } if (StringUtils.isEmpty(addDTO.getStatus())) { throw new RuntimeException("状态不能为空"); } diff --git a/ruoyi-ui/src/views/ccdiEmployee/index.vue b/ruoyi-ui/src/views/ccdiEmployee/index.vue index a0b8d9f..f1ff7cc 100644 --- a/ruoyi-ui/src/views/ccdiEmployee/index.vue +++ b/ruoyi-ui/src/views/ccdiEmployee/index.vue @@ -315,11 +315,15 @@ export default { { required: true, message: "柜员号不能为空", trigger: "blur" }, { pattern: /^\d{7}$/, message: "柜员号必须为7位数字", trigger: "blur" } ], + deptId: [ + { required: true, message: "所属部门不能为空", trigger: "change" } + ], idCard: [ { required: true, message: "身份证号不能为空", trigger: "blur" }, { pattern: idCardPattern, message: "请输入正确的18位身份证号", trigger: "blur" } ], phone: [ + { required: true, message: "电话不能为空", trigger: "blur" }, { pattern: phonePattern, message: "请输入正确的11位手机号", trigger: "blur" } ], status: [ diff --git a/sql/ccdi_employee_status_dict.sql b/sql/ccdi_employee_status_dict.sql new file mode 100644 index 0000000..04276dd --- /dev/null +++ b/sql/ccdi_employee_status_dict.sql @@ -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(), '离职状态'); diff --git a/员工信息导入模板.xlsx b/员工信息导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..161732791e2fcc0bf7ab1a6196c55611e9114c70 GIT binary patch literal 3810 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 literal 0 HcmV?d00001