Files
ccdi/doc/plans/2026-02-09-ccdi-staff-fmy-relation-design.md
2026-02-09 14:28:25 +08:00

9.4 KiB
Raw Blame History

员工亲属关系信息维护功能设计文档

一、需求概述

开发一个员工亲属关系信息维护的页面功能包括新增、修改、删除、模板下载、文件导入异步新增。完全按照采购交易管理和招聘信息功能的后端业务处理逻辑和前端UI交互进行开发交互细节保持完全一致。

二、功能规格

2.1 数据模型

数据表ccdi_staff_fmy_relation

主键设计

  • 使用自增 id 作为主键
  • 建立唯一索引:UNIQUE KEY uk_person_cert (person_id, relation_cert_no)
  • 确保同一员工不会重复添加同一亲属

核心字段

  • id - 主键BIGINT自增
  • person_id - 员工身份证号关联ccdi_base_staff表
  • relation_type - 关系类型(字典:配偶、父亲、母亲、儿子、女儿、祖父、祖母、外祖父、外祖母、兄弟姐妹)
  • relation_name - 关系人姓名
  • gender - 性别M:男 F:女 O:其他)
  • birth_date - 出生日期
  • relation_cert_type - 证件类型(下拉:身份证、护照、军官证等)
  • relation_cert_no - 证件号码
  • mobile_phone1 - 手机号码1
  • mobile_phone2 - 手机号码2
  • wechat_no1 - 微信名称1
  • wechat_no2 - 微信名称2
  • wechat_no3 - 微信名称3
  • contact_address - 详细联系地址
  • relation_desc - 关系详细描述
  • status - 状态0-无效、1-有效)
  • effective_date - 关系生效日期
  • invalid_date - 关系失效日期
  • remark - 备注信息
  • data_source - 数据来源
  • is_emp_family - 是否是员工的家庭关系(后台维护,不显示)
  • is_cust_family - 是否是信贷客户的家庭关系(后台维护,不显示)

必填字段

  • 员工身份证号、关系类型、关系人姓名、证件类型、证件号码、状态

2.2 数据验证规则

  1. person_id存在性校验必须在ccdi_base_staff表中存在
  2. 唯一性校验person_id + relation_cert_no 组合唯一
  3. 身份证号格式校验18位身份证号格式
  4. 手机号格式校验11位手机号码格式可选

2.3 模块命名

  • 后端模块名ccdi-staff-fmy-relation
  • 数据库表ccdi_staff_fmy_relation
  • 前端路由/ccdi/staff/fmy/relation
  • 菜单路径:信息维护 > 员工亲属关系
  • 权限标识ccdi:staffFmyRelation:*

三、后端设计

3.1 Controller层接口

基础CRUD接口

  • GET /ccdi/staffFmyRelation/list - 分页查询5个查询条件
  • GET /ccdi/staffFmyRelation/{id} - 获取详情
  • POST /ccdi/staffFmyRelation - 新增
  • PUT /ccdi/staffFmyRelation - 修改
  • DELETE /ccdi/staffFmyRelation/{ids} - 批量删除
  • POST /ccdi/staffFmyRelation/export - 导出

导入相关接口

  • POST /ccdi/staffFmyRelation/importTemplate - 下载模板(带字典下拉框)
  • POST /ccdi/staffFmyRelation/importData - 异步导入(纯新增,重复即失败)
  • GET /ccdi/staffFmyRelation/importStatus/{taskId} - 查询导入状态
  • GET /ccdi/staffFmyRelation/importFailures/{taskId} - 查询导入失败记录(分页)

3.2 查询条件

列表页支持5个查询条件

  1. 员工身份证号
  2. 关系人姓名
  3. 关系类型(下拉)
  4. 证件号码
  5. 状态(下拉:有效/无效)

3.3 核心业务逻辑

  1. 数据验证:新增/修改时验证person_id是否在ccdi_base_staff中存在
  2. 唯一性校验person_id + relation_cert_no组合唯一
  3. 异步导入使用线程池处理导入结果存入Redis前端轮询状态
  4. 纯新增模式:导入时不更新已存在的记录,直接标记为失败

3.4 代码结构

ruoyi-ccdi/
├── controller/
│   └── CcdiStaffFmyRelationController.java
├── domain/
│   ├── CcdiStaffFmyRelation.java          # 实体类
│   ├── dto/
│   │   ├── CcdiStaffFmyRelationAddDTO.java
│   │   ├── CcdiStaffFmyRelationEditDTO.java
│   │   └── CcdiStaffFmyRelationQueryDTO.java
│   ├── vo/
│   │   ├── CcdiStaffFmyRelationVO.java
│   │   └── StaffFmyRelationImportFailureVO.java
│   └── excel/
│       └── CcdiStaffFmyRelationExcel.java
├── mapper/
│   └── CcdiStaffFmyRelationMapper.java
└── service/
    ├── ICcdiStaffFmyRelationService.java
    ├── ICcdiStaffFmyRelationImportService.java
    ├── impl/
    │   ├── CcdiStaffFmyRelationServiceImpl.java
    │   └── CcdiStaffFmyRelationImportServiceImpl.java

四、前端设计

4.1 列表页布局

顶部查询区5个查询条件

  • 员工身份证号、关系人姓名、关系类型(下拉)、证件号码、状态(下拉)

操作按钮

  • 新增、导出、导入、模板下载、删除(批量)

表格列

  • 员工身份证号、关系类型、关系人姓名、性别、证件类型、证件号码、手机号码1、状态、创建时间
  • 操作列:修改、删除

4.2 新增/修改对话框

分组两列布局,不折叠:

第一组 - 基本信息(两列):

  • 员工身份证号*、关系类型*(下拉)、关系人姓名*、性别(下拉)、出生日期、证件类型*(下拉)、证件号码*(带格式校验)

第二组 - 联系方式(两列):

  • 手机号码1、手机号码2、微信名称1、微信名称2、微信名称3、联系地址

第三组 - 其他信息(两列):

  • 关系详细描述、状态*(默认有效)、生效日期、失效日期、备注

4.3 导入功能交互

完全参照招聘信息的导入流程:

  1. 点击"导入"按钮 → 选择Excel文件
  2. 立即返回taskId → 弹出"导入任务已提交"提示
  3. 自动轮询importStatus接口 → 显示进度条
  4. 完成后显示导入摘要(成功数、失败数)
  5. 失败记录可点击查看详情(分页表格)

4.4 前端代码结构

ruoyi-ui/src/
├── api/
│   └── ccdi/
│       └── staffFmyRelation.js
└── views/
    └── ccdiStaffFmyRelation/
        └── index.vue

五、数据字典

5.1 关系类型字典

字典类型ccdi_relation_type

字典值

  • 配偶
  • 父亲
  • 母亲
  • 儿子
  • 女儿
  • 祖父
  • 祖母
  • 外祖父
  • 外祖母
  • 兄弟姐妹

5.2 证件类型字典

字典类型ccdi_cert_type(新建或复用)

字典值

  • 身份证
  • 护照
  • 军官证
  • 其他

5.3 性别字典

字典类型sys_user_sex(复用)

字典值

  • M
  • F
  • 其他O

六、与参考代码的校验对照

6.1 必须保持一致的关键点

1. Controller接口结构

  • 接口路径、参数命名、返回值格式与CcdiPurchaseTransactionController完全一致
  • 使用MyBatis Plus的Page进行分页
  • 使用@PreAuthorize注解进行权限控制
  • 使用@Operation注解标注Swagger文档

2. 异步导入流程

  • importData接口立即返回taskId
  • 使用ImportResultVO封装返回结果
  • importStatus接口返回ImportStatusVO
  • importFailures接口支持分页查询失败记录

3. 前端UI交互

  • 导入对话框自动轮询importStatus接口
  • 进度条显示导入进度
  • 完成后显示导入摘要
  • 失败记录以可展开的表格形式展示

4. Excel模板

  • 使用@DictDropdown注解为字典字段添加下拉框
  • 字段顺序与表单一致
  • 必填字段标注红色星号

6.2 实现后校验清单

创建实施方案后,需要对照采购交易管理代码逐项校验:

  • Controller接口签名是否一致
  • Service层方法命名是否一致
  • DTO/VO类的命名和字段是否一致
  • 前端API调用方式是否一致
  • 前端页面布局和交互流程是否一致
  • 导入功能的状态轮询机制是否一致
  • 导入失败记录的展示方式是否一致

七、实施步骤

阶段1数据库和字典准备

  1. 确认数据库表 ccdi_staff_fmy_relation 已存在(或创建)
  2. 添加唯一索引:uk_person_cert (person_id, relation_cert_no)
  3. 创建数据字典:ccdi_relation_type10种关系类型
  4. 配置菜单:信息维护 > 员工亲属关系

阶段2后端开发

  1. 生成实体类、Mapper、Service、Controller基础代码
  2. 创建VO/DTO类参照采购交易的结构
  3. 实现Excel导入导出类添加@DictDropdown注解
  4. 实现Service层业务逻辑含唯一性校验、person_id存在性校验
  5. 实现异步导入Service使用线程池+Redis
  6. 实现Controller层接口
  7. 配置Swagger注解

阶段3前端开发

  1. 创建API文件 staffFmyRelation.js参照purchaseTransaction.js
  2. 创建Vue页面 index.vue参照purchase交易的布局
  3. 实现列表页(查询、表格、分页)
  4. 实现新增/修改对话框(分组两列布局)
  5. 实现导入功能(含轮询、进度条、失败记录展示)

阶段4测试和校验

  1. 编写测试脚本使用admin/admin123获取token
  2. 测试CRUD功能
  3. 测试Excel导入导出
  4. 与采购交易代码对照校验(使用校验清单)
  5. 生成API文档

八、文档输出

  • 设计文档:doc/plans/2026-02-09-ccdi-staff-fmy-relation-design.md
  • API文档doc/api/ccdi_staff_fmy_relation_api.md

九、参考文档

  • 采购交易管理:CcdiPurchaseTransactionController.java
  • 招聘信息管理:CcdiStaffRecruitmentController.java
  • 前端参考:ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue