From f7c8bd1c95f87cbf87b364719191fb2c24825b97 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Mon, 9 Feb 2026 17:00:41 +0800 Subject: [PATCH] feat --- doc/database-docs/ccdi_staff_fmy_relation.csv | 4 +- .../员工实体关系信息维护功能设计文档.md | 341 ++++++++++++++++++ ...26-02-09-ccdi-staff-fmy-relation-design.md | 284 --------------- .../ccdi/domain/CcdiStaffFmyRelation.java | 107 ------ .../dto/CcdiStaffFmyRelationAddDTO.java | 122 ------- .../dto/CcdiStaffFmyRelationEditDTO.java | 127 ------- .../dto/CcdiStaffFmyRelationQueryDTO.java | 41 --- .../excel/CcdiStaffFmyRelationExcel.java | 124 ------- .../domain/vo/CcdiStaffFmyRelationVO.java | 117 ------ .../mapper/CcdiStaffFmyRelationMapper.java | 53 --- .../ICcdiStaffFmyRelationImportService.java | 41 --- .../service/ICcdiStaffFmyRelationService.java | 84 ----- .../ccdi/CcdiStaffFmyRelationMapper.xml | 149 -------- 13 files changed, 343 insertions(+), 1251 deletions(-) create mode 100644 doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md delete mode 100644 doc/plans/2026-02-09-ccdi-staff-fmy-relation-design.md delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/CcdiStaffFmyRelation.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationAddDTO.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationEditDTO.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationQueryDTO.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/excel/CcdiStaffFmyRelationExcel.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/CcdiStaffFmyRelationVO.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiStaffFmyRelationMapper.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationImportService.java delete mode 100644 ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationService.java delete mode 100644 ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffFmyRelationMapper.xml diff --git a/doc/database-docs/ccdi_staff_fmy_relation.csv b/doc/database-docs/ccdi_staff_fmy_relation.csv index 14e476e..74d69ff 100644 --- a/doc/database-docs/ccdi_staff_fmy_relation.csv +++ b/doc/database-docs/ccdi_staff_fmy_relation.csv @@ -19,8 +19,8 @@ 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-是 +20,data_source,VARCHAR(50),,是,否,"数据来源,MANUAL:手动录入, SYSTEM:系统同步, IMPORT:批量导入, API:接口获取" +21,is_emp_family,TINYINT(1),1,否,否,是否是员工的家庭关系:0-否 1-是 22,is_cust_family,TINYINT(1),0,否,否,是否是信贷客户的家庭关系:0-否 1-是 23,created_by,VARCHAR,-,否,-,记录创建人 24,updated_by,VARCHAR,-,是,-,记录更新人 diff --git a/doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md b/doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md new file mode 100644 index 0000000..48cade1 --- /dev/null +++ b/doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md @@ -0,0 +1,341 @@ +# 员工实体关系信息维护功能设计文档 + +## 一、功能概述 + +### 1.1 功能描述 +员工实体关系信息维护功能用于管理员工与企业之间的关联关系,记录员工(或员工家庭关联人)在不同企业中担任的职务信息。该功能支持增删改查、批量导入导出等操作,完全参照采购交易管理和招聘信息功能的业务逻辑和UI交互。 + +### 1.2 参照标准 +- 后端业务逻辑:完全参照 `CcdiPurchaseTransaction`(采购交易管理) +- 前端UI交互:完全参照 `ccdiPurchaseTransaction/index.vue` +- 异步导入机制:完全参照采购交易的异步导入流程 + +## 二、数据库设计 + +### 2.1 表结构 +基于 `ccdi_staff_enterprise_relation.csv` 定义: + +| 序号 | 字段名 | 类型 | 默认值 | 是否可为空 | 是否主键 | 注释 | +|------|--------|------|--------|------------|----------|------| +| 1 | id | BIGINT | 自增 | 否 | 是 | 主键,唯一标识 | +| 2 | person_id | VARCHAR | - | 否 | 否 | 身份证号,关联员工表的外键 | +| 3 | relation_person_post | VARCHAR | - | 是 | 否 | 关联人在企业的职务:股东、法人、高管、实际控制人等 | +| 4 | social_credit_code | VARCHAR | - | 否 | 否 | 统一社会信用代码,关联企业主体信息表的外键 | +| 5 | enterprise_name | VARCHAR | - | 是 | 否 | 企业名称(冗余存储,便于快速查询) | +| 6 | status | INT | 1 | 否 | 否 | 关系是否有效:0 - 无效、1 - 有效(默认有效) | +| 7 | remark | TEXT | - | 是 | 否 | 补充说明 | +| 8 | data_source | VARCHAR(50) | - | 是 | 否 | 数据来源 | +| 9 | is_employee | TINYINT(1) | 0 | 否 | 否 | 是否是员工:0-否 1-是 | +| 10 | is_emp_family | TINYINT(1) | 1 | 否 | 否 | 是否是员工家庭关联人:0-否 1-是 | +| 11 | is_customer | TINYINT(1) | 0 | 否 | 否 | 是否是信贷客户:0-否 1-是 | +| 12 | is_cust_family | TINYINT(1) | 0 | 否 | 否 | 是否是信贷客户关联人:0-否 1-是 | +| 13 | created_by | VARCHAR | - | 否 | 否 | 记录创建人 | +| 14 | updated_by | VARCHAR | - | 是 | 否 | 记录更新人 | +| 15 | create_time | DATETIME | - | 否 | 否 | 记录创建时间 | +| 16 | update_time | DATETIME | - | 否 | 否 | 记录更新时间 | + +### 2.2 唯一性约束 +- 业务唯一性:`person_id + social_credit_code` 组合必须唯一 +- 包含所有status值(0和1)的记录 +- 新增和导入时需要校验唯一性 + +## 三、后端设计 + +### 3.1 模块结构 + +``` +com.ruoyi.ccdi +├── controller +│ └── CcdiStaffEnterpriseRelationController.java +├── service +│ ├── ICcdiStaffEnterpriseRelationService.java +│ ├── ICcdiStaffEnterpriseRelationImportService.java +│ └── impl +│ ├── CcdiStaffEnterpriseRelationServiceImpl.java +│ └── CcdiStaffEnterpriseRelationImportServiceImpl.java +├── mapper +│ └── CcdiStaffEnterpriseRelationMapper.java +└── domain + ├── CcdiStaffEnterpriseRelation.java (实体类) + ├── vo + │ ├── CcdiStaffEnterpriseRelationVO.java (查询返回) + │ ├── ImportResultVO.java (导入结果) + │ ├── ImportStatusVO.java (导入状态) + │ └── StaffEnterpriseRelationImportFailureVO.java (导入失败记录) + ├── dto + │ ├── CcdiStaffEnterpriseRelationAddDTO.java (新增) + │ ├── CcdiStaffEnterpriseRelationEditDTO.java (编辑) + │ └── CcdiStaffEnterpriseRelationQueryDTO.java (查询) + └── excel + └── CcdiStaffEnterpriseRelationExcel.java (导入导出) +``` + +### 3.2 Controller接口定义 + +**基础路径:** `/ccdi/staffEnterpriseRelation` + +| 方法 | 路径 | 说明 | 权限 | +|------|------|------|------| +| GET | /list | 分页查询列表 | ccdi:staffEnterpriseRelation:list | +| POST | /export | 导出 | ccdi:staffEnterpriseRelation:export | +| GET | /{id} | 获取详情 | ccdi:staffEnterpriseRelation:query | +| POST | / | 新增 | ccdi:staffEnterpriseRelation:add | +| PUT | / | 修改 | ccdi:staffEnterpriseRelation:edit | +| DELETE | /{ids} | 删除 | ccdi:staffEnterpriseRelation:remove | +| POST | /importTemplate | 下载导入模板 | - | +| POST | /importData | 异步导入 | ccdi:staffEnterpriseRelation:import | +| GET | /importStatus/{taskId} | 查询导入状态 | ccdi:staffEnterpriseRelation:import | +| GET | /importFailures/{taskId} | 查询导入失败记录 | ccdi:staffEnterpriseRelation:import | + +### 3.3 核心业务逻辑 + +#### 3.3.1 唯一性校验 +```java +// 新增时校验 +if (mapper.existsByPersonIdAndSocialCreditCode(personId, socialCreditCode)) { + throw new RuntimeException("该员工与企业的关系已存在"); +} +``` + +#### 3.3.2 默认值设置 +```java +entity.setStatus(1); // 有效 +entity.setIsEmployee(0); +entity.setIsEmpFamily(1); +entity.setIsCustomer(0); +entity.setIsCustFamily(0); +entity.setDataSource("MANUAL"); // 或 "IMPORT" +``` + +#### 3.3.3 异步导入流程 +1. 接收文件 → 解析Excel → 生成UUID任务ID → 立即返回 +2. @Async异步方法: + - 批量查询已存在的 person_id + social_credit_code 组合 + - 遍历校验,分类成功/失败 + - 批量插入成功数据(500条/批) + - 失败记录存Redis(7天过期) + - 更新导入状态到Redis +3. 前端轮询查询状态(2秒/次,最多150次) + +#### 3.3.4 Redis存储结构 +``` +import:staffEnterpriseRelation:{taskId} // 导入状态(Hash) +import:staffEnterpriseRelation:{taskId}:failures // 失败记录(List,JSON序列化) +``` + +## 四、前端设计 + +### 4.1 文件结构 +``` +ruoyi-ui/src/ +├── views +│ └── ccdiStaffEnterpriseRelation +│ └── index.vue +└── api + └── ccdiStaffEnterpriseRelation.js +``` + +### 4.2 列表页设计 + +#### 4.2.1 查询表单 +- 身份证号(模糊查询) +- 统一社会信用代码(模糊查询) +- 企业名称(模糊查询) +- 状态下拉选择(有效/无效) +- 搜索、重置按钮 + +#### 4.2.2 操作按钮 +- 新增 +- 导入 +- 导出 +- 查看导入失败记录(条件显示) +- 右侧工具栏(显示搜索、刷新) + +#### 4.2.3 表格列 +| 列名 | 字段 | 说明 | +|------|------|------| +| 选择框 | - | 多选 | +| 身份证号 | personId | show-overflow-tooltip | +| 企业名称 | enterpriseName | show-overflow-tooltip | +| 关联人在企业的职务 | relationPersonPost | - | +| 状态 | status | 字典翻译 | +| 数据来源 | dataSource | 字典翻译 | +| 创建时间 | createTime | 格式化 | +| 操作 | - | 详情、编辑、删除 | + +### 4.3 新增/编辑对话框 + +**宽度:** 800px + +**表单字段:** +- 身份证号:可搜索下拉(el-select + remote + filterable) +- 统一社会信用代码:输入框 + 18位格式校验 +- 企业名称:输入框 + 必填 +- 关联人在企业的职务:输入框 + 可选 +- 状态:下拉选择 + 默认值1(有效) +- 补充说明:textarea + 可选 + +**不显示字段:** +- data_source(后端自动设置) +- is_employee、is_emp_family、is_customer、is_cust_family(后端自动设置) + +### 4.4 导入功能 + +#### 4.4.1 导入对话框 +- 拖拽上传区域 +- 模板下载链接 +- 仅允许 .xlsx / .xls 格式 + +#### 4.4.2 导入流程 +1. 文件上传成功 → 显示通知"导入任务已提交" +2. 每2秒轮询查询导入状态 +3. 完成后显示结果通知: + - SUCCESS:全部成功!共导入N条数据 + - PARTIAL_SUCCESS:成功N条,失败M条 +4. 如果有失败记录,显示"查看导入失败记录"按钮 + +#### 4.4.3 查看失败记录 +- 点击按钮弹窗显示失败列表 +- 失败记录包含:personId、socialCreditCode、enterpriseName、errorMessage +- 支持分页 +- 支持清除历史记录 + +## 五、数据字典配置 + +### 5.1 关系状态字典 +**字典类型:** `ccdi_relation_status` + +| 字典值 | 字典标签 | 排序 | +|--------|----------|------| +| 0 | 无效 | 2 | +| 1 | 有效 | 1 | + +### 5.2 数据来源字典 +**字典类型:** `ccdi_data_source` + +| 字典值 | 字典标签 | 排序 | +|--------|----------|------| +| MANUAL | 手动录入 | 1 | +| SYSTEM | 系统同步 | 2 | +| IMPORT | 批量导入 | 3 | +| API | 接口获取 | 4 | + +## 六、Excel导入模板 + +### 6.1 模板列定义 +| 列名 | 字段名 | 是否必填 | 校验规则 | 说明 | +|------|--------|----------|----------|------| +| 身份证号 | personId | 是 | 18位身份证格式 | 关联员工表 | +| 统一社会信用代码 | socialCreditCode | 是 | 18位统一信用代码格式 | 关联企业表 | +| 企业名称 | enterpriseName | 是 | 最大长度200 | 冗余存储 | +| 关联人在企业的职务 | relationPersonPost | 否 | 最大长度100 | 如:股东、法人、高管等 | +| 补充说明 | remark | 否 | TEXT类型 | 可选填写 | + +### 6.2 后端自动设置 +- status = 1(有效) +- data_source = "IMPORT" +- is_employee = 0 +- is_emp_family = 1 +- is_customer = 0 +- is_cust_family = 0 + +### 6.3 导入校验规则 +1. 唯一性校验:person_id + social_credit_code 组合重复则失败 +2. 格式校验:身份证号18位、统一社会信用代码18位 +3. 必填校验:personId、socialCreditCode、enterpriseName +4. 失败记录:记录到Redis,返回详细信息 + +## 七、菜单权限配置 + +### 7.1 菜单信息 +- **菜单名称:** 员工实体关系 +- **路由地址:** ccdiStaffEnterpriseRelation +- **组件路径:** ccdiStaffEnterpriseRelation/index +- **上级菜单:** 待定(根据实际菜单结构配置) + +### 7.2 权限标识 +``` +ccdi:staffEnterpriseRelation:list # 查询列表 +ccdi:staffEnterpriseRelation:query # 查询详情 +ccdi:staffEnterpriseRelation:add # 新增 +ccdi:staffEnterpriseRelation:edit # 修改 +ccdi:staffEnterpriseRelation:remove # 删除 +ccdi:staffEnterpriseRelation:export # 导出 +ccdi:staffEnterpriseRelation:import # 导入 +``` + +## 八、一致性校验清单 + +### 8.1 后端一致性 +- [ ] Controller接口定义完全一致(路径、参数、返回值) +- [ ] Service层方法命名和逻辑结构一致 +- [ ] 异步导入实现方式一致(@Async、Redis存储、轮询机制) +- [ ] 批量插入分批大小一致(500条/批) +- [ ] 唯一性校验逻辑一致(先批量查询,再逐条校验) +- [ ] 失败记录存储方式一致(Redis JSON序列化,7天过期) +- [ ] 导入状态更新逻辑一致(SUCCESS/PARTIAL_SUCCESS) +- [ ] Swagger注解格式一致 +- [ ] 权限注解格式一致 + +### 8.2 前端一致性 +- [ ] 列表页布局结构一致(查询表单、按钮栏、表格、分页) +- [ ] 新增/编辑对话框布局一致 +- [ ] 详情对话框使用 el-descriptions 展示 +- [ ] 导入对话框一致(拖拽上传、模板下载链接) +- [ ] 导入轮询机制一致(2秒间隔、150次上限) +- [ ] 导入结果通知方式一致($notify、不同类型) +- [ ] localStorage存储任务ID方式一致 +- [ ] 查看失败记录弹窗一致 +- [ ] API调用方式一致(async/await、错误处理) + +## 九、技术要点 + +### 9.1 关键技术 +- **MyBatis Plus 3.5.10**:CRUD操作和分页 +- **EasyExcel**:Excel导入导出 +- **@Async**:异步导入 +- **Redis**:导入状态和失败记录存储 +- **Swagger 3**:API文档 + +### 9.2 性能优化 +- 批量插入:500条/批 +- 批量查询已存在数据:减少数据库查询次数 +- Redis缓存:减少重复查询 + +### 9.3 安全考虑 +- 权限注解:@PreAuthorize +- SQL注入防护:使用MyBatis Plus参数绑定 +- XSS防护:前端输入校验 + +## 十、测试要点 + +### 10.1 功能测试 +- [ ] 新增功能:唯一性校验 +- [ ] 编辑功能:修改各个字段 +- [ ] 删除功能:单个删除、批量删除 +- [ ] 导入功能:正常数据、重复数据、格式错误数据 +- [ ] 导出功能:查询条件导出 +- [ ] 查询功能:模糊查询、状态筛选 + +### 10.2 性能测试 +- [ ] 导入1000条数据的响应时间 +- [ ] 查询10万条数据的分页性能 +- [ ] 并发导入的处理能力 + +### 10.3 兼容性测试 +- [ ] 不同浏览器兼容性 +- [ ] Excel 2003/2007/2010格式兼容性 + +## 十一、附录 + +### 11.1 参照文件 +- **后端参照:** + - `CcdiPurchaseTransactionController.java` + - `CcdiPurchaseTransactionServiceImpl.java` + - `CcdiPurchaseTransactionImportServiceImpl.java` +- **前端参照:** + - `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue` + - `ruoyi-ui/src/api/ccdiPurchaseTransaction.js` + +### 11.2 数据库CSV文件 +- `doc/database-docs/ccdi_staff_enterprise_relation.csv` diff --git a/doc/plans/2026-02-09-ccdi-staff-fmy-relation-design.md b/doc/plans/2026-02-09-ccdi-staff-fmy-relation-design.md deleted file mode 100644 index 356b8a6..0000000 --- a/doc/plans/2026-02-09-ccdi-staff-fmy-relation-design.md +++ /dev/null @@ -1,284 +0,0 @@ -# 员工亲属关系信息维护功能设计文档 - -## 一、需求概述 - -开发一个员工亲属关系信息维护的页面,功能包括新增、修改、删除、模板下载、文件导入异步新增。完全按照采购交易管理和招聘信息功能的后端业务处理逻辑和前端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_type`(10种关系类型) -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` diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/CcdiStaffFmyRelation.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/CcdiStaffFmyRelation.java deleted file mode 100644 index 05a9563..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/CcdiStaffFmyRelation.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.ruoyi.ccdi.domain; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 员工亲属关系信息对象 ccdi_staff_fmy_relation - * - * @author ruoyi - * @date 2026-02-09 - */ -@Data -public class CcdiStaffFmyRelation implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** 主键ID */ - @TableId(type = IdType.AUTO) - private Long id; - - /** 员工身份证号 */ - private String personId; - - /** 关系类型 */ - private String relationType; - - /** 关系人姓名 */ - private String relationName; - - /** 性别 */ - private String gender; - - /** 出生日期 */ - private Date birthDate; - - /** 证件类型 */ - private String relationCertType; - - /** 证件号码 */ - private String relationCertNo; - - /** 手机号码1 */ - private String mobilePhone1; - - /** 手机号码2 */ - private String mobilePhone2; - - /** 微信名称1 */ - private String wechatNo1; - - /** 微信名称2 */ - private String wechatNo2; - - /** 微信名称3 */ - private String wechatNo3; - - /** 详细联系地址 */ - private String contactAddress; - - /** 关系详细描述 */ - private String relationDesc; - - /** 状态:0-无效、1-有效 */ - private Integer status; - - /** 关系生效日期 */ - private Date effectiveDate; - - /** 关系失效日期 */ - private Date invalidDate; - - /** 备注信息 */ - private String remark; - - /** 数据来源 */ - private String dataSource; - - /** 是否是员工的家庭关系:0-否 1-是 */ - private Integer isEmpFamily; - - /** 是否是信贷客户的家庭关系:0-否 1-是 */ - private Integer isCustFamily; - - /** 创建时间 */ - @TableField(fill = FieldFill.INSERT) - private Date createTime; - - /** 更新时间 */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Date updateTime; - - /** 创建人 */ - @TableField(fill = FieldFill.INSERT) - private String createdBy; - - /** 更新人 */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private String updatedBy; -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationAddDTO.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationAddDTO.java deleted file mode 100644 index 1cfefed..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationAddDTO.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.ruoyi.ccdi.domain.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 员工亲属关系信息新增DTO - * - * @author ruoyi - * @date 2026-02-09 - */ -@Data -@Schema(description = "员工亲属关系信息新增") -public class CcdiStaffFmyRelationAddDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** 员工身份证号 */ - @NotBlank(message = "员工身份证号不能为空") - @Pattern(regexp = "^\\d{17}[\\dXx]$", message = "员工身份证号格式不正确") - @Schema(description = "员工身份证号") - private String personId; - - /** 关系类型 */ - @NotBlank(message = "关系类型不能为空") - @Size(max = 50, message = "关系类型长度不能超过50个字符") - @Schema(description = "关系类型") - private String relationType; - - /** 关系人姓名 */ - @NotBlank(message = "关系人姓名不能为空") - @Size(max = 100, message = "关系人姓名长度不能超过100个字符") - @Schema(description = "关系人姓名") - private String relationName; - - /** 性别 */ - @Pattern(regexp = "^[MFO]$", message = "性别只能是M、F或O") - @Schema(description = "性别:M-男 F-女 O-其他") - private String gender; - - /** 出生日期 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Schema(description = "出生日期") - private Date birthDate; - - /** 证件类型 */ - @NotBlank(message = "证件类型不能为空") - @Size(max = 50, message = "证件类型长度不能超过50个字符") - @Schema(description = "证件类型") - private String relationCertType; - - /** 证件号码 */ - @NotBlank(message = "证件号码不能为空") - @Size(max = 50, message = "证件号码长度不能超过50个字符") - @Schema(description = "证件号码") - private String relationCertNo; - - /** 手机号码1 */ - @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码1格式不正确") - @Schema(description = "手机号码1") - private String mobilePhone1; - - /** 手机号码2 */ - @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码2格式不正确") - @Schema(description = "手机号码2") - private String mobilePhone2; - - /** 微信名称1 */ - @Size(max = 100, message = "微信名称1长度不能超过100个字符") - @Schema(description = "微信名称1") - private String wechatNo1; - - /** 微信名称2 */ - @Size(max = 100, message = "微信名称2长度不能超过100个字符") - @Schema(description = "微信名称2") - private String wechatNo2; - - /** 微信名称3 */ - @Size(max = 100, message = "微信名称3长度不能超过100个字符") - @Schema(description = "微信名称3") - private String wechatNo3; - - /** 详细联系地址 */ - @Size(max = 255, message = "详细联系地址长度不能超过255个字符") - @Schema(description = "详细联系地址") - private String contactAddress; - - /** 关系详细描述 */ - @Size(max = 500, message = "关系详细描述长度不能超过500个字符") - @Schema(description = "关系详细描述") - private String relationDesc; - - /** 状态 */ - @NotNull(message = "状态不能为空") - @Schema(description = "状态:0-无效、1-有效") - private Integer status; - - /** 关系生效日期 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "关系生效日期") - private Date effectiveDate; - - /** 关系失效日期 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "关系失效日期") - private Date invalidDate; - - /** 备注信息 */ - @Size(max = 500, message = "备注信息长度不能超过500个字符") - @Schema(description = "备注信息") - private String remark; -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationEditDTO.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationEditDTO.java deleted file mode 100644 index e9a6a60..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationEditDTO.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.ruoyi.ccdi.domain.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 员工亲属关系信息编辑DTO - * - * @author ruoyi - * @date 2026-02-09 - */ -@Data -@Schema(description = "员工亲属关系信息编辑") -public class CcdiStaffFmyRelationEditDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** 主键ID */ - @NotNull(message = "主键ID不能为空") - @Schema(description = "主键ID") - private Long id; - - /** 员工身份证号 */ - @NotBlank(message = "员工身份证号不能为空") - @Pattern(regexp = "^\\d{17}[\\dXx]$", message = "员工身份证号格式不正确") - @Schema(description = "员工身份证号") - private String personId; - - /** 关系类型 */ - @NotBlank(message = "关系类型不能为空") - @Size(max = 50, message = "关系类型长度不能超过50个字符") - @Schema(description = "关系类型") - private String relationType; - - /** 关系人姓名 */ - @NotBlank(message = "关系人姓名不能为空") - @Size(max = 100, message = "关系人姓名长度不能超过100个字符") - @Schema(description = "关系人姓名") - private String relationName; - - /** 性别 */ - @Pattern(regexp = "^[MFO]$", message = "性别只能是M、F或O") - @Schema(description = "性别:M-男 F-女 O-其他") - private String gender; - - /** 出生日期 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Schema(description = "出生日期") - private Date birthDate; - - /** 证件类型 */ - @NotBlank(message = "证件类型不能为空") - @Size(max = 50, message = "证件类型长度不能超过50个字符") - @Schema(description = "证件类型") - private String relationCertType; - - /** 证件号码 */ - @NotBlank(message = "证件号码不能为空") - @Size(max = 50, message = "证件号码长度不能超过50个字符") - @Schema(description = "证件号码") - private String relationCertNo; - - /** 手机号码1 */ - @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码1格式不正确") - @Schema(description = "手机号码1") - private String mobilePhone1; - - /** 手机号码2 */ - @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码2格式不正确") - @Schema(description = "手机号码2") - private String mobilePhone2; - - /** 微信名称1 */ - @Size(max = 100, message = "微信名称1长度不能超过100个字符") - @Schema(description = "微信名称1") - private String wechatNo1; - - /** 微信名称2 */ - @Size(max = 100, message = "微信名称2长度不能超过100个字符") - @Schema(description = "微信名称2") - private String wechatNo2; - - /** 微信名称3 */ - @Size(max = 100, message = "微信名称3长度不能超过100个字符") - @Schema(description = "微信名称3") - private String wechatNo3; - - /** 详细联系地址 */ - @Size(max = 255, message = "详细联系地址长度不能超过255个字符") - @Schema(description = "详细联系地址") - private String contactAddress; - - /** 关系详细描述 */ - @Size(max = 500, message = "关系详细描述长度不能超过500个字符") - @Schema(description = "关系详细描述") - private String relationDesc; - - /** 状态 */ - @NotNull(message = "状态不能为空") - @Schema(description = "状态:0-无效、1-有效") - private Integer status; - - /** 关系生效日期 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "关系生效日期") - private Date effectiveDate; - - /** 关系失效日期 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "关系失效日期") - private Date invalidDate; - - /** 备注信息 */ - @Size(max = 500, message = "备注信息长度不能超过500个字符") - @Schema(description = "备注信息") - private String remark; -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationQueryDTO.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationQueryDTO.java deleted file mode 100644 index 31e7074..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/dto/CcdiStaffFmyRelationQueryDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ruoyi.ccdi.domain.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 员工亲属关系信息查询DTO - * - * @author ruoyi - * @date 2026-02-09 - */ -@Data -@Schema(description = "员工亲属关系信息查询条件") -public class CcdiStaffFmyRelationQueryDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** 员工身份证号 */ - @Schema(description = "员工身份证号") - private String personId; - - /** 关系人姓名 */ - @Schema(description = "关系人姓名") - private String relationName; - - /** 关系类型 */ - @Schema(description = "关系类型") - private String relationType; - - /** 证件号码 */ - @Schema(description = "证件号码") - private String relationCertNo; - - /** 状态 */ - @Schema(description = "状态:0-无效、1-有效") - private Integer status; -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/excel/CcdiStaffFmyRelationExcel.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/excel/CcdiStaffFmyRelationExcel.java deleted file mode 100644 index 3763888..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/excel/CcdiStaffFmyRelationExcel.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.ruoyi.ccdi.domain.excel; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.alibaba.excel.annotation.write.style.ColumnWidth; -import com.ruoyi.common.annotation.DictDropdown; -import com.ruoyi.common.annotation.Required; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - -/** - * 员工亲属关系信息Excel导入导出对象 - * - * @author ruoyi - * @date 2026-02-09 - */ -@Data -public class CcdiStaffFmyRelationExcel implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** 员工身份证号 */ - @ExcelProperty(value = "员工身份证号", index = 0) - @ColumnWidth(20) - @Required - private String personId; - - /** 关系类型 */ - @ExcelProperty(value = "关系类型", index = 1) - @ColumnWidth(15) - @Required - @DictDropdown(dictType = "ccdi_relation_type") - private String relationType; - - /** 关系人姓名 */ - @ExcelProperty(value = "关系人姓名", index = 2) - @ColumnWidth(15) - @Required - private String relationName; - - /** 性别 */ - @ExcelProperty(value = "性别", index = 3) - @ColumnWidth(10) - @DictDropdown(dictType = "sys_user_sex") - private String gender; - - /** 出生日期 */ - @ExcelProperty(value = "出生日期", index = 4) - @ColumnWidth(15) - private Date birthDate; - - /** 证件类型 */ - @ExcelProperty(value = "证件类型", index = 5) - @ColumnWidth(15) - @Required - @DictDropdown(dictType = "ccdi_cert_type") - private String relationCertType; - - /** 证件号码 */ - @ExcelProperty(value = "证件号码", index = 6) - @ColumnWidth(20) - @Required - private String relationCertNo; - - /** 手机号码1 */ - @ExcelProperty(value = "手机号码1", index = 7) - @ColumnWidth(15) - private String mobilePhone1; - - /** 手机号码2 */ - @ExcelProperty(value = "手机号码2", index = 8) - @ColumnWidth(15) - private String mobilePhone2; - - /** 微信名称1 */ - @ExcelProperty(value = "微信名称1", index = 9) - @ColumnWidth(15) - private String wechatNo1; - - /** 微信名称2 */ - @ExcelProperty(value = "微信名称2", index = 10) - @ColumnWidth(15) - private String wechatNo2; - - /** 微信名称3 */ - @ExcelProperty(value = "微信名称3", index = 11) - @ColumnWidth(15) - private String wechatNo3; - - /** 详细联系地址 */ - @ExcelProperty(value = "详细联系地址", index = 12) - @ColumnWidth(25) - private String contactAddress; - - /** 关系详细描述 */ - @ExcelProperty(value = "关系详细描述", index = 13) - @ColumnWidth(20) - private String relationDesc; - - /** 状态 */ - @ExcelProperty(value = "状态", index = 14) - @ColumnWidth(10) - @Required - @DictDropdown(dictType = "ccdi_status", defaultValue = "1") - private Integer status; - - /** 关系生效日期 */ - @ExcelProperty(value = "关系生效日期", index = 15) - @ColumnWidth(20) - private Date effectiveDate; - - /** 关系失效日期 */ - @ExcelProperty(value = "关系失效日期", index = 16) - @ColumnWidth(20) - private Date invalidDate; - - /** 备注信息 */ - @ExcelProperty(value = "备注信息", index = 17) - @ColumnWidth(25) - private String remark; -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/CcdiStaffFmyRelationVO.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/CcdiStaffFmyRelationVO.java deleted file mode 100644 index e58507b..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/domain/vo/CcdiStaffFmyRelationVO.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.ruoyi.ccdi.domain.vo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; - -/** - * 员工亲属关系信息VO - * - * @author ruoyi - * @date 2026-02-09 - */ -@Data -@Schema(description = "员工亲属关系信息") -public class CcdiStaffFmyRelationVO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** 主键ID */ - @Schema(description = "主键ID") - private Long id; - - /** 员工身份证号 */ - @Schema(description = "员工身份证号") - private String personId; - - /** 关系类型 */ - @Schema(description = "关系类型") - private String relationType; - - /** 关系人姓名 */ - @Schema(description = "关系人姓名") - private String relationName; - - /** 性别 */ - @Schema(description = "性别:M-男 F-女 O-其他") - private String gender; - - /** 出生日期 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Schema(description = "出生日期") - private String birthDate; - - /** 证件类型 */ - @Schema(description = "证件类型") - private String relationCertType; - - /** 证件号码 */ - @Schema(description = "证件号码") - private String relationCertNo; - - /** 手机号码1 */ - @Schema(description = "手机号码1") - private String mobilePhone1; - - /** 手机号码2 */ - @Schema(description = "手机号码2") - private String mobilePhone2; - - /** 微信名称1 */ - @Schema(description = "微信名称1") - private String wechatNo1; - - /** 微信名称2 */ - @Schema(description = "微信名称2") - private String wechatNo2; - - /** 微信名称3 */ - @Schema(description = "微信名称3") - private String wechatNo3; - - /** 详细联系地址 */ - @Schema(description = "详细联系地址") - private String contactAddress; - - /** 关系详细描述 */ - @Schema(description = "关系详细描述") - private String relationDesc; - - /** 状态 */ - @Schema(description = "状态:0-无效、1-有效") - private Integer status; - - /** 关系生效日期 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "关系生效日期") - private String effectiveDate; - - /** 关系失效日期 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "关系失效日期") - private String invalidDate; - - /** 备注信息 */ - @Schema(description = "备注信息") - private String remark; - - /** 创建时间 */ - @Schema(description = "创建时间") - private String createTime; - - /** 更新时间 */ - @Schema(description = "更新时间") - private String updateTime; - - /** 创建人 */ - @Schema(description = "创建人") - private String createdBy; - - /** 更新人 */ - @Schema(description = "更新人") - private String updatedBy; -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiStaffFmyRelationMapper.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiStaffFmyRelationMapper.java deleted file mode 100644 index 8cadcd4..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiStaffFmyRelationMapper.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.ruoyi.ccdi.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.ccdi.domain.CcdiStaffFmyRelation; -import com.ruoyi.ccdi.domain.dto.CcdiStaffFmyRelationQueryDTO; -import com.ruoyi.ccdi.domain.vo.CcdiStaffFmyRelationVO; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 员工亲属关系信息 数据层 - * - * @author ruoyi - * @date 2026-02-09 - */ -public interface CcdiStaffFmyRelationMapper extends BaseMapper { - - /** - * 分页查询员工亲属关系列表 - * - * @param page 分页对象 - * @param queryDTO 查询条件 - * @return 员工亲属关系VO分页结果 - */ - Page selectRelationPage(@Param("page") Page page, - @Param("query") CcdiStaffFmyRelationQueryDTO queryDTO); - - /** - * 查询员工亲属关系详情 - * - * @param id 主键ID - * @return 员工亲属关系VO - */ - CcdiStaffFmyRelationVO selectRelationById(@Param("id") Long id); - - /** - * 查询员工亲属关系列表(用于导出) - * - * @param queryDTO 查询条件 - * @return 员工亲属关系Excel实体集合 - */ - List selectRelationListForExport(@Param("query") CcdiStaffFmyRelationQueryDTO queryDTO); - - /** - * 批量插入员工亲属关系数据 - * - * @param list 员工亲属关系列表 - * @return 插入行数 - */ - int insertBatch(@Param("list") List list); -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationImportService.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationImportService.java deleted file mode 100644 index 40cd5ad..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationImportService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ruoyi.ccdi.service; - -import com.ruoyi.ccdi.domain.excel.CcdiStaffFmyRelationExcel; -import com.ruoyi.ccdi.domain.vo.ImportStatusVO; -import com.ruoyi.ccdi.domain.vo.StaffFmyRelationImportFailureVO; - -import java.util.List; - -/** - * 员工亲属关系信息异步导入服务层 - * - * @author ruoyi - * @date 2026-02-09 - */ -public interface ICcdiStaffFmyRelationImportService { - - /** - * 异步导入员工亲属关系数据 - * - * @param excelList Excel数据列表 - * @param taskId 任务ID - * @param userName 当前用户名 - */ - void importRelationAsync(List excelList, String taskId, String userName); - - /** - * 查询导入状态 - * - * @param taskId 任务ID - * @return 导入状态信息 - */ - ImportStatusVO getImportStatus(String taskId); - - /** - * 获取导入失败记录 - * - * @param taskId 任务ID - * @return 失败记录列表 - */ - List getImportFailures(String taskId); -} diff --git a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationService.java b/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationService.java deleted file mode 100644 index 4983135..0000000 --- a/ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/ICcdiStaffFmyRelationService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.ruoyi.ccdi.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.ccdi.domain.dto.CcdiStaffFmyRelationAddDTO; -import com.ruoyi.ccdi.domain.dto.CcdiStaffFmyRelationEditDTO; -import com.ruoyi.ccdi.domain.dto.CcdiStaffFmyRelationQueryDTO; -import com.ruoyi.ccdi.domain.excel.CcdiStaffFmyRelationExcel; -import com.ruoyi.ccdi.domain.vo.CcdiStaffFmyRelationVO; - -import java.util.List; - -/** - * 员工亲属关系信息 服务层 - * - * @author ruoyi - * @date 2026-02-09 - */ -public interface ICcdiStaffFmyRelationService { - - /** - * 查询员工亲属关系列表 - * - * @param queryDTO 查询条件 - * @return 员工亲属关系VO集合 - */ - List selectRelationList(CcdiStaffFmyRelationQueryDTO queryDTO); - - /** - * 分页查询员工亲属关系列表 - * - * @param page 分页对象 - * @param queryDTO 查询条件 - * @return 员工亲属关系VO分页结果 - */ - Page selectRelationPage(Page page, CcdiStaffFmyRelationQueryDTO queryDTO); - - /** - * 查询员工亲属关系列表(用于导出) - * - * @param queryDTO 查询条件 - * @return 员工亲属关系Excel实体集合 - */ - List selectRelationListForExport(CcdiStaffFmyRelationQueryDTO queryDTO); - - /** - * 查询员工亲属关系详情 - * - * @param id 主键ID - * @return 员工亲属关系VO - */ - CcdiStaffFmyRelationVO selectRelationById(Long id); - - /** - * 新增员工亲属关系 - * - * @param addDTO 新增DTO - * @return 结果 - */ - int insertRelation(CcdiStaffFmyRelationAddDTO addDTO); - - /** - * 修改员工亲属关系 - * - * @param editDTO 编辑DTO - * @return 结果 - */ - int updateRelation(CcdiStaffFmyRelationEditDTO editDTO); - - /** - * 批量删除员工亲属关系 - * - * @param ids 需要删除的主键ID数组 - * @return 结果 - */ - int deleteRelationByIds(Long[] ids); - - /** - * 导入员工亲属关系数据(异步) - * - * @param excelList Excel实体列表 - * @return 任务ID - */ - String importRelation(List excelList); -} diff --git a/ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffFmyRelationMapper.xml b/ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffFmyRelationMapper.xml deleted file mode 100644 index 8e1881b..0000000 --- a/ruoyi-ccdi/src/main/resources/mapper/ccdi/CcdiStaffFmyRelationMapper.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO ccdi_staff_fmy_relation - (person_id, relation_type, relation_name, gender, birth_date, - relation_cert_type, relation_cert_no, - mobile_phone1, mobile_phone2, - wechat_no1, wechat_no2, wechat_no3, - contact_address, relation_desc, status, - effective_date, invalid_date, remark, - data_source, is_emp_family, is_cust_family, - created_by, create_time, updated_by, update_time) - VALUES - - (#{item.personId}, #{item.relationType}, #{item.relationName}, #{item.gender}, #{item.birthDate}, - #{item.relationCertType}, #{item.relationCertNo}, - #{item.mobilePhone1}, #{item.mobilePhone2}, - #{item.wechatNo1}, #{item.wechatNo2}, #{item.wechatNo3}, - #{item.contactAddress}, #{item.relationDesc}, #{item.status}, - #{item.effectiveDate}, #{item.invalidDate}, #{item.remark}, - #{item.dataSource}, #{item.isEmpFamily}, #{item.isCustFamily}, - #{item.createdBy}, NOW(), #{item.updatedBy}, NOW()) - - - -