文件夹整理

This commit is contained in:
wkc
2026-02-09 14:28:25 +08:00
parent 056d239041
commit 02249c402e
2429 changed files with 3159 additions and 239710 deletions

View File

@@ -1,252 +0,0 @@
## Context
员工信息维护是纪检初核系统的核心基础功能。系统需要管理银行内部员工的基础信息及其亲属关系,以便在进行纪检初核工作时能够快速查询相关人员信息。
**约束条件:**
- 必须遵循若依框架的代码规范
- 必须使用项目已定义的命名规范(模块前缀 `ccdi_`
- 必须支持 Excel 导入导出功能
- 亲属信息需要与员工信息关联管理
**相关方:**
- 纪检人员:查询员工及亲属信息
- 系统管理员:批量导入员工数据
- 人事部门:维护员工基础信息
## Goals / Non-Goals
### Goals
1. 提供完整的员工信息 CRUD 接口
2. 支持员工亲属信息的关联管理(一对多关系)
3. 支持 Excel 批量导入导出,导入时可同时导入亲属信息
4. 遵循现有代码模式(参考 `ccdi_intermediary_blacklist` 模块)
### Non-Goals
- 不涉及前端页面的实现(本次仅实现后端接口)
- 不涉及员工组织架构的复杂层级管理
- 不涉及员工权限、角色管理(使用若依现有系统)
- 不涉及亲属关系的高级查询功能
## Decisions
### 1. 数据模型设计
**决策:使用两张表存储员工和亲属信息**
```
ccdi_employee (员工主表)
├── employee_id (主键)
├── name (姓名)
├── teller_no (柜员号, UNIQUE)
├── org_no (所属机构号)
├── id_card (身份证号, UNIQUE)
├── phone (电话)
├── hire_date (入职时间)
├── status (状态: 0=在职, 1=离职)
└── 审计字段 (create_by, create_time, update_by, update_time)
ccdi_employee_relative (员工亲属表)
├── relative_id (主键)
├── employee_id (外键 → ccdi_employee.employee_id)
├── relative_name (亲属姓名)
├── relative_id_card (亲属身份证号)
├── relative_phone (亲属手机号)
├── relationship (与员工关系)
└── 审计字段
```
**理由:**
- 符合数据库范式设计,避免数据冗余
- 支持一对多关系(一个员工可以有多个亲属)
- 便于查询和维护
**替代方案考虑:**
- 方案2将亲属信息存储为 JSON 字段
- 优点:单表存储,查询简单
- 缺点:无法对亲属信息建索引,不支持复杂查询
- **拒绝原因**:未来可能需要按亲属信息查询
### 2. 亲属信息维护方式
**决策:在员工的新增/编辑接口中同时支持亲属信息**
```
POST /dpc/employee
{
"name": "张三",
"tellerNo": "001",
"orgNo": "1001",
"idCard": "110101199001011234",
"phone": "13800138000",
"hireDate": "2020-01-01",
"relatives": [
{
"relativeName": "李四",
"relativeIdCard": "110101199001011235",
"relativePhone": "13800138001",
"relationship": "配偶"
}
]
}
```
**理由:**
- 减少接口数量,简化前端调用
- 保证员工与亲属信息的原子性操作
- 符合业务场景(新增员工时同时录入亲属信息)
### 3. Excel 导入格式
**决策:使用多 Sheet 导入方式**
```
Sheet1: 员工信息
| 姓名 | 柜员号 | 所属机构号 | 身份证号 | 电话 | 入职时间 |
|------|--------|------------|----------|------|----------|
| 张三 | 001 | 1001 | ... | ... | 2020-01-01 |
Sheet2: 亲属信息 (可选)
| 员工身份证号 | 亲属姓名 | 亲属身份证号 | 亲属手机号 | 与员工关系 |
|--------------|----------|--------------|------------|------------|
| 110101... | 李四 | 110101... | 138... | 配偶 |
```
**理由:**
- 清晰分离员工和亲属数据
- 支持仅导入员工信息(亲属信息为可选)
- 通过员工身份证号关联两张表
**替代方案考虑:**
- 方案2单 Sheet 导入,亲属信息嵌套在员工行中
- 缺点格式复杂Excel 难以编辑
- **拒绝原因**:用户体验差
### 4. 字典数据
**决策:使用字典管理"与员工关系"字段和"员工状态"字段**
```
字典类型: ccdi_relative_relationship
字典数据: 配偶、父亲、母亲、子女、兄弟姐妹、其他
字典类型: ccdi_employee_status
字典数据: 在职(0)、离职(1)
```
**理由:**
- 符合若依框架设计模式
- 便于后续扩展关系类型
- 统一管理枚举值
### 5. 数据库约束
**决策:柜员号和身份证号添加唯一约束**
```sql
UNIQUE KEY `uk_teller_no` (`teller_no`),
UNIQUE KEY `uk_id_card` (`id_card`)
```
**理由:**
- 柜员号是员工的唯一标识,不允许重复
- 身份证号具有唯一性,不允许重复
- 防止数据重复和业务逻辑错误
### 6. 命名规范
**决策:遵循项目规范**
- 表名: `ccdi_employee`, `ccdi_employee_relative`
- 实体类: `CcdiEmployee`, `CcdiEmployeeRelative`
- Controller: `CcdiEmployeeController`
- 权限标识: `dpc:employee:*`
- **所有实体类、DTO、VO 类统一使用 @Data 注解**
**理由:**
- 与现有 `ccdi_intermediary_blacklist` 模块保持一致
- 符合项目编码规范
- @Data 注解自动生成 getter/setter代码简洁
### 7. MyBatis Plus 使用策略
**决策:区分简单 CRUD 和复杂查询的实现方式**
**简单 CRUD 操作(使用 MyBatis Plus 方法):**
- BaseMapper 提供的方法:`insert`, `deleteById`, `deleteByIds`, `updateById`, `selectById`, `selectList`, `selectCount`
- 条件构造器:`QueryWrapper`, `LambdaQueryWrapper` 用于简单条件查询
- 适用场景:单表增删改查、简单条件筛选
**复杂查询操作(使用 XML 映射):**
- 多表关联查询(员工 + 亲属信息)
- 复杂条件组合查询
- 需要自定义结果映射的查询
- 适用场景:关联查询、复杂业务查询
**示例:**
```java
// 简单查询 - 使用 MyBatis Plus
employeeMapper.selectById(id);
employeeMapper.selectList(new LambdaQueryWrapper<CcdiEmployee>()
.eq(CcdiEmployee::getTellerNo, tellerNo));
// 复杂查询 - 使用 XML
EmployeeWithRelativesVO selectEmployeeWithRelatives(Long id);
```
**理由:**
- 简单 CRUD 使用 MyBatis Plus 减少代码量,提高开发效率
- 复杂查询使用 XML 保持 SQL 可读性和可维护性
- 符合项目技术规范MyBatis Plus 3.5.10Spring Boot 3 适配版)
## Risks / Trade-offs
### 风险1: Excel 导入时亲属数据关联失败
**风险描述**: 导入员工和亲属信息时,若员工身份证号填写错误,亲属信息无法关联。
**缓解措施**:
- 导入时进行数据校验
- 提供详细的导入错误报告
- 支持"仅导入员工"模式,亲属信息可后续补录
### 风险2: 亲属信息数据量过大
**风险描述**: 某些员工可能有大量亲属记录,影响查询性能。
**缓解措施**:
- 建立适当的数据库索引
- 列表查询时默认不返回亲属详情
- 提供单独的亲属查询接口
### 权衡: 简化 vs 完整性
- **当前方案**: 使用两表设计,支持完整的一对多关系
- **简化方案**: 将亲属信息存储为 JSON
- **选择**: 当前方案,因为纪检场景可能需要按亲属信息查询
## Migration Plan
### 后端部署步骤
1. 执行数据库脚本,创建表和字典数据
2. 部署后端代码
3. (前端开发阶段)配置菜单和权限数据
### 回滚计划
1. 从数据库中删除新增的表和字典数据
2. 移除后端代码部署
### 前端开发注意事项
- 开发前端页面时需同步在 `sys_menu` 表中插入菜单及权限数据
- 菜单路径:信息维护 → 员工信息管理
- 权限标识:`dpc:employee:list`, `dpc:employee:query`, `dpc:employee:add`, `dpc:employee:edit`, `dpc:employee:remove`, `dpc:employee:export`, `dpc:employee:import`
## Open Questions
1. **亲属关系是否需要支持多层级?** (如:亲属的亲属)
- **当前决策**: 否,仅支持员工的直接亲属
2. **导入时是否需要支持"更新已有员工"模式?**
- **当前决策**: 是,通过柜员号或身份证号判断
3. ~~**员工离职后如何处理?**~~
- **已确认**: 增加状态字段0=在职, 1=离职)
4. ~~**身份证号和柜员号是否需要唯一性约束?**~~
- **已确认**: 两者都需要唯一约束

View File

@@ -1,81 +0,0 @@
# Change: 添加员工信息维护功能
## Why
当前系统缺少员工信息管理能力,员工基础信息(姓名、柜员号、所属机构、身份证、电话、入职时间)以及员工亲属关系信息需要通过系统进行维护。这导致:
1. 员工信息分散管理,缺乏统一的数据源
2. 亲属关系信息无法与员工信息关联管理
3. 数据录入效率低,无法批量导入导出
为解决上述问题,需要添加员工信息维护功能,支持员工及其亲属信息的增删改查、批量导入导出。
## What Changes
### 新增功能
- 员工信息管理:支持员工的新增、编辑、删除、查询
- 员工信息导入导出:支持 Excel 批量导入导出员工数据
- 员工亲属管理:支持在员工信息中维护亲属关系
### 数据模型
**员工主表 (ccdi_employee)**
- 员工ID (主键)
- 姓名
- 柜员号 (唯一约束)
- 所属机构号
- 身份证号 (唯一约束)
- 电话
- 入职时间
- 状态 (0=在职, 1=离职)
- 审计字段(创建者、创建时间、更新者、更新时间)
**员工亲属表 (ccdi_employee_relative)**
- 亲属ID (主键)
- 员工ID (外键)
- 亲属姓名
- 亲属身份证号
- 亲属手机号
- 与员工关系
- 审计字段
### API 接口
- `POST /dpc/employee` - 新增员工
- `PUT /dpc/employee` - 编辑员工
- `DELETE /dpc/employee/{ids}` - 删除员工
- `GET /dpc/employee/list` - 查询员工列表
- `GET /dpc/employee/{id}` - 获取员工详情
- `POST /dpc/employee/export` - 导出员工信息
- `POST /dpc/employee/importTemplate` - 下载导入模板
- `POST /dpc/employee/importData` - 导入员工信息
## Impact
### 影响的规范 (Affected Specs)
- 新增规范: `employee-info` (员工信息管理)
### 影响的代码 (Affected Code)
- **新增模块**: `ruoyi-dpc` (DPC业务模块)
- `com.ruoyi.dpc.domain.CcdiEmployee` - 员工实体(使用 @Data 注解)
- `com.ruoyi.dpc.domain.CcdiEmployeeRelative` - 亲属实体(使用 @Data 注解)
- `com.ruoyi.dpc.domain.dto.*` - DTO类统一使用 @Data 注解)
- `com.ruoyi.dpc.domain.vo.*` - VO类统一使用 @Data 注解)
- `com.ruoyi.dpc.controller.CcdiEmployeeController` - 控制器
- `com.ruoyi.dpc.service.*` - 服务层
- `com.ruoyi.dpc.mapper.*` - 数据访问层(继承 MyBatis Plus BaseMapper
- **技术实现**:
- 简单 CRUD 操作使用 MyBatis Plus BaseMapper 方法
- 复杂查询(如多表关联)使用 XML 映射文件
- **数据库**: 新增表
- `ccdi_employee` - 员工信息表
- `ccdi_employee_relative` - 员工亲属表
- `sys_dict_type` - 字典类型表(员工状态、亲属关系)
- **菜单系统**: (将在前端开发阶段处理)
- 本次不涉及菜单数据的创建
- 前端开发时需在 `sys_menu` 表中插入菜单及权限数据
- **前端**: (本次提案仅涉及后端接口)
- 前端页面开发时需要同步配置菜单数据
### 非破坏性变更 (Non-Breaking)
此变更为纯新增功能,不影响现有系统行为。

View File

@@ -1,526 +0,0 @@
# 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** 日志应包含:操作人、操作时间、操作类型、导入数量

View File

@@ -1,99 +0,0 @@
## 1. 数据库设计与实现
- [x] 1.1 创建 `ccdi_employee` 员工信息表包含字段employee_id, name, teller_no, org_no, id_card, phone, hire_date, status, create_by, create_time, update_by, update_time
- [x] 1.2 为 `ccdi_employee` 表创建唯一约束uk_teller_no (柜员号唯一), uk_id_card (身份证号唯一)
- [x] 1.3 为 `ccdi_employee` 表创建索引idx_org_no, idx_status
- [x] 1.4 创建 `ccdi_employee_relative` 员工亲属表包含字段relative_id, employee_id, relative_name, relative_id_card, relative_phone, relationship, create_by, create_time, update_by, update_time
- [x] 1.5 为 `ccdi_employee_relative` 表创建索引idx_employee_id, idx_relative_id_card
- [x] 1.6 添加外键约束ccdi_employee_relative.employee_id → ccdi_employee.employee_id可选根据项目规范决定
- [x] 1.7 创建 `ccdi_relative_relationship` 字典类型及字典数据(配偶、父亲、母亲、子女、兄弟姐妹、其他)
- [x] 1.8 创建 `ccdi_employee_status` 字典类型及字典数据(在职=0、离职=1
## 2. 后端实体类创建
- [x] 2.1 创建 `CcdiEmployee.java` 实体类,使用 @Data 注解,包含 @Excel 注解用于导入导出
- [x] 2.2 创建 `CcdiEmployeeRelative.java` 实体类,使用 @Data 注解
- [x] 2.3 创建 `CcdiEmployeeAddDTO.java` 新增 DTO使用 @Data 注解,包含 @Validated 校验注解
- [x] 2.4 创建 `CcdiEmployeeEditDTO.java` 编辑 DTO使用 @Data 注解,包含 @Validated 校验注解
- [x] 2.5 创建 `CcdiEmployeeQueryDTO.java` 查询 DTO使用 @Data 注解
- [x] 2.6 创建 `CcdiEmployeeVO.java` 视图对象,使用 @Data 注解,包含亲属列表
- [x] 2.7 创建 `CcdiEmployeeRelativeVO.java` 亲属视图对象,使用 @Data 注解
- [x] 2.8 创建 `CcdiEmployeeRelativeAddDTO.java` 亲属新增 DTO使用 @Data 注解
## 3. Mapper 层实现
- [x] 3.1 创建 `CcdiEmployeeMapper.java` 接口,继承 `BaseMapper<CcdiEmployee>`
- [x] 3.2 创建 `CcdiEmployeeMapper.xml` MyBatis 映射文件,仅实现复杂查询(如:员工详情包含亲属列表)
- [x] 3.3 在 XML 中实现 `selectEmployeeWithRelatives` 方法,关联查询员工及其亲属信息
- [x] 3.4 创建 `CcdiEmployeeRelativeMapper.java` 接口,继承 `BaseMapper<CcdiEmployeeRelative>`
- [x] 3.5 创建 `CcdiEmployeeRelativeMapper.xml` MyBatis 映射文件(如需复杂查询)
- [x] 3.6 简单 CRUD 操作使用 MyBatis Plus 提供的 BaseMapper 方法insert, deleteById, deleteByIds, updateById, selectById, selectList
- [x] 3.7 简单条件查询使用 LambdaQueryWrapper 或 QueryWrapper按柜员号、身份证号查询
- [x] 3.8 复杂多条件查询在 XML 中编写自定义 SQL
## 4. Service 层实现
- [x] 4.1 创建 `ICcdiEmployeeService.java` 接口
- [x] 4.2 创建 `CcdiEmployeeServiceImpl.java` 实现类
- [x] 4.3 实现查询员工列表方法 `selectEmployeeList`,支持分页和多条件查询
- [x] 4.4 实现查询员工详情方法 `selectEmployeeById`,包含亲属信息
- [x] 4.5 实现新增员工方法 `insertEmployee`,支持同时插入亲属信息
- [x] 4.6 实现编辑员工方法 `updateEmployee`,支持更新亲属信息(先删除后插入)
- [x] 4.7 实现删除员工方法 `deleteEmployeeByIds`,级联删除亲属信息
- [x] 4.8 实现导出员工数据方法 `selectEmployeeListForExport`
- [x] 4.9 实现导入员工数据方法 `importEmployee`,支持批量导入员工和亲属
- [x] 4.10 实现柜员号唯一性校验
- [x] 4.11 实现身份证号格式校验
- [x] 4.12 实现电话格式校验
## 5. Controller 层实现
- [x] 5.1 创建 `CcdiEmployeeController.java` 控制器类
- [x] 5.2 实现 `GET /dpc/employee/list` 查询列表接口,添加 @PreAuthorize 权限注解
- [x] 5.3 实现 `GET /dpc/employee/{id}` 查询详情接口
- [x] 5.4 实现 `POST /dpc/employee` 新增接口
- [x] 5.5 实现 `PUT /dpc/employee` 编辑接口
- [x] 5.6 实现 `DELETE /dpc/employee/{ids}` 删除接口
- [x] 5.7 实现 `POST /dpc/employee/export` 导出接口
- [x] 5.8 实现 `POST /dpc/employee/importTemplate` 下载模板接口
- [x] 5.9 实现 `POST /dpc/employee/importData` 导入接口
- [x] 5.10 为所有接口添加 @Log 注解记录操作日志
## 6. 导入导出功能实现
- [x] 6.1 配置 `CcdiEmployee` 实体的 @Excel 注解,定义导出列
- [x] 6.2 配置 `CcdiEmployeeRelative` 实体的 @Excel 注解(用于多 Sheet 导入)
- [x] 6.3 实现导入模板的 Excel 格式定义
- [x] 6.4 实现 Excel 解析逻辑,支持多 Sheet 读取
- [x] 6.5 实现员工和亲属数据的关联逻辑(通过身份证号)
- [x] 6.6 实现导入数据校验逻辑
- [x] 6.7 实现导入错误信息收集和反馈
## 7. 数据校验
- [x] 7.1 实现 DTO 层的 @NotBlank@Size@Pattern 等校验注解
- [x] 7.2 实现身份证号格式校验18位符合国标
- [x] 7.3 实现电话号码格式校验11位手机号
- [x] 7.4 实现柜员号唯一性校验
- [x] 7.5 实现入职时间日期格式校验
- [x] 7.6 实现亲属信息必填字段校验
## 8. 测试
- [x] 8.1 生成可执行的测试脚本
- [x] 8.2 测试查询员工列表接口(分页、条件筛选)
- [x] 8.3 测试查询员工详情接口(包含亲属信息)
- [x] 8.4 测试新增员工接口(包含亲属信息)
- [x] 8.5 测试编辑员工接口(修改基本信息、新增/修改/删除亲属)
- [x] 8.6 测试删除员工接口(验证级联删除亲属)
- [x] 8.7 测试导出功能
- [x] 8.8 测试下载模板功能
- [x] 8.9 测试导入功能(正常数据、错误数据、更新模式)
- [x] 8.10 测试权限控制(无权限访问应被拒绝)
- [x] 8.11 测试数据校验(空值、格式错误、重复数据)
## 9. API 文档生成
- [x] 9.1 确认所有接口在 Swagger UI 中正确显示
- [x] 9.2 在项目文件目录下生成 API 文档doc/API文档.md
- [x] 9.3 文档包含:接口地址、请求方式、请求参数、响应格式、权限要求