## 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 文档包含：接口地址、请求方式、请求参数、响应格式、权限要求
