feat
This commit is contained in:
@@ -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,-,是,-,记录更新人
|
||||
|
||||
|
341
doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md
Normal file
341
doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md
Normal file
@@ -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`
|
||||
@@ -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`
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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<CcdiStaffFmyRelation> {
|
||||
|
||||
/**
|
||||
* 分页查询员工亲属关系列表
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param queryDTO 查询条件
|
||||
* @return 员工亲属关系VO分页结果
|
||||
*/
|
||||
Page<CcdiStaffFmyRelationVO> selectRelationPage(@Param("page") Page<CcdiStaffFmyRelationVO> page,
|
||||
@Param("query") CcdiStaffFmyRelationQueryDTO queryDTO);
|
||||
|
||||
/**
|
||||
* 查询员工亲属关系详情
|
||||
*
|
||||
* @param id 主键ID
|
||||
* @return 员工亲属关系VO
|
||||
*/
|
||||
CcdiStaffFmyRelationVO selectRelationById(@Param("id") Long id);
|
||||
|
||||
/**
|
||||
* 查询员工亲属关系列表(用于导出)
|
||||
*
|
||||
* @param queryDTO 查询条件
|
||||
* @return 员工亲属关系Excel实体集合
|
||||
*/
|
||||
List<CcdiStaffFmyRelationVO> selectRelationListForExport(@Param("query") CcdiStaffFmyRelationQueryDTO queryDTO);
|
||||
|
||||
/**
|
||||
* 批量插入员工亲属关系数据
|
||||
*
|
||||
* @param list 员工亲属关系列表
|
||||
* @return 插入行数
|
||||
*/
|
||||
int insertBatch(@Param("list") List<CcdiStaffFmyRelation> list);
|
||||
}
|
||||
@@ -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<CcdiStaffFmyRelationExcel> excelList, String taskId, String userName);
|
||||
|
||||
/**
|
||||
* 查询导入状态
|
||||
*
|
||||
* @param taskId 任务ID
|
||||
* @return 导入状态信息
|
||||
*/
|
||||
ImportStatusVO getImportStatus(String taskId);
|
||||
|
||||
/**
|
||||
* 获取导入失败记录
|
||||
*
|
||||
* @param taskId 任务ID
|
||||
* @return 失败记录列表
|
||||
*/
|
||||
List<StaffFmyRelationImportFailureVO> getImportFailures(String taskId);
|
||||
}
|
||||
@@ -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<CcdiStaffFmyRelationVO> selectRelationList(CcdiStaffFmyRelationQueryDTO queryDTO);
|
||||
|
||||
/**
|
||||
* 分页查询员工亲属关系列表
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param queryDTO 查询条件
|
||||
* @return 员工亲属关系VO分页结果
|
||||
*/
|
||||
Page<CcdiStaffFmyRelationVO> selectRelationPage(Page<CcdiStaffFmyRelationVO> page, CcdiStaffFmyRelationQueryDTO queryDTO);
|
||||
|
||||
/**
|
||||
* 查询员工亲属关系列表(用于导出)
|
||||
*
|
||||
* @param queryDTO 查询条件
|
||||
* @return 员工亲属关系Excel实体集合
|
||||
*/
|
||||
List<CcdiStaffFmyRelationExcel> 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<CcdiStaffFmyRelationExcel> excelList);
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ruoyi.ccdi.mapper.CcdiStaffFmyRelationMapper">
|
||||
|
||||
<!-- 员工亲属关系信息ResultMap -->
|
||||
<resultMap type="com.ruoyi.ccdi.domain.vo.CcdiStaffFmyRelationVO" id="CcdiStaffFmyRelationVOResult">
|
||||
<id property="id" column="id"/>
|
||||
<result property="personId" column="person_id"/>
|
||||
<result property="relationType" column="relation_type"/>
|
||||
<result property="relationName" column="relation_name"/>
|
||||
<result property="gender" column="gender"/>
|
||||
<result property="birthDate" column="birth_date"/>
|
||||
<result property="relationCertType" column="relation_cert_type"/>
|
||||
<result property="relationCertNo" column="relation_cert_no"/>
|
||||
<result property="mobilePhone1" column="mobile_phone1"/>
|
||||
<result property="mobilePhone2" column="mobile_phone2"/>
|
||||
<result property="wechatNo1" column="wechat_no1"/>
|
||||
<result property="wechatNo2" column="wechat_no2"/>
|
||||
<result property="wechatNo3" column="wechat_no3"/>
|
||||
<result property="contactAddress" column="contact_address"/>
|
||||
<result property="relationDesc" column="relation_desc"/>
|
||||
<result property="status" column="status"/>
|
||||
<result property="effectiveDate" column="effective_date"/>
|
||||
<result property="invalidDate" column="invalid_date"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="createdBy" column="created_by"/>
|
||||
<result property="updatedBy" column="updated_by"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 分页查询员工亲属关系列表 -->
|
||||
<select id="selectRelationPage" resultMap="CcdiStaffFmyRelationVOResult">
|
||||
SELECT
|
||||
id, person_id, relation_type, relation_name, gender,
|
||||
DATE_FORMAT(birth_date, '%Y-%m-%d') as birth_date,
|
||||
relation_cert_type, relation_cert_no,
|
||||
mobile_phone1, mobile_phone2,
|
||||
wechat_no1, wechat_no2, wechat_no3,
|
||||
contact_address, relation_desc, status,
|
||||
DATE_FORMAT(effective_date, '%Y-%m-%d %H:%i:%s') as effective_date,
|
||||
DATE_FORMAT(invalid_date, '%Y-%m-%d %H:%i:%s') as invalid_date,
|
||||
remark,
|
||||
DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') as create_time,
|
||||
DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%s') as update_time,
|
||||
created_by, updated_by
|
||||
FROM ccdi_staff_fmy_relation
|
||||
<where>
|
||||
<if test="query.personId != null and query.personId != ''">
|
||||
AND person_id = #{query.personId}
|
||||
</if>
|
||||
<if test="query.relationName != null and query.relationName != ''">
|
||||
AND relation_name LIKE CONCAT('%', #{query.relationName}, '%')
|
||||
</if>
|
||||
<if test="query.relationType != null and query.relationType != ''">
|
||||
AND relation_type = #{query.relationType}
|
||||
</if>
|
||||
<if test="query.relationCertNo != null and query.relationCertNo != ''">
|
||||
AND relation_cert_no LIKE CONCAT('%', #{query.relationCertNo}, '%')
|
||||
</if>
|
||||
<if test="query.status != null">
|
||||
AND status = #{query.status}
|
||||
</if>
|
||||
</where>
|
||||
ORDER BY create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 查询员工亲属关系详情 -->
|
||||
<select id="selectRelationById" resultMap="CcdiStaffFmyRelationVOResult">
|
||||
SELECT
|
||||
id, person_id, relation_type, relation_name, gender,
|
||||
DATE_FORMAT(birth_date, '%Y-%m-%d') as birth_date,
|
||||
relation_cert_type, relation_cert_no,
|
||||
mobile_phone1, mobile_phone2,
|
||||
wechat_no1, wechat_no2, wechat_no3,
|
||||
contact_address, relation_desc, status,
|
||||
DATE_FORMAT(effective_date, '%Y-%m-%d %H:%i:%s') as effective_date,
|
||||
DATE_FORMAT(invalid_date, '%Y-%m-%d %H:%i:%s') as invalid_date,
|
||||
remark,
|
||||
DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') as create_time,
|
||||
DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%s') as update_time,
|
||||
created_by, updated_by
|
||||
FROM ccdi_staff_fmy_relation
|
||||
WHERE id = #{id}
|
||||
</select>
|
||||
|
||||
<!-- 查询员工亲属关系列表(用于导出) -->
|
||||
<select id="selectRelationListForExport" resultMap="CcdiStaffFmyRelationVOResult">
|
||||
SELECT
|
||||
id, person_id, relation_type, relation_name, gender,
|
||||
DATE_FORMAT(birth_date, '%Y-%m-%d') as birth_date,
|
||||
relation_cert_type, relation_cert_no,
|
||||
mobile_phone1, mobile_phone2,
|
||||
wechat_no1, wechat_no2, wechat_no3,
|
||||
contact_address, relation_desc, status,
|
||||
DATE_FORMAT(effective_date, '%Y-%m-%d %H:%i:%s') as effective_date,
|
||||
DATE_FORMAT(invalid_date, '%Y-%m-%d %H:%i:%s') as invalid_date,
|
||||
remark,
|
||||
DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') as create_time,
|
||||
DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%s') as update_time,
|
||||
created_by, updated_by
|
||||
FROM ccdi_staff_fmy_relation
|
||||
<where>
|
||||
<if test="query.personId != null and query.personId != ''">
|
||||
AND person_id = #{query.personId}
|
||||
</if>
|
||||
<if test="query.relationName != null and query.relationName != ''">
|
||||
AND relation_name LIKE CONCAT('%', #{query.relationName}, '%')
|
||||
</if>
|
||||
<if test="query.relationType != null and query.relationType != ''">
|
||||
AND relation_type = #{query.relationType}
|
||||
</if>
|
||||
<if test="query.relationCertNo != null and query.relationCertNo != ''">
|
||||
AND relation_cert_no LIKE CONCAT('%', #{query.relationCertNo}, '%')
|
||||
</if>
|
||||
<if test="query.status != null">
|
||||
AND status = #{query.status}
|
||||
</if>
|
||||
</where>
|
||||
ORDER BY create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 批量插入员工亲属关系数据 -->
|
||||
<insert id="insertBatch">
|
||||
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
|
||||
<foreach collection="list" item="item" separator=",">
|
||||
(#{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())
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user