From 9c84af78f2bbdca2e9a63a2be70d1b4dbb6241e3 Mon Sep 17 00:00:00 2001
From: wkc <978997012@qq.com>
Date: Thu, 5 Feb 2026 14:06:35 +0800
Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E5=91=98=E5=B7=A5?=
=?UTF-8?q?=E6=9F=9C=E5=91=98=E5=8F=B7=E4=BC=98=E5=8C=96=E8=AE=BE=E8=AE=A1?=
=?UTF-8?q?=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 移除tellerNo字段,将employeeId设置为柜员号
- 柜员号为7位数字,手动输入,唯一性校验
- 包含数据库、后端、前端、测试等完整设计方案
- 生成测试脚本和API文档更新计划
---
doc/design/2026-02-05-员工柜员号优化设计.md | 455 ++++++++++++++++++++
doc/docs/ccdi_fmy_relation_person.csv | 28 ++
doc/docs/ccdi_purchase_transaction.csv | 38 ++
doc/docs/ccdi_staff_recruitment.csv | 22 +
doc/docs/ccdi_staff_transfer.csv | 18 +
sql/remove_employee_relative.sql | 13 +
6 files changed, 574 insertions(+)
create mode 100644 doc/design/2026-02-05-员工柜员号优化设计.md
create mode 100644 doc/docs/ccdi_fmy_relation_person.csv
create mode 100644 doc/docs/ccdi_purchase_transaction.csv
create mode 100644 doc/docs/ccdi_staff_recruitment.csv
create mode 100644 doc/docs/ccdi_staff_transfer.csv
create mode 100644 sql/remove_employee_relative.sql
diff --git a/doc/design/2026-02-05-员工柜员号优化设计.md b/doc/design/2026-02-05-员工柜员号优化设计.md
new file mode 100644
index 0000000..733f90b
--- /dev/null
+++ b/doc/design/2026-02-05-员工柜员号优化设计.md
@@ -0,0 +1,455 @@
+# 员工柜员号优化设计文档
+
+**文档版本**: v1.0
+**创建日期**: 2026-02-05
+**设计目标**: 统一标识符,移除tellerNo字段,将employeeId设置为柜员号
+
+---
+
+## 一、需求概述
+
+### 1.1 需求背景
+当前员工信息表中存在两个字段用于标识员工:
+- `employee_id`: 数据库主键,自增ID
+- `teller_no`: 柜员号,业务标识符
+
+这种双标识符设计造成了字段冗余和业务混淆。
+
+### 1.2 需求目标
+- **移除 `teller_no` 字段**,简化数据结构
+- **将 `employee_id` 改为手动输入的柜员号**(7位数字)
+- **统一标识符**,避免业务混淆
+- **保持数据完整性和业务连续性**
+
+### 1.3 约束条件
+- 系统处于开发阶段,无正式生产数据
+- 柜员号必须为7位数字
+- 柜员号必须唯一,不允许重复
+- 柜员号为必填字段
+
+---
+
+## 二、数据库层设计
+
+### 2.1 表结构修改
+
+#### 删除字段
+```sql
+ALTER TABLE ccdi_employee DROP COLUMN teller_no;
+```
+
+#### 修改主键字段
+```sql
+-- 移除自增属性
+ALTER TABLE ccdi_employee MODIFY employee_id BIGINT(20) NOT NULL;
+
+-- 更新字段注释
+ALTER TABLE ccdi_employee MODIFY COLUMN employee_id BIGINT(20) NOT NULL COMMENT '员工ID(柜员号,7位数字)';
+```
+
+#### 重建表方案(推荐,清空数据场景)
+```sql
+DROP TABLE IF EXISTS ccdi_employee;
+
+CREATE TABLE ccdi_employee (
+ employee_id BIGINT(20) NOT NULL COMMENT '员工ID(柜员号,7位数字)',
+ name VARCHAR(100) NOT NULL COMMENT '姓名',
+ dept_id BIGINT(20) DEFAULT NULL COMMENT '所属部门ID',
+ id_card VARCHAR(18) NOT NULL COMMENT '身份证号',
+ phone VARCHAR(11) DEFAULT NULL COMMENT '电话',
+ hire_date DATE DEFAULT NULL COMMENT '入职时间',
+ status CHAR(1) NOT NULL DEFAULT '0' COMMENT '状态(0在职 1离职)',
+ create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
+ create_time DATETIME DEFAULT NULL COMMENT '创建时间',
+ update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
+ update_time DATETIME DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (employee_id),
+ KEY idx_dept_id (dept_id),
+ KEY idx_status (status),
+ UNIQUE KEY uk_id_card (id_card)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工信息表';
+```
+
+### 2.2 索引调整
+- 移除: `UNIQUE KEY teller_no`
+- 保留: `PRIMARY KEY (employee_id)` 天然保证唯一性
+
+---
+
+## 三、后端代码层设计
+
+### 3.1 Entity 实体类 (CcdiEmployee.java)
+
+**修改前**:
+```java
+@TableId(type = IdType.AUTO)
+private Long employeeId;
+
+private String tellerNo;
+```
+
+**修改后**:
+```java
+@TableId(type = IdType.INPUT) // 改为手动输入
+private Long employeeId;
+
+// 删除 tellerNo 字段
+```
+
+### 3.2 DTO 类修改
+
+#### CcdiEmployeeAddDTO.java
+```java
+/** 员工ID(柜员号) */
+@NotNull(message = "柜员号不能为空")
+@Min(value = 1000000L, message = "柜员号必须为7位数字")
+@Max(value = 9999999L, message = "柜员号必须为7位数字")
+private Long employeeId;
+
+// 删除 tellerNo 字段
+```
+
+#### CcdiEmployeeEditDTO.java
+```java
+// employeeId 作为主键标识,通过路径参数传递,不在请求体中
+
+// 删除 tellerNo 字段
+```
+
+#### CcdiEmployeeQueryDTO.java
+```java
+/** 柜员号(精确查询) */
+@Min(value = 1000000L, message = "柜员号必须为7位数字")
+@Max(value = 9999999L, message = "柜员号必须为7位数字")
+private Long employeeId;
+
+// 删除 tellerNo 字段
+```
+
+### 3.3 VO 类修改 (CcdiEmployeeVO.java)
+
+```java
+/** 员工ID(柜员号) */
+private Long employeeId;
+
+// 删除 tellerNo 字段
+```
+
+### 3.4 Service 层修改
+
+#### 新增柜员号唯一性校验
+```java
+@Override
+public void checkEmployeeIdUnique(Long employeeId) {
+ CcdiEmployee existing = baseMapper.selectById(employeeId);
+ if (existing != null) {
+ throw new ServiceException("柜员号已存在,请使用其他柜员号");
+ }
+}
+```
+
+#### 新增员工方法调整
+```java
+@Override
+public void addEmployee(CcdiEmployeeAddDTO dto) {
+ // 1. 校验柜员号唯一性
+ checkEmployeeIdUnique(dto.getEmployeeId());
+
+ // 2. 校验身份证号唯一性
+ checkIdCardUnique(dto.getIdCard());
+
+ // 3. 转换并保存
+ CcdiEmployee employee = BeanUtil.copyProperties(dto, CcdiEmployee.class);
+ baseMapper.insert(employee);
+}
+```
+
+### 3.5 Mapper XML 修改
+
+#### ResultMap 调整
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+#### 查询 SQL 调整
+```xml
+
+```
+
+### 3.6 Controller 层修改
+
+#### 接口参数调整
+- **POST /ccdi/employee**: 新增接口,接收 `employeeId` 作为必填字段
+- **PUT /ccdi/employee/{employeeId}**: 编辑接口,`employeeId` 作为路径参数不可修改
+- **GET /ccdi/employee/list**: 列表查询,移除 `tellerNo` 查询参数,保留 `employeeId` 精确查询
+
+#### Swagger 注释更新
+```java
+@Operation(summary = "新增员工信息", description = "employeeId为柜员号,7位数字")
+```
+
+---
+
+## 四、前端代码层设计
+
+### 4.1 查询表单调整
+
+```vue
+
+
+
+
+
+
+```
+
+### 4.2 表格列调整
+
+```vue
+
+
+
+
+
+```
+
+### 4.3 新增/编辑对话框调整
+
+```vue
+
+
+
+
+
+
+
+
+
+```
+
+### 4.4 JavaScript 数据结构
+
+```javascript
+data() {
+ return {
+ queryParams: {
+ name: null,
+ employeeId: null, // 替代 tellerNo
+ deptId: null,
+ idCard: null,
+ status: null
+ },
+ form: {
+ employeeId: null, // 替代 tellerNo
+ name: null,
+ deptId: null,
+ // ...
+ }
+ }
+}
+```
+
+### 4.5 表单校验规则
+
+```javascript
+rules: {
+ employeeId: [
+ { required: true, message: "柜员号不能为空", trigger: "blur" },
+ { pattern: /^\d{7}$/, message: "柜员号必须为7位数字", trigger: "blur" }
+ ],
+ // 其他规则...
+}
+```
+
+---
+
+## 五、测试方案
+
+### 5.1 新增员工测试
+
+| 测试场景 | 输入数据 | 预期结果 |
+|---------|---------|---------|
+| 正常场景 | 柜员号: 1000000 | 新增成功 |
+| 格式错误-少于7位 | 柜员号: 123456 | 提示"柜员号必须为7位数字" |
+| 格式错误-多于7位 | 柜员号: 12345678 | 提示"柜员号必须为7位数字" |
+| 格式错误-非数字 | 柜员号: 123456a | 提示"柜员号必须为7位数字" |
+| 唯一性冲突 | 重复的柜员号 | 提示"柜员号已存在" |
+| 必填校验 | 柜员号为空 | 提示"柜员号不能为空" |
+
+### 5.2 编辑员工测试
+
+| 测试场景 | 操作 | 预期结果 |
+|---------|------|---------|
+| 正常编辑 | 修改其他字段,柜员号不可变 | 编辑成功,柜员号不变 |
+| 只读验证 | 尝试修改柜员号 | 柜员号输入框禁用 |
+
+### 5.3 查询测试
+
+| 测试场景 | 输入 | 预期结果 |
+|---------|------|---------|
+| 精确查询 | 输入7位柜员号 | 返回匹配的员工记录 |
+| 列表显示 | 查看列表 | 显示employeeId作为柜员号 |
+
+---
+
+## 六、文档更新清单
+
+### 6.1 API 文档更新
+- **文件路径**: `doc/api/员工信息管理API文档.md`
+- **更新内容**:
+ 1. 新增接口:移除 `tellerNo`,新增 `employeeId` 参数说明
+ 2. 编辑接口:更新路径参数为 `employeeId`
+ 3. 查询接口:移除 `tellerNo` 查询参数,新增 `employeeId`
+ 4. 返回数据:移除 `tellerNo` 字段
+ 5. 字段说明表:更新 `employeeId` 为"员工ID(柜员号,7位数字)"
+
+### 6.2 测试脚本
+- **文件路径**: `doc/test/2026-02-05-employee-modify-test.sh`
+- **测试账号**: username: admin, password: admin123
+- **测试接口**: `/login/test` 获取 token
+
+### 6.3 数据库脚本
+- **文件路径**: `sql/modify_employee_id_to_teller_no.sql`
+- **执行顺序**:
+ 1. 删除 `teller_no` 字段
+ 2. 修改 `employee_id` 为非自增
+ 3. 更新字段注释
+
+---
+
+## 七、实施步骤
+
+### 7.1 数据库修改
+1. 备份现有数据库(如有数据)
+2. 执行 SQL 脚本修改表结构
+3. 验证表结构修改成功
+
+### 7.2 后端代码修改
+1. 修改 Entity 实体类
+2. 修改 DTO 类(Add/Edit/Query)
+3. 修改 VO 类
+4. 修改 Service 层,添加唯一性校验
+5. 修改 Mapper XML
+6. 修改 Controller 层
+7. 编译后端项目,确保无错误
+
+### 7.3 前端代码修改
+1. 修改查询表单
+2. 修改表格列
+3. 修改新增/编辑对话框
+4. 修改 JavaScript 数据结构和方法
+5. 添加表单校验规则
+6. 编译前端项目,确保无错误
+
+### 7.4 测试验证
+1. 执行测试脚本
+2. 验证新增功能
+3. 验证编辑功能
+4. 验证查询功能
+5. 验证唯一性校验
+6. 验证格式校验
+7. 生成测试报告
+
+### 7.5 文档更新
+1. 更新 API 文档
+2. 更新测试报告
+3. 提交代码到版本控制
+
+---
+
+## 八、风险评估与应对
+
+### 8.1 风险点
+1. **数据迁移风险**: 如果有正式数据,需要迁移方案
+ - **应对**: 当前为开发阶段,无正式数据,直接修改
+
+2. **接口兼容性**: 前端调用可能受影响
+ - **应对**: 同步修改前端代码和接口调用
+
+3. **业务逻辑依赖**: 其他模块可能引用 `tellerNo`
+ - **应对**: 全局搜索 `tellerNo` 引用,同步修改
+
+### 8.2 回滚方案
+如果修改后出现问题,可以:
+1. 恢复数据库表结构(添加回 `teller_no` 字段)
+2. 恢复代码到修改前的版本
+3. 恢复前端代码到修改前的版本
+
+---
+
+## 九、验收标准
+
+### 9.1 功能验收
+- ✅ 数据库 `teller_no` 字段已删除
+- ✅ `employee_id` 改为非自增,手动输入
+- ✅ 后端代码所有 `tellerNo` 引用已移除
+- ✅ 前端页面显示 `employeeId` 作为柜员号
+- ✅ 新增员工时必须输入7位数字柜员号
+- ✅ 柜员号唯一性校验生效
+- ✅ 柜员号格式校验生效
+- ✅ 编辑时柜员号不可修改
+
+### 9.2 性能验收
+- ✅ 接口响应时间无明显变化
+- ✅ 数据库查询效率正常
+
+### 9.3 文档验收
+- ✅ API 文档已更新
+- ✅ 测试脚本已生成
+- ✅ 测试报告已生成
+
+---
+
+**文档结束**
diff --git a/doc/docs/ccdi_fmy_relation_person.csv b/doc/docs/ccdi_fmy_relation_person.csv
new file mode 100644
index 0000000..2488f25
--- /dev/null
+++ b/doc/docs/ccdi_fmy_relation_person.csv
@@ -0,0 +1,28 @@
+1.人员家庭关系表:ccdi_fmy_relation_person,,,,,,
+序号,字段名,类型,默认值,是否可为空,是否主键,注释
+1,id,BIGINT,-,否,自动递增,主键,唯一标识
+2,person_id,VARCHAR,-,否,-,员工身份证号,关联员工表的外键
+3,relation_type,VARCHAR,-,否,-,关系类型,如:配偶、子女、父母、兄弟姐妹等
+4,relation_name,VARCHAR,-,否,-,关系人姓名
+5,gender,CHAR,-,是,-,M:男 F:女 O:其他
+6,birth_date,DATE,-,是,-,关系人出生日期
+7,relation_cert_type,VARCHAR,-,是,-,身份证、护照、军官证等
+8,relation_cert_no,VARCHAR,-,是,-,证件号码
+9,mobile_phone1,VARCHAR,-,是,-,手机号码1
+10,mobile_phone2,VARCHAR,-,是,-,手机号码2
+11,wechat_no1,VARCHAR,-,是,-,微信名称1
+12,wechat_no2,VARCHAR,-,是,-,微信名称2
+13,wechat_no3,VARCHAR,-,是,-,微信名称3
+14,contact_address,VARCHAR,-,是,-,详细联系地址
+15,relation_desc,VARCHAR,-,是,-,关系详细描述
+16,status,INT,1,否,-,关系是否有效:0 - 无效、1 - 有效(默认有效)
+17,effective_date,DATETIME,-,是,-,关系生效日期
+18,invalid_date,DATETIME,,是,,关系失效日期
+19,remark,TEXT,-,是,-,备注信息
+20,data_source,VARCHAR(50),,是,否,数据来源(系统名称)
+21,is_emp_family,TINYINT(1),0,否,否,是否是员工的家庭关系:0-否 1-是
+22,is_cust_family,TINYINT(1),0,否,否,是否是信贷客户的家庭关系:0-否 1-是
+23,created_by,VARCHAR,-,否,-,记录创建人
+24,updated_by,VARCHAR,-,是,-,记录更新人
+25,create_time,DATETIME,,否,,记录创建时间
+26,update_time,DATETIME,-,是,-,记录更新时间
diff --git a/doc/docs/ccdi_purchase_transaction.csv b/doc/docs/ccdi_purchase_transaction.csv
new file mode 100644
index 0000000..f9a47c5
--- /dev/null
+++ b/doc/docs/ccdi_purchase_transaction.csv
@@ -0,0 +1,38 @@
+6.员工采购交易信息表:ccdi_purchase_transaction,,,,,,
+序号,字段名,类型,默认值,是否可为空,是否主键,注释
+1,purchase_id,VARCHAR(32),,否,是,采购事项ID
+2,purchase_category,VARCHAR(50),-,否,否,采购类别
+3,project_name,VARCHAR(200),-,是,否,项目名称
+4,subject_name,VARCHAR(200),-,否,否,标的物名称
+5,subject_desc,TEXT,-,是,否,标的物描述
+6,purchase_qty,"DECIMAL(12,4)",1,否,否,采购数量
+7,budget_amount,"DECIMAL(18,2)",-,否,否,预算金额
+8,bid_amount,"DECIMAL(18,2)",-,是,否,中标金额
+9,actual_amount,"DECIMAL(18,2)",-,是,否,实际采购金额
+10,contract_amount,"DECIMAL(18,2)",-,是,否,合同金额
+11,settlement_amount,"DECIMAL(18,2)",-,是,否,结算金额
+12,purchase_method,VARCHAR(50),-,否,否,采购方式
+13,supplier_name,VARCHAR(200),-,是,否,中标供应商名称
+14,contact_person,VARCHAR(50),-,是,否,供应商联系人
+15,contact_phone,VARCHAR(20),-,是,否,供应商联系电话
+16,supplier_uscc,VARCHAR(18),-,是,否,供应商统一信用代码
+17,supplier_bank_account,VARCHAR(50),-,是,否,供应商银行账户
+18,apply_date,DATE,-,否,否,采购申请日期(或立项日期)
+19,plan_approve_date,DATE,-,是,否,采购计划批准日期
+20,announce_date,DATE,-,是,否,采购公告发布日期
+21,bid_open_date,DATE,-,是,否,开标日期
+22,contract_sign_date,DATE,-,是,否,合同签订日期
+23,expected_delivery_date,DATE,-,是,否,预计交货日期
+24,actual_delivery_date,DATE,-,是,否,实际交货日期
+25,acceptance_date,DATE,-,是,否,验收日期
+26,settlement_date,DATE,-,是,否,结算日期
+27,applicant_id,VARCHAR(7),-,否,否,申请人工号
+28,applicant_name,VARCHAR(50),-,否,否,申请人姓名
+29,apply_department,VARCHAR(100),-,否,否,申请部门
+30,purchase_leader_id,VARCHAR(7),-,是,否,采购负责人工号
+31,purchase_leader_name,VARCHAR(50),-,是,否,采购负责人姓名
+32,purchase_department,VARCHAR(100),-,是,否,采购部门
+33,create_time,DATETIME,CURRENT_TIMESTAMP,否,否,创建时间
+34,update_time,DATETIME,CURRENT_TIMESTAMP,否,否,更新时间
+35,created_by,VARCHAR(50),-,否,否,创建人
+36,updated_by,VARCHAR(50),-,是,否,更新人
diff --git a/doc/docs/ccdi_staff_recruitment.csv b/doc/docs/ccdi_staff_recruitment.csv
new file mode 100644
index 0000000..09348d5
--- /dev/null
+++ b/doc/docs/ccdi_staff_recruitment.csv
@@ -0,0 +1,22 @@
+4.员工招聘信息表:ccdi_staff_recruitment,,,,,,
+序号,字段名,类型,默认值,是否可为空,是否主键,注释
+1,recruit_id,VARCHAR(32),,否,是,招聘项目编号
+2,recruit_name,VARCHAR(100),,否,否,招聘项目名称
+3,pos_name,VARCHAR(100),,否,否,职位名称
+4,pos_category,VARCHAR(50),,否,否,职位类别
+5,pos_desc,TEXT,,否,否,职位描述
+6,cand_name,VARCHAR(20),,否,否,应聘人员姓名
+7,cand_edu,VARCHAR(20),,否,否,应聘人员学历
+8,cand_id,VARCHAR(18),,否,否,应聘人员证件号码
+9,cand_school,VARCHAR(50),,否,否,应聘人员毕业院校
+10,cand_major,VARCHAR(30),,否,否,应聘人员专业
+11,cand_grad,VARCHAR(6),,否,否,应聘人员毕业年月
+12,admit_status,VARCHAR(10),,否,否,记录录用情况:录用、未录用、放弃等
+13,interviewer_name1,VARCHAR(20),,是,否,面试官1姓名
+14,interviewer_id1,VARCHAR(10),,是,否,面试官1工号
+13,interviewer_name2,VARCHAR(20),,是,否,面试官2姓名
+14,interviewer_id2,VARCHAR(10),,是,否,面试官2工号
+16,created_by,VARCHAR(20),-,否,否,记录创建人
+17,updated_by,VARCHAR(20),-,是,否,记录更新人
+18,create_time,VARCHAR(10),0000-00-00,是,否,创建时间
+19,update_time,VARCHAR(10),0000-00-00,是,否,更新时间
diff --git a/doc/docs/ccdi_staff_transfer.csv b/doc/docs/ccdi_staff_transfer.csv
new file mode 100644
index 0000000..e91f10b
--- /dev/null
+++ b/doc/docs/ccdi_staff_transfer.csv
@@ -0,0 +1,18 @@
+5.员工调动记录表:ccdi_staff_transfer,,,,,,
+序号,字段名,类型,默认值,是否可为空,是否主键,注释
+1,num_id,string,,否,是,员工工号(主键)
+2,transfer_type,VARCHAR,,是,否,"调动类型:PROMOTION:升职, DEMOTION:降职, LATERAL:平调, ROTATION:轮岗, SECONDMENT:借调, DEPARTMENT_CHANGE:部门调动, POSITION_CHANGE:职位调整, RETURN:返岗, TERMINATION:离职, OTHER:其他"
+3,transfer_sub_type,VARCHAR,,是,否,"调动子类型,双聘调动、临时调动等"
+4,dept_id_before,VARCHAR,,是,否,调动前部门ID
+5,dept_name_before,VARCHAR,,是,否,调动前部门
+6,grade_before,VARCHAR,,是,否,调动前职级
+7,position_before,VARCHAR,,是,否,调动前岗位
+8,salary_level_before,VARCHAR,,是,否,调动前薪酬等级
+9,dept_id_after,VARCHAR,0000-00-00,是,否,调动后部门ID
+10,dept_name_after,VARCHAR,0000-00-00,是,否,调动后部门
+11,grade_after,VARCHAR,,是,否,调动后职级
+12,position_after,VARCHAR,,是,否,调动后岗位
+13,salary_level_after,VARCHAR,,是,否,调动后薪酬等级
+14,transfer_date,DATE,,是,否,调动日期
+15,create_time,DATETIME,-,否,当前时间,记录创建时间
+16,update_time,DATETIME,-,否,当前时间,记录更新时间
diff --git a/sql/remove_employee_relative.sql b/sql/remove_employee_relative.sql
new file mode 100644
index 0000000..dd1f158
--- /dev/null
+++ b/sql/remove_employee_relative.sql
@@ -0,0 +1,13 @@
+/*
+ * 员工亲属功能移除 - 删除亲属表
+ * 执行日期: 2026-02-05
+ * 说明: 移除员工亲属相关功能,删除亲属表
+ */
+
+-- 删除员工亲属表
+DROP TABLE IF EXISTS `ccdi_employee_relative`;
+
+-- 删除亲属关系字典数据(如果存在)
+-- 注意:根据实际情况确认字典表名称和类型
+-- DELETE FROM sys_dict_data WHERE dict_type = 'ccdi_relative_relationship';
+-- DELETE FROM sys_dict_type WHERE dict_type = 'ccdi_relative_relationship';