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';