Files
ccdi/openspec/changes/add-employee-info/specs/employee-info/spec.md
wkc 0cc8ef0fc3 员工信息管理
- 新增员工信息CRUD功能
- 添加员工关联人员管理
- 配置MyBatis Plus审计字段
- 添加OpenSpec规范文档
- 新增测试脚本和数据

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-28 14:40:27 +08:00

527 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Spec: 员工信息管理
## ADDED Requirements
### Requirement: 系统SHALL支持查询员工信息列表
系统MUST提供查询功能允许用户查询系统中已维护的员工信息列表支持分页、模糊搜索和多条件筛选。
#### Scenario: 分页查询员工列表
**Given** 用户已登录系统且具有 `dpc:employee:list` 权限
**When** 用户访问员工信息管理页面
**Then** 系统应显示员工列表,支持分页展示
#### Scenario: 按姓名模糊搜索员工
**Given** 用户已登录系统且具有 `dpc:employee:list` 权限
**And** 系统中存在姓名为"张三"的员工
**When** 用户在搜索框输入"张"并点击搜索
**Then** 系统应返回所有姓名中包含"张"的员工记录
#### Scenario: 按柜员号精确搜索员工
**Given** 用户已登录系统且具有 `dpc:employee:list` 权限
**And** 系统中存在柜员号为"001"的员工
**When** 用户在搜索框输入"001"并点击搜索
**Then** 系统应返回该柜员号对应的员工记录
#### Scenario: 按所属机构号筛选员工
**Given** 用户已登录系统且具有 `dpc:employee:list` 权限
**And** 系统中存在所属机构号为"1001"的员工
**When** 用户选择所属机构号为"1001"并点击搜索
**Then** 系统应返回该机构下的所有员工记录
#### Scenario: 按身份证号精确搜索员工
**Given** 用户已登录系统且具有 `dpc:employee:list` 权限
**And** 系统中存在身份证号为"110101199001011234"的员工
**When** 用户在搜索框输入"110101199001011234"并点击搜索
**Then** 系统应返回该身份证号对应的员工记录
#### Scenario: 组合条件查询员工
**Given** 用户已登录系统且具有 `dpc:employee:list` 权限
**When** 用户同时输入姓名"张"、柜员号"001"、所属机构号"1001"并点击搜索
**Then** 系统应返回同时满足所有条件的记录
#### Scenario: 按状态筛选员工
**Given** 用户已登录系统且具有 `dpc:employee:list` 权限
**And** 系统中存在在职和离职两种状态的员工记录
**When** 用户选择状态为"在职"并点击搜索
**Then** 系统应仅返回状态为"在职"的记录
---
### Requirement: 系统SHALL支持新增员工信息
系统MUST提供新增功能允许用户添加员工信息并可同时维护员工亲属信息。
#### Scenario: 新增员工基本信息
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户点击"新增"按钮
**And** 填写姓名为"张三"
**And** 填写柜员号为"001"
**And** 填写所属机构号为"1001"
**And** 填写身份证号为"110101199001011234"
**And** 填写电话为"13800138000"
**And** 填写入职时间为"2020-01-01"
**And** 选择状态为"在职"
**And** 点击"确定"按钮
**Then** 系统应保存员工信息并提示"操作成功"
**And** 列表中应显示新增的记录
#### Scenario: 新增员工时同时添加亲属信息
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户点击"新增"按钮
**And** 填写员工基本信息
**And** 在亲属区域添加亲属:姓名"李四"、身份证"110101199001011235"、电话"13800138001"、关系"配偶"
**And** 点击"确定"按钮
**Then** 系统应保存员工信息及亲属信息
**And** 查询该员工详情时应显示关联的亲属信息
#### Scenario: 新增员工时同时添加多个亲属
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户点击"新增"按钮
**And** 填写员工基本信息
**And** 添加3个亲属信息
**And** 点击"确定"按钮
**Then** 系统应保存员工信息及所有亲属信息
**And** 查询该员工详情时应显示3个亲属
#### Scenario: 新增时姓名为空应校验失败
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户点击"新增"按钮
**And** 不填写姓名
**And** 点击"确定"按钮
**Then** 系统应提示"姓名不能为空"
**And** 不保存数据
#### Scenario: 新增时柜员号为空应校验失败
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户点击"新增"按钮
**And** 不填写柜员号
**And** 点击"确定"按钮
**Then** 系统应提示"柜员号不能为空"
**And** 不保存数据
#### Scenario: 新增时身份证号格式校验
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户点击"新增"按钮
**And** 填写身份证号为"123"(不符合身份证格式)
**And** 点击"确定"按钮
**Then** 系统应提示"身份证号格式不正确"
**And** 不保存数据
#### Scenario: 新增时电话格式校验
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户点击"新增"按钮
**And** 填写电话为"abc"(不符合手机号格式)
**And** 点击"确定"按钮
**Then** 系统应提示"电话格式不正确"
**And** 不保存数据
#### Scenario: 新增时柜员号重复应校验失败
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**And** 系统中已存在柜员号为"001"的员工
**When** 用户点击"新增"按钮
**And** 填写柜员号为"001"
**And** 点击"确定"按钮
**Then** 系统应提示"该柜员号已存在"
**And** 不保存数据
#### Scenario: 新增时身份证号重复应校验失败
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**And** 系统中已存在身份证号为"110101199001011234"的员工
**When** 用户点击"新增"按钮
**And** 填写身份证号为"110101199001011234"
**And** 点击"确定"按钮
**Then** 系统应提示"该身份证号已存在"
**And** 不保存数据
---
### Requirement: 系统SHALL支持编辑员工信息
系统MUST提供编辑功能允许用户修改已存在的员工信息及其亲属信息。
#### Scenario: 编辑员工基本信息
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**And** 系统中存在一条员工记录
**When** 用户点击该记录的"编辑"按钮
**And** 修改姓名为"李四"
**And** 点击"确定"按钮
**Then** 系统应更新员工信息并提示"操作成功"
**And** 列表中应显示更新后的姓名
#### Scenario: 编辑员工时新增亲属
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**And** 系统中存在一条员工记录该员工有1个亲属
**When** 用户点击该记录的"编辑"按钮
**And** 在亲属区域添加新的亲属信息
**And** 点击"确定"按钮
**Then** 系统应保存新的亲属信息
**And** 查询该员工详情时应显示2个亲属
#### Scenario: 编辑员工时修改亲属信息
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**And** 系统中存在一条员工记录,该员工有亲属"李四"
**When** 用户点击该记录的"编辑"按钮
**And** 修改亲属姓名为"王五"
**And** 点击"确定"按钮
**Then** 系统应更新亲属信息
**And** 查询该员工详情时应显示更新后的亲属姓名
#### Scenario: 编辑员工时删除亲属
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**And** 系统中存在一条员工记录该员工有2个亲属
**When** 用户点击该记录的"编辑"按钮
**And** 删除其中一个亲属
**And** 点击"确定"按钮
**Then** 系统应删除该亲属信息
**And** 查询该员工详情时应仅显示1个亲属
#### Scenario: 编辑时清除所有亲属
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**And** 系统中存在一条员工记录,该员工有亲属信息
**When** 用户点击该记录的"编辑"按钮
**And** 删除所有亲属
**And** 点击"确定"按钮
**Then** 系统应删除所有亲属信息
**And** 查询该员工详情时亲属列表应为空
#### Scenario: 编辑时姓名为空应校验失败
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**And** 系统中存在一条员工记录
**When** 用户点击该记录的"编辑"按钮
**And** 清空姓名字段
**And** 点击"确定"按钮
**Then** 系统应提示"姓名不能为空"
**And** 不更新数据
#### Scenario: 编辑时亲属信息校验
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**And** 系统中存在一条员工记录
**When** 用户点击该记录的"编辑"按钮
**And** 添加亲属信息但不填写亲属姓名
**And** 点击"确定"按钮
**Then** 系统应提示"亲属姓名不能为空"
**And** 不更新数据
---
### Requirement: 系统SHALL支持删除员工信息
系统MUST提供删除功能允许用户删除不再需要的员工记录删除员工时应级联删除其亲属信息。
#### Scenario: 删除单条员工记录
**Given** 用户已登录系统且具有 `dpc:employee:remove` 权限
**And** 系统中存在一条员工记录
**When** 用户点击该记录的"删除"按钮
**And** 确认删除操作
**Then** 系统应删除该员工记录
**And** 系统应同时删除该员工的所有亲属信息
**And** 列表中不再显示该记录
#### Scenario: 批量删除员工记录
**Given** 用户已登录系统且具有 `dpc:employee:remove` 权限
**And** 系统中存在多条员工记录
**When** 用户勾选3条记录
**And** 点击"删除"按钮
**And** 确认删除操作
**Then** 系统应删除选中的3条员工记录
**And** 系统应同时删除这3个员工的所有亲属信息
**And** 列表中不再显示这3条记录
---
### Requirement: 系统SHALL支持查看员工详情
系统MUST提供详情查看功能允许用户查看员工的完整信息及亲属列表。
#### Scenario: 查看员工基本信息
**Given** 用户已登录系统且具有 `dpc:employee:query` 权限
**And** 系统中存在一条员工记录
**When** 用户点击该记录的"查看"按钮
**Then** 系统应显示员工的完整基本信息
**And** 信息应包括:姓名、柜员号、所属机构号、身份证号、电话、入职时间
#### Scenario: 查看员工亲属信息
**Given** 用户已登录系统且具有 `dpc:employee:query` 权限
**And** 系统中存在一条员工记录该员工有2个亲属
**When** 用户点击该记录的"查看"按钮
**Then** 系统应显示员工的基本信息
**And** 系统应显示该员工的亲属列表
**And** 亲属信息应包括:亲属姓名、亲属身份证号、亲属手机号、与员工关系
#### Scenario: 查看无亲属的员工
**Given** 用户已登录系统且具有 `dpc:employee:query` 权限
**And** 系统中存在一条员工记录,该员工无亲属信息
**When** 用户点击该记录的"查看"按钮
**Then** 系统应显示员工的基本信息
**And** 亲属列表应显示为空或提示"暂无亲属信息"
---
### Requirement: 系统SHALL支持导出员工信息
系统MUST提供导出功能允许用户将查询结果导出为 Excel 文件。
#### Scenario: 导出所有员工数据
**Given** 用户已登录系统且具有 `dpc:employee:export` 权限
**And** 系统中存在100条员工记录
**When** 用户点击"导出"按钮
**And** 不设置任何筛选条件
**Then** 系统应生成包含100条记录的 Excel 文件并下载
#### Scenario: 导出筛选后的员工数据
**Given** 用户已登录系统且具有 `dpc:employee:export` 权限
**And** 系统中存在多个机构的员工记录
**When** 用户筛选所属机构号为"1001"
**And** 点击"导出"按钮
**Then** 系统应生成仅包含该机构员工记录的 Excel 文件并下载
#### Scenario: 导出的 Excel 文件格式正确
**Given** 用户已登录系统且具有 `dpc:employee:export` 权限
**When** 用户点击"导出"按钮
**Then** Excel 文件应包含以下列:姓名、柜员号、所属机构号、身份证号、电话、入职时间
**And** 表头应使用中文显示
**And** 数据应正确显示
---
### Requirement: 系统SHALL支持下载 Excel 导入模板
系统MUST提供模板下载功能允许用户下载标准的 Excel 导入模板。
#### Scenario: 下载员工信息导入模板
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**When** 用户点击"下载模板"按钮
**Then** 系统应生成 Excel 模板文件并下载
**And** 模板应包含"员工信息" Sheet
**And** 模板应包含"亲属信息" Sheet可选
**And** 员工信息 Sheet 应包含以下列:姓名、柜员号、所属机构号、身份证号、电话、入职时间
**And** 亲属信息 Sheet 应包含以下列:员工身份证号、亲属姓名、亲属身份证号、亲属手机号、与员工关系
#### Scenario: 模板中的示例数据正确
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**When** 用户下载导入模板
**Then** 模板应包含至少一行示例数据
**And** 示例数据应展示正确的填写格式
---
### Requirement: 系统SHALL支持通过 Excel 批量导入员工信息
系统MUST提供批量导入功能允许用户通过 Excel 文件批量导入员工信息,支持同时导入员工和亲属数据。
#### Scenario: 导入包含有效员工数据的 Excel 文件
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 用户已准备好包含10条有效员工数据的 Excel 文件
**When** 用户点击"导入"按钮
**And** 选择准备好的 Excel 文件
**And** 点击"确定"
**Then** 系统应导入10条记录并提示"成功导入10条数据"
**And** 列表中应显示这10条新增记录
#### Scenario: 导入时同时导入员工和亲属信息
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 用户准备的 Excel 文件包含5条员工数据
**And** 亲属信息 Sheet 包含这5个员工的亲属信息
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应导入5条员工记录及其关联的亲属信息
**And** 提示导入成功
#### Scenario: 导入时部分数据格式错误
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 用户准备的 Excel 文件包含10条数据
**And** 其中2条数据的姓名字段为空
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应仅导入8条有效数据
**And** 提示"成功导入8条数据失败2条数据"
**And** 显示失败行的错误详情
#### Scenario: 导入时柜员号重复
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 系统中已存在柜员号为"001"的员工
**And** 用户准备的 Excel 文件包含柜员号为"001"的记录
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 不勾选"更新已存在数据"
**And** 点击"确定"
**Then** 系统应提示该行数据"柜员号已存在"
**And** 该行数据不被导入
#### Scenario: 导入时选择更新支持模式
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 系统中已存在柜员号为"001"的员工
**And** 用户准备的 Excel 文件包含相同柜员号的记录但姓名不同
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 勾选"更新已存在数据"选项
**And** 点击"确定"
**Then** 系统应更新该柜员号对应的记录
**And** 提示包含更新成功的消息
#### Scenario: 导入时亲属信息关联失败
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 用户准备的 Excel 文件包含亲属信息
**And** 亲属信息 Sheet 中某条记录的员工身份证号在员工信息 Sheet 中不存在
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应提示该亲属记录"员工身份证号不存在"
**And** 该亲属记录不被导入
#### Scenario: 导入时身份证号格式校验
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 用户准备的 Excel 文件中某条记录的身份证号格式不正确
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应提示该行数据"身份证号格式不正确"
**And** 该行数据不被导入
#### Scenario: 导入时电话格式校验
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 用户准备的 Excel 文件中某条记录的电话格式不正确
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应提示该行数据"电话格式不正确"
**And** 该行数据不被导入
#### Scenario: 导入时仅导入员工信息(无亲属 Sheet
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**And** 用户准备的 Excel 文件仅包含员工信息 Sheet
**And** 不包含亲属信息 Sheet
**When** 用户点击"导入"按钮
**And** 选择 Excel 文件
**And** 点击"确定"
**Then** 系统应正常导入员工信息
**And** 提示导入成功
---
### Requirement: 系统SHALL验证用户权限
系统MUST根据用户的角色和权限控制其对员工信息功能的访问。
#### Scenario: 无权限用户访问列表应被拒绝
**Given** 用户已登录系统
**And** 该用户不具有 `dpc:employee:list` 权限
**When** 用户尝试访问员工信息管理页面
**Then** 系统应提示"您没有权限执行此操作"
**And** 不显示列表数据
#### Scenario: 无权限用户尝试新增应被拒绝
**Given** 用户已登录系统
**And** 该用户不具有 `dpc:employee:add` 权限
**When** 用户尝试点击"新增"按钮
**Then** 系统应隐藏或禁用"新增"按钮
#### Scenario: 无权限用户尝试编辑应被拒绝
**Given** 用户已登录系统
**And** 该用户不具有 `dpc:employee:edit` 权限
**When** 用户尝试点击"编辑"按钮
**Then** 系统应隐藏或禁用"编辑"按钮
#### Scenario: 无权限用户尝试删除应被拒绝
**Given** 用户已登录系统
**And** 该用户不具有 `dpc:employee:remove` 权限
**When** 用户尝试点击"删除"按钮
**Then** 系统应隐藏或禁用"删除"按钮
#### Scenario: 无权限用户尝试导出应被拒绝
**Given** 用户已登录系统
**And** 该用户不具有 `dpc:employee:export` 权限
**When** 用户尝试点击"导出"按钮
**Then** 系统应隐藏或禁用"导出"按钮
#### Scenario: 无权限用户尝试导入应被拒绝
**Given** 用户已登录系统
**And** 该用户不具有 `dpc:employee:import` 权限
**When** 用户尝试点击"导入"按钮
**Then** 系统应隐藏或禁用"导入"按钮
---
### Requirement: 系统SHALL记录操作日志
系统MUST记录用户对员工信息的关键操作包括新增、修改、删除、导入等操作。
#### Scenario: 新增操作应记录日志
**Given** 用户已登录系统且具有 `dpc:employee:add` 权限
**When** 用户成功新增一条员工记录
**Then** 系统应在操作日志中记录
**And** 日志应包含:操作人、操作时间、操作类型、操作内容
#### Scenario: 修改操作应记录日志
**Given** 用户已登录系统且具有 `dpc:employee:edit` 权限
**When** 用户成功修改一条员工记录
**Then** 系统应在操作日志中记录
**And** 日志应包含:操作人、操作时间、操作类型、修改内容
#### Scenario: 删除操作应记录日志
**Given** 用户已登录系统且具有 `dpc:employee:remove` 权限
**When** 用户成功删除一条员工记录
**Then** 系统应在操作日志中记录
**And** 日志应包含操作人、操作时间、操作类型、删除的记录ID
#### Scenario: 导入操作应记录日志
**Given** 用户已登录系统且具有 `dpc:employee:import` 权限
**When** 用户成功导入员工数据
**Then** 系统应在操作日志中记录
**And** 日志应包含:操作人、操作时间、操作类型、导入数量