diff --git a/doc/api-docs/api/ccdi-employee-import-api.md b/assets/api-docs/api/ccdi-employee-import-api.md
similarity index 68%
rename from doc/api-docs/api/ccdi-employee-import-api.md
rename to assets/api-docs/api/ccdi-employee-import-api.md
index 7bd2044..0c0387a 100644
--- a/doc/api-docs/api/ccdi-employee-import-api.md
+++ b/assets/api-docs/api/ccdi-employee-import-api.md
@@ -8,10 +8,10 @@
**请求参数:**
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | File | 是 | Excel文件 |
-| updateSupport | boolean | 否 | 是否更新已存在的数据,默认false |
+| 参数名 | 类型 | 必填 | 说明 |
+|---------------|---------|----|--------------------|
+| file | File | 是 | Excel文件 |
+| updateSupport | boolean | 否 | 是否更新已存在的数据,默认false |
**响应示例:**
@@ -35,9 +35,9 @@
**路径参数:**
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| taskId | String | 是 | 任务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|------|
+| taskId | String | 是 | 任务ID |
**响应示例:**
@@ -60,12 +60,12 @@
**状态说明:**
-| 状态值 | 说明 |
-|--------|------|
-| PROCESSING | 处理中 |
-| SUCCESS | 全部成功 |
+| 状态值 | 说明 |
+|-----------------|------|
+| PROCESSING | 处理中 |
+| SUCCESS | 全部成功 |
| PARTIAL_SUCCESS | 部分成功 |
-| FAILED | 全部失败 |
+| FAILED | 全部失败 |
## 3. 查询导入失败记录
@@ -75,16 +75,16 @@
**路径参数:**
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| taskId | String | 是 | 任务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|------|
+| taskId | String | 是 | 任务ID |
**查询参数:**
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| pageNum | Integer | 否 | 页码,默认1 |
-| pageSize | Integer | 否 | 每页条数,默认10 |
+| 参数名 | 类型 | 必填 | 说明 |
+|----------|---------|----|-----------|
+| pageNum | Integer | 否 | 页码,默认1 |
+| pageSize | Integer | 否 | 每页条数,默认10 |
**响应示例:**
diff --git a/doc/api-docs/api/ccdi_purchase_transaction_api.md b/assets/api-docs/api/ccdi_purchase_transaction_api.md
similarity index 52%
rename from doc/api-docs/api/ccdi_purchase_transaction_api.md
rename to assets/api-docs/api/ccdi_purchase_transaction_api.md
index 0f8d077..2627230 100644
--- a/doc/api-docs/api/ccdi_purchase_transaction_api.md
+++ b/assets/api-docs/api/ccdi_purchase_transaction_api.md
@@ -1,6 +1,7 @@
# 采购交易信息管理 - API接口文档
## 文档信息
+
- **模块名称**: 采购交易信息管理
- **Controller**: `CcdiPurchaseTransactionController`
- **Base Path**: `/ccdi/purchaseTransaction`
@@ -10,6 +11,7 @@
---
## 目录
+
1. [接口列表](#接口列表)
2. [接口详情](#接口详情)
3. [数据模型](#数据模型)
@@ -20,18 +22,18 @@
## 接口列表
-| 序号 | 接口名称 | HTTP方法 | 路径 | 权限标识 | 说明 |
-|------|---------|----------|------|----------|------|
-| 1 | 查询采购交易列表 | GET | /list | ccdi:purchaseTransaction:list | 分页查询采购交易信息 |
-| 2 | 获取采购交易详情 | GET | /{purchaseId} | ccdi:purchaseTransaction:query | 根据ID获取详细信息 |
-| 3 | 新增采购交易 | POST | / | ccdi:purchaseTransaction:add | 新增采购交易记录 |
-| 4 | 修改采购交易 | PUT | / | ccdi:purchaseTransaction:edit | 修改采购交易记录 |
-| 5 | 删除采购交易 | DELETE | /{purchaseIds} | ccdi:purchaseTransaction:remove | 删除采购交易记录 |
-| 6 | 导出采购交易 | POST | /export | ccdi:purchaseTransaction:export | 导出Excel文件 |
-| 7 | 下载导入模板 | POST | /importTemplate | 无 | 下载带下拉框的模板 |
-| 8 | 导入采购交易 | POST | /importData | ccdi:purchaseTransaction:import | 异步导入Excel数据 |
-| 9 | 查询导入状态 | GET | /importStatus/{taskId} | ccdi:purchaseTransaction:import | 查询异步导入进度 |
-| 10 | 查询导入失败记录 | GET | /importFailures/{taskId} | ccdi:purchaseTransaction:import | 查询导入失败详情 |
+| 序号 | 接口名称 | HTTP方法 | 路径 | 权限标识 | 说明 |
+|----|----------|--------|--------------------------|---------------------------------|-------------|
+| 1 | 查询采购交易列表 | GET | /list | ccdi:purchaseTransaction:list | 分页查询采购交易信息 |
+| 2 | 获取采购交易详情 | GET | /{purchaseId} | ccdi:purchaseTransaction:query | 根据ID获取详细信息 |
+| 3 | 新增采购交易 | POST | / | ccdi:purchaseTransaction:add | 新增采购交易记录 |
+| 4 | 修改采购交易 | PUT | / | ccdi:purchaseTransaction:edit | 修改采购交易记录 |
+| 5 | 删除采购交易 | DELETE | /{purchaseIds} | ccdi:purchaseTransaction:remove | 删除采购交易记录 |
+| 6 | 导出采购交易 | POST | /export | ccdi:purchaseTransaction:export | 导出Excel文件 |
+| 7 | 下载导入模板 | POST | /importTemplate | 无 | 下载带下拉框的模板 |
+| 8 | 导入采购交易 | POST | /importData | ccdi:purchaseTransaction:import | 异步导入Excel数据 |
+| 9 | 查询导入状态 | GET | /importStatus/{taskId} | ccdi:purchaseTransaction:import | 查询异步导入进度 |
+| 10 | 查询导入失败记录 | GET | /importFailures/{taskId} | ccdi:purchaseTransaction:import | 查询导入失败详情 |
---
@@ -49,17 +51,18 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|--------|------|------|------|--------|
-| pageNum | Integer | 否 | 页码,默认1 | 1 |
-| pageSize | Integer | 否 | 每页条数,默认10 | 10 |
-| projectName | String | 否 | 项目名称(模糊查询) | 办公设备采购 |
-| subjectName | String | 否 | 标的物名称(模糊查询) | 电脑 |
-| applicantName | String | 否 | 申请人姓名(模糊查询) | 张三 |
-| params[beginApplyDate] | String | 否 | 申请日期起始 | 2025-01-01 |
-| params[endApplyDate] | String | 否 | 申请日期结束 | 2025-12-31 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|------------------------|---------|----|-------------|------------|
+| pageNum | Integer | 否 | 页码,默认1 | 1 |
+| pageSize | Integer | 否 | 每页条数,默认10 | 10 |
+| projectName | String | 否 | 项目名称(模糊查询) | 办公设备采购 |
+| subjectName | String | 否 | 标的物名称(模糊查询) | 电脑 |
+| applicantName | String | 否 | 申请人姓名(模糊查询) | 张三 |
+| params[beginApplyDate] | String | 否 | 申请日期起始 | 2025-01-01 |
+| params[endApplyDate] | String | 否 | 申请日期结束 | 2025-12-31 |
**响应示例**:
+
```json
{
"code": 200,
@@ -122,11 +125,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|--------|------|------|------|--------|
-| purchaseId | String | 是 | 采购事项ID | PO20250206001 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|------------|--------|----|--------|---------------|
+| purchaseId | String | 是 | 采购事项ID | PO20250206001 |
**响应示例**:
+
```json
{
"code": 200,
@@ -185,6 +189,7 @@
**权限要求**: `ccdi:purchaseTransaction:add`
**请求头**:
+
```
Content-Type: application/json
Authorization: Bearer {token}
@@ -192,42 +197,43 @@ Authorization: Bearer {token}
**请求体** (`CcdiPurchaseTransactionAddDTO`):
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|--------|------|------|------|--------|
-| purchaseId | String | 是 | 采购事项ID(最大32字符) | PO20250206001 |
-| purchaseCategory | String | 否 | 采购类别(最大50字符) | 货物类 |
-| projectName | String | 否 | 项目名称(最大200字符) | 办公设备采购项目 |
-| subjectName | String | 否 | 标的物名称(最大200字符) | 笔记本电脑 |
-| subjectDesc | String | 否 | 标的物描述(最大500字符) | 高性能办公笔记本 |
-| purchaseQty | BigDecimal | 否 | 采购数量 | 50.00 |
-| budgetAmount | BigDecimal | 否 | 预算金额 | 500000.00 |
-| bidAmount | BigDecimal | 否 | 中标金额 | 450000.00 |
-| actualAmount | BigDecimal | 否 | 实际采购金额 | 455000.00 |
-| contractAmount | BigDecimal | 否 | 合同金额 | 450000.00 |
-| settlementAmount | BigDecimal | 否 | 结算金额 | 455000.00 |
-| purchaseMethod | String | 否 | 采购方式(最大50字符) | 公开招标 |
-| supplierName | String | 否 | 供应商名称(最大200字符) | 某某科技有限公司 |
-| supplierUscc | String | 否 | 供应商统一信用代码(最大18字符) | 91110000MA000000XX |
-| contactPerson | String | 否 | 供应商联系人(最大50字符) | 李四 |
-| contactPhone | String | 否 | 供应商联系电话(最大20字符) | 13800138000 |
-| supplierBankAccount | String | 否 | 供应商银行账户(最大50字符) | 1234567890123456789 |
-| applyDate | String | 否 | 采购申请日期(yyyy-MM-dd) | 2025-01-01 |
-| planApproveDate | String | 否 | 采购计划批准日期(yyyy-MM-dd) | 2025-01-05 |
-| announceDate | String | 否 | 采购公告发布日期(yyyy-MM-dd) | 2025-01-10 |
-| bidOpenDate | String | 否 | 开标日期(yyyy-MM-dd) | 2025-01-15 |
-| contractSignDate | String | 否 | 合同签订日期(yyyy-MM-dd) | 2025-01-20 |
-| expectedDeliveryDate | String | 否 | 预计交货日期(yyyy-MM-dd) | 2025-02-01 |
-| actualDeliveryDate | String | 否 | 实际交货日期(yyyy-MM-dd) | 2025-02-01 |
-| acceptanceDate | String | 否 | 验收日期(yyyy-MM-dd) | 2025-02-05 |
-| settlementDate | String | 否 | 结算日期(yyyy-MM-dd) | 2025-02-10 |
-| applicantId | String | 否 | 申请人工号(最大20字符) | E001001 |
-| applicantName | String | 否 | 申请人姓名(最大50字符) | 张三 |
-| applyDepartment | String | 否 | 申请部门(最大100字符) | 信息技术部 |
-| purchaseLeaderId | String | 否 | 采购负责人工号(最大20字符) | E002001 |
-| purchaseLeaderName | String | 否 | 采购负责人姓名(最大50字符) | 王五 |
-| purchaseDepartment | String | 否 | 采购部门(最大100字符) | 采购部 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|----------------------|------------|----|----------------------|---------------------|
+| purchaseId | String | 是 | 采购事项ID(最大32字符) | PO20250206001 |
+| purchaseCategory | String | 否 | 采购类别(最大50字符) | 货物类 |
+| projectName | String | 否 | 项目名称(最大200字符) | 办公设备采购项目 |
+| subjectName | String | 否 | 标的物名称(最大200字符) | 笔记本电脑 |
+| subjectDesc | String | 否 | 标的物描述(最大500字符) | 高性能办公笔记本 |
+| purchaseQty | BigDecimal | 否 | 采购数量 | 50.00 |
+| budgetAmount | BigDecimal | 否 | 预算金额 | 500000.00 |
+| bidAmount | BigDecimal | 否 | 中标金额 | 450000.00 |
+| actualAmount | BigDecimal | 否 | 实际采购金额 | 455000.00 |
+| contractAmount | BigDecimal | 否 | 合同金额 | 450000.00 |
+| settlementAmount | BigDecimal | 否 | 结算金额 | 455000.00 |
+| purchaseMethod | String | 否 | 采购方式(最大50字符) | 公开招标 |
+| supplierName | String | 否 | 供应商名称(最大200字符) | 某某科技有限公司 |
+| supplierUscc | String | 否 | 供应商统一信用代码(最大18字符) | 91110000MA000000XX |
+| contactPerson | String | 否 | 供应商联系人(最大50字符) | 李四 |
+| contactPhone | String | 否 | 供应商联系电话(最大20字符) | 13800138000 |
+| supplierBankAccount | String | 否 | 供应商银行账户(最大50字符) | 1234567890123456789 |
+| applyDate | String | 否 | 采购申请日期(yyyy-MM-dd) | 2025-01-01 |
+| planApproveDate | String | 否 | 采购计划批准日期(yyyy-MM-dd) | 2025-01-05 |
+| announceDate | String | 否 | 采购公告发布日期(yyyy-MM-dd) | 2025-01-10 |
+| bidOpenDate | String | 否 | 开标日期(yyyy-MM-dd) | 2025-01-15 |
+| contractSignDate | String | 否 | 合同签订日期(yyyy-MM-dd) | 2025-01-20 |
+| expectedDeliveryDate | String | 否 | 预计交货日期(yyyy-MM-dd) | 2025-02-01 |
+| actualDeliveryDate | String | 否 | 实际交货日期(yyyy-MM-dd) | 2025-02-01 |
+| acceptanceDate | String | 否 | 验收日期(yyyy-MM-dd) | 2025-02-05 |
+| settlementDate | String | 否 | 结算日期(yyyy-MM-dd) | 2025-02-10 |
+| applicantId | String | 否 | 申请人工号(最大20字符) | E001001 |
+| applicantName | String | 否 | 申请人姓名(最大50字符) | 张三 |
+| applyDepartment | String | 否 | 申请部门(最大100字符) | 信息技术部 |
+| purchaseLeaderId | String | 否 | 采购负责人工号(最大20字符) | E002001 |
+| purchaseLeaderName | String | 否 | 采购负责人姓名(最大50字符) | 王五 |
+| purchaseDepartment | String | 否 | 采购部门(最大100字符) | 采购部 |
**请求示例**:
+
```json
{
"purchaseId": "PO20250206001",
@@ -266,6 +272,7 @@ Authorization: Bearer {token}
```
**响应示例**:
+
```json
{
"code": 200,
@@ -286,6 +293,7 @@ Authorization: Bearer {token}
**权限要求**: `ccdi:purchaseTransaction:edit`
**请求头**:
+
```
Content-Type: application/json
Authorization: Bearer {token}
@@ -296,6 +304,7 @@ Authorization: Bearer {token}
参数同新增接口,但purchaseId为必填且不可修改。
**响应示例**:
+
```json
{
"code": 200,
@@ -317,16 +326,18 @@ Authorization: Bearer {token}
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|--------|------|------|------|--------|
-| purchaseIds | String[] | 是 | 采购事项ID数组,多个用逗号分隔 | PO20250206001,PO20250206002 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|-------------|----------|----|------------------|-----------------------------|
+| purchaseIds | String[] | 是 | 采购事项ID数组,多个用逗号分隔 | PO20250206001,PO20250206002 |
**请求示例**:
+
```
DELETE /ccdi/purchaseTransaction/PO20250206001,PO20250206002
```
**响应示例**:
+
```json
{
"code": 200,
@@ -351,6 +362,7 @@ DELETE /ccdi/purchaseTransaction/PO20250206001,PO20250206002
**响应**: Excel文件流
**请求示例**:
+
```bash
curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/export" \
-H "Authorization: Bearer {token}" \
@@ -372,6 +384,7 @@ curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/export" \
**响应**: Excel模板文件流(包含数据验证下拉框)
**请求示例**:
+
```bash
curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/importTemplate" \
-H "Authorization: Bearer {token}" \
@@ -391,6 +404,7 @@ curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/importTemplate" \
**权限要求**: `ccdi:purchaseTransaction:import`
**请求头**:
+
```
Content-Type: multipart/form-data
Authorization: Bearer {token}
@@ -398,17 +412,18 @@ Authorization: Bearer {token}
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|--------|------|------|------|--------|
-| updateSupport | boolean | 是 | 是否更新已存在数据 | true/false |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|---------------|---------|----|-----------|------------|
+| updateSupport | boolean | 是 | 是否更新已存在数据 | true/false |
**表单参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | File | 是 | Excel文件(.xlsx或.xls) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------|------|----|---------------------|
+| file | File | 是 | Excel文件(.xlsx或.xls) |
**响应示例**:
+
```json
{
"code": 200,
@@ -430,11 +445,12 @@ Authorization: Bearer {token}
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|--------|------|------|------|--------|
-| taskId | String | 是 | 任务ID | task-20250206-123456789 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|--------|--------|----|------|-------------------------|
+| taskId | String | 是 | 任务ID | task-20250206-123456789 |
**响应示例**:
+
```json
{
"code": 200,
@@ -451,6 +467,7 @@ Authorization: Bearer {token}
```
**状态说明**:
+
- `pending`: 等待执行
- `running`: 正在执行
- `completed`: 执行完成
@@ -470,11 +487,12 @@ Authorization: Bearer {token}
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|--------|------|------|------|--------|
-| taskId | String | 是 | 任务ID | task-20250206-123456789 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|--------|--------|----|------|-------------------------|
+| taskId | String | 是 | 任务ID | task-20250206-123456789 |
**响应示例**:
+
```json
{
"code": 200,
@@ -522,24 +540,24 @@ Excel导入导出使用的数据对象,支持字典下拉框。
异步导入任务的状态信息。
-| 字段 | 类型 | 说明 |
-|------|------|------|
-| taskId | String | 任务ID |
-| status | String | 状态:pending/running/completed/failed |
-| total | Integer | 总记录数 |
-| successCount | Integer | 成功数量 |
-| failureCount | Integer | 失败数量 |
-| errorMsg | String | 错误信息(失败时) |
+| 字段 | 类型 | 说明 |
+|--------------|---------|-------------------------------------|
+| taskId | String | 任务ID |
+| status | String | 状态:pending/running/completed/failed |
+| total | Integer | 总记录数 |
+| successCount | Integer | 成功数量 |
+| failureCount | Integer | 失败数量 |
+| errorMsg | String | 错误信息(失败时) |
### PurchaseTransactionImportFailureVO (导入失败记录对象)
导入失败的记录详情。
-| 字段 | 类型 | 说明 |
-|------|------|------|
-| purchaseId | String | 采购事项ID |
-| rowNum | Integer | 行号 |
-| errorMessage | String | 错误信息 |
+| 字段 | 类型 | 说明 |
+|--------------|---------|--------|
+| purchaseId | String | 采购事项ID |
+| rowNum | Integer | 行号 |
+| errorMessage | String | 错误信息 |
---
@@ -547,22 +565,22 @@ Excel导入导出使用的数据对象,支持字典下拉框。
### HTTP状态码
-| 状态码 | 说明 |
-|--------|------|
-| 200 | 请求成功 |
+| 状态码 | 说明 |
+|-----|----------------|
+| 200 | 请求成功 |
| 401 | 未授权,token无效或过期 |
-| 403 | 无权限访问 |
-| 404 | 资源不存在 |
-| 500 | 服务器内部错误 |
+| 403 | 无权限访问 |
+| 404 | 资源不存在 |
+| 500 | 服务器内部错误 |
### 业务错误码
-| code | msg | 说明 |
-|------|-----|------|
-| 200 | 操作成功 | 请求成功处理 |
-| 500 | 操作失败 | 服务器处理失败 |
-| 401 | 请先登录 | 未登录或token过期 |
-| 403 | 无权限访问 | 权限不足 |
+| code | msg | 说明 |
+|------|-------|-------------|
+| 200 | 操作成功 | 请求成功处理 |
+| 500 | 操作失败 | 服务器处理失败 |
+| 401 | 请先登录 | 未登录或token过期 |
+| 403 | 无权限访问 | 权限不足 |
---
@@ -645,10 +663,11 @@ curl -X POST "http://localhost:8080/ccdi/purchaseTransaction/export" \
### 3. Postman测试步骤
1. **创建环境变量**:
- - `base_url`: http://localhost:8080
- - `token`: (登录后获取)
+ - `base_url`: http://localhost:8080
+ - `token`: (登录后获取)
2. **创建Pre-request Script**:
+
```javascript
// 自动设置token
if (!pm.environment.get("token")) {
@@ -668,13 +687,13 @@ if (!pm.environment.get("token")) {
```
3. **设置Authorization**:
- - Type: Bearer Token
- - Token: `{{token}}`
+ - Type: Bearer Token
+ - Token: `{{token}}`
4. **执行测试**:
- - 按接口顺序执行
- - 查看响应结果
- - 验证数据正确性
+ - 按接口顺序执行
+ - 查看响应结果
+ - 验证数据正确性
---
@@ -684,44 +703,44 @@ if (!pm.environment.get("token")) {
表名: `ccdi_purchase_transaction`
-| 字段名 | 类型 | 说明 | 备注 |
-|--------|------|------|------|
-| purchase_id | varchar(32) | 采购事项ID | 主键 |
-| purchase_category | varchar(50) | 采购类别 | |
-| project_name | varchar(200) | 项目名称 | |
-| subject_name | varchar(200) | 标的物名称 | |
-| subject_desc | varchar(500) | 标的物描述 | |
-| purchase_qty | decimal(10,2) | 采购数量 | |
-| budget_amount | decimal(15,2) | 预算金额 | |
-| bid_amount | decimal(15,2) | 中标金额 | |
-| actual_amount | decimal(15,2) | 实际采购金额 | |
-| contract_amount | decimal(15,2) | 合同金额 | |
-| settlement_amount | decimal(15,2) | 结算金额 | |
-| purchase_method | varchar(50) | 采购方式 | |
-| supplier_name | varchar(200) | 中标供应商名称 | |
-| contact_person | varchar(50) | 供应商联系人 | |
-| contact_phone | varchar(20) | 供应商联系电话 | |
-| supplier_uscc | varchar(18) | 供应商统一信用代码 | |
-| supplier_bank_account | varchar(50) | 供应商银行账户 | |
-| apply_date | date | 采购申请日期 | |
-| plan_approve_date | date | 采购计划批准日期 | |
-| announce_date | date | 采购公告发布日期 | |
-| bid_open_date | date | 开标日期 | |
-| contract_sign_date | date | 合同签订日期 | |
-| expected_delivery_date | date | 预计交货日期 | |
-| actual_delivery_date | date | 实际交货日期 | |
-| acceptance_date | date | 验收日期 | |
-| settlement_date | date | 结算日期 | |
-| applicant_id | varchar(20) | 申请人工号 | |
-| applicant_name | varchar(50) | 申请人姓名 | |
-| apply_department | varchar(100) | 申请部门 | |
-| purchase_leader_id | varchar(20) | 采购负责人工号 | |
-| purchase_leader_name | varchar(50) | 采购负责人姓名 | |
-| purchase_department | varchar(100) | 采购部门 | |
-| create_time | datetime | 创建时间 | 自动填充 |
-| update_time | datetime | 更新时间 | 自动填充 |
-| created_by | varchar(64) | 创建人 | 自动填充 |
-| updated_by | varchar(64) | 更新人 | 自动填充 |
+| 字段名 | 类型 | 说明 | 备注 |
+|------------------------|---------------|-----------|------|
+| purchase_id | varchar(32) | 采购事项ID | 主键 |
+| purchase_category | varchar(50) | 采购类别 | |
+| project_name | varchar(200) | 项目名称 | |
+| subject_name | varchar(200) | 标的物名称 | |
+| subject_desc | varchar(500) | 标的物描述 | |
+| purchase_qty | decimal(10,2) | 采购数量 | |
+| budget_amount | decimal(15,2) | 预算金额 | |
+| bid_amount | decimal(15,2) | 中标金额 | |
+| actual_amount | decimal(15,2) | 实际采购金额 | |
+| contract_amount | decimal(15,2) | 合同金额 | |
+| settlement_amount | decimal(15,2) | 结算金额 | |
+| purchase_method | varchar(50) | 采购方式 | |
+| supplier_name | varchar(200) | 中标供应商名称 | |
+| contact_person | varchar(50) | 供应商联系人 | |
+| contact_phone | varchar(20) | 供应商联系电话 | |
+| supplier_uscc | varchar(18) | 供应商统一信用代码 | |
+| supplier_bank_account | varchar(50) | 供应商银行账户 | |
+| apply_date | date | 采购申请日期 | |
+| plan_approve_date | date | 采购计划批准日期 | |
+| announce_date | date | 采购公告发布日期 | |
+| bid_open_date | date | 开标日期 | |
+| contract_sign_date | date | 合同签订日期 | |
+| expected_delivery_date | date | 预计交货日期 | |
+| actual_delivery_date | date | 实际交货日期 | |
+| acceptance_date | date | 验收日期 | |
+| settlement_date | date | 结算日期 | |
+| applicant_id | varchar(20) | 申请人工号 | |
+| applicant_name | varchar(50) | 申请人姓名 | |
+| apply_department | varchar(100) | 申请部门 | |
+| purchase_leader_id | varchar(20) | 采购负责人工号 | |
+| purchase_leader_name | varchar(50) | 采购负责人姓名 | |
+| purchase_department | varchar(100) | 采购部门 | |
+| create_time | datetime | 创建时间 | 自动填充 |
+| update_time | datetime | 更新时间 | 自动填充 |
+| created_by | varchar(64) | 创建人 | 自动填充 |
+| updated_by | varchar(64) | 更新人 | 自动填充 |
### B. 菜单权限配置
@@ -744,25 +763,25 @@ source sql/ccdi_purchase_transaction_menu.sql;
### 前端交互流程
1. **上传文件**
- - 用户点击"导入"按钮
- - 选择Excel文件
- - 点击"确定"上传
- - **导入对话框立即关闭**
+ - 用户点击"导入"按钮
+ - 选择Excel文件
+ - 点击"确定"上传
+ - **导入对话框立即关闭**
2. **后台处理**
- - 右上角显示通知:"导入任务已提交,正在后台处理中,处理完成后将通知您"
- - 系统每2秒轮询一次导入状态
+ - 右上角显示通知:"导入任务已提交,正在后台处理中,处理完成后将通知您"
+ - 系统每2秒轮询一次导入状态
3. **导入完成**
- - 全部成功:显示绿色通知"导入完成!全部成功!共导入N条数据"
- - 部分失败:显示橙色通知"导入完成!成功N条,失败M条"
- - 如果有失败记录,操作栏显示"查看导入失败记录"按钮
+ - 全部成功:显示绿色通知"导入完成!全部成功!共导入N条数据"
+ - 部分失败:显示橙色通知"导入完成!成功N条,失败M条"
+ - 如果有失败记录,操作栏显示"查看导入失败记录"按钮
4. **查看失败记录**
- - 点击"查看导入失败记录"按钮
- - 打开对话框显示分页的失败记录
- - 包含字段:采购事项ID、项目名称、标的物名称、失败原因
- - 支持清除历史记录
+ - 点击"查看导入失败记录"按钮
+ - 打开对话框显示分页的失败记录
+ - 包含字段:采购事项ID、项目名称、标的物名称、失败原因
+ - 支持清除历史记录
### 状态持久化
@@ -778,10 +797,10 @@ source sql/ccdi_purchase_transaction_menu.sql;
## 版本历史
-| 版本 | 日期 | 说明 | 作者 |
-|------|------|------|------|
+| 版本 | 日期 | 说明 | 作者 |
+|-------|------------|-----------------|-------|
| 1.0.0 | 2026-02-06 | 初始版本,采购交易信息管理接口 | ruoyi |
-| 1.1.0 | 2026-02-08 | 添加导入功能交互说明 | ruoyi |
+| 1.1.0 | 2026-02-08 | 添加导入功能交互说明 | ruoyi |
---
diff --git a/doc/api-docs/api/ccdi_staff_recruitment_api.md b/assets/api-docs/api/ccdi_staff_recruitment_api.md
similarity index 58%
rename from doc/api-docs/api/ccdi_staff_recruitment_api.md
rename to assets/api-docs/api/ccdi_staff_recruitment_api.md
index d7e5451..dd15064 100644
--- a/doc/api-docs/api/ccdi_staff_recruitment_api.md
+++ b/assets/api-docs/api/ccdi_staff_recruitment_api.md
@@ -31,17 +31,17 @@
**请求参数:**
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|-------|------|------|------|--------|
-| pageNum | Integer | 否 | 页码,默认1 | 1 |
-| pageSize | Integer | 否 | 每页条数,默认10 | 10 |
-| recruitName | String | 否 | 招聘项目名称(模糊查询) | 2025春季招聘 |
-| posName | String | 否 | 职位名称(模糊查询) | 软件工程师 |
-| candName | String | 否 | 候选人姓名(模糊查询) | 张三 |
-| candId | String | 否 | 证件号码(精确查询) | 110101199001011234 |
-| admitStatus | String | 否 | 录用状态(精确查询) | 录用/未录用/放弃 |
-| interviewerName | String | 否 | 面试官姓名(模糊查询,查询面试官1或2) | 李四 |
-| interviewerId | String | 否 | 面试官工号(精确查询,查询面试官1或2) | 10001 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|-----------------|---------|----|----------------------|--------------------|
+| pageNum | Integer | 否 | 页码,默认1 | 1 |
+| pageSize | Integer | 否 | 每页条数,默认10 | 10 |
+| recruitName | String | 否 | 招聘项目名称(模糊查询) | 2025春季招聘 |
+| posName | String | 否 | 职位名称(模糊查询) | 软件工程师 |
+| candName | String | 否 | 候选人姓名(模糊查询) | 张三 |
+| candId | String | 否 | 证件号码(精确查询) | 110101199001011234 |
+| admitStatus | String | 否 | 录用状态(精确查询) | 录用/未录用/放弃 |
+| interviewerName | String | 否 | 面试官姓名(模糊查询,查询面试官1或2) | 李四 |
+| interviewerId | String | 否 | 面试官工号(精确查询,查询面试官1或2) | 10001 |
**响应示例:**
@@ -90,9 +90,9 @@
**路径参数:**
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|-------|------|------|------|--------|
-| recruitId | String | 是 | 招聘项目编号 | REC20250205001 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|-----------|--------|----|--------|----------------|
+| recruitId | String | 是 | 招聘项目编号 | REC20250205001 |
**响应示例:**
@@ -165,20 +165,20 @@
**字段校验规则:**
-| 字段 | 校验规则 | 错误提示 |
-|-----|---------|---------|
-| recruitId | @NotBlank, @Size(max=32) | 招聘项目编号不能为空/长度不能超过32 |
-| recruitName | @NotBlank, @Size(max=100) | 招聘项目名称不能为空/长度不能超过100 |
-| posName | @NotBlank, @Size(max=100) | 职位名称不能为空/长度不能超过100 |
-| posCategory | @NotBlank, @Size(max=50) | 职位类别不能为空/长度不能超过50 |
-| posDesc | @NotBlank | 职位描述不能为空 |
-| candName | @NotBlank, @Size(max=20) | 应聘人员姓名不能为空/长度不能超过20 |
-| candEdu | @NotBlank, @Size(max=20) | 应聘人员学历不能为空/长度不能超过20 |
-| candId | @NotBlank, @Pattern(身份证正则) | 证件号码不能为空/格式不正确 |
-| candSchool | @NotBlank, @Size(max=50) | 应聘人员毕业院校不能为空/长度不能超过50 |
-| candMajor | @NotBlank, @Size(max=30) | 应聘人员专业不能为空/长度不能超过30 |
-| candGrad | @NotBlank, @Pattern(YYYYMM) | 毕业年月不能为空/格式不正确 |
-| admitStatus | @NotBlank, @EnumValid | 录用情况不能为空/状态值不合法 |
+| 字段 | 校验规则 | 错误提示 |
+|-------------|-----------------------------|-----------------------|
+| recruitId | @NotBlank, @Size(max=32) | 招聘项目编号不能为空/长度不能超过32 |
+| recruitName | @NotBlank, @Size(max=100) | 招聘项目名称不能为空/长度不能超过100 |
+| posName | @NotBlank, @Size(max=100) | 职位名称不能为空/长度不能超过100 |
+| posCategory | @NotBlank, @Size(max=50) | 职位类别不能为空/长度不能超过50 |
+| posDesc | @NotBlank | 职位描述不能为空 |
+| candName | @NotBlank, @Size(max=20) | 应聘人员姓名不能为空/长度不能超过20 |
+| candEdu | @NotBlank, @Size(max=20) | 应聘人员学历不能为空/长度不能超过20 |
+| candId | @NotBlank, @Pattern(身份证正则) | 证件号码不能为空/格式不正确 |
+| candSchool | @NotBlank, @Size(max=50) | 应聘人员毕业院校不能为空/长度不能超过50 |
+| candMajor | @NotBlank, @Size(max=30) | 应聘人员专业不能为空/长度不能超过30 |
+| candGrad | @NotBlank, @Pattern(YYYYMM) | 毕业年月不能为空/格式不正确 |
+| admitStatus | @NotBlank, @EnumValid | 录用情况不能为空/状态值不合法 |
**响应示例:**
@@ -243,9 +243,9 @@
**路径参数:**
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|-------|------|------|------|--------|
-| recruitIds | String[] | 是 | 招聘项目编号数组,多个用逗号分隔 | REC20250205001,REC20250205002 |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|------------|----------|----|------------------|-------------------------------|
+| recruitIds | String[] | 是 | 招聘项目编号数组,多个用逗号分隔 | REC20250205001,REC20250205002 |
**响应示例:**
@@ -274,24 +274,24 @@
**模板字段顺序:**
-| 序号 | 字段名 | 说明 | 必填 |
-|-----|--------|------|------|
-| 1 | 招聘项目编号 | 唯一标识 | 是 |
-| 2 | 招聘项目名称 | - | 是 |
-| 3 | 职位名称 | - | 是 |
-| 4 | 职位类别 | - | 是 |
-| 5 | 职位描述 | - | 是 |
-| 6 | 应聘人员姓名 | - | 是 |
-| 7 | 应聘人员学历 | - | 是 |
-| 8 | 应聘人员证件号码 | 身份证号 | 是 |
-| 9 | 应聘人员毕业院校 | - | 是 |
-| 10 | 应聘人员专业 | - | 是 |
-| 11 | 应聘人员毕业年月 | 格式:YYYYMM | 是 |
-| 12 | 录用情况 | 录用/未录用/放弃 | 是 |
-| 13 | 面试官1姓名 | - | 否 |
-| 14 | 面试官1工号 | - | 否 |
-| 15 | 面试官2姓名 | - | 否 |
-| 16 | 面试官2工号 | - | 否 |
+| 序号 | 字段名 | 说明 | 必填 |
+|----|----------|-----------|----|
+| 1 | 招聘项目编号 | 唯一标识 | 是 |
+| 2 | 招聘项目名称 | - | 是 |
+| 3 | 职位名称 | - | 是 |
+| 4 | 职位类别 | - | 是 |
+| 5 | 职位描述 | - | 是 |
+| 6 | 应聘人员姓名 | - | 是 |
+| 7 | 应聘人员学历 | - | 是 |
+| 8 | 应聘人员证件号码 | 身份证号 | 是 |
+| 9 | 应聘人员毕业院校 | - | 是 |
+| 10 | 应聘人员专业 | - | 是 |
+| 11 | 应聘人员毕业年月 | 格式:YYYYMM | 是 |
+| 12 | 录用情况 | 录用/未录用/放弃 | 是 |
+| 13 | 面试官1姓名 | - | 否 |
+| 14 | 面试官1工号 | - | 否 |
+| 15 | 面试官2姓名 | - | 否 |
+| 16 | 面试官2工号 | - | 否 |
### 3.2 批量导入
@@ -305,10 +305,10 @@
**请求参数:**
-| 参数名 | 类型 | 必填 | 说明 | 示例值 |
-|-------|------|------|------|--------|
-| updateSupport | Boolean | 否 | 是否更新已存在的数据 | true |
-| file | File | 是 | Excel文件 | - |
+| 参数名 | 类型 | 必填 | 说明 | 示例值 |
+|---------------|---------|----|------------|------|
+| updateSupport | Boolean | 否 | 是否更新已存在的数据 | true |
+| file | File | 是 | Excel文件 | - |
**请求类型:** `multipart/form-data`
@@ -350,11 +350,11 @@
### 4.1 录用状态枚举 (AdmitStatus)
-| 枚举值 | 说明 |
-|--------|------|
-| 录用 | 已录用该候选人 |
+| 枚举值 | 说明 |
+|-----|---------|
+| 录用 | 已录用该候选人 |
| 未录用 | 未录用该候选人 |
-| 放弃 | 候选人放弃 |
+| 放弃 | 候选人放弃 |
### 4.2 CcdiStaffRecruitmentVO
@@ -368,24 +368,24 @@ Excel导入导出对象,使用EasyExcel注解。
## 5. 错误码说明
-| 错误码 | 说明 |
-|--------|------|
-| 200 | 操作成功 |
-| 400 | 参数校验失败 |
+| 错误码 | 说明 |
+|-----|----------|
+| 200 | 操作成功 |
+| 400 | 参数校验失败 |
| 401 | 未授权,请先登录 |
-| 403 | 无权限访问 |
-| 404 | 资源不存在 |
-| 409 | 主键冲突 |
-| 500 | 服务器内部错误 |
+| 403 | 无权限访问 |
+| 404 | 资源不存在 |
+| 409 | 主键冲突 |
+| 500 | 服务器内部错误 |
### 常见业务错误
-| 错误信息 | 说明 |
-|---------|------|
-| 该招聘项目编号已存在 | 新增时recruitId重复 |
-| 招聘项目编号不能为空 | recruitId字段为空 |
-| 证件号码格式不正确 | 身份证号格式验证失败 |
-| 毕业年月格式不正确 | candGrad不是YYYYMM格式 |
+| 错误信息 | 说明 |
+|------------|--------------------|
+| 该招聘项目编号已存在 | 新增时recruitId重复 |
+| 招聘项目编号不能为空 | recruitId字段为空 |
+| 证件号码格式不正确 | 身份证号格式验证失败 |
+| 毕业年月格式不正确 | candGrad不是YYYYMM格式 |
| 录用情况状态值不合法 | admitStatus不是枚举值之一 |
---
diff --git a/doc/api-docs/api/中介黑名单管理API文档-v2.0.md b/assets/api-docs/api/中介黑名单管理API文档-v2.0.md
similarity index 59%
rename from doc/api-docs/api/中介黑名单管理API文档-v2.0.md
rename to assets/api-docs/api/中介黑名单管理API文档-v2.0.md
index 6144a1d..5fdaa88 100644
--- a/doc/api-docs/api/中介黑名单管理API文档-v2.0.md
+++ b/assets/api-docs/api/中介黑名单管理API文档-v2.0.md
@@ -24,15 +24,16 @@
**请求参数** (Query Params):
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| name | String | 否 | 姓名/机构名称(模糊查询) |
-| certificateNo | String | 否 | 证件号/统一社会信用代码(精确查询) |
-| intermediaryType | String | 否 | 中介类型(1=个人, 2=实体) |
-| pageNum | Integer | 否 | 页码(默认1) |
-| pageSize | Integer | 否 | 每页数量(默认10) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------------|---------|----|--------------------|
+| name | String | 否 | 姓名/机构名称(模糊查询) |
+| certificateNo | String | 否 | 证件号/统一社会信用代码(精确查询) |
+| intermediaryType | String | 否 | 中介类型(1=个人, 2=实体) |
+| pageNum | Integer | 否 | 页码(默认1) |
+| pageSize | Integer | 否 | 每页数量(默认10) |
**响应示例**:
+
```json
{
"code": 200,
@@ -57,18 +58,18 @@
**响应字段说明**:
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| bizId | String | 业务ID |
-| name | String | 姓名/机构名称 |
-| certificateNo | String | 证件号/统一社会信用代码 |
-| intermediaryType | String | 中介类型(1=个人, 2=实体) |
-| intermediaryTypeName | String | 中介类型名称 |
-| status | String | 状态(0=正常, 1=停用) |
-| statusName | String | 状态名称 |
-| remark | String | 备注 |
-| createBy | String | 创建人 |
-| createTime | String | 创建时间 |
+| 字段名 | 类型 | 说明 |
+|----------------------|--------|------------------|
+| bizId | String | 业务ID |
+| name | String | 姓名/机构名称 |
+| certificateNo | String | 证件号/统一社会信用代码 |
+| intermediaryType | String | 中介类型(1=个人, 2=实体) |
+| intermediaryTypeName | String | 中介类型名称 |
+| status | String | 状态(0=正常, 1=停用) |
+| statusName | String | 状态名称 |
+| remark | String | 备注 |
+| createBy | String | 创建人 |
+| createTime | String | 创建时间 |
---
@@ -80,11 +81,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| bizId | String | 是 | 业务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|-------|--------|----|------|
+| bizId | String | 是 | 业务ID |
**响应示例**:
+
```json
{
"code": 200,
@@ -129,11 +131,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| socialCreditCode | String | 是 | 统一社会信用代码 |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------------|--------|----|----------|
+| socialCreditCode | String | 是 | 统一社会信用代码 |
**响应示例**:
+
```json
{
"code": 200,
@@ -178,6 +181,7 @@
**权限要求**: `ccdi:intermediary:add`
**请求体** (application/json):
+
```json
{
"name": "张三",
@@ -201,26 +205,27 @@
**字段说明**:
-| 字段名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| name | String | 是 | 姓名(最大100字符) |
-| personId | String | 是 | 证件号码(最大50字符) |
-| personType | String | 否 | 人员类型 |
-| personSubType | String | 否 | 人员子类型 |
-| relationType | String | 否 | 关系类型 |
-| gender | String | 否 | 性别(M=男, F=女, O=其他) |
-| idType | String | 否 | 证件类型 |
-| mobile | String | 否 | 手机号码(最大20字符) |
-| wechatNo | String | 否 | 微信号(最大50字符) |
-| contactAddress | String | 否 | 联系地址(最大200字符) |
-| company | String | 否 | 所在公司(最大200字符) |
-| socialCreditCode | String | 否 | 企业统一信用码(最大50字符) |
-| position | String | 否 | 职位(最大100字符) |
-| relatedNumId | String | 否 | 关联人员ID(最大50字符) |
-| relation | String | 否 | 关联关系(最大50字符) |
-| remark | String | 否 | 备注(最大500字符) |
+| 字段名 | 类型 | 必填 | 说明 |
+|------------------|--------|----|--------------------|
+| name | String | 是 | 姓名(最大100字符) |
+| personId | String | 是 | 证件号码(最大50字符) |
+| personType | String | 否 | 人员类型 |
+| personSubType | String | 否 | 人员子类型 |
+| relationType | String | 否 | 关系类型 |
+| gender | String | 否 | 性别(M=男, F=女, O=其他) |
+| idType | String | 否 | 证件类型 |
+| mobile | String | 否 | 手机号码(最大20字符) |
+| wechatNo | String | 否 | 微信号(最大50字符) |
+| contactAddress | String | 否 | 联系地址(最大200字符) |
+| company | String | 否 | 所在公司(最大200字符) |
+| socialCreditCode | String | 否 | 企业统一信用码(最大50字符) |
+| position | String | 否 | 职位(最大100字符) |
+| relatedNumId | String | 否 | 关联人员ID(最大50字符) |
+| relation | String | 否 | 关联关系(最大50字符) |
+| remark | String | 否 | 备注(最大500字符) |
**响应示例**:
+
```json
{
"code": 200,
@@ -237,6 +242,7 @@
**权限要求**: `ccdi:intermediary:add`
**请求体** (application/json):
+
```json
{
"enterpriseName": "XX中介公司",
@@ -261,23 +267,24 @@
**字段说明**:
-| 字段名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| enterpriseName | String | 是 | 机构名称(最大200字符) |
-| socialCreditCode | String | 否 | 统一社会信用代码(最大50字符) |
-| enterpriseType | String | 否 | 主体类型(最大50字符) |
-| enterpriseNature | String | 否 | 企业性质(最大50字符) |
-| industryClass | String | 否 | 行业分类(最大100字符) |
-| industryName | String | 否 | 所属行业(最大100字符) |
-| establishDate | Date | 否 | 成立日期 |
-| registerAddress | String | 否 | 注册地址(最大500字符) |
-| legalRepresentative | String | 否 | 法定代表人(最大100字符) |
-| legalCertType | String | 否 | 法定代表人证件类型(最大50字符) |
-| legalCertNo | String | 否 | 法定代表人证件号码(最大50字符) |
-| shareholder1-5 | String | 否 | 股东信息(每个最大100字符) |
-| remark | String | 否 | 备注(最大500字符) |
+| 字段名 | 类型 | 必填 | 说明 |
+|---------------------|--------|----|-------------------|
+| enterpriseName | String | 是 | 机构名称(最大200字符) |
+| socialCreditCode | String | 否 | 统一社会信用代码(最大50字符) |
+| enterpriseType | String | 否 | 主体类型(最大50字符) |
+| enterpriseNature | String | 否 | 企业性质(最大50字符) |
+| industryClass | String | 否 | 行业分类(最大100字符) |
+| industryName | String | 否 | 所属行业(最大100字符) |
+| establishDate | Date | 否 | 成立日期 |
+| registerAddress | String | 否 | 注册地址(最大500字符) |
+| legalRepresentative | String | 否 | 法定代表人(最大100字符) |
+| legalCertType | String | 否 | 法定代表人证件类型(最大50字符) |
+| legalCertNo | String | 否 | 法定代表人证件号码(最大50字符) |
+| shareholder1-5 | String | 否 | 股东信息(每个最大100字符) |
+| remark | String | 否 | 备注(最大500字符) |
**响应示例**:
+
```json
{
"code": 200,
@@ -294,6 +301,7 @@
**权限要求**: `ccdi:intermediary:edit`
**请求体** (application/json):
+
```json
{
"bizId": "I202602040001",
@@ -319,6 +327,7 @@
**字段说明**: 与新增个人中介相同,bizId为必填项
**响应示例**:
+
```json
{
"code": 200,
@@ -335,6 +344,7 @@
**权限要求**: `ccdi:intermediary:edit`
**请求体** (application/json):
+
```json
{
"socialCreditCode": "91110000123456789X",
@@ -360,6 +370,7 @@
**字段说明**: 与新增实体中介相同,socialCreditCode为必填项
**响应示例**:
+
```json
{
"code": 200,
@@ -377,11 +388,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| ids | String[] | 是 | 业务ID数组(逗号分隔) |
+| 参数名 | 类型 | 必填 | 说明 |
+|-----|----------|----|--------------|
+| ids | String[] | 是 | 业务ID数组(逗号分隔) |
**响应示例**:
+
```json
{
"code": 200,
@@ -399,12 +411,13 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| personId | String | 是 | 证件号码 |
-| bizId | String | 否 | 排除的业务ID(修改时使用) |
+| 参数名 | 类型 | 必填 | 说明 |
+|----------|--------|----|----------------|
+| personId | String | 是 | 证件号码 |
+| bizId | String | 否 | 排除的业务ID(修改时使用) |
**响应示例**:
+
```json
{
"code": 200,
@@ -425,12 +438,13 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| socialCreditCode | String | 是 | 统一社会信用代码 |
-| excludeId | String | 否 | 排除的ID(修改时使用) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------------|--------|----|--------------|
+| socialCreditCode | String | 是 | 统一社会信用代码 |
+| excludeId | String | 否 | 排除的ID(修改时使用) |
**响应示例**:
+
```json
{
"code": 200,
@@ -454,9 +468,11 @@
**Excel格式说明**:
**Sheet1: 个人中介信息**
-| 姓名 | 人员类型 | 人员子类型 | 关系类型 | 性别▼ | 证件类型▼ | 证件号码 | 手机号码 | 微信号 | 联系地址 | 所在公司 | 企业统一信用码 | 职位 | 关联人员ID | 关联关系 | 备注 |
+| 姓名 | 人员类型 | 人员子类型 | 关系类型 | 性别▼ | 证件类型▼ | 证件号码 | 手机号码 | 微信号 | 联系地址 | 所在公司 |
+企业统一信用码 | 职位 | 关联人员ID | 关联关系 | 备注 |
|------|---------|-----------|---------|-------|-----------|---------|---------|--------|---------|---------|--------------|-----|-----------|---------|------|
-| 张三 | 中介 | 本人 | 正常 | 男 | 身份证 | 110101199001011234 | 13800138000 | zhangsan | 北京市朝阳区 | XX公司 | 91110000XXXXXXXXXX | 经纪人 | - | - | 测试 |
+| 张三 | 中介 | 本人 | 正常 | 男 | 身份证 | 110101199001011234 | 13800138000 | zhangsan | 北京市朝阳区 | XX公司 |
+91110000XXXXXXXXXX | 经纪人 | - | - | 测试 |
**注**: 带▼标记的列包含下拉框,选项来自字典
@@ -473,9 +489,11 @@
**Excel格式说明**:
**Sheet1: 实体中介信息**
-| 机构名称 | 统一社会信用代码 | 主体类型▼ | 企业性质▼ | 行业分类 | 所属行业 | 成立日期 | 注册地址 | 法定代表人 | 法定代表人证件类型 | 法定代表人证件号码 | 股东1 | 股东2 | 股东3 | 股东4 | 股东5 | 备注 |
+| 机构名称 | 统一社会信用代码 | 主体类型▼ | 企业性质▼ | 行业分类 | 所属行业 | 成立日期 | 注册地址 | 法定代表人 |
+法定代表人证件类型 | 法定代表人证件号码 | 股东1 | 股东2 | 股东3 | 股东4 | 股东5 | 备注 |
|---------|-----------------|-----------|-----------|---------|---------|---------|---------|-----------|-------------------|-------------------|-------|-------|-------|-------|-------|------|
-| XX公司 | 91110000XXXXXXXXXX | 有限责任公司 | 民企 | 房地产 | 房地产业 | 2020-01-01 | 北京市朝阳区 | 张三 | 身份证 | 110101199001011234 | 李四 | 王五 | - | - | - | - |
+| XX公司 | 91110000XXXXXXXXXX | 有限责任公司 | 民企 | 房地产 | 房地产业 | 2020-01-01 | 北京市朝阳区 | 张三 | 身份证 |
+110101199001011234 | 李四 | 王五 | - | - | - | - |
---
@@ -487,12 +505,13 @@
**请求参数** (multipart/form-data):
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | File | 是 | Excel文件 |
-| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) |
+| 参数名 | 类型 | 必填 | 说明 |
+|---------------|---------|----|--------------------|
+| file | File | 是 | Excel文件 |
+| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) |
**响应示例**:
+
```json
{
"code": 200,
@@ -510,12 +529,13 @@
**请求参数** (multipart/form-data):
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | File | 是 | Excel文件 |
-| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) |
+| 参数名 | 类型 | 必填 | 说明 |
+|---------------|---------|----|--------------------|
+| file | File | 是 | Excel文件 |
+| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) |
**响应示例**:
+
```json
{
"code": 200,
@@ -529,39 +549,39 @@
导入模板中的下拉框选项来自系统字典管理,相关字典类型:
-| 字典类型 | 字典名称 | 用途 |
-|---------|---------|------|
-| ccdi_indiv_gender | 个人中介性别 | 个人中介模板性别下拉框 |
-| ccdi_certificate_type | 证件类型 | 个人中介模板证件类型下拉框 |
-| ccdi_entity_type | 主体类型 | 机构中介模板主体类型下拉框 |
-| ccdi_enterprise_nature | 企业性质 | 机构中介模板企业性质下拉框 |
-| ccdi_data_source | 数据来源 | 数据来源字段映射 |
+| 字典类型 | 字典名称 | 用途 |
+|------------------------|--------|---------------|
+| ccdi_indiv_gender | 个人中介性别 | 个人中介模板性别下拉框 |
+| ccdi_certificate_type | 证件类型 | 个人中介模板证件类型下拉框 |
+| ccdi_entity_type | 主体类型 | 机构中介模板主体类型下拉框 |
+| ccdi_enterprise_nature | 企业性质 | 机构中介模板企业性质下拉框 |
+| ccdi_data_source | 数据来源 | 数据来源字段映射 |
---
## 错误码说明
-| HTTP状态码 | 错误码 | 说明 |
-|-----------|--------|------|
-| 200 | 200 | 操作成功 |
-| 401 | 401 | 未授权,请先登录 |
-| 403 | 403 | 无权限访问 |
-| 500 | 500 | 服务器内部错误 |
+| HTTP状态码 | 错误码 | 说明 |
+|---------|-----|----------|
+| 200 | 200 | 操作成功 |
+| 401 | 401 | 未授权,请先登录 |
+| 403 | 403 | 无权限访问 |
+| 500 | 500 | 服务器内部错误 |
---
## 业务错误信息
-| 错误信息 | 说明 |
-|----------|------|
-| 姓名不能为空 | 个人中介新增/修改时姓名为空 |
-| 机构名称不能为空 | 实体中介新增/修改时机构名称为空 |
-| 证件号码不能为空 | 个人中介新增/修改时证件号码为空 |
-| 该证件号已存在 | 新增/导入时证件号重复 |
-| 该统一社会信用代码已存在 | 新增/导入时信用代码重复 |
-| 姓名长度不能超过100个字符 | 姓名超长 |
-| 证件号码长度不能超过50个字符 | 证件号码超长 |
-| 机构名称长度不能超过200个字符 | 机构名称超长 |
+| 错误信息 | 说明 |
+|------------------|------------------|
+| 姓名不能为空 | 个人中介新增/修改时姓名为空 |
+| 机构名称不能为空 | 实体中介新增/修改时机构名称为空 |
+| 证件号码不能为空 | 个人中介新增/修改时证件号码为空 |
+| 该证件号已存在 | 新增/导入时证件号重复 |
+| 该统一社会信用代码已存在 | 新增/导入时信用代码重复 |
+| 姓名长度不能超过100个字符 | 姓名超长 |
+| 证件号码长度不能超过50个字符 | 证件号码超长 |
+| 机构名称长度不能超过200个字符 | 机构名称超长 |
---
@@ -576,12 +596,12 @@
## 更新日志
-| 版本 | 日期 | 说明 |
-|------|------|------|
-| 1.0.0 | 2026-01-29 | 初始版本,支持个人和机构分类管理 |
-| 1.1.0 | 2026-01-29 | 添加字典下拉框功能,分离个人/机构模板 |
-| 1.2.0 | 2026-01-29 | 修改接口分离:新增个人/机构专用修改接口,修复中介类型修改问题 |
-| 1.3.0 | 2026-01-29 | 新增接口分离:新增个人/机构专用新增接口,统一接口设计 |
+| 版本 | 日期 | 说明 |
+|-------|------------|---------------------------------------------------|
+| 1.0.0 | 2026-01-29 | 初始版本,支持个人和机构分类管理 |
+| 1.1.0 | 2026-01-29 | 添加字典下拉框功能,分离个人/机构模板 |
+| 1.2.0 | 2026-01-29 | 修改接口分离:新增个人/机构专用修改接口,修复中介类型修改问题 |
+| 1.3.0 | 2026-01-29 | 新增接口分离:新增个人/机构专用新增接口,统一接口设计 |
| 2.0.0 | 2026-02-04 | 重构版本:使用MyBatis Plus,分离DTO/VO,统一业务ID(bizId),优化查询接口 |
---
@@ -589,22 +609,26 @@
## 主要变更说明 (v2.0)
### 架构变更
+
- 使用MyBatis Plus替代原生MyBatis
- 分离DTO(请求)和VO(响应)对象
- 统一使用业务ID(bizId)作为主键
### 接口变更
+
- 查询详情接口分离为个人和实体两个接口
- 新增接口分离为个人和实体两个接口
- 修改接口分离为个人和实体两个接口
- 新增唯一性校验接口
### 数据模型变更
+
- 个人中介使用`personId`作为证件号字段
- 实体中介使用`socialCreditCode`作为统一社会信用代码字段
- 删除了`intermediaryId`,统一使用`bizId`
### 查询功能增强
+
- 支持按中介类型查询
- 支持按姓名/机构名称模糊查询
- 支持按证件号/统一社会信用代码精确查询
diff --git a/doc/api-docs/api/中介黑名单管理API文档.md b/assets/api-docs/api/中介黑名单管理API文档.md
similarity index 55%
rename from doc/api-docs/api/中介黑名单管理API文档.md
rename to assets/api-docs/api/中介黑名单管理API文档.md
index 5d3fac7..c499861 100644
--- a/doc/api-docs/api/中介黑名单管理API文档.md
+++ b/assets/api-docs/api/中介黑名单管理API文档.md
@@ -22,15 +22,16 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| name | String | 否 | 姓名/机构名称(模糊查询) |
-| certificateNo | String | 否 | 证件号/统一社会信用代码(精确查询) |
-| intermediaryType | String | 否 | 中介类型(1=个人, 2=机构) |
-| pageNum | Integer | 否 | 页码(默认1) |
-| pageSize | Integer | 否 | 每页数量(默认10) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------------|---------|----|--------------------|
+| name | String | 否 | 姓名/机构名称(模糊查询) |
+| certificateNo | String | 否 | 证件号/统一社会信用代码(精确查询) |
+| intermediaryType | String | 否 | 中介类型(1=个人, 2=机构) |
+| pageNum | Integer | 否 | 页码(默认1) |
+| pageSize | Integer | 否 | 每页数量(默认10) |
**响应示例**:
+
```json
{
"code": 200,
@@ -54,17 +55,17 @@
**响应字段说明**:
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| id | String | ID(个人为bizId,实体为socialCreditCode) |
-| name | String | 姓名/机构名称 |
-| certificateNo | String | 证件号/统一社会信用代码 |
-| intermediaryType | String | 中介类型(1=个人, 2=实体) |
-| personType | String | 人员类型/实体 |
-| company | String | 公司/机构名称 |
-| dataSource | String | 数据来源(MANUAL=手动, IMPORT=导入, API=接口) |
-| createTime | Date | 创建时间 |
-| updateTime | Date | 修改时间 |
+| 字段名 | 类型 | 说明 |
+|------------------|--------|------------------------------------|
+| id | String | ID(个人为bizId,实体为socialCreditCode) |
+| name | String | 姓名/机构名称 |
+| certificateNo | String | 证件号/统一社会信用代码 |
+| intermediaryType | String | 中介类型(1=个人, 2=实体) |
+| personType | String | 人员类型/实体 |
+| company | String | 公司/机构名称 |
+| dataSource | String | 数据来源(MANUAL=手动, IMPORT=导入, API=接口) |
+| createTime | Date | 创建时间 |
+| updateTime | Date | 修改时间 |
---
@@ -76,11 +77,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| bizId | String | 是 | 人员业务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|-------|--------|----|--------|
+| bizId | String | 是 | 人员业务ID |
**响应示例**:
+
```json
{
"code": 200,
@@ -111,27 +113,27 @@
**响应字段说明**:
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| bizId | String | 人员业务ID |
-| intermediaryType | String | 中介类型(固定为"1") |
-| name | String | 姓名 |
-| personType | String | 人员类型(房产中介、贷款中介等) |
-| personSubType | String | 人员子类型(本人、配偶、父亲等) |
-| gender | String | 性别(M=男, F=女, O=其他) |
-| idType | String | 证件类型(身份证、护照等) |
-| personId | String | 证件号码 |
-| mobile | String | 手机号码 |
-| wechatNo | String | 微信号 |
-| contactAddress | String | 联系地址 |
-| company | String | 所在公司 |
-| position | String | 职位 |
-| socialCreditCode | String | 企业统一信用码 |
-| relatedNumId | String | 关联人员ID |
-| relationType | String | 关联关系(配偶、父子、母女等) |
-| dataSource | String | 数据来源 |
-| remark | String | 备注 |
-| createTime | Date | 创建时间 |
+| 字段名 | 类型 | 说明 |
+|------------------|--------|--------------------|
+| bizId | String | 人员业务ID |
+| intermediaryType | String | 中介类型(固定为"1") |
+| name | String | 姓名 |
+| personType | String | 人员类型(房产中介、贷款中介等) |
+| personSubType | String | 人员子类型(本人、配偶、父亲等) |
+| gender | String | 性别(M=男, F=女, O=其他) |
+| idType | String | 证件类型(身份证、护照等) |
+| personId | String | 证件号码 |
+| mobile | String | 手机号码 |
+| wechatNo | String | 微信号 |
+| contactAddress | String | 联系地址 |
+| company | String | 所在公司 |
+| position | String | 职位 |
+| socialCreditCode | String | 企业统一信用码 |
+| relatedNumId | String | 关联人员ID |
+| relationType | String | 关联关系(配偶、父子、母女等) |
+| dataSource | String | 数据来源 |
+| remark | String | 备注 |
+| createTime | Date | 创建时间 |
---
@@ -143,11 +145,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| socialCreditCode | String | 是 | 统一社会信用代码 |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------------|--------|----|----------|
+| socialCreditCode | String | 是 | 统一社会信用代码 |
**响应示例**:
+
```json
{
"code": 200,
@@ -179,24 +182,24 @@
**响应字段说明**:
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| socialCreditCode | String | 统一社会信用代码 |
-| intermediaryType | String | 中介类型(固定为"2") |
-| enterpriseName | String | 机构名称 |
-| enterpriseType | String | 主体类型 |
-| enterpriseNature | String | 企业性质 |
-| industryClass | String | 行业分类 |
-| industryName | String | 所属行业 |
-| establishDate | Date | 成立日期 |
-| registerAddress | String | 注册地址 |
-| legalRepresentative | String | 法定代表人 |
-| legalCertType | String | 法定代表人证件类型 |
-| legalCertNo | String | 法定代表人证件号码 |
-| shareholder1-5 | String | 股东信息 |
-| dataSource | String | 数据来源 |
-| remark | String | 备注 |
-| createTime | Date | 创建时间 |
+| 字段名 | 类型 | 说明 |
+|---------------------|--------|--------------|
+| socialCreditCode | String | 统一社会信用代码 |
+| intermediaryType | String | 中介类型(固定为"2") |
+| enterpriseName | String | 机构名称 |
+| enterpriseType | String | 主体类型 |
+| enterpriseNature | String | 企业性质 |
+| industryClass | String | 行业分类 |
+| industryName | String | 所属行业 |
+| establishDate | Date | 成立日期 |
+| registerAddress | String | 注册地址 |
+| legalRepresentative | String | 法定代表人 |
+| legalCertType | String | 法定代表人证件类型 |
+| legalCertNo | String | 法定代表人证件号码 |
+| shareholder1-5 | String | 股东信息 |
+| dataSource | String | 数据来源 |
+| remark | String | 备注 |
+| createTime | Date | 创建时间 |
---
@@ -207,6 +210,7 @@
**权限要求**: `ccdi:intermediary:add`
**请求体**:
+
```json
{
"name": "张三",
@@ -229,25 +233,26 @@
**字段说明**:
-| 字段名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| name | String | 是 | 姓名(1-100字符) |
-| personId | String | 是 | 证件号码(不超过50字符) |
-| personType | String | 否 | 人员类型(枚举值,见下文) |
-| personSubType | String | 否 | 人员子类型(枚举值,见下文) |
-| gender | String | 否 | 性别(M=男, F=女, O=其他) |
-| idType | String | 否 | 证件类型(枚举值,见下文) |
-| mobile | String | 否 | 手机号码(不超过20字符) |
-| wechatNo | String | 否 | 微信号(不超过50字符) |
-| contactAddress | String | 否 | 联系地址(不超过200字符) |
-| company | String | 否 | 所在公司(不超过200字符) |
-| position | String | 否 | 职位(不超过100字符) |
-| socialCreditCode | String | 否 | 企业统一信用码(不超过50字符) |
-| relatedNumId | String | 否 | 关联人员ID(不超过50字符) |
-| relationType | String | 否 | 关联关系(枚举值,见下文) |
-| remark | String | 否 | 备注(不超过500字符) |
+| 字段名 | 类型 | 必填 | 说明 |
+|------------------|--------|----|--------------------|
+| name | String | 是 | 姓名(1-100字符) |
+| personId | String | 是 | 证件号码(不超过50字符) |
+| personType | String | 否 | 人员类型(枚举值,见下文) |
+| personSubType | String | 否 | 人员子类型(枚举值,见下文) |
+| gender | String | 否 | 性别(M=男, F=女, O=其他) |
+| idType | String | 否 | 证件类型(枚举值,见下文) |
+| mobile | String | 否 | 手机号码(不超过20字符) |
+| wechatNo | String | 否 | 微信号(不超过50字符) |
+| contactAddress | String | 否 | 联系地址(不超过200字符) |
+| company | String | 否 | 所在公司(不超过200字符) |
+| position | String | 否 | 职位(不超过100字符) |
+| socialCreditCode | String | 否 | 企业统一信用码(不超过50字符) |
+| relatedNumId | String | 否 | 关联人员ID(不超过50字符) |
+| relationType | String | 否 | 关联关系(枚举值,见下文) |
+| remark | String | 否 | 备注(不超过500字符) |
**响应示例**:
+
```json
{
"code": 200,
@@ -264,6 +269,7 @@
**权限要求**: `ccdi:intermediary:add`
**请求体**:
+
```json
{
"enterpriseName": "XX中介公司",
@@ -288,23 +294,24 @@
**字段说明**:
-| 字段名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| enterpriseName | String | 是 | 机构名称(1-200字符) |
-| socialCreditCode | String | 是 | 统一社会信用代码(不超过50字符) |
-| enterpriseType | String | 否 | 主体类型(枚举值,见下文) |
-| enterpriseNature | String | 否 | 企业性质(枚举值,见下文) |
-| industryClass | String | 否 | 行业分类(不超过100字符) |
-| industryName | String | 否 | 所属行业(不超过100字符) |
-| establishDate | Date | 否 | 成立日期(yyyy-MM-dd) |
-| registerAddress | String | 否 | 注册地址(不超过500字符) |
-| legalRepresentative | String | 否 | 法定代表人(不超过100字符) |
-| legalCertType | String | 否 | 法定代表人证件类型(枚举值) |
-| legalCertNo | String | 否 | 法定代表人证件号码(不超过50字符) |
-| shareholder1-5 | String | 否 | 股东信息(每个不超过100字符) |
-| remark | String | 否 | 备注(不超过500字符) |
+| 字段名 | 类型 | 必填 | 说明 |
+|---------------------|--------|----|--------------------|
+| enterpriseName | String | 是 | 机构名称(1-200字符) |
+| socialCreditCode | String | 是 | 统一社会信用代码(不超过50字符) |
+| enterpriseType | String | 否 | 主体类型(枚举值,见下文) |
+| enterpriseNature | String | 否 | 企业性质(枚举值,见下文) |
+| industryClass | String | 否 | 行业分类(不超过100字符) |
+| industryName | String | 否 | 所属行业(不超过100字符) |
+| establishDate | Date | 否 | 成立日期(yyyy-MM-dd) |
+| registerAddress | String | 否 | 注册地址(不超过500字符) |
+| legalRepresentative | String | 否 | 法定代表人(不超过100字符) |
+| legalCertType | String | 否 | 法定代表人证件类型(枚举值) |
+| legalCertNo | String | 否 | 法定代表人证件号码(不超过50字符) |
+| shareholder1-5 | String | 否 | 股东信息(每个不超过100字符) |
+| remark | String | 否 | 备注(不超过500字符) |
**响应示例**:
+
```json
{
"code": 200,
@@ -321,6 +328,7 @@
**权限要求**: `ccdi:intermediary:edit`
**请求体**:
+
```json
{
"bizId": "abc123xyz456",
@@ -345,6 +353,7 @@
**字段说明**: 与新增接口相同,但 `bizId` 为必填项。
**响应示例**:
+
```json
{
"code": 200,
@@ -361,6 +370,7 @@
**权限要求**: `ccdi:intermediary:edit`
**请求体**:
+
```json
{
"socialCreditCode": "91110000XXXXXXXXXX",
@@ -386,6 +396,7 @@
**字段说明**: 与新增接口相同。
**响应示例**:
+
```json
{
"code": 200,
@@ -403,13 +414,14 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| ids | String[] | 是 | ID数组(个人为bizId,实体为socialCreditCode) |
+| 参数名 | 类型 | 必填 | 说明 |
+|-----|----------|----|------------------------------------|
+| ids | String[] | 是 | ID数组(个人为bizId,实体为socialCreditCode) |
**示例**: `/ccdi/intermediary/abc123,91110000XXXXXXXXXX`
**响应示例**:
+
```json
{
"code": 200,
@@ -427,12 +439,13 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| personId | String | 是 | 证件号码 |
-| bizId | String | 否 | 排除的人员ID(修改时使用) |
+| 参数名 | 类型 | 必填 | 说明 |
+|----------|--------|----|----------------|
+| personId | String | 是 | 证件号码 |
+| bizId | String | 否 | 排除的人员ID(修改时使用) |
**响应示例**:
+
```json
{
"code": 200,
@@ -453,12 +466,13 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| socialCreditCode | String | 是 | 统一社会信用代码 |
-| excludeId | String | 否 | 排除的ID(修改时使用) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------------|--------|----|--------------|
+| socialCreditCode | String | 是 | 统一社会信用代码 |
+| excludeId | String | 否 | 排除的ID(修改时使用) |
**响应示例**:
+
```json
{
"code": 200,
@@ -480,6 +494,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -503,6 +518,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -528,6 +544,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -549,6 +566,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -571,6 +589,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -597,6 +616,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -620,6 +640,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -642,6 +663,7 @@
**权限要求**: 无
**响应示例**:
+
```json
{
"code": 200,
@@ -659,23 +681,23 @@
## 错误码说明
-| HTTP状态码 | 错误码 | 说明 |
-|-----------|--------|------|
-| 200 | 200 | 操作成功 |
-| 401 | 401 | 未授权,请先登录 |
-| 403 | 403 | 无权限访问 |
-| 500 | 500 | 服务器内部错误 |
+| HTTP状态码 | 错误码 | 说明 |
+|---------|-----|----------|
+| 200 | 200 | 操作成功 |
+| 401 | 401 | 未授权,请先登录 |
+| 403 | 403 | 无权限访问 |
+| 500 | 500 | 服务器内部错误 |
## 业务错误信息
-| 错误信息 | 说明 |
-|----------|------|
-| 姓名不能为空 | 新增/修改时姓名为空 |
-| 证件号码不能为空 | 新增时证件号码为空 |
-| 该证件号已存在 | 新增/导入时证件号重复 |
-| 该统一社会信用代码已存在 | 新增/导入时信用代码重复 |
-| 姓名长度不能超过100个字符 | 姓名超长 |
-| 证件号长度不能超过50个字符 | 证件号超长 |
+| 错误信息 | 说明 |
+|----------------|--------------|
+| 姓名不能为空 | 新增/修改时姓名为空 |
+| 证件号码不能为空 | 新增时证件号码为空 |
+| 该证件号已存在 | 新增/导入时证件号重复 |
+| 该统一社会信用代码已存在 | 新增/导入时信用代码重复 |
+| 姓名长度不能超过100个字符 | 姓名超长 |
+| 证件号长度不能超过50个字符 | 证件号超长 |
## 测试账号
@@ -683,44 +705,45 @@
- **密码**: `admin123`
**获取Token**: 调用 `POST /login/test` 接口获取Token,后续请求在 Header 中添加:
+
```
Authorization: Bearer {token}
```
## 更新日志
-| 版本 | 日期 | 说明 |
-|------|------|------|
+| 版本 | 日期 | 说明 |
+|-------|------------|---------------------------|
| 2.0.0 | 2026-02-05 | 统一字段命名,使用接口枚举,更新文档与实际代码一致 |
-| 1.3.0 | 2026-01-29 | 新增接口分离:个人/机构专用新增接口 |
-| 1.2.0 | 2026-01-29 | 修改接口分离:个人/机构专用修改接口 |
-| 1.1.0 | 2026-01-29 | 添加字典下拉框功能 |
-| 1.0.0 | 2026-01-29 | 初始版本 |
+| 1.3.0 | 2026-01-29 | 新增接口分离:个人/机构专用新增接口 |
+| 1.2.0 | 2026-01-29 | 修改接口分离:个人/机构专用修改接口 |
+| 1.1.0 | 2026-01-29 | 添加字典下拉框功能 |
+| 1.0.0 | 2026-01-29 | 初始版本 |
## 注意事项
1. **中介类型字段**:
- - 个人中介:`intermediaryType = "1"`
- - 实体中介:`intermediaryType = "2"`
+ - 个人中介:`intermediaryType = "1"`
+ - 实体中介:`intermediaryType = "2"`
2. **枚举值使用**:
- - 所有下拉选项字段应使用枚举接口返回的 `value` 值
- - 不要硬编码或使用字典表的 `dictValue`
+ - 所有下拉选项字段应使用枚举接口返回的 `value` 值
+ - 不要硬编码或使用字典表的 `dictValue`
3. **数据来源字段**:
- - 手动录入:`MANUAL`
- - 系统同步:`SYSTEM`
- - 批量导入:`IMPORT`
- - 接口获取:`API`
+ - 手动录入:`MANUAL`
+ - 系统同步:`SYSTEM`
+ - 批量导入:`IMPORT`
+ - 接口获取:`API`
4. **分页排序**:
- - 列表查询默认按 `updateTime` 降序排列
- - 使用 MyBatis Plus 分页插件
+ - 列表查询默认按 `updateTime` 降序排列
+ - 使用 MyBatis Plus 分页插件
5. **ID字段**:
- - 个人中介使用 `bizId` 作为唯一标识
- - 实体中介使用 `socialCreditCode` 作为唯一标识
+ - 个人中介使用 `bizId` 作为唯一标识
+ - 实体中介使用 `socialCreditCode` 作为唯一标识
6. **批量操作**:
- - 删除接口支持同时删除个人和实体中介
- - 根据ID长度自动判断类型(个人ID较长)
+ - 删除接口支持同时删除个人和实体中介
+ - 根据ID长度自动判断类型(个人ID较长)
diff --git a/doc/api-docs/api/中介黑名单管理API测试报告.md b/assets/api-docs/api/中介黑名单管理API测试报告.md
similarity index 96%
rename from doc/api-docs/api/中介黑名单管理API测试报告.md
rename to assets/api-docs/api/中介黑名单管理API测试报告.md
index 75f4e87..1ef8040 100644
--- a/doc/api-docs/api/中介黑名单管理API测试报告.md
+++ b/assets/api-docs/api/中介黑名单管理API测试报告.md
@@ -10,12 +10,12 @@
## 测试结果汇总
-| 指标 | 数值 |
-|------|------|
-| 测试场景总数 | 11 |
-| 通过数量 | 11 |
-| 失败数量 | 0 |
-| 通过率 | 100.00% |
+| 指标 | 数值 |
+|--------|---------|
+| 测试场景总数 | 11 |
+| 通过数量 | 11 |
+| 失败数量 | 0 |
+| 通过率 | 100.00% |
## 测试用例详情
@@ -25,6 +25,7 @@
**描述:** 使用测试账号登录获取认证token
**请求参数:**
+
```json
{
"username": "admin",
@@ -33,6 +34,7 @@
```
**测试结果:** ✅ 通过
+
- 成功获取token
- token格式正确
@@ -44,10 +46,12 @@
**描述:** 分页查询中介黑名单列表
**请求参数:**
+
- pageNum: 1
- pageSize: 10
**测试结果:** ✅ 通过
+
- 返回分页数据结构正确
- 包含 total 和 rows 字段
- 数据格式符合预期
@@ -60,6 +64,7 @@
**描述:** 新增个人类型的中介黑名单记录
**请求参数:**
+
```json
{
"name": "测试个人中介_20260129_164311",
@@ -70,6 +75,7 @@
```
**测试结果:** ✅ 通过
+
- 成功创建记录
- 返回状态码 200
- 成功获取到新创建的ID: 2005
@@ -82,6 +88,7 @@
**描述:** 新增机构类型的中介黑名单记录
**请求参数:**
+
```json
{
"name": "测试机构中介_20260129_164311",
@@ -92,6 +99,7 @@
```
**测试结果:** ✅ 通过
+
- 成功创建记录
- 返回状态码 200
- 成功获取到新创建的ID: 2006
@@ -104,9 +112,11 @@
**描述:** 根据ID获取中介详细信息
**请求参数:**
+
- intermediaryId: 2005
**测试结果:** ✅ 通过
+
- 成功获取详情信息
- 返回完整的数据结构
- 包含所有必要字段
@@ -119,6 +129,7 @@
**描述:** 修改已存在的中介信息
**请求参数:**
+
```json
{
"intermediaryId": 2005,
@@ -131,6 +142,7 @@
```
**测试结果:** ✅ 通过
+
- 成功更新记录
- 返回状态码 200
- 数据修改生效
@@ -143,11 +155,13 @@
**描述:** 导出中介黑名单数据为Excel文件
**请求参数:**
+
```json
{}
```
**测试结果:** ✅ 通过
+
- 成功导出Excel文件
- 文件格式正确
- 文件保存至: test_output/test6_export.xlsx
@@ -160,6 +174,7 @@
**描述:** 下载个人中介导入Excel模板
**测试结果:** ✅ 通过
+
- 成功下载模板文件
- 文件格式正确
- 文件保存至: test_output/test7_person_template.xlsx
@@ -172,6 +187,7 @@
**描述:** 下载机构中介导入Excel模板
**测试结果:** ✅ 通过
+
- 成功下载模板文件
- 文件格式正确
- 文件保存至: test_output/test8_entity_template.xlsx
@@ -184,11 +200,13 @@
**描述:** 按中介类型筛选查询
**请求参数:**
+
- pageNum: 1
- pageSize: 10
- intermediaryType: 1 (个人)
**测试结果:** ✅ 通过
+
- 查询结果正确
- 数据筛选生效
- 返回指定类型的数据
@@ -201,11 +219,13 @@
**描述:** 按状态筛选查询
**请求参数:**
+
- pageNum: 1
- pageSize: 10
- status: 1
**测试结果:** ✅ 通过
+
- 查询结果正确
- 数据筛选生效
- 返回指定状态的数据
@@ -218,9 +238,11 @@
**描述:** 批量删除中介黑名单记录
**请求参数:**
+
- intermediaryIds: 2005,2006
**测试结果:** ✅ 通过
+
- 成功删除记录
- 返回状态码 200
- 数据删除生效
@@ -230,6 +252,7 @@
## 测试文件清单
### 响应JSON文件
+
- `test1_list_response.json` - 查询列表响应
- `test2_add_person_response.json` - 新增个人中介响应
- `test3_add_entity_response.json` - 新增机构中介响应
@@ -240,11 +263,13 @@
- `test11_query_by_status_response.json` - 按状态查询响应
### Excel文件
+
- `test6_export.xlsx` - 导出的数据文件
- `test7_person_template.xlsx` - 个人中介导入模板
- `test8_entity_template.xlsx` - 机构中介导入模板
### 报告文件
+
- `test_report_20260129_164311.txt` - 详细测试日志
## 结论
@@ -252,6 +277,7 @@
**所有测试用例均已通过,中介黑名单管理API功能完整且运行正常。**
### 主要验证点
+
1. ✅ 认证授权机制正常
2. ✅ CRUD操作功能完整
3. ✅ 分页查询功能正常
@@ -260,6 +286,7 @@
6. ✅ 批量操作功能正常
### 建议
+
1. 建议在实际部署前进行压力测试
2. 建议添加更多的边界条件测试用例
3. 建议完善错误码和错误信息的文档
diff --git a/assets/api-docs/api/员工亲属关系导入API文档.md b/assets/api-docs/api/员工亲属关系导入API文档.md
new file mode 100644
index 0000000..cc5e7e1
--- /dev/null
+++ b/assets/api-docs/api/员工亲属关系导入API文档.md
@@ -0,0 +1,202 @@
+# 员工亲属关系导入 API 文档
+
+## 概述
+
+员工亲属关系导入模块提供员工亲属关系的批量导入功能。
+
+**基础路径**: `/ccdi/staffFmyRelation`
+
+**权限标识前缀**: `ccdi:staffFmyRelation`
+
+**数据表**: `ccdi_cust_fmy_relation`
+
+**关联表**:
+
+- `ccdi_base_staff` - 员工基础信息表(通过id_card关联)
+
+---
+
+## API 接口
+
+### 1. 异步导入员工亲属关系
+
+**接口地址**: `POST /ccdi/staffFmyRelation/importData`
+
+**权限要求**: `ccdi:staffFmyRelation:import`
+
+**请求参数**: FormData
+
+| 参数名 | 类型 | 必填 | 说明 |
+|---------------|---------|----|---------------------|
+| file | File | 是 | Excel文件 |
+| updateSupport | Boolean | 否 | 是否更新已存在的记录(默认false) |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "导入任务已提交,正在后台处理",
+ "data": {
+ "taskId": "abc123-def456-ghi789",
+ "status": "PROCESSING",
+ "message": "导入任务已提交,正在后台处理"
+ }
+}
+```
+
+**导入流程**:
+
+1. 上传Excel文件
+2. 后台立即返回taskId
+3. 使用taskId轮询查询导入状态
+4. 导入完成后查看失败记录(如有)
+
+**导入验证规则**:
+
+导入时会验证以下字段:
+
+| 字段名 | 验证规则 | 错误提示 |
+|---------|----------------------------------|-------------------------------------|
+| 员工身份证号 | 必须在员工信息表(ccdi_base_staff)中存在 | "第N行: 身份证号[XXX]不存在于员工信息表中,请先添加员工信息" |
+| 关系类型 | 不能为空,必须在字典中存在 | "第N行: 关系类型不能为空" |
+| 关系人姓名 | 不能为空 | "第N行: 关系人姓名不能为空" |
+| 关系人证件类型 | 不能为空 | "第N行: 关系人证件类型不能为空" |
+| 关系人证件号码 | 不能为空 | "第N行: 关系人证件号码不能为空" |
+| 手机号码1 | 如果填写,必须为有效手机号 | "第N行: 手机号码1格式不正确" |
+| 手机号码2 | 如果填写,必须为有效手机号 | "第N行: 手机号码2格式不正确" |
+| 性别 | 如果填写,必须是"男"、"女"、"其他"或"M"、"F"、"O" | "第N行: 性别只能是:男、女、其他 或 M、F、O" |
+
+**性能优化**:
+
+- 采用批量预验证方式,仅1次数据库查询身份证号存在性
+- 批量查询已存在的身份证号+关系人证件号码组合,避免重复导入
+
+---
+
+### 2. 查询导入状态
+
+**接口地址**: `GET /ccdi/staffFmyRelation/importStatus/{taskId}`
+
+**权限要求**: `ccdi:staffFmyRelation:import`
+
+**路径参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|--------|
+| taskId | String | 是 | 导入任务ID |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "查询成功",
+ "data": {
+ "taskId": "abc123-def456-ghi789",
+ "status": "COMPLETED",
+ "total": 100,
+ "successCount": 95,
+ "failureCount": 5,
+ "message": "导入完成"
+ }
+}
+```
+
+**状态说明**:
+
+| 状态 | 说明 |
+|-----------------|------|
+| PENDING | 等待处理 |
+| PROCESSING | 处理中 |
+| SUCCESS | 全部成功 |
+| PARTIAL_SUCCESS | 部分成功 |
+| FAILED | 处理失败 |
+
+---
+
+### 3. 查询导入失败记录
+
+**接口地址**: `GET /ccdi/staffFmyRelation/importFailures/{taskId}`
+
+**权限要求**: `ccdi:staffFmyRelation:import`
+
+**路径参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|--------|
+| taskId | String | 是 | 导入任务ID |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "查询成功",
+ "data": [
+ {
+ "personId": "999999999999999999",
+ "relationType": "父亲",
+ "relationName": "张三",
+ "relationCertType": "身份证",
+ "relationCertNo": "110101195501017890",
+ "errorMessage": "第2行: 身份证号[999999999999999999]不存在于员工信息表中,请先添加员工信息",
+ "rowNumber": 2
+ }
+ ]
+}
+```
+
+**失败记录字段说明**:
+
+| 字段名 | 类型 | 说明 |
+|------------------|---------|---------|
+| personId | String | 员工身份证号 |
+| relationType | String | 关系类型 |
+| relationName | String | 关系人姓名 |
+| relationCertType | String | 关系人证件类型 |
+| relationCertNo | String | 关系人证件号码 |
+| errorMessage | String | 错误信息 |
+| rowNumber | Integer | Excel行号 |
+
+---
+
+## Excel 模板字段说明
+
+| 字段名 | 是否必填 | 说明 |
+|---------|------|-------------|
+| 员工身份证号 | 是 | 必须在员工信息表中存在 |
+| 关系类型 | 是 | 下拉选择字典 |
+| 关系人姓名 | 是 | 不能为空 |
+| 性别 | 否 | 下拉选择字典 |
+| 出生日期 | 否 | 日期格式 |
+| 关系人证件类型 | 是 | 下拉选择字典 |
+| 关系人证件号码 | 是 | 不能为空 |
+| 手机号码1 | 否 | 手机号格式 |
+| 手机号码2 | 否 | 手机号格式 |
+| 微信名称1-3 | 否 | 自由输入 |
+| 详细联系地址 | 否 | 自由输入 |
+| 关系详细描述 | 否 | 自由输入 |
+| 生效日期 | 否 | 日期格式 |
+| 失效日期 | 否 | 日期格式 |
+| 备注 | 否 | 自由输入 |
+
+---
+
+## 错误码说明
+
+| 错误码 | 说明 |
+|-----|-------|
+| 200 | 操作成功 |
+| 401 | 未授权 |
+| 403 | 无权限 |
+| 500 | 服务器错误 |
+
+---
+
+## 更新日志
+
+**2026-02-11**:
+
+- 新增员工身份证号存在性校验
+- 优化导入性能,采用批量预验证方式
diff --git a/doc/api-docs/api/员工信息管理API文档.md b/assets/api-docs/api/员工信息管理API文档.md
similarity index 58%
rename from doc/api-docs/api/员工信息管理API文档.md
rename to assets/api-docs/api/员工信息管理API文档.md
index 27fb92e..ca96b84 100644
--- a/doc/api-docs/api/员工信息管理API文档.md
+++ b/assets/api-docs/api/员工信息管理API文档.md
@@ -22,17 +22,18 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| name | String | 否 | 姓名(模糊查询) |
-| employeeId | Long | 否 | 员工ID(柜员号,精确查询,7位数字) |
-| deptId | Long | 否 | 所属部门ID |
-| idCard | String | 否 | 身份证号(精确查询) |
-| status | String | 否 | 状态(0=在职, 1=离职) |
-| pageNum | Integer | 否 | 页码(默认1) |
-| pageSize | Integer | 否 | 每页数量(默认10) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------|---------|----|---------------------|
+| name | String | 否 | 姓名(模糊查询) |
+| employeeId | Long | 否 | 员工ID(柜员号,精确查询,7位数字) |
+| deptId | Long | 否 | 所属部门ID |
+| idCard | String | 否 | 身份证号(精确查询) |
+| status | String | 否 | 状态(0=在职, 1=离职) |
+| pageNum | Integer | 否 | 页码(默认1) |
+| pageSize | Integer | 否 | 每页数量(默认10) |
**响应示例**:
+
```json
{
"code": 200,
@@ -57,18 +58,18 @@
**响应字段说明**:
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| employeeId | Long | 员工ID(柜员号,7位数字) |
-| name | String | 姓名 |
-| deptId | Long | 所属部门ID |
-| deptName | String | 所属部门名称(关联 sys_dept 表) |
-| idCard | String | 身份证号 |
-| phone | String | 电话 |
-| hireDate | Date | 入职时间 |
-| status | String | 状态(0=在职, 1=离职) |
-| statusDesc | String | 状态描述 |
-| createTime | Date | 创建时间 |
+| 字段名 | 类型 | 说明 |
+|------------|--------|-----------------------|
+| employeeId | Long | 员工ID(柜员号,7位数字) |
+| name | String | 姓名 |
+| deptId | Long | 所属部门ID |
+| deptName | String | 所属部门名称(关联 sys_dept 表) |
+| idCard | String | 身份证号 |
+| phone | String | 电话 |
+| hireDate | Date | 入职时间 |
+| status | String | 状态(0=在职, 1=离职) |
+| statusDesc | String | 状态描述 |
+| createTime | Date | 创建时间 |
---
@@ -80,11 +81,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| employeeId | Long | 是 | 员工ID(柜员号) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------------|------|----|-----------|
+| employeeId | Long | 是 | 员工ID(柜员号) |
**响应示例**:
+
```json
{
"code": 200,
@@ -112,12 +114,14 @@
**权限要求**: `ccdi:employee:add`
**请求头**:
+
```
Content-Type: application/json
Authorization: Bearer {token}
```
**请求体**:
+
```json
{
"employeeId": 1000001,
@@ -132,17 +136,18 @@ Authorization: Bearer {token}
**字段说明**:
-| 字段名 | 类型 | 必填 | 说明 | 校验规则 |
-|--------|------|------|------|----------|
-| employeeId | Long | 是 | 员工ID(柜员号,7位数字) | 必填,7位数字,唯一 |
-| name | String | 是 | 姓名 | 最大100字符 |
-| deptId | Long | 是 | 所属部门ID | 必填 |
-| idCard | String | 是 | 身份证号 | 18位,符合国标,唯一 |
-| phone | String | 是 | 电话 | 必填,11位手机号 |
-| hireDate | Date | 否 | 入职时间 | yyyy-MM-dd |
-| status | String | 是 | 状态 | 0=在职, 1=离职 |
+| 字段名 | 类型 | 必填 | 说明 | 校验规则 |
+|------------|--------|----|----------------|-------------|
+| employeeId | Long | 是 | 员工ID(柜员号,7位数字) | 必填,7位数字,唯一 |
+| name | String | 是 | 姓名 | 最大100字符 |
+| deptId | Long | 是 | 所属部门ID | 必填 |
+| idCard | String | 是 | 身份证号 | 18位,符合国标,唯一 |
+| phone | String | 是 | 电话 | 必填,11位手机号 |
+| hireDate | Date | 否 | 入职时间 | yyyy-MM-dd |
+| status | String | 是 | 状态 | 0=在职, 1=离职 |
**响应示例**:
+
```json
{
"code": 200,
@@ -159,6 +164,7 @@ Authorization: Bearer {token}
**权限要求**: `ccdi:employee:edit`
**请求体**:
+
```json
{
"employeeId": 1000001,
@@ -174,6 +180,7 @@ Authorization: Bearer {token}
**字段说明**: 与新增接口相同,employeeId 为必填项,编辑时不可修改柜员号。
**响应示例**:
+
```json
{
"code": 200,
@@ -191,11 +198,12 @@ Authorization: Bearer {token}
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| employeeIds | Long[] | 是 | 员工ID数组(逗号分隔) |
+| 参数名 | 类型 | 必填 | 说明 |
+|-------------|--------|----|--------------|
+| employeeIds | Long[] | 是 | 员工ID数组(逗号分隔) |
**响应示例**:
+
```json
{
"code": 200,
@@ -235,10 +243,12 @@ Authorization: Bearer {token}
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
**注**:
+
- 带 * 标记的列为必填项(姓名、柜员号、所属部门、身份证号、电话、状态)
- 带 ▼ 标记的列包含下拉框,选项来自字典 `ccdi_employee_status`
**使用 @DictDropdown 注解实现**:
+
- 状态字段使用 `@DictDropdown(dictType = "ccdi_employee_status")` 注解
- 系统自动从 Redis 缓存读取字典数据并生成下拉框
- 下拉选项可动态更新,刷新字典缓存后生效
@@ -253,10 +263,10 @@ Authorization: Bearer {token}
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | File | 是 | Excel 文件 |
-| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) |
+| 参数名 | 类型 | 必填 | 说明 |
+|---------------|---------|----|--------------------|
+| file | File | 是 | Excel 文件 |
+| updateSupport | Boolean | 否 | 是否更新已存在数据(默认false) |
**Excel 格式**:
@@ -266,6 +276,7 @@ Authorization: Bearer {token}
| 张三 | 1000001 | 100 | 110101199001011234 | 13800138000 | 2020-01-01 | 在职 |
**说明**:
+
- ***标记为必填项**: 姓名、柜员号、所属部门、身份证号、电话、状态**
- 柜员号: 7位数字,必填,唯一
- 所属部门: 必须填写有效的部门ID
@@ -273,6 +284,7 @@ Authorization: Bearer {token}
- 入职时间: 选填,格式为 yyyy-MM-dd
**响应示例**:
+
```json
{
"code": 200,
@@ -284,27 +296,27 @@ Authorization: Bearer {token}
## 错误码说明
-| 错误码 | 说明 |
-|--------|------|
-| 200 | 操作成功 |
+| 错误码 | 说明 |
+|-----|----------|
+| 200 | 操作成功 |
| 401 | 未授权,请先登录 |
-| 403 | 无权限访问 |
-| 500 | 服务器内部错误 |
+| 403 | 无权限访问 |
+| 500 | 服务器内部错误 |
## 业务错误信息
-| 错误信息 | 说明 |
-|----------|------|
-| 该柜员号已存在 | 新增时柜员号重复 |
-| 柜员号不能为空 | 新增时柜员号为空 |
-| 柜员号必须为7位数字 | 柜员号格式不正确 |
-| 所属部门不能为空 | 新增时所属部门为空 |
-| 该身份证号已存在 | 新增/编辑时身份证号重复 |
-| 姓名不能为空 | 新增时姓名为空 |
-| 身份证号格式不正确 | 身份证号不符合18位国标 |
-| 电话不能为空 | 新增时电话为空 |
-| 电话格式不正确 | 手机号不符合11位格式 |
-| 状态只能填写'在职'或'离职' | 状态值不正确 |
+| 错误信息 | 说明 |
+|-----------------|--------------|
+| 该柜员号已存在 | 新增时柜员号重复 |
+| 柜员号不能为空 | 新增时柜员号为空 |
+| 柜员号必须为7位数字 | 柜员号格式不正确 |
+| 所属部门不能为空 | 新增时所属部门为空 |
+| 该身份证号已存在 | 新增/编辑时身份证号重复 |
+| 姓名不能为空 | 新增时姓名为空 |
+| 身份证号格式不正确 | 身份证号不符合18位国标 |
+| 电话不能为空 | 新增时电话为空 |
+| 电话格式不正确 | 手机号不符合11位格式 |
+| 状态只能填写'在职'或'离职' | 状态值不正确 |
---
diff --git a/doc/api-docs/api/员工实体关系导入API文档.md b/assets/api-docs/api/员工实体关系导入API文档.md
similarity index 53%
rename from doc/api-docs/api/员工实体关系导入API文档.md
rename to assets/api-docs/api/员工实体关系导入API文档.md
index 6306b0d..4387866 100644
--- a/doc/api-docs/api/员工实体关系导入API文档.md
+++ b/assets/api-docs/api/员工实体关系导入API文档.md
@@ -11,6 +11,7 @@
**数据表**: `ccdi_cust_enterprise_relation`
**关联表**:
+
- `ccdi_base_staff` - 员工基础信息表(通过id_card关联)
---
@@ -25,12 +26,13 @@
**请求参数**: FormData
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | File | 是 | Excel文件 |
-| updateSupport | Boolean | 否 | 是否更新已存在的记录(默认false) |
+| 参数名 | 类型 | 必填 | 说明 |
+|---------------|---------|----|---------------------|
+| file | File | 是 | Excel文件 |
+| updateSupport | Boolean | 否 | 是否更新已存在的记录(默认false) |
**响应示例**:
+
```json
{
"code": 200,
@@ -44,6 +46,7 @@
```
**导入流程**:
+
1. 上传Excel文件
2. 后台立即返回taskId
3. 使用taskId轮询查询导入状态
@@ -53,13 +56,14 @@
导入时会验证以下字段:
-| 字段名 | 验证规则 | 错误提示 |
-|--------|---------|---------|
-| 身份证号 | 必须在员工信息表(ccdi_base_staff)中存在 | "第N行: 身份证号[XXX]不存在于员工信息表中,请先添加员工信息" |
-| 统一社会信用代码 | 必须为18位有效统一社会信用代码 | "第N行: 统一社会信用代码格式不正确" |
-| 企业名称 | 不能为空,长度不超过200字符 | "第N行: 企业名称不能为空" 或 "企业名称长度不能超过200个字符" |
+| 字段名 | 验证规则 | 错误提示 |
+|----------|------------------------------|--------------------------------------|
+| 身份证号 | 必须在员工信息表(ccdi_base_staff)中存在 | "第N行: 身份证号[XXX]不存在于员工信息表中,请先添加员工信息" |
+| 统一社会信用代码 | 必须为18位有效统一社会信用代码 | "第N行: 统一社会信用代码格式不正确" |
+| 企业名称 | 不能为空,长度不超过200字符 | "第N行: 企业名称不能为空" 或 "企业名称长度不能超过200个字符" |
**性能优化**:
+
- 采用批量预验证方式,仅1次数据库查询身份证号存在性
- 批量查询已存在的身份证号+统一社会信用代码组合,避免重复导入
@@ -73,11 +77,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| taskId | String | 是 | 导入任务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|--------|
+| taskId | String | 是 | 导入任务ID |
**响应示例**:
+
```json
{
"code": 200,
@@ -95,13 +100,13 @@
**状态说明**:
-| 状态 | 说明 |
-|------|------|
-| PENDING | 等待处理 |
-| PROCESSING | 处理中 |
-| SUCCESS | 全部成功 |
+| 状态 | 说明 |
+|-----------------|------|
+| PENDING | 等待处理 |
+| PROCESSING | 处理中 |
+| SUCCESS | 全部成功 |
| PARTIAL_SUCCESS | 部分成功 |
-| FAILED | 处理失败 |
+| FAILED | 处理失败 |
---
@@ -113,11 +118,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| taskId | String | 是 | 导入任务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|--------|
+| taskId | String | 是 | 导入任务ID |
**响应示例**:
+
```json
{
"code": 200,
@@ -137,36 +143,36 @@
**失败记录字段说明**:
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| personId | String | 身份证号 |
-| socialCreditCode | String | 统一社会信用代码 |
-| enterpriseName | String | 企业名称 |
-| relationPersonPost | String | 关联人在企业的职务 |
-| errorMessage | String | 错误信息 |
-| rowNumber | Integer | Excel行号 |
+| 字段名 | 类型 | 说明 |
+|--------------------|---------|-----------|
+| personId | String | 身份证号 |
+| socialCreditCode | String | 统一社会信用代码 |
+| enterpriseName | String | 企业名称 |
+| relationPersonPost | String | 关联人在企业的职务 |
+| errorMessage | String | 错误信息 |
+| rowNumber | Integer | Excel行号 |
---
## Excel 模板字段说明
-| 字段名 | 是否必填 | 说明 |
-|--------|---------|------|
-| 身份证号 | 是 | 必须在员工信息表中存在 |
-| 统一社会信用代码 | 是 | 18位有效统一社会信用代码 |
-| 企业名称 | 是 | 长度不超过200字符 |
-| 关联人在企业的职务 | 否 | 长度不超过100字符 |
-| 补充说明 | 否 | 备注信息 |
+| 字段名 | 是否必填 | 说明 |
+|-----------|------|---------------|
+| 身份证号 | 是 | 必须在员工信息表中存在 |
+| 统一社会信用代码 | 是 | 18位有效统一社会信用代码 |
+| 企业名称 | 是 | 长度不超过200字符 |
+| 关联人在企业的职务 | 否 | 长度不超过100字符 |
+| 补充说明 | 否 | 备注信息 |
---
## 错误码说明
-| 错误码 | 说明 |
-|--------|------|
-| 200 | 操作成功 |
-| 401 | 未授权 |
-| 403 | 无权限 |
+| 错误码 | 说明 |
+|-----|-------|
+| 200 | 操作成功 |
+| 401 | 未授权 |
+| 403 | 无权限 |
| 500 | 服务器错误 |
---
@@ -174,5 +180,6 @@
## 更新日志
**2026-02-11**:
+
- 新增员工身份证号存在性校验
- 优化导入性能,采用批量预验证方式
diff --git a/assets/api-docs/api/员工实体关系管理API文档.md b/assets/api-docs/api/员工实体关系管理API文档.md
new file mode 100644
index 0000000..b746af5
--- /dev/null
+++ b/assets/api-docs/api/员工实体关系管理API文档.md
@@ -0,0 +1,504 @@
+# 员工实体关系管理 API 文档
+
+## 概述
+
+员工实体关系管理模块提供员工与企业关系的增删改查、批量导入导出功能。
+
+**基础路径**: `/ccdi/staffEnterpriseRelation`
+
+**权限标识前缀**: `ccdi:staffEnterpriseRelation`
+
+**重要更新**: 自2026-02-11起,列表接口和详情接口响应中新增 `personName` 字段(员工姓名)
+,该字段通过关联查询 `ccdi_base_staff` 表获取。
+
+---
+
+## API 接口列表
+
+### 1. 查询员工实体关系列表
+
+**接口地址**: `GET /ccdi/staffEnterpriseRelation/list`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:list`
+
+**请求参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|------------------|---------|----|----------------|
+| personId | String | 否 | 身份证号(精确查询) |
+| socialCreditCode | String | 否 | 统一社会信用代码(精确查询) |
+| status | Integer | 否 | 状态(0=无效, 1=有效) |
+| pageNum | Integer | 否 | 页码(默认1) |
+| pageSize | Integer | 否 | 每页数量(默认10) |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "查询成功",
+ "rows": [
+ {
+ "id": 1,
+ "personId": "110101199001011234",
+ "personName": "张三",
+ "relationPersonPost": "法定代表人",
+ "socialCreditCode": "91110000MA000001XX",
+ "enterpriseName": "某某科技有限公司",
+ "status": 1,
+ "remark": "补充说明",
+ "dataSource": "人工导入",
+ "isEmployee": 1,
+ "isEmpFamily": 0,
+ "isCustomer": 1,
+ "isCustFamily": 0,
+ "createTime": "2026-02-09 10:00:00",
+ "updateTime": "2026-02-09 10:00:00",
+ "createdBy": "admin",
+ "updatedBy": "admin"
+ }
+ ],
+ "total": 1
+}
+```
+
+**响应字段说明**:
+
+| 字段名 | 类型 | 说明 |
+|--------------------|---------|-------------------|
+| id | Long | 主键ID |
+| personId | String | 身份证号 |
+| personName | String | 员工姓名(通过关联查询获取) |
+| relationPersonPost | String | 关联人在企业的职务 |
+| socialCreditCode | String | 统一社会信用代码 |
+| enterpriseName | String | 企业名称 |
+| status | Integer | 状态(0=无效, 1=有效) |
+| remark | String | 补充说明 |
+| dataSource | String | 数据来源 |
+| isEmployee | Integer | 是否为员工(0=否, 1=是) |
+| isEmpFamily | Integer | 是否为员工家属(0=否, 1=是) |
+| isCustomer | Integer | 是否为客户(0=否, 1=是) |
+| isCustFamily | Integer | 是否为客户家属(0=否, 1=是) |
+| createTime | Date | 创建时间 |
+| updateTime | Date | 更新时间 |
+| createdBy | String | 创建人 |
+| updatedBy | String | 更新人 |
+
+**注意**:
+
+- `personName` 字段通过 LEFT JOIN `ccdi_base_staff` 表获取
+- 如果 `personId` 在员工信息表中不存在,`personName` 为 `null`
+
+---
+
+### 2. 查询员工实体关系详情
+
+**接口地址**: `GET /ccdi/staffEnterpriseRelation/{id}`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:query`
+
+**路径参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|-----|------|----|------|
+| id | Long | 是 | 主键ID |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "操作成功",
+ "data": {
+ "id": 1,
+ "personId": "110101199001011234",
+ "personName": "张三",
+ "relationPersonPost": "法定代表人",
+ "socialCreditCode": "91110000MA000001XX",
+ "enterpriseName": "某某科技有限公司",
+ "status": 1,
+ "remark": "补充说明",
+ "dataSource": "人工导入",
+ "isEmployee": 1,
+ "isEmpFamily": 0,
+ "isCustomer": 1,
+ "isCustFamily": 0,
+ "createTime": "2026-02-09 10:00:00",
+ "updateTime": "2026-02-09 10:00:00",
+ "createdBy": "admin",
+ "updatedBy": "admin"
+ }
+}
+```
+
+**响应字段说明**:
+
+| 字段名 | 类型 | 说明 |
+|--------------------|---------|-------------------|
+| id | Long | 主键ID |
+| personId | String | 身份证号 |
+| personName | String | 员工姓名(通过关联查询获取) |
+| relationPersonPost | String | 关联人在企业的职务 |
+| socialCreditCode | String | 统一社会信用代码 |
+| enterpriseName | String | 企业名称 |
+| status | Integer | 状态(0=无效, 1=有效) |
+| remark | String | 补充说明 |
+| dataSource | String | 数据来源 |
+| isEmployee | Integer | 是否为员工(0=否, 1=是) |
+| isEmpFamily | Integer | 是否为员工家属(0=否, 1=是) |
+| isCustomer | Integer | 是否为客户(0=否, 1=是) |
+| isCustFamily | Integer | 是否为客户家属(0=否, 1=是) |
+| createTime | Date | 创建时间 |
+| updateTime | Date | 更新时间 |
+| createdBy | String | 创建人 |
+| updatedBy | String | 更新人 |
+
+**注意**:
+
+- `personName` 字段通过 LEFT JOIN `ccdi_base_staff` 表获取
+- 如果 `personId` 在员工信息表中不存在,`personName` 为 `null`
+
+---
+
+### 3. 新增员工实体关系
+
+**接口地址**: `POST /ccdi/staffEnterpriseRelation`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:add`
+
+**请求头**:
+
+```
+Content-Type: application/json
+Authorization: Bearer {token}
+```
+
+**请求体**:
+
+```json
+{
+ "personId": "110101199001011234",
+ "relationPersonPost": "法定代表人",
+ "socialCreditCode": "91110000MA000001XX",
+ "status": 1,
+ "remark": "补充说明",
+ "dataSource": "人工导入",
+ "isEmployee": 1,
+ "isEmpFamily": 0,
+ "isCustomer": 1,
+ "isCustFamily": 0
+}
+```
+
+**字段说明**:
+
+| 字段名 | 类型 | 必填 | 说明 | 校验规则 |
+|--------------------|---------|----|-----------|-----------------|
+| personId | String | 是 | 身份证号 | 18位,符合国标 |
+| relationPersonPost | String | 是 | 关联人在企业的职务 | 最大100字符 |
+| socialCreditCode | String | 是 | 统一社会信用代码 | 18位 |
+| status | Integer | 否 | 状态 | 0=无效, 1=有效, 默认1 |
+| remark | String | 否 | 补充说明 | 最大500字符 |
+| dataSource | String | 否 | 数据来源 | 最大100字符 |
+| isEmployee | Integer | 否 | 是否为员工 | 0=否, 1=是 |
+| isEmpFamily | Integer | 否 | 是否为员工家属 | 0=否, 1=是 |
+| isCustomer | Integer | 否 | 是否为客户 | 0=否, 1=是 |
+| isCustFamily | Integer | 否 | 是否为客户家属 | 0=否, 1=是 |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "操作成功"
+}
+```
+
+---
+
+### 4. 修改员工实体关系
+
+**接口地址**: `PUT /ccdi/staffEnterpriseRelation`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:edit`
+
+**请求头**:
+
+```
+Content-Type: application/json
+Authorization: Bearer {token}
+```
+
+**请求体**:
+
+```json
+{
+ "id": 1,
+ "personId": "110101199001011234",
+ "relationPersonPost": "法定代表人",
+ "socialCreditCode": "91110000MA000001XX",
+ "status": 1,
+ "remark": "补充说明",
+ "dataSource": "人工导入",
+ "isEmployee": 1,
+ "isEmpFamily": 0,
+ "isCustomer": 1,
+ "isCustFamily": 0
+}
+```
+
+**字段说明**:
+
+| 字段名 | 类型 | 必填 | 说明 | 校验规则 |
+|--------------------|---------|----|-----------|------------|
+| id | Long | 是 | 主键ID | 必填 |
+| personId | String | 是 | 身份证号 | 18位,符合国标 |
+| relationPersonPost | String | 是 | 关联人在企业的职务 | 最大100字符 |
+| socialCreditCode | String | 是 | 统一社会信用代码 | 18位 |
+| status | Integer | 否 | 状态 | 0=无效, 1=有效 |
+| remark | String | 否 | 补充说明 | 最大500字符 |
+| dataSource | String | 否 | 数据来源 | 最大100字符 |
+| isEmployee | Integer | 否 | 是否为员工 | 0=否, 1=是 |
+| isEmpFamily | Integer | 否 | 是否为员工家属 | 0=否, 1=是 |
+| isCustomer | Integer | 否 | 是否为客户 | 0=否, 1=是 |
+| isCustFamily | Integer | 否 | 是否为客户家属 | 0=否, 1=是 |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "操作成功"
+}
+```
+
+---
+
+### 5. 删除员工实体关系
+
+**接口地址**: `DELETE /ccdi/staffEnterpriseRelation/{ids}`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:remove`
+
+**路径参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|-----|--------|----|-------------------|
+| ids | Long[] | 是 | 主键ID数组(多个ID用逗号分隔) |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "操作成功"
+}
+```
+
+---
+
+### 6. 导出员工实体关系
+
+**接口地址**: `POST /ccdi/staffEnterpriseRelation/export`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:export`
+
+**请求参数**: 与列表查询参数相同
+
+**响应**: Excel文件流
+
+---
+
+### 7. 下载导入模板
+
+**接口地址**: `POST /ccdi/staffEnterpriseRelation/importTemplate`
+
+**权限要求**: 无
+
+**响应**: Excel模板文件流(包含字典下拉框)
+
+**模板字段说明**:
+
+| 字段名 | 说明 | 是否必填 | 数据类型 | 示例值 |
+|-----------|-----------|------|------|--------------------|
+| 身份证号 | 18位身份证号 | 是 | 文本 | 110101199001011234 |
+| 关联人在企业的职务 | 职务名称 | 是 | 文本 | 法定代表人 |
+| 统一社会信用代码 | 18位社会信用代码 | 是 | 文本 | 91110000MA000001XX |
+| 状态 | 有效/无效 | 否 | 下拉选择 | 有效 |
+| 补充说明 | 备注信息 | 否 | 文本 | - |
+| 数据来源 | 数据来源 | 否 | 文本 | 人工导入 |
+| 是否为员工 | 是/否 | 否 | 下拉选择 | 是 |
+| 是否为员工家属 | 是/否 | 否 | 下拉选择 | 否 |
+| 是否为客户 | 是/否 | 否 | 下拉选择 | 是 |
+| 是否为客户家属 | 是/否 | 否 | 下拉选择 | 否 |
+
+---
+
+### 8. 异步导入员工实体关系
+
+**接口地址**: `POST /ccdi/staffEnterpriseRelation/importData`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:import`
+
+**请求头**:
+
+```
+Content-Type: multipart/form-data
+Authorization: Bearer {token}
+```
+
+**请求参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|------|------|----|---------|
+| file | File | 是 | Excel文件 |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "导入任务已提交,正在后台处理",
+ "data": {
+ "taskId": "import-task-20260209-100000",
+ "status": "PROCESSING",
+ "message": "导入任务已提交,正在后台处理"
+ }
+}
+```
+
+**导入流程说明**:
+
+1. 接口立即返回,不等待后台任务完成
+2. 通过 `taskId` 查询导入进度
+3. 导入完成后可查询失败记录
+
+---
+
+### 9. 查询导入状态
+
+**接口地址**: `GET /ccdi/staffEnterpriseRelation/importStatus/{taskId}`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:import`
+
+**路径参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|---------------|
+| taskId | String | 是 | 任务ID(从导入接口获取) |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "操作成功",
+ "data": {
+ "taskId": "import-task-20260209-100000",
+ "status": "COMPLETED",
+ "totalCount": 100,
+ "successCount": 95,
+ "failureCount": 5,
+ "message": "导入完成"
+ }
+}
+```
+
+**状态说明**:
+
+- `PROCESSING`: 处理中
+- `COMPLETED`: 已完成
+- `FAILED`: 失败
+
+---
+
+### 10. 查询导入失败记录
+
+**接口地址**: `GET /ccdi/staffEnterpriseRelation/importFailures/{taskId}`
+
+**权限要求**: `ccdi:staffEnterpriseRelation:import`
+
+**路径参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|------|
+| taskId | String | 是 | 任务ID |
+
+**查询参数**:
+
+| 参数名 | 类型 | 必填 | 说明 |
+|----------|---------|----|------------|
+| pageNum | Integer | 否 | 页码(默认1) |
+| pageSize | Integer | 否 | 每页数量(默认10) |
+
+**响应示例**:
+
+```json
+{
+ "code": 200,
+ "msg": "查询成功",
+ "rows": [
+ {
+ "rowNum": 5,
+ "personId": "110101199001011235",
+ "relationPersonPost": "法定代表人",
+ "socialCreditCode": "91110000MA000001XX",
+ "errorMessage": "身份证号格式不正确"
+ }
+ ],
+ "total": 5
+}
+```
+
+**失败记录字段说明**:
+
+| 字段名 | 类型 | 说明 |
+|--------------------|---------|-----------|
+| rowNum | Integer | 行号 |
+| personId | String | 身份证号 |
+| relationPersonPost | String | 关联人在企业的职务 |
+| socialCreditCode | String | 统一社会信用代码 |
+| errorMessage | String | 错误信息 |
+
+---
+
+## 数据字典
+
+### 状态(status)
+
+| 值 | 说明 |
+|---|----|
+| 0 | 无效 |
+| 1 | 有效 |
+
+### 是否标志(isEmployee/isEmpFamily/isCustomer/isCustFamily)
+
+| 值 | 说明 |
+|---|----|
+| 0 | 否 |
+| 1 | 是 |
+
+---
+
+## 错误码说明
+
+| 错误码 | 说明 |
+|-----|----------|
+| 200 | 操作成功 |
+| 401 | 未授权,请先登录 |
+| 403 | 无权限访问 |
+| 500 | 服务器内部错误 |
+
+---
+
+## 更新日志
+
+### 2026-02-11
+
+- 新增: 在列表接口和详情接口响应中添加 `personName` 字段(员工姓名)
+- 优化: 通过 LEFT JOIN `ccdi_base_staff` 表获取员工姓名
+- 注意: 如果 `personId` 在员工信息表中不存在,`personName` 为 `null`
+
+### 2026-02-09
+
+- 初始版本: 完成员工实体关系管理基础功能
diff --git a/doc/api-docs/api/员工调动记录管理API文档.md b/assets/api-docs/api/员工调动记录管理API文档.md
similarity index 51%
rename from doc/api-docs/api/员工调动记录管理API文档.md
rename to assets/api-docs/api/员工调动记录管理API文档.md
index a14c5a7..4817605 100644
--- a/doc/api-docs/api/员工调动记录管理API文档.md
+++ b/assets/api-docs/api/员工调动记录管理API文档.md
@@ -11,6 +11,7 @@
**数据表**: `ccdi_staff_transfer`
**关联表**:
+
- `ccdi_base_staff` - 员工基础信息表(通过staff_id关联)
- `sys_dept` - 部门表(通过dept_id_before/after关联)
@@ -26,19 +27,20 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| staffId | Long | 否 | 员工ID(精确查询) |
-| staffName | String | 否 | 员工姓名(模糊查询) |
-| transferType | String | 否 | 调动类型(精确查询) |
-| deptIdBefore | Long | 否 | 调动前部门ID |
-| deptIdAfter | Long | 否 | 调动后部门ID |
-| transferDateStart | Date | 否 | 调动开始日期(yyyy-MM-dd) |
-| transferDateEnd | Date | 否 | 调动结束日期(yyyy-MM-dd) |
-| pageNum | Integer | 否 | 页码(默认1) |
-| pageSize | Integer | 否 | 每页数量(默认10) |
+| 参数名 | 类型 | 必填 | 说明 |
+|-------------------|---------|----|--------------------|
+| staffId | Long | 否 | 员工ID(精确查询) |
+| staffName | String | 否 | 员工姓名(模糊查询) |
+| transferType | String | 否 | 调动类型(精确查询) |
+| deptIdBefore | Long | 否 | 调动前部门ID |
+| deptIdAfter | Long | 否 | 调动后部门ID |
+| transferDateStart | Date | 否 | 调动开始日期(yyyy-MM-dd) |
+| transferDateEnd | Date | 否 | 调动结束日期(yyyy-MM-dd) |
+| pageNum | Integer | 否 | 页码(默认1) |
+| pageSize | Integer | 否 | 每页数量(默认10) |
**响应示例**:
+
```json
{
"code": 200,
@@ -71,26 +73,26 @@
**响应字段说明**:
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| id | Long | 主键ID |
-| staffId | Long | 员工ID |
-| staffName | String | 员工姓名(关联查询) |
-| transferType | String | 调动类型代码 |
-| transferTypeDesc | String | 调动类型描述 |
-| transferSubType | String | 调动子类型 |
-| deptIdBefore | Long | 调动前部门ID |
-| deptNameBefore | String | 调动前部门名称 |
-| gradeBefore | String | 调动前职级 |
-| positionBefore | String | 调动前岗位 |
-| salaryLevelBefore | String | 调动前薪酬等级 |
-| deptIdAfter | Long | 调动后部门ID |
-| deptNameAfter | String | 调动后部门名称 |
-| gradeAfter | String | 调动后职级 |
-| positionAfter | String | 调动后岗位 |
-| salaryLevelAfter | String | 调动后薪酬等级 |
-| transferDate | Date | 调动日期 |
-| createTime | Date | 创建时间 |
+| 字段名 | 类型 | 说明 |
+|-------------------|--------|------------|
+| id | Long | 主键ID |
+| staffId | Long | 员工ID |
+| staffName | String | 员工姓名(关联查询) |
+| transferType | String | 调动类型代码 |
+| transferTypeDesc | String | 调动类型描述 |
+| transferSubType | String | 调动子类型 |
+| deptIdBefore | Long | 调动前部门ID |
+| deptNameBefore | String | 调动前部门名称 |
+| gradeBefore | String | 调动前职级 |
+| positionBefore | String | 调动前岗位 |
+| salaryLevelBefore | String | 调动前薪酬等级 |
+| deptIdAfter | Long | 调动后部门ID |
+| deptNameAfter | String | 调动后部门名称 |
+| gradeAfter | String | 调动后职级 |
+| positionAfter | String | 调动后岗位 |
+| salaryLevelAfter | String | 调动后薪酬等级 |
+| transferDate | Date | 调动日期 |
+| createTime | Date | 创建时间 |
---
@@ -102,11 +104,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| id | Long | 是 | 调动记录ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|-----|------|----|--------|
+| id | Long | 是 | 调动记录ID |
**响应示例**:
+
```json
{
"code": 200,
@@ -167,24 +170,25 @@
**请求字段说明**:
-| 字段名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| staffId | Long | 是 | 员工ID |
-| transferType | String | 是 | 调动类型 |
-| transferSubType | String | 否 | 调动子类型 |
-| deptIdBefore | Long | 否 | 调动前部门ID |
-| deptNameBefore | String | 否 | 调动前部门名称 |
-| gradeBefore | String | 否 | 调动前职级 |
-| positionBefore | String | 否 | 调动前岗位 |
-| salaryLevelBefore | String | 否 | 调动前薪酬等级 |
-| deptIdAfter | Long | 否 | 调动后部门ID |
-| deptNameAfter | String | 否 | 调动后部门名称 |
-| gradeAfter | String | 否 | 调动后职级 |
-| positionAfter | String | 否 | 调动后岗位 |
-| salaryLevelAfter | String | 否 | 调动后薪酬等级 |
-| transferDate | Date | 是 | 调动日期(yyyy-MM-dd) |
+| 字段名 | 类型 | 必填 | 说明 |
+|-------------------|--------|----|------------------|
+| staffId | Long | 是 | 员工ID |
+| transferType | String | 是 | 调动类型 |
+| transferSubType | String | 否 | 调动子类型 |
+| deptIdBefore | Long | 否 | 调动前部门ID |
+| deptNameBefore | String | 否 | 调动前部门名称 |
+| gradeBefore | String | 否 | 调动前职级 |
+| positionBefore | String | 否 | 调动前岗位 |
+| salaryLevelBefore | String | 否 | 调动前薪酬等级 |
+| deptIdAfter | Long | 否 | 调动后部门ID |
+| deptNameAfter | String | 否 | 调动后部门名称 |
+| gradeAfter | String | 否 | 调动后职级 |
+| positionAfter | String | 否 | 调动后岗位 |
+| salaryLevelAfter | String | 否 | 调动后薪酬等级 |
+| transferDate | Date | 是 | 调动日期(yyyy-MM-dd) |
**响应示例**:
+
```json
{
"code": 200,
@@ -219,12 +223,13 @@
**请求字段说明**:
-| 字段名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| id | Long | 是 | 调动记录ID |
-| 其他字段 | - | 否 | 同新增接口,所有字段均为可选 |
+| 字段名 | 类型 | 必填 | 说明 |
+|------|------|----|----------------|
+| id | Long | 是 | 调动记录ID |
+| 其他字段 | - | 否 | 同新增接口,所有字段均为可选 |
**响应示例**:
+
```json
{
"code": 200,
@@ -242,11 +247,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| ids | String | 是 | 调动记录ID数组,逗号分隔(例: 1,2,3) |
+| 参数名 | 类型 | 必填 | 说明 |
+|-----|--------|----|-------------------------|
+| ids | String | 是 | 调动记录ID数组,逗号分隔(例: 1,2,3) |
**响应示例**:
+
```json
{
"code": 200,
@@ -278,20 +284,20 @@
**模板字段说明**:
-| 字段名 | 是否必填 | 说明 |
-|--------|---------|------|
-| 员工工号 | 是 | 员工ID |
-| 调动类型 | 是 | 下拉选择字典 |
-| 调动子类型 | 否 | 自由输入 |
-| 调动前部门 | 否 | 自由输入 |
-| 调动前职级 | 否 | 自由输入 |
-| 调动前岗位 | 否 | 自由输入 |
-| 调动前薪酬等级 | 否 | 自由输入 |
-| 调动后部门 | 否 | 自由输入 |
-| 调动后职级 | 否 | 自由输入 |
-| 调动后岗位 | 否 | 自由输入 |
-| 调动后薪酬等级 | 否 | 自由输入 |
-| 调动日期 | 是 | 格式: yyyy-MM-dd |
+| 字段名 | 是否必填 | 说明 |
+|---------|------|----------------|
+| 员工工号 | 是 | 员工ID |
+| 调动类型 | 是 | 下拉选择字典 |
+| 调动子类型 | 否 | 自由输入 |
+| 调动前部门 | 否 | 自由输入 |
+| 调动前职级 | 否 | 自由输入 |
+| 调动前岗位 | 否 | 自由输入 |
+| 调动前薪酬等级 | 否 | 自由输入 |
+| 调动后部门 | 否 | 自由输入 |
+| 调动后职级 | 否 | 自由输入 |
+| 调动后岗位 | 否 | 自由输入 |
+| 调动后薪酬等级 | 否 | 自由输入 |
+| 调动日期 | 是 | 格式: yyyy-MM-dd |
---
@@ -303,12 +309,13 @@
**请求参数**: FormData
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | File | 是 | Excel文件 |
-| updateSupport | Boolean | 否 | 是否更新已存在的记录(默认false) |
+| 参数名 | 类型 | 必填 | 说明 |
+|---------------|---------|----|---------------------|
+| file | File | 是 | Excel文件 |
+| updateSupport | Boolean | 否 | 是否更新已存在的记录(默认false) |
**响应示例**:
+
```json
{
"code": 200,
@@ -322,6 +329,7 @@
```
**导入流程**:
+
1. 上传Excel文件
2. 后台立即返回taskId
3. 使用taskId轮询查询导入状态
@@ -331,14 +339,15 @@
导入时会验证以下字段:
-| 字段名 | 验证规则 | 错误提示 |
-|--------|---------|---------|
-| 员工ID | 必须在员工信息表(ccdi_base_staff)中存在 | "第N行: 员工ID XXX 不存在" |
-| 调动前部门ID | 必须在部门表(sys_dept)中存在 | "第N行: 调动前部门ID XXX 不存在" |
-| 调动后部门ID | 必须在部门表(sys_dept)中存在 | "第N行: 调动后部门ID XXX 不存在" |
-| 调动日期 | 必须符合yyyy-MM-dd格式 | "第N行: 调动日期格式不正确" |
+| 字段名 | 验证规则 | 错误提示 |
+|---------|------------------------------|------------------------|
+| 员工ID | 必须在员工信息表(ccdi_base_staff)中存在 | "第N行: 员工ID XXX 不存在" |
+| 调动前部门ID | 必须在部门表(sys_dept)中存在 | "第N行: 调动前部门ID XXX 不存在" |
+| 调动后部门ID | 必须在部门表(sys_dept)中存在 | "第N行: 调动后部门ID XXX 不存在" |
+| 调动日期 | 必须符合yyyy-MM-dd格式 | "第N行: 调动日期格式不正确" |
**性能优化**:
+
- 采用批量预验证方式,仅1次数据库查询员工ID存在性
- 从2次遍历优化为1次遍历,提升导入性能
@@ -352,11 +361,12 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| taskId | String | 是 | 导入任务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|--------|
+| taskId | String | 是 | 导入任务ID |
**响应示例**:
+
```json
{
"code": 200,
@@ -374,12 +384,12 @@
**状态说明**:
-| 状态 | 说明 |
-|------|------|
-| PENDING | 等待处理 |
-| PROCESSING | 处理中 |
-| COMPLETED | 处理完成 |
-| FAILED | 处理失败 |
+| 状态 | 说明 |
+|------------|------|
+| PENDING | 等待处理 |
+| PROCESSING | 处理中 |
+| COMPLETED | 处理完成 |
+| FAILED | 处理失败 |
---
@@ -391,18 +401,19 @@
**路径参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| taskId | String | 是 | 导入任务ID |
+| 参数名 | 类型 | 必填 | 说明 |
+|--------|--------|----|--------|
+| taskId | String | 是 | 导入任务ID |
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| pageNum | Integer | 否 | 页码(默认1) |
-| pageSize | Integer | 否 | 每页数量(默认10) |
+| 参数名 | 类型 | 必填 | 说明 |
+|----------|---------|----|------------|
+| pageNum | Integer | 否 | 页码(默认1) |
+| pageSize | Integer | 否 | 每页数量(默认10) |
**响应示例**:
+
```json
{
"code": 200,
@@ -430,11 +441,12 @@
**请求参数**:
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| name | String | 否 | 员工姓名(模糊查询,用于下拉搜索) |
+| 参数名 | 类型 | 必填 | 说明 |
+|------|--------|----|-------------------|
+| name | String | 否 | 员工姓名(模糊查询,用于下拉搜索) |
**响应示例**:
+
```json
{
"code": 200,
@@ -462,29 +474,29 @@
### 调动类型 (ccdi_transfer_type)
-| 字典值 | 显示值 | CSS类 |
-|--------|--------|-------|
-| PROMOTION | 升职 | primary |
-| DEMOPTION | 降职 | danger |
-| LATERAL | 平调 | info |
-| ROTATION | 轮岗 | warning |
-| SECONDMENT | 借调 | default |
+| 字典值 | 显示值 | CSS类 |
+|-------------------|------|---------|
+| PROMOTION | 升职 | primary |
+| DEMOPTION | 降职 | danger |
+| LATERAL | 平调 | info |
+| ROTATION | 轮岗 | warning |
+| SECONDMENT | 借调 | default |
| DEPARTMENT_CHANGE | 部门调动 | success |
-| POSITION_CHANGE | 职位调整 | primary |
-| RETURN | 返岗 | info |
-| TERMINATION | 离职 | danger |
-| OTHER | 其他 | default |
+| POSITION_CHANGE | 职位调整 | primary |
+| RETURN | 返岗 | info |
+| TERMINATION | 离职 | danger |
+| OTHER | 其他 | default |
---
## 错误码说明
-| 错误码 | 说明 |
-|--------|------|
-| 200 | 操作成功 |
+| 错误码 | 说明 |
+|-----|----------|
+| 200 | 操作成功 |
| 401 | 未授权,请先登录 |
-| 403 | 无权限访问 |
-| 500 | 服务器内部错误 |
+| 403 | 无权限访问 |
+| 500 | 服务器内部错误 |
---
@@ -502,8 +514,8 @@
## 更新日志
-| 版本 | 日期 | 说明 |
-|------|------|------|
+| 版本 | 日期 | 说明 |
+|------|------------|----------------------|
| v1.0 | 2026-02-10 | 初始版本,完成基础CRUD和导入导出功能 |
---
diff --git a/doc/api-docs/后端枚举字段说明.md b/assets/api-docs/后端枚举字段说明.md
similarity index 97%
rename from doc/api-docs/后端枚举字段说明.md
rename to assets/api-docs/后端枚举字段说明.md
index ee7e06c..905836d 100644
--- a/doc/api-docs/后端枚举字段说明.md
+++ b/assets/api-docs/后端枚举字段说明.md
@@ -10,12 +10,13 @@
### 1. 中介类型 (intermediaryType)
-| 代码值 | 说明 |
-|--------|------|
+| 代码值 | 说明 |
+|-----|------|
| `1` | 个人中介 |
| `2` | 机构中介 |
**前端转换示例:**
+
```javascript
const getIntermediaryTypeName = (type) => {
const map = {
@@ -29,11 +30,12 @@ const getIntermediaryTypeName = (type) => {
### 2. 状态 (status)
| 代码值 | 说明 |
-|--------|------|
+|-----|----|
| `0` | 正常 |
| `1` | 停用 |
**前端转换示例:**
+
```javascript
const getStatusName = (status) => {
const map = {
@@ -46,14 +48,15 @@ const getStatusName = (status) => {
### 3. 数据来源 (dataSource / date_source)
-| 代码值 | 说明 |
-|--------|------|
+| 代码值 | 说明 |
+|----------|------|
| `MANUAL` | 手动录入 |
| `IMPORT` | 批量导入 |
| `SYSTEM` | 系统同步 |
-| `API` | 接口获取 |
+| `API` | 接口获取 |
**前端转换示例:**
+
```javascript
const getDataSourceName = (source) => {
const map = {
@@ -69,12 +72,13 @@ const getDataSourceName = (source) => {
### 4. 性别 (indivGender) - 个人中介
| 代码值 | 说明 |
-|--------|------|
-| `M` | 男 |
-| `F` | 女 |
+|-----|----|
+| `M` | 男 |
+| `F` | 女 |
| `O` | 其他 |
**前端转换示例:**
+
```javascript
const getGenderName = (gender) => {
const map = {
@@ -89,6 +93,7 @@ const getGenderName = (gender) => {
### 5. 证件类型 (indivCertType)
常用证件类型代码:
+
- `身份证` - 身份证
- `护照` - 护照
- `港澳通行证` - 港澳通行证
diff --git a/doc/database-docs/ccdi_biz_intermediary.csv b/assets/database-docs/ccdi_biz_intermediary.csv
similarity index 100%
rename from doc/database-docs/ccdi_biz_intermediary.csv
rename to assets/database-docs/ccdi_biz_intermediary.csv
diff --git a/doc/database-docs/ccdi_cust_enterprise_relation.csv b/assets/database-docs/ccdi_cust_enterprise_relation.csv
similarity index 100%
rename from doc/database-docs/ccdi_cust_enterprise_relation.csv
rename to assets/database-docs/ccdi_cust_enterprise_relation.csv
diff --git a/doc/database-docs/ccdi_cust_fmy_relation.csv b/assets/database-docs/ccdi_cust_fmy_relation.csv
similarity index 100%
rename from doc/database-docs/ccdi_cust_fmy_relation.csv
rename to assets/database-docs/ccdi_cust_fmy_relation.csv
diff --git a/doc/database-docs/ccdi_enterprise_base_info.csv b/assets/database-docs/ccdi_enterprise_base_info.csv
similarity index 100%
rename from doc/database-docs/ccdi_enterprise_base_info.csv
rename to assets/database-docs/ccdi_enterprise_base_info.csv
diff --git a/doc/database-docs/ccdi_fmy_relation_person.csv b/assets/database-docs/ccdi_fmy_relation_person.csv
similarity index 100%
rename from doc/database-docs/ccdi_fmy_relation_person.csv
rename to assets/database-docs/ccdi_fmy_relation_person.csv
diff --git a/doc/database-docs/ccdi_purchase_transaction.csv b/assets/database-docs/ccdi_purchase_transaction.csv
similarity index 100%
rename from doc/database-docs/ccdi_purchase_transaction.csv
rename to assets/database-docs/ccdi_purchase_transaction.csv
diff --git a/doc/database-docs/ccdi_staff_enterprise_relation.csv b/assets/database-docs/ccdi_staff_enterprise_relation.csv
similarity index 100%
rename from doc/database-docs/ccdi_staff_enterprise_relation.csv
rename to assets/database-docs/ccdi_staff_enterprise_relation.csv
diff --git a/doc/database-docs/ccdi_staff_fmy_relation.csv b/assets/database-docs/ccdi_staff_fmy_relation.csv
similarity index 100%
rename from doc/database-docs/ccdi_staff_fmy_relation.csv
rename to assets/database-docs/ccdi_staff_fmy_relation.csv
diff --git a/doc/database-docs/ccdi_staff_recruitment.csv b/assets/database-docs/ccdi_staff_recruitment.csv
similarity index 100%
rename from doc/database-docs/ccdi_staff_recruitment.csv
rename to assets/database-docs/ccdi_staff_recruitment.csv
diff --git a/doc/database-docs/ccdi_staff_transfer.csv b/assets/database-docs/ccdi_staff_transfer.csv
similarity index 100%
rename from doc/database-docs/ccdi_staff_transfer.csv
rename to assets/database-docs/ccdi_staff_transfer.csv
diff --git a/doc/database-docs/database-index-validation.md b/assets/database-docs/database-index-validation.md
similarity index 79%
rename from doc/database-docs/database-index-validation.md
rename to assets/database-docs/database-index-validation.md
index cf409b7..f5629c8 100644
--- a/doc/database-docs/database-index-validation.md
+++ b/assets/database-docs/database-index-validation.md
@@ -1,12 +1,15 @@
# 数据库唯一索引验证报告
## 验证日期
+
2026-02-08
## 验证目的
+
确认中介信息导入功能所需的数据库唯一索引已正确配置,为 `INSERT ... ON DUPLICATE KEY UPDATE` 语句提供基础支持。
## 涉及表
+
- `ccdi_biz_intermediary` (个人中介表)
- `ccdi_enterprise_base_info` (实体中介表)
@@ -19,10 +22,12 @@
#### 检查项: person_id 唯一索引
**检查前状态:**
+
- 存在普通索引 `idx_person_id` (Non_unique = 1)
- ❌ 不满足唯一性要求
**执行操作:**
+
```sql
-- 删除原有普通索引
ALTER TABLE ccdi_biz_intermediary DROP INDEX idx_person_id;
@@ -32,6 +37,7 @@ ALTER TABLE ccdi_biz_intermediary ADD UNIQUE KEY uk_person_id (person_id);
```
**检查后状态:**
+
- ✅ 唯一索引 `uk_person_id` 已创建
- Non_unique: 0
- Column_name: person_id
@@ -39,22 +45,24 @@ ALTER TABLE ccdi_biz_intermediary ADD UNIQUE KEY uk_person_id (person_id);
- Cardinality: 1745
**最终索引状态:**
+
- ✅ PRIMARY KEY: `biz_id`
- ✅ UNIQUE KEY: `uk_person_id` (Non_unique = 0)
- ✅ INDEX: `idx_name` (普通索引)
- ✅ INDEX: `idx_mobile` (普通索引)
**完整索引列表:**
+
```sql
SHOW INDEX FROM ccdi_biz_intermediary;
```
-| Key_name | Column_name | Non_unique | Index_type |
-|----------|-------------|------------|------------|
-| PRIMARY | biz_id | 0 | BTREE |
-| uk_person_id | person_id | 0 | BTREE |
-| idx_name | name | 1 | BTREE |
-| idx_mobile | mobile | 1 | BTREE |
+| Key_name | Column_name | Non_unique | Index_type |
+|--------------|-------------|------------|------------|
+| PRIMARY | biz_id | 0 | BTREE |
+| uk_person_id | person_id | 0 | BTREE |
+| idx_name | name | 1 | BTREE |
+| idx_mobile | mobile | 1 | BTREE |
---
@@ -63,17 +71,20 @@ SHOW INDEX FROM ccdi_biz_intermediary;
#### 检查项: social_credit_code 主键
**检查前状态:**
+
- ✅ `social_credit_code` 已为 PRIMARY KEY
- 字段类型: varchar(50)
- 约束: NOT NULL
- 引擎: InnoDB
**表结构确认:**
+
```sql
SHOW CREATE TABLE ccdi_enterprise_base_info;
```
**结论:**
+
- ✅ 无需修改,已满足要求
---
@@ -81,21 +92,24 @@ SHOW CREATE TABLE ccdi_enterprise_base_info;
## 总结
### 验证结论
+
✅ **所有必需的唯一索引/主键均已正确配置**
### 配置详情
-| 表名 | 字段 | 约束类型 | 状态 |
-|------|------|----------|------|
-| ccdi_biz_intermediary | person_id | UNIQUE KEY | ✅ 已创建 |
+| 表名 | 字段 | 约束类型 | 状态 |
+|---------------------------|--------------------|-------------|-------|
+| ccdi_biz_intermediary | person_id | UNIQUE KEY | ✅ 已创建 |
| ccdi_enterprise_base_info | social_credit_code | PRIMARY KEY | ✅ 已存在 |
### 对导入功能的影响
+
- ✅ `INSERT ... ON DUPLICATE KEY UPDATE` 现在可以正确工作
- ✅ 个人中介数据根据 `person_id` 自动去重和更新
- ✅ 实体中介数据根据 `social_credit_code` 自动去重和更新
### 注意事项
+
1. **唯一索引约束:** 导入数据时,如果 `person_id` 重复,将自动执行更新操作
2. **性能影响:** 唯一索引会在插入和更新时进行唯一性检查,对性能有轻微影响
3. **数据完整性:** 唯一索引确保了数据的唯一性,防止重复数据
@@ -103,8 +117,10 @@ SHOW CREATE TABLE ccdi_enterprise_base_info;
---
## 执行人员
+
Claude Code AI Assistant
## 审核状态
+
✅ 已完成验证并创建唯一索引
✅ 文档已提交到 git (commit: a6a872b)
diff --git a/assets/database/alter_collation_to_general_ci.sql b/assets/database/alter_collation_to_general_ci.sql
new file mode 100644
index 0000000..dff39f3
--- /dev/null
+++ b/assets/database/alter_collation_to_general_ci.sql
@@ -0,0 +1,76 @@
+-- =====================================================
+-- 修改数据库字段排序规则脚本
+-- 从 utf8mb4_unicode_ci 改为 utf8mb4_general_ci
+-- 目标表:3 个表,45 个字段
+-- 执行时间:2026-02-28
+-- =====================================================
+
+USE
+ccdi;
+
+-- =====================================================
+-- 1. 修改 ccdi_base_staff 表(5 个字段)
+-- =====================================================
+ALTER TABLE ccdi_base_staff MODIFY COLUMN name varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名';
+ALTER TABLE ccdi_base_staff MODIFY COLUMN phone varchar (11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '电话';
+ALTER TABLE ccdi_base_staff MODIFY COLUMN status char (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '状态(0在职 1离职)';
+ALTER TABLE ccdi_base_staff MODIFY COLUMN create_by varchar (64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者';
+ALTER TABLE ccdi_base_staff MODIFY COLUMN update_by varchar (64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者';
+
+-- =====================================================
+-- 2. 修改 ccdi_biz_intermediary 表(20 个字段)
+-- =====================================================
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN biz_id varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '人员ID';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN person_type varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '人员类型';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN person_sub_type varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '人员子类型';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN name varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN gender char (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN id_type varchar (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '身份证' COMMENT '证件类型';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN person_id varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '证件号码';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN mobile varchar (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '手机号码';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN wechat_no varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信号';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN contact_address varchar (200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系地址';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN company varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所在公司';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN social_credit_code varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '企业统一信用码';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN position varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '职位';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN related_num_id varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联人员ID';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN relation_type varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联关系';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN data_source varchar (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'MANUAL' COMMENT '数据来源';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN remark varchar (500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注信息';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN created_by varchar (64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '记录创建人';
+ALTER TABLE ccdi_biz_intermediary MODIFY COLUMN updated_by varchar (64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '记录更新人';
+
+-- =====================================================
+-- 3. 修改 ccdi_enterprise_base_info 表(20 个字段)
+-- =====================================================
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN social_credit_code varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '统一社会信用代码';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN enterprise_name varchar (200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '企业名称';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN enterprise_type varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '企业类型';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN enterprise_nature varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '企业性质';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN industry_class varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '行业分类';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN industry_name varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '所属行业';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN register_address varchar (500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '注册地址';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN legal_representative varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '法定代表人';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN legal_cert_type varchar (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '法定代表人证件类型';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN legal_cert_no varchar (50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '法定代表人证件号码';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN shareholder1 varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '股东1';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN shareholder2 varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '股东2';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN shareholder3 varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '股东3';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN shareholder4 varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '股东4';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN shareholder5 varchar (100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '股东5';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN status varchar (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '经营状态';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN risk_level varchar (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '风险等级:1-高风险, 2-中风险, 3-低风险';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN ent_source varchar (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'GENERAL' COMMENT '企业来源:GENERAL-一般企业, EMP_RELATION-员工关系人, CREDIT_CUSTOMER-信贷客户, INTERMEDIARY-中介, BOTH-兼有';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN data_source varchar (20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'MANUAL' COMMENT '数据来源';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN created_by varchar (64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建人';
+ALTER TABLE ccdi_enterprise_base_info MODIFY COLUMN updated_by varchar (64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新人';
+
+-- =====================================================
+-- 验证修改结果
+-- =====================================================
+SELECT COUNT(*) as remaining_unicode_ci_columns
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = 'ccdi'
+ AND COLLATION_NAME = 'utf8mb4_unicode_ci';
+
+-- 应该返回 0
diff --git a/doc/database/backup/.gitkeep b/assets/database/backup/.gitkeep
similarity index 100%
rename from doc/database/backup/.gitkeep
rename to assets/database/backup/.gitkeep
diff --git a/doc/database/backup/ccdi_data.sql b/assets/database/backup/ccdi_data.sql
similarity index 100%
rename from doc/database/backup/ccdi_data.sql
rename to assets/database/backup/ccdi_data.sql
diff --git a/assets/database/backup/ccdi_structure.sql b/assets/database/backup/ccdi_structure.sql
new file mode 100644
index 0000000..76d1878
--- /dev/null
+++ b/assets/database/backup/ccdi_structure.sql
@@ -0,0 +1,1141 @@
+-- CCDI 数据库表结构
+-- 导出时间: 2026-02-28 15:26:16
+-- 源数据库: 116.62.17.81:3306/ccdi
+-- 字符集: utf8mb4
+
+SET NAMES utf8mb4;
+SET
+CHARACTER SET utf8mb4;
+SET
+GLOBAL character_set_client=utf8mb4;
+SET
+GLOBAL character_set_connection=utf8mb4;
+SET
+GLOBAL character_set_results=utf8mb4;
+
+-- MySQL dump 10.13 Distrib 5.7.44, for Win64 (x86_64)
+--
+-- Host: 116.62.17.81 Database: ccdi
+-- ------------------------------------------------------
+-- Server version 5.7.44
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `QRTZ_BLOB_TRIGGERS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_BLOB_TRIGGERS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `blob_data` blob COMMENT '存放持久化Trigger对象',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`),
+ CONSTRAINT `QRTZ_BLOB_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `QRTZ_TRIGGERS` (`sched_name`, `trigger_name`, `trigger_group`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Blob类型的触发器表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_CALENDARS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_CALENDARS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `calendar_name` varchar(200) NOT NULL COMMENT '日历名称',
+ `calendar` blob NOT NULL COMMENT '存放持久化calendar对象',
+ PRIMARY KEY (`sched_name`, `calendar_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日历信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_CRON_TRIGGERS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_CRON_TRIGGERS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `cron_expression` varchar(200) NOT NULL COMMENT 'cron表达式',
+ `time_zone_id` varchar(80) DEFAULT NULL COMMENT '时区',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`),
+ CONSTRAINT `QRTZ_CRON_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `QRTZ_TRIGGERS` (`sched_name`, `trigger_name`, `trigger_group`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Cron类型的触发器表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_FIRED_TRIGGERS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_FIRED_TRIGGERS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `entry_id` varchar(95) NOT NULL COMMENT '调度器实例id',
+ `trigger_name` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `instance_name` varchar(200) NOT NULL COMMENT '调度器实例名',
+ `fired_time` bigint(13) NOT NULL COMMENT '触发的时间',
+ `sched_time` bigint(13) NOT NULL COMMENT '定时器制定的时间',
+ `priority` int(11) NOT NULL COMMENT '优先级',
+ `state` varchar(16) NOT NULL COMMENT '状态',
+ `job_name` varchar(200) DEFAULT NULL COMMENT '任务名称',
+ `job_group` varchar(200) DEFAULT NULL COMMENT '任务组名',
+ `is_nonconcurrent` varchar(1) DEFAULT NULL COMMENT '是否并发',
+ `requests_recovery` varchar(1) DEFAULT NULL COMMENT '是否接受恢复执行',
+ PRIMARY KEY (`sched_name`, `entry_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='已触发的触发器表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_JOB_DETAILS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_JOB_DETAILS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `job_name` varchar(200) NOT NULL COMMENT '任务名称',
+ `job_group` varchar(200) NOT NULL COMMENT '任务组名',
+ `description` varchar(250) DEFAULT NULL COMMENT '相关介绍',
+ `job_class_name` varchar(250) NOT NULL COMMENT '执行任务类名称',
+ `is_durable` varchar(1) NOT NULL COMMENT '是否持久化',
+ `is_nonconcurrent` varchar(1) NOT NULL COMMENT '是否并发',
+ `is_update_data` varchar(1) NOT NULL COMMENT '是否更新数据',
+ `requests_recovery` varchar(1) NOT NULL COMMENT '是否接受恢复执行',
+ `job_data` blob COMMENT '存放持久化job对象',
+ PRIMARY KEY (`sched_name`, `job_name`, `job_group`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务详细信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_LOCKS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_LOCKS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `lock_name` varchar(40) NOT NULL COMMENT '悲观锁名称',
+ PRIMARY KEY (`sched_name`, `lock_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储的悲观锁信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_PAUSED_TRIGGER_GRPS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `trigger_group` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ PRIMARY KEY (`sched_name`, `trigger_group`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='暂停的触发器表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_SCHEDULER_STATE`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_SCHEDULER_STATE`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `instance_name` varchar(200) NOT NULL COMMENT '实例名称',
+ `last_checkin_time` bigint(13) NOT NULL COMMENT '上次检查时间',
+ `checkin_interval` bigint(13) NOT NULL COMMENT '检查间隔时间',
+ PRIMARY KEY (`sched_name`, `instance_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='调度器状态表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_SIMPLE_TRIGGERS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_SIMPLE_TRIGGERS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `repeat_count` bigint(7) NOT NULL COMMENT '重复的次数统计',
+ `repeat_interval` bigint(12) NOT NULL COMMENT '重复的间隔时间',
+ `times_triggered` bigint(10) NOT NULL COMMENT '已经触发的次数',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`),
+ CONSTRAINT `QRTZ_SIMPLE_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `QRTZ_TRIGGERS` (`sched_name`, `trigger_name`, `trigger_group`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='简单触发器的信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_SIMPROP_TRIGGERS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_SIMPROP_TRIGGERS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `str_prop_1` varchar(512) DEFAULT NULL COMMENT 'String类型的trigger的第一个参数',
+ `str_prop_2` varchar(512) DEFAULT NULL COMMENT 'String类型的trigger的第二个参数',
+ `str_prop_3` varchar(512) DEFAULT NULL COMMENT 'String类型的trigger的第三个参数',
+ `int_prop_1` int(11) DEFAULT NULL COMMENT 'int类型的trigger的第一个参数',
+ `int_prop_2` int(11) DEFAULT NULL COMMENT 'int类型的trigger的第二个参数',
+ `long_prop_1` bigint(20) DEFAULT NULL COMMENT 'long类型的trigger的第一个参数',
+ `long_prop_2` bigint(20) DEFAULT NULL COMMENT 'long类型的trigger的第二个参数',
+ `dec_prop_1` decimal(13, 4) DEFAULT NULL COMMENT 'decimal类型的trigger的第一个参数',
+ `dec_prop_2` decimal(13, 4) DEFAULT NULL COMMENT 'decimal类型的trigger的第二个参数',
+ `bool_prop_1` varchar(1) DEFAULT NULL COMMENT 'Boolean类型的trigger的第一个参数',
+ `bool_prop_2` varchar(1) DEFAULT NULL COMMENT 'Boolean类型的trigger的第二个参数',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`),
+ CONSTRAINT `QRTZ_SIMPROP_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `QRTZ_TRIGGERS` (`sched_name`, `trigger_name`, `trigger_group`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='同步机制的行锁表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `QRTZ_TRIGGERS`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `QRTZ_TRIGGERS`
+(
+ `sched_name` varchar(120) NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) NOT NULL COMMENT '触发器的名字',
+ `trigger_group` varchar(200) NOT NULL COMMENT '触发器所属组的名字',
+ `job_name` varchar(200) NOT NULL COMMENT 'qrtz_job_details表job_name的外键',
+ `job_group` varchar(200) NOT NULL COMMENT 'qrtz_job_details表job_group的外键',
+ `description` varchar(250) DEFAULT NULL COMMENT '相关介绍',
+ `next_fire_time` bigint(13) DEFAULT NULL COMMENT '上一次触发时间(毫秒)',
+ `prev_fire_time` bigint(13) DEFAULT NULL COMMENT '下一次触发时间(默认为-1表示不触发)',
+ `priority` int(11) DEFAULT NULL COMMENT '优先级',
+ `trigger_state` varchar(16) NOT NULL COMMENT '触发器状态',
+ `trigger_type` varchar(8) NOT NULL COMMENT '触发器的类型',
+ `start_time` bigint(13) NOT NULL COMMENT '开始时间',
+ `end_time` bigint(13) DEFAULT NULL COMMENT '结束时间',
+ `calendar_name` varchar(200) DEFAULT NULL COMMENT '日程表名称',
+ `misfire_instr` smallint(2) DEFAULT NULL COMMENT '补偿执行的策略',
+ `job_data` blob COMMENT '存放持久化job对象',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`),
+ KEY `sched_name` (`sched_name`,`job_name`,`job_group`),
+ CONSTRAINT `QRTZ_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `QRTZ_JOB_DETAILS` (`sched_name`, `job_name`, `job_group`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='触发器详细信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_base_staff`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_base_staff`
+(
+ `staff_id` bigint(20) NOT NULL COMMENT '员工ID(柜员号,7位数字)',
+ `name` varchar(100) NOT NULL COMMENT '姓名',
+ `dept_id` bigint(20) DEFAULT NULL COMMENT '所属部门ID',
+ `id_card` varchar(100) DEFAULT NULL COMMENT '身份证号',
+ `phone` varchar(11) DEFAULT NULL COMMENT '电话',
+ `hire_date` date DEFAULT NULL COMMENT '入职时间',
+ `status` char(1) NOT NULL DEFAULT '0' COMMENT '状态(0在职 1离职)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`staff_id`),
+ KEY `idx_status` (`status`),
+ KEY `idx_dept_id` (`dept_id`),
+ KEY `idx_id_card` (`id_card`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_biz_intermediary`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_biz_intermediary`
+(
+ `biz_id` varchar(50) NOT NULL COMMENT '人员ID',
+ `person_type` varchar(50) DEFAULT NULL COMMENT '人员类型',
+ `person_sub_type` varchar(50) DEFAULT NULL COMMENT '人员子类型',
+ `name` varchar(100) NOT NULL COMMENT '姓名',
+ `gender` char(1) DEFAULT NULL COMMENT '性别',
+ `id_type` varchar(20) DEFAULT '身份证' COMMENT '证件类型',
+ `person_id` varchar(50) NOT NULL COMMENT '证件号码',
+ `mobile` varchar(20) DEFAULT NULL COMMENT '手机号码',
+ `wechat_no` varchar(50) DEFAULT NULL COMMENT '微信号',
+ `contact_address` varchar(200) DEFAULT NULL COMMENT '联系地址',
+ `company` varchar(100) DEFAULT NULL COMMENT '所在公司',
+ `social_credit_code` varchar(50) DEFAULT NULL COMMENT '企业统一信用码',
+ `position` varchar(50) DEFAULT NULL COMMENT '职位',
+ `related_num_id` varchar(50) DEFAULT NULL COMMENT '关联人员ID',
+ `relation_type` varchar(50) DEFAULT NULL COMMENT '关联关系',
+ `data_source` varchar(20) DEFAULT 'MANUAL' COMMENT '数据来源',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
+ `created_by` varchar(64) DEFAULT '' COMMENT '记录创建人',
+ `updated_by` varchar(64) DEFAULT '' COMMENT '记录更新人',
+ `create_time` datetime DEFAULT NULL COMMENT '记录创建时间',
+ `update_time` datetime DEFAULT NULL COMMENT '记录更新时间',
+ PRIMARY KEY (`biz_id`),
+ UNIQUE KEY `uk_person_id` (`person_id`),
+ KEY `idx_name` (`name`),
+ KEY `idx_mobile` (`mobile`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='中介人员基本信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_cust_enterprise_relation`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_cust_enterprise_relation`
+(
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键,唯一标识',
+ `person_id` varchar(18) NOT NULL COMMENT '身份证号',
+ `relation_person_post` varchar(100) DEFAULT NULL COMMENT '关联人在企业的职务',
+ `social_credit_code` varchar(18) NOT NULL COMMENT '统一社会信用代码',
+ `enterprise_name` varchar(200) DEFAULT NULL COMMENT '企业名称',
+ `status` int(11) NOT NULL DEFAULT '1' COMMENT '关系是否有效',
+ `remark` text COMMENT '补充说明',
+ `data_source` varchar(50) DEFAULT NULL COMMENT '数据来源',
+ `is_employee` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是员工',
+ `is_emp_family` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是员工家庭关联人',
+ `is_customer` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是信贷客户',
+ `is_cust_family` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是信贷客户关联人',
+ `created_by` varchar(64) NOT NULL COMMENT '记录创建人',
+ `updated_by` varchar(64) DEFAULT NULL COMMENT '记录更新人',
+ `create_time` datetime NOT NULL COMMENT '记录创建时间',
+ `update_time` datetime NOT NULL COMMENT '记录更新时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_person_enterprise` (`person_id`,`social_credit_code`),
+ KEY `idx_person_id` (`person_id`),
+ KEY `idx_social_credit_code` (`social_credit_code`)
+) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COMMENT='信贷客户实体关联关系表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_cust_fmy_relation`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_cust_fmy_relation`
+(
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `person_id` varchar(100) NOT NULL COMMENT '信贷客户身份证号',
+ `relation_type` varchar(50) NOT NULL COMMENT '关系类型',
+ `relation_name` varchar(100) NOT NULL COMMENT '关系人姓名',
+ `gender` char(1) DEFAULT NULL COMMENT '性别:M-男,F-女,O-其他',
+ `birth_date` date DEFAULT NULL COMMENT '关系人出生日期',
+ `relation_cert_type` varchar(50) NOT NULL COMMENT '证件类型',
+ `relation_cert_no` varchar(50) NOT NULL COMMENT '证件号码',
+ `mobile_phone1` varchar(20) DEFAULT NULL COMMENT '手机号码1',
+ `mobile_phone2` varchar(20) DEFAULT NULL COMMENT '手机号码2',
+ `wechat_no1` varchar(50) DEFAULT NULL COMMENT '微信名称1',
+ `wechat_no2` varchar(50) DEFAULT NULL COMMENT '微信名称2',
+ `wechat_no3` varchar(50) DEFAULT NULL COMMENT '微信名称3',
+ `contact_address` varchar(500) DEFAULT NULL COMMENT '详细联系地址',
+ `relation_desc` varchar(500) DEFAULT NULL COMMENT '关系详细描述',
+ `status` int(11) NOT NULL DEFAULT '1' COMMENT '状态:0-无效,1-有效',
+ `effective_date` datetime DEFAULT NULL COMMENT '关系生效日期',
+ `invalid_date` datetime DEFAULT NULL COMMENT '关系失效日期',
+ `remark` text COMMENT '备注信息',
+ `data_source` varchar(50) DEFAULT NULL COMMENT '数据来源:MANUAL-手动录入,IMPORT-批量导入',
+ `is_emp_family` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是员工的家庭关系:0-否',
+ `is_cust_family` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否是信贷客户的家庭关系:1-是',
+ `created_by` varchar(100) NOT NULL COMMENT '记录创建人',
+ `updated_by` varchar(100) DEFAULT NULL COMMENT '记录更新人',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_person_cert` (`person_id`,`relation_cert_no`) COMMENT '信贷客户身份证号+关系人证件号码唯一',
+ KEY `idx_person_id` (`person_id`),
+ KEY `idx_relation_cert_no` (`relation_cert_no`),
+ KEY `idx_status` (`status`) COMMENT '状态索引',
+ KEY `idx_data_source` (`data_source`) COMMENT '数据来源索引'
+) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COMMENT='信贷客户家庭关系表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_enterprise_base_info`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_enterprise_base_info`
+(
+ `social_credit_code` varchar(50) NOT NULL COMMENT '统一社会信用代码',
+ `enterprise_name` varchar(200) NOT NULL COMMENT '企业名称',
+ `enterprise_type` varchar(50) DEFAULT NULL COMMENT '企业类型',
+ `enterprise_nature` varchar(50) DEFAULT NULL COMMENT '企业性质',
+ `industry_class` varchar(50) DEFAULT NULL COMMENT '行业分类',
+ `industry_name` varchar(100) DEFAULT NULL COMMENT '所属行业',
+ `establish_date` date DEFAULT NULL COMMENT '成立日期',
+ `register_address` varchar(500) DEFAULT NULL COMMENT '注册地址',
+ `legal_representative` varchar(100) DEFAULT NULL COMMENT '法定代表人',
+ `legal_cert_type` varchar(20) DEFAULT NULL COMMENT '法定代表人证件类型',
+ `legal_cert_no` varchar(50) DEFAULT NULL COMMENT '法定代表人证件号码',
+ `shareholder1` varchar(100) DEFAULT NULL COMMENT '股东1',
+ `shareholder2` varchar(100) DEFAULT NULL COMMENT '股东2',
+ `shareholder3` varchar(100) DEFAULT NULL COMMENT '股东3',
+ `shareholder4` varchar(100) DEFAULT NULL COMMENT '股东4',
+ `shareholder5` varchar(100) DEFAULT NULL COMMENT '股东5',
+ `status` varchar(20) DEFAULT NULL COMMENT '经营状态',
+ `risk_level` varchar(1) DEFAULT '3' COMMENT '风险等级:1-高风险, 2-中风险, 3-低风险',
+ `ent_source` varchar(20) DEFAULT 'GENERAL' COMMENT '企业来源:GENERAL-一般企业, EMP_RELATION-员工关系人, CREDIT_CUSTOMER-信贷客户, INTERMEDIARY-中介, BOTH-兼有',
+ `data_source` varchar(20) DEFAULT 'MANUAL' COMMENT '数据来源',
+ `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `created_by` varchar(64) DEFAULT '' COMMENT '创建人',
+ `updated_by` varchar(64) DEFAULT '' COMMENT '更新人',
+ PRIMARY KEY (`social_credit_code`),
+ KEY `idx_enterprise_name` (`enterprise_name`),
+ KEY `idx_ent_source` (`ent_source`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业主体信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_model_param`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_model_param`
+(
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `project_id` bigint(20) DEFAULT '0' COMMENT '项目ID(0表示默认参数,其他值为具体项目ID)',
+ `model_code` varchar(100) NOT NULL COMMENT '模型编码',
+ `model_name` varchar(100) NOT NULL COMMENT '模型名称',
+ `param_code` varchar(100) NOT NULL COMMENT '参数编码',
+ `param_name` varchar(100) NOT NULL COMMENT '监测项名称',
+ `param_desc` varchar(500) DEFAULT NULL COMMENT '参数描述',
+ `param_value` varchar(200) NOT NULL COMMENT '参数值',
+ `param_unit` varchar(50) DEFAULT NULL COMMENT '参数单位',
+ `sort_order` int(11) DEFAULT '0' COMMENT '排序号(参数展示顺序)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_project_model_param` (`project_id`,`model_code`,`param_code`),
+ KEY `idx_project_id` (`project_id`),
+ KEY `idx_model_code` (`model_code`)
+) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='模型参数配置表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_project`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_project`
+(
+ `project_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '项目ID',
+ `project_name` varchar(200) NOT NULL COMMENT '项目名称',
+ `description` varchar(500) DEFAULT NULL COMMENT '项目描述',
+ `config_type` varchar(20) NOT NULL DEFAULT 'default' COMMENT '配置方式:default-全局默认,custom-自定义',
+ `status` char(1) NOT NULL DEFAULT '0' COMMENT '项目状态:0-进行中,1-已完成,2-已归档',
+ `is_archived` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否归档:0-未归档,1-已归档',
+ `target_count` int(11) NOT NULL DEFAULT '0' COMMENT '目标人数',
+ `high_risk_count` int(11) NOT NULL DEFAULT '0' COMMENT '高风险人数',
+ `medium_risk_count` int(11) NOT NULL DEFAULT '0' COMMENT '中风险人数',
+ `low_risk_count` int(11) NOT NULL DEFAULT '0' COMMENT '低风险人数',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志:0-存在,2-删除',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`project_id`),
+ KEY `idx_project_name` (`project_name`),
+ KEY `idx_status` (`status`),
+ KEY `idx_is_archived` (`is_archived`),
+ KEY `idx_del_flag` (`del_flag`),
+ KEY `idx_create_time` (`create_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COMMENT='纪检初核项目表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_purchase_transaction`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_purchase_transaction`
+(
+ `purchase_id` varchar(32) NOT NULL COMMENT '采购事项ID',
+ `purchase_category` varchar(50) NOT NULL COMMENT '采购类别',
+ `project_name` varchar(200) DEFAULT NULL COMMENT '项目名称',
+ `subject_name` varchar(200) NOT NULL COMMENT '标的物名称',
+ `subject_desc` text COMMENT '标的物描述',
+ `purchase_qty` decimal(12, 4) NOT NULL DEFAULT '1.0000' COMMENT '采购数量',
+ `budget_amount` decimal(18, 2) NOT NULL COMMENT '预算金额',
+ `bid_amount` decimal(18, 2) DEFAULT NULL COMMENT '中标金额',
+ `actual_amount` decimal(18, 2) DEFAULT NULL COMMENT '实际采购金额',
+ `contract_amount` decimal(18, 2) DEFAULT NULL COMMENT '合同金额',
+ `settlement_amount` decimal(18, 2) DEFAULT NULL COMMENT '结算金额',
+ `purchase_method` varchar(50) NOT NULL COMMENT '采购方式',
+ `supplier_name` varchar(200) DEFAULT NULL COMMENT '中标供应商名称',
+ `contact_person` varchar(50) DEFAULT NULL COMMENT '供应商联系人',
+ `contact_phone` varchar(20) DEFAULT NULL COMMENT '供应商联系电话',
+ `supplier_uscc` varchar(18) DEFAULT NULL COMMENT '供应商统一信用代码',
+ `supplier_bank_account` varchar(50) DEFAULT NULL COMMENT '供应商银行账户',
+ `apply_date` date NOT NULL COMMENT '采购申请日期',
+ `plan_approve_date` date DEFAULT NULL COMMENT '采购计划批准日期',
+ `announce_date` date DEFAULT NULL COMMENT '采购公告发布日期',
+ `bid_open_date` date DEFAULT NULL COMMENT '开标日期',
+ `contract_sign_date` date DEFAULT NULL COMMENT '合同签订日期',
+ `expected_delivery_date` date DEFAULT NULL COMMENT '预计交货日期',
+ `actual_delivery_date` date DEFAULT NULL COMMENT '实际交货日期',
+ `acceptance_date` date DEFAULT NULL COMMENT '验收日期',
+ `settlement_date` date DEFAULT NULL COMMENT '结算日期',
+ `applicant_id` varchar(7) NOT NULL COMMENT '申请人工号',
+ `applicant_name` varchar(50) NOT NULL COMMENT '申请人姓名',
+ `apply_department` varchar(100) NOT NULL COMMENT '申请部门',
+ `purchase_leader_id` varchar(7) DEFAULT NULL COMMENT '采购负责人工号',
+ `purchase_leader_name` varchar(50) DEFAULT NULL COMMENT '采购负责人姓名',
+ `purchase_department` varchar(100) DEFAULT NULL COMMENT '采购部门',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `created_by` varchar(50) NOT NULL COMMENT '创建人',
+ `updated_by` varchar(50) DEFAULT NULL COMMENT '更新人',
+ PRIMARY KEY (`purchase_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工采购交易信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_staff_enterprise_relation`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_staff_enterprise_relation`
+(
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键,唯一标识',
+ `person_id` varchar(100) NOT NULL COMMENT '身份证号,关联员工表的外键',
+ `relation_person_post` varchar(100) DEFAULT NULL COMMENT '关联人在企业的职务:股东、法人、高管、实际控制人等',
+ `social_credit_code` varchar(50) NOT NULL COMMENT '统一社会信用代码,关联企业主体信息表的外键',
+ `enterprise_name` varchar(200) DEFAULT NULL COMMENT '企业名称(冗余存储,便于快速查询)',
+ `status` int(11) NOT NULL DEFAULT '1' COMMENT '关系是否有效:0 - 无效、1 - 有效(默认有效)',
+ `remark` text COMMENT '补充说明',
+ `data_source` varchar(50) DEFAULT NULL COMMENT '数据来源',
+ `is_employee` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是员工:0-否 1-是',
+ `is_emp_family` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否是员工家庭关联人:0-否 1-是',
+ `is_customer` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是信贷客户:0-否 1-是',
+ `is_cust_family` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是信贷客户关联人:0-否 1-是',
+ `created_by` varchar(100) NOT NULL COMMENT '记录创建人',
+ `updated_by` varchar(100) DEFAULT NULL COMMENT '记录更新人',
+ `create_time` datetime NOT NULL COMMENT '记录创建时间',
+ `update_time` datetime NOT NULL COMMENT '记录更新时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_person_social` (`person_id`,`social_credit_code`) COMMENT '业务唯一性约束'
+) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='员工实体关系表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_staff_fmy_relation`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_staff_fmy_relation`
+(
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `person_id` varchar(100) NOT NULL COMMENT '员工身份证号',
+ `relation_type` varchar(50) NOT NULL COMMENT '关系类型',
+ `relation_name` varchar(100) NOT NULL COMMENT '关系人姓名',
+ `gender` char(1) DEFAULT NULL COMMENT '性别:M-男,F-女,O-其他',
+ `birth_date` date DEFAULT NULL COMMENT '关系人出生日期',
+ `relation_cert_type` varchar(50) NOT NULL COMMENT '关系人证件类型',
+ `relation_cert_no` varchar(50) NOT NULL COMMENT '关系人证件号码',
+ `mobile_phone1` varchar(20) DEFAULT NULL COMMENT '手机号码1',
+ `mobile_phone2` varchar(20) DEFAULT NULL COMMENT '手机号码2',
+ `wechat_no1` varchar(50) DEFAULT NULL COMMENT '微信名称1',
+ `wechat_no2` varchar(50) DEFAULT NULL COMMENT '微信名称2',
+ `wechat_no3` varchar(50) DEFAULT NULL COMMENT '微信名称3',
+ `contact_address` varchar(500) DEFAULT NULL COMMENT '详细联系地址',
+ `relation_desc` varchar(500) DEFAULT NULL COMMENT '关系详细描述',
+ `status` int(11) NOT NULL DEFAULT '1' COMMENT '状态:0-无效,1-有效',
+ `effective_date` datetime DEFAULT NULL COMMENT '关系生效日期',
+ `invalid_date` datetime DEFAULT NULL COMMENT '关系失效日期',
+ `remark` text COMMENT '备注信息',
+ `data_source` varchar(50) DEFAULT NULL COMMENT '数据来源:MANUAL-手工录入,SYSTEM-系统同步,IMPORT-批量导入,API-接口获取',
+ `is_emp_family` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否是员工的家庭关系:0-否 1-是',
+ `is_cust_family` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是信贷客户的家庭关系:0-否 1-是',
+ `created_by` varchar(100) NOT NULL COMMENT '记录创建人',
+ `updated_by` varchar(100) DEFAULT NULL COMMENT '记录更新人',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_person_cert` (`person_id`,`relation_cert_no`),
+ KEY `idx_person_id` (`person_id`),
+ KEY `idx_relation_cert_no` (`relation_cert_no`),
+ KEY `idx_status` (`status`),
+ KEY `idx_data_source` (`data_source`)
+) ENGINE=InnoDB AUTO_INCREMENT=3501 DEFAULT CHARSET=utf8mb4 COMMENT='员工家庭关系表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_staff_recruitment`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_staff_recruitment`
+(
+ `recruit_id` varchar(32) NOT NULL COMMENT '招聘项目编号',
+ `recruit_name` varchar(100) NOT NULL COMMENT '招聘项目名称',
+ `pos_name` varchar(100) NOT NULL COMMENT '职位名称',
+ `pos_category` varchar(50) NOT NULL COMMENT '职位类别',
+ `pos_desc` text NOT NULL COMMENT '职位描述',
+ `cand_name` varchar(20) NOT NULL COMMENT '应聘人员姓名',
+ `cand_edu` varchar(20) NOT NULL COMMENT '应聘人员学历',
+ `cand_id` varchar(18) NOT NULL COMMENT '应聘人员证件号码',
+ `cand_school` varchar(50) NOT NULL COMMENT '应聘人员毕业院校',
+ `cand_major` varchar(30) NOT NULL COMMENT '应聘人员专业',
+ `cand_grad` varchar(6) NOT NULL COMMENT '应聘人员毕业年月',
+ `admit_status` varchar(10) NOT NULL COMMENT '录用情况:录用、未录用、放弃',
+ `interviewer_name1` varchar(20) DEFAULT NULL COMMENT '面试官1姓名',
+ `interviewer_id1` varchar(10) DEFAULT NULL COMMENT '面试官1工号',
+ `interviewer_name2` varchar(20) DEFAULT NULL COMMENT '面试官2姓名',
+ `interviewer_id2` varchar(10) DEFAULT NULL COMMENT '面试官2工号',
+ `created_by` varchar(20) NOT NULL COMMENT '记录创建人',
+ `updated_by` varchar(20) DEFAULT NULL COMMENT '记录更新人',
+ `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ PRIMARY KEY (`recruit_id`),
+ KEY `idx_cand_id` (`cand_id`),
+ KEY `idx_admit_status` (`admit_status`),
+ KEY `idx_interviewer_id1` (`interviewer_id1`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工招聘信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ccdi_staff_transfer`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ccdi_staff_transfer`
+(
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `staff_id` bigint(20) NOT NULL COMMENT '员工ID,关联ccdi_base_staff.staff_id',
+ `transfer_type` varchar(50) DEFAULT NULL COMMENT '调动类型:PROMOTION-升职,DEMOPTION-降职,LATERAL-平调,ROTATION-轮岗,SECONDMENT-借调,DEPARTMENT_CHANGE-部门调动,POSITION_CHANGE-职位调整,RETURN-返岗,TERMINATION-离职,OTHER-其他',
+ `transfer_sub_type` varchar(100) DEFAULT NULL COMMENT '调动子类型,双聘调动、临时调动等',
+ `dept_id_before` bigint(20) DEFAULT NULL COMMENT '调动前部门ID',
+ `dept_name_before` varchar(200) DEFAULT NULL COMMENT '调动前部门',
+ `grade_before` varchar(50) DEFAULT NULL COMMENT '调动前职级',
+ `position_before` varchar(100) DEFAULT NULL COMMENT '调动前岗位',
+ `salary_level_before` varchar(50) DEFAULT NULL COMMENT '调动前薪酬等级',
+ `dept_id_after` bigint(20) DEFAULT NULL COMMENT '调动后部门ID',
+ `dept_name_after` varchar(200) DEFAULT NULL COMMENT '调动后部门',
+ `grade_after` varchar(50) DEFAULT NULL COMMENT '调动后职级',
+ `position_after` varchar(100) DEFAULT NULL COMMENT '调动后岗位',
+ `salary_level_after` varchar(50) DEFAULT NULL COMMENT '调动后薪酬等级',
+ `transfer_date` date DEFAULT NULL COMMENT '调动日期',
+ `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
+ `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
+ `created_by` varchar(100) NOT NULL COMMENT '创建人',
+ `updated_by` varchar(100) DEFAULT NULL COMMENT '更新人',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_staff_transfer_date` (`staff_id`,`dept_id_before`,`dept_id_after`,`transfer_date`),
+ KEY `idx_staff_id` (`staff_id`) USING BTREE,
+ KEY `idx_transfer_type` (`transfer_type`) USING BTREE,
+ KEY `idx_transfer_date` (`transfer_date`) USING BTREE,
+ KEY `idx_dept_before` (`dept_id_before`) USING BTREE,
+ KEY `idx_dept_after` (`dept_id_after`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=415 DEFAULT CHARSET=utf8mb4 COMMENT='员工调动记录表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `gen_table`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `gen_table`
+(
+ `table_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `table_name` varchar(200) DEFAULT '' COMMENT '表名称',
+ `table_comment` varchar(500) DEFAULT '' COMMENT '表描述',
+ `sub_table_name` varchar(64) DEFAULT NULL COMMENT '关联子表的表名',
+ `sub_table_fk_name` varchar(64) DEFAULT NULL COMMENT '子表关联的外键名',
+ `class_name` varchar(100) DEFAULT '' COMMENT '实体类名称',
+ `tpl_category` varchar(200) DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)',
+ `tpl_web_type` varchar(30) DEFAULT '' COMMENT '前端模板类型(element-ui模版 element-plus模版)',
+ `package_name` varchar(100) DEFAULT NULL COMMENT '生成包路径',
+ `module_name` varchar(30) DEFAULT NULL COMMENT '生成模块名',
+ `business_name` varchar(30) DEFAULT NULL COMMENT '生成业务名',
+ `function_name` varchar(50) DEFAULT NULL COMMENT '生成功能名',
+ `function_author` varchar(50) DEFAULT NULL COMMENT '生成功能作者',
+ `gen_type` char(1) DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',
+ `gen_path` varchar(200) DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',
+ `options` varchar(1000) DEFAULT NULL COMMENT '其它生成选项',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`table_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `gen_table_column`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `gen_table_column`
+(
+ `column_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `table_id` bigint(20) DEFAULT NULL COMMENT '归属表编号',
+ `column_name` varchar(200) DEFAULT NULL COMMENT '列名称',
+ `column_comment` varchar(500) DEFAULT NULL COMMENT '列描述',
+ `column_type` varchar(100) DEFAULT NULL COMMENT '列类型',
+ `java_type` varchar(500) DEFAULT NULL COMMENT 'JAVA类型',
+ `java_field` varchar(200) DEFAULT NULL COMMENT 'JAVA字段名',
+ `is_pk` char(1) DEFAULT NULL COMMENT '是否主键(1是)',
+ `is_increment` char(1) DEFAULT NULL COMMENT '是否自增(1是)',
+ `is_required` char(1) DEFAULT NULL COMMENT '是否必填(1是)',
+ `is_insert` char(1) DEFAULT NULL COMMENT '是否为插入字段(1是)',
+ `is_edit` char(1) DEFAULT NULL COMMENT '是否编辑字段(1是)',
+ `is_list` char(1) DEFAULT NULL COMMENT '是否列表字段(1是)',
+ `is_query` char(1) DEFAULT NULL COMMENT '是否查询字段(1是)',
+ `query_type` varchar(200) DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',
+ `html_type` varchar(200) DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+ `dict_type` varchar(200) DEFAULT '' COMMENT '字典类型',
+ `sort` int(11) DEFAULT NULL COMMENT '排序',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`column_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表字段';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_config`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_config`
+(
+ `config_id` int(5) NOT NULL AUTO_INCREMENT COMMENT '参数主键',
+ `config_name` varchar(100) DEFAULT '' COMMENT '参数名称',
+ `config_key` varchar(100) DEFAULT '' COMMENT '参数键名',
+ `config_value` varchar(500) DEFAULT '' COMMENT '参数键值',
+ `config_type` char(1) DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`config_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='参数配置表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_dept`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_dept`
+(
+ `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id',
+ `parent_id` bigint(20) DEFAULT '0' COMMENT '父部门id',
+ `ancestors` varchar(50) DEFAULT '' COMMENT '祖级列表',
+ `dept_name` varchar(30) DEFAULT '' COMMENT '部门名称',
+ `order_num` int(4) DEFAULT '0' COMMENT '显示顺序',
+ `leader` varchar(20) DEFAULT NULL COMMENT '负责人',
+ `phone` varchar(11) DEFAULT NULL COMMENT '联系电话',
+ `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
+ `status` char(1) DEFAULT '0' COMMENT '部门状态(0正常 1停用)',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`dept_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_dict_data`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_dict_data`
+(
+ `dict_code` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典编码',
+ `dict_sort` int(4) DEFAULT '0' COMMENT '字典排序',
+ `dict_label` varchar(100) DEFAULT '' COMMENT '字典标签',
+ `dict_value` varchar(100) DEFAULT '' COMMENT '字典键值',
+ `dict_type` varchar(100) DEFAULT '' COMMENT '字典类型',
+ `css_class` varchar(100) DEFAULT NULL COMMENT '样式属性(其他样式扩展)',
+ `list_class` varchar(100) DEFAULT NULL COMMENT '表格回显样式',
+ `is_default` char(1) DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`dict_code`)
+) ENGINE=InnoDB AUTO_INCREMENT=165 DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_dict_type`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_dict_type`
+(
+ `dict_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键',
+ `dict_name` varchar(100) DEFAULT '' COMMENT '字典名称',
+ `dict_type` varchar(100) DEFAULT '' COMMENT '字典类型',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`dict_id`),
+ UNIQUE KEY `dict_type` (`dict_type`)
+) ENGINE=InnoDB AUTO_INCREMENT=116 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_job`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_job`
+(
+ `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID',
+ `job_name` varchar(64) NOT NULL DEFAULT '' COMMENT '任务名称',
+ `job_group` varchar(64) NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名',
+ `invoke_target` varchar(500) NOT NULL COMMENT '调用目标字符串',
+ `cron_expression` varchar(255) DEFAULT '' COMMENT 'cron执行表达式',
+ `misfire_policy` varchar(20) DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',
+ `concurrent` char(1) DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1暂停)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT '' COMMENT '备注信息',
+ PRIMARY KEY (`job_id`, `job_name`, `job_group`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务调度表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_job_log`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_job_log`
+(
+ `job_log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID',
+ `job_name` varchar(64) NOT NULL COMMENT '任务名称',
+ `job_group` varchar(64) NOT NULL COMMENT '任务组名',
+ `invoke_target` varchar(500) NOT NULL COMMENT '调用目标字符串',
+ `job_message` varchar(500) DEFAULT NULL COMMENT '日志信息',
+ `status` char(1) DEFAULT '0' COMMENT '执行状态(0正常 1失败)',
+ `exception_info` varchar(2000) DEFAULT '' COMMENT '异常信息',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ PRIMARY KEY (`job_log_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务调度日志表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_logininfor`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_logininfor`
+(
+ `info_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '访问ID',
+ `user_name` varchar(50) DEFAULT '' COMMENT '用户账号',
+ `ipaddr` varchar(128) DEFAULT '' COMMENT '登录IP地址',
+ `login_location` varchar(255) DEFAULT '' COMMENT '登录地点',
+ `browser` varchar(50) DEFAULT '' COMMENT '浏览器类型',
+ `os` varchar(50) DEFAULT '' COMMENT '操作系统',
+ `status` char(1) DEFAULT '0' COMMENT '登录状态(0成功 1失败)',
+ `msg` varchar(255) DEFAULT '' COMMENT '提示消息',
+ `login_time` datetime DEFAULT NULL COMMENT '访问时间',
+ PRIMARY KEY (`info_id`),
+ KEY `idx_sys_logininfor_s` (`status`),
+ KEY `idx_sys_logininfor_lt` (`login_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=206 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_menu`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_menu`
+(
+ `menu_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
+ `menu_name` varchar(50) NOT NULL COMMENT '菜单名称',
+ `parent_id` bigint(20) DEFAULT '0' COMMENT '父菜单ID',
+ `order_num` int(4) DEFAULT '0' COMMENT '显示顺序',
+ `path` varchar(200) DEFAULT '' COMMENT '路由地址',
+ `component` varchar(255) DEFAULT NULL COMMENT '组件路径',
+ `query` varchar(255) DEFAULT NULL COMMENT '路由参数',
+ `route_name` varchar(50) DEFAULT '' COMMENT '路由名称',
+ `is_frame` int(1) DEFAULT '1' COMMENT '是否为外链(0是 1否)',
+ `is_cache` int(1) DEFAULT '0' COMMENT '是否缓存(0缓存 1不缓存)',
+ `menu_type` char(1) DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
+ `visible` char(1) DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)',
+ `status` char(1) DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
+ `perms` varchar(100) DEFAULT NULL COMMENT '权限标识',
+ `icon` varchar(100) DEFAULT '#' COMMENT '菜单图标',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT '' COMMENT '备注',
+ PRIMARY KEY (`menu_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2091 DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_notice`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_notice`
+(
+ `notice_id` int(4) NOT NULL AUTO_INCREMENT COMMENT '公告ID',
+ `notice_title` varchar(50) NOT NULL COMMENT '公告标题',
+ `notice_type` char(1) NOT NULL COMMENT '公告类型(1通知 2公告)',
+ `notice_content` longblob COMMENT '公告内容',
+ `status` char(1) DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(255) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`notice_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='通知公告表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_oper_log`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_oper_log`
+(
+ `oper_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键',
+ `title` varchar(50) DEFAULT '' COMMENT '模块标题',
+ `business_type` int(2) DEFAULT '0' COMMENT '业务类型(0其它 1新增 2修改 3删除)',
+ `method` varchar(200) DEFAULT '' COMMENT '方法名称',
+ `request_method` varchar(10) DEFAULT '' COMMENT '请求方式',
+ `operator_type` int(1) DEFAULT '0' COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
+ `oper_name` varchar(50) DEFAULT '' COMMENT '操作人员',
+ `dept_name` varchar(50) DEFAULT '' COMMENT '部门名称',
+ `oper_url` varchar(255) DEFAULT '' COMMENT '请求URL',
+ `oper_ip` varchar(128) DEFAULT '' COMMENT '主机地址',
+ `oper_location` varchar(255) DEFAULT '' COMMENT '操作地点',
+ `oper_param` varchar(2000) DEFAULT '' COMMENT '请求参数',
+ `json_result` varchar(2000) DEFAULT '' COMMENT '返回参数',
+ `status` int(1) DEFAULT '0' COMMENT '操作状态(0正常 1异常)',
+ `error_msg` varchar(2000) DEFAULT '' COMMENT '错误消息',
+ `oper_time` datetime DEFAULT NULL COMMENT '操作时间',
+ `cost_time` bigint(20) DEFAULT '0' COMMENT '消耗时间',
+ PRIMARY KEY (`oper_id`),
+ KEY `idx_sys_oper_log_bt` (`business_type`),
+ KEY `idx_sys_oper_log_s` (`status`),
+ KEY `idx_sys_oper_log_ot` (`oper_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=355 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_post`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_post`
+(
+ `post_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '岗位ID',
+ `post_code` varchar(64) NOT NULL COMMENT '岗位编码',
+ `post_name` varchar(50) NOT NULL COMMENT '岗位名称',
+ `post_sort` int(4) NOT NULL COMMENT '显示顺序',
+ `status` char(1) NOT NULL COMMENT '状态(0正常 1停用)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`post_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='岗位信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_role`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_role`
+(
+ `role_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID',
+ `role_name` varchar(30) NOT NULL COMMENT '角色名称',
+ `role_key` varchar(100) NOT NULL COMMENT '角色权限字符串',
+ `role_sort` int(4) NOT NULL COMMENT '显示顺序',
+ `data_scope` char(1) DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+ `menu_check_strictly` tinyint(1) DEFAULT '1' COMMENT '菜单树选择项是否关联显示',
+ `dept_check_strictly` tinyint(1) DEFAULT '1' COMMENT '部门树选择项是否关联显示',
+ `status` char(1) NOT NULL COMMENT '角色状态(0正常 1停用)',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`role_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='角色信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_role_dept`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_role_dept`
+(
+ `role_id` bigint(20) NOT NULL COMMENT '角色ID',
+ `dept_id` bigint(20) NOT NULL COMMENT '部门ID',
+ PRIMARY KEY (`role_id`, `dept_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色和部门关联表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_role_menu`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_role_menu`
+(
+ `role_id` bigint(20) NOT NULL COMMENT '角色ID',
+ `menu_id` bigint(20) NOT NULL COMMENT '菜单ID',
+ PRIMARY KEY (`role_id`, `menu_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色和菜单关联表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_user`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_user`
+(
+ `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
+ `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
+ `user_name` varchar(30) NOT NULL COMMENT '用户账号',
+ `nick_name` varchar(30) NOT NULL COMMENT '用户昵称',
+ `user_type` varchar(2) DEFAULT '00' COMMENT '用户类型(00系统用户)',
+ `email` varchar(50) DEFAULT '' COMMENT '用户邮箱',
+ `phonenumber` varchar(11) DEFAULT '' COMMENT '手机号码',
+ `sex` char(1) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
+ `avatar` varchar(100) DEFAULT '' COMMENT '头像地址',
+ `password` varchar(100) DEFAULT '' COMMENT '密码',
+ `status` char(1) DEFAULT '0' COMMENT '账号状态(0正常 1停用)',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ `login_ip` varchar(128) DEFAULT '' COMMENT '最后登录IP',
+ `login_date` datetime DEFAULT NULL COMMENT '最后登录时间',
+ `pwd_update_date` datetime DEFAULT NULL COMMENT '密码最后更新时间',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`user_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_user_post`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_user_post`
+(
+ `user_id` bigint(20) NOT NULL COMMENT '用户ID',
+ `post_id` bigint(20) NOT NULL COMMENT '岗位ID',
+ PRIMARY KEY (`user_id`, `post_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户与岗位关联表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `sys_user_role`
+--
+
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `sys_user_role`
+(
+ `user_id` bigint(20) NOT NULL COMMENT '用户ID',
+ `role_id` bigint(20) NOT NULL COMMENT '角色ID',
+ PRIMARY KEY (`user_id`, `role_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户和角色关联表';
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2026-02-28 15:26:16
diff --git a/assets/database/staff-enterprise-relation-dict.sql b/assets/database/staff-enterprise-relation-dict.sql
new file mode 100644
index 0000000..ee9445d
--- /dev/null
+++ b/assets/database/staff-enterprise-relation-dict.sql
@@ -0,0 +1,65 @@
+-- =====================================================
+-- 数据字典SQL:员工实体关系模块
+-- 创建时间: 2026-02-09
+-- 说明: 包含关系状态和数据来源两个字典类型
+-- =====================================================
+
+-- =====================================================
+-- 一、字典类型定义
+-- =====================================================
+
+-- 字典类型:关系状态
+INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, status, create_dept, create_by, create_time,
+ update_by, update_time, remark)
+VALUES (NULL, '000000', '关系状态', 'ccdi_relation_status', '0', NULL, 'admin', NOW(), NULL, NULL,
+ '关系状态列表:0-无效,1-有效');
+
+-- 字典类型:数据来源
+INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, status, create_dept, create_by, create_time,
+ update_by, update_time, remark)
+VALUES (NULL, '000000', '数据来源', 'ccdi_data_source', '0', NULL, 'admin', NOW(), NULL, NULL,
+ '数据来源列表:MANUAL-手动录入,SYSTEM-系统同步,IMPORT-批量导入,API-接口获取');
+
+-- =====================================================
+-- 二、字典数据定义
+-- =====================================================
+
+-- 关系状态字典数据
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+ is_default, status, create_dept, create_by, create_time, update_by, update_time, remark)
+VALUES (NULL, '000000', 2, '无效', '0', 'ccdi_relation_status', NULL, 'danger', 'N', '0', NULL, 'admin', NOW(), NULL,
+ NULL, '关系状态:无效');
+
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+ is_default, status, create_dept, create_by, create_time, update_by, update_time, remark)
+VALUES (NULL, '000000', 1, '有效', '1', 'ccdi_relation_status', NULL, 'primary', 'Y', '0', NULL, 'admin', NOW(), NULL,
+ NULL, '关系状态:有效');
+
+-- 数据来源字典数据
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+ is_default, status, create_dept, create_by, create_time, update_by, update_time, remark)
+VALUES (NULL, '000000', 1, '手动录入', 'MANUAL', 'ccdi_data_source', NULL, 'default', 'N', '0', NULL, 'admin', NOW(),
+ NULL, NULL, '数据来源:手动录入');
+
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+ is_default, status, create_dept, create_by, create_time, update_by, update_time, remark)
+VALUES (NULL, '000000', 2, '系统同步', 'SYSTEM', 'ccdi_data_source', NULL, 'info', 'N', '0', NULL, 'admin', NOW(), NULL,
+ NULL, '数据来源:系统同步');
+
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+ is_default, status, create_dept, create_by, create_time, update_by, update_time, remark)
+VALUES (NULL, '000000', 3, '批量导入', 'IMPORT', 'ccdi_data_source', NULL, 'success', 'N', '0', NULL, 'admin', NOW(),
+ NULL, NULL, '数据来源:批量导入');
+
+INSERT INTO sys_dict_data(dict_code, tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class,
+ is_default, status, create_dept, create_by, create_time, update_by, update_time, remark)
+VALUES (NULL, '000000', 4, '接口获取', 'API', 'ccdi_data_source', NULL, 'warning', 'N', '0', NULL, 'admin', NOW(), NULL,
+ NULL, '数据来源:接口获取');
+
+-- =====================================================
+-- 三、回滚SQL(如需删除这些字典数据,执行以下语句)
+-- =====================================================
+-- DELETE FROM sys_dict_data WHERE dict_type = 'ccdi_relation_status';
+-- DELETE FROM sys_dict_data WHERE dict_type = 'ccdi_data_source';
+-- DELETE FROM sys_dict_type WHERE dict_type = 'ccdi_relation_status';
+-- DELETE FROM sys_dict_type WHERE dict_type = 'ccdi_data_source';
diff --git a/doc/database/staff-enterprise-relation-menu.sql b/assets/database/staff-enterprise-relation-menu.sql
similarity index 51%
rename from doc/database/staff-enterprise-relation-menu.sql
rename to assets/database/staff-enterprise-relation-menu.sql
index 3ac437c..f251017 100644
--- a/doc/database/staff-enterprise-relation-menu.sql
+++ b/assets/database/staff-enterprise-relation-menu.sql
@@ -12,40 +12,56 @@
-- 员工实体关系菜单
-- 注意: parent_id = 2000 是"信息维护"一级菜单,如需调整请修改此值
-- order_num = 3 表示在"信息维护"下的排序位置(中介黑名单=1,员工信息=2,员工实体关系=3)
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2030, '员工实体关系', 2000, 3, 'staffEnterpriseRelation', 'ccdiStaffEnterpriseRelation/index', NULL, NULL, 1, 0, 'C', '0', '0', 'ccdi:staffEnterpriseRelation:list', '#', 'admin', NOW(), '员工实体关系菜单');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2030, '员工实体关系', 2000, 3, 'staffEnterpriseRelation', 'ccdiStaffEnterpriseRelation/index', NULL, NULL, 1, 0,
+ 'C', '0', '0', 'ccdi:staffEnterpriseRelation:list', '#', 'admin', NOW(), '员工实体关系菜单');
-- =====================================================
-- 二、按钮权限配置
-- =====================================================
-- 员工实体关系查询权限
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2031, '员工实体关系查询', 2030, 1, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0', 'ccdi:staffEnterpriseRelation:query', '#', 'admin', NOW(), '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2031, '员工实体关系查询', 2030, 1, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0',
+ 'ccdi:staffEnterpriseRelation:query', '#', 'admin', NOW(), '');
-- 员工实体关系列表权限
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2032, '员工实体关系列表', 2030, 2, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0', 'ccdi:staffEnterpriseRelation:list', '#', 'admin', NOW(), '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2032, '员工实体关系列表', 2030, 2, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0',
+ 'ccdi:staffEnterpriseRelation:list', '#', 'admin', NOW(), '');
-- 员工实体关系新增权限
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2033, '员工实体关系新增', 2030, 3, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0', 'ccdi:staffEnterpriseRelation:add', '#', 'admin', NOW(), '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2033, '员工实体关系新增', 2030, 3, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0',
+ 'ccdi:staffEnterpriseRelation:add', '#', 'admin', NOW(), '');
-- 员工实体关系修改权限
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2034, '员工实体关系修改', 2030, 4, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0', 'ccdi:staffEnterpriseRelation:edit', '#', 'admin', NOW(), '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2034, '员工实体关系修改', 2030, 4, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0',
+ 'ccdi:staffEnterpriseRelation:edit', '#', 'admin', NOW(), '');
-- 员工实体关系删除权限
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2035, '员工实体关系删除', 2030, 5, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0', 'ccdi:staffEnterpriseRelation:remove', '#', 'admin', NOW(), '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2035, '员工实体关系删除', 2030, 5, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0',
+ 'ccdi:staffEnterpriseRelation:remove', '#', 'admin', NOW(), '');
-- 员工实体关系导出权限
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2036, '员工实体关系导出', 2030, 6, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0', 'ccdi:staffEnterpriseRelation:export', '#', 'admin', NOW(), '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2036, '员工实体关系导出', 2030, 6, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0',
+ 'ccdi:staffEnterpriseRelation:export', '#', 'admin', NOW(), '');
-- 员工实体关系导入权限
-INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
-VALUES(2037, '员工实体关系导入', 2030, 7, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0', 'ccdi:staffEnterpriseRelation:import', '#', 'admin', NOW(), '');
+INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache,
+ menu_type, visible, status, perms, icon, create_by, create_time, remark)
+VALUES (2037, '员工实体关系导入', 2030, 7, '', NULL, NULL, NULL, 1, 0, 'F', '0', '0',
+ 'ccdi:staffEnterpriseRelation:import', '#', 'admin', NOW(), '');
-- =====================================================
-- 三、权限标识说明
diff --git a/doc/database/数据库迁移操作指南.md b/assets/database/数据库迁移操作指南.md
similarity index 90%
rename from doc/database/数据库迁移操作指南.md
rename to assets/database/数据库迁移操作指南.md
index 50a222a..7b71d56 100644
--- a/doc/database/数据库迁移操作指南.md
+++ b/assets/database/数据库迁移操作指南.md
@@ -9,14 +9,14 @@
项目提供两个独立的脚本:
1. **export_database.sh** - 数据库导出脚本
- - 从开发环境导出数据库
- - 生成表结构和数据文件到 `doc/database/backup/` 文件夹
- - 配置已内置在脚本顶部
+ - 从开发环境导出数据库
+ - 生成表结构和数据文件到 `doc/database/backup/` 文件夹
+ - 配置已内置在脚本顶部
2. **import_database.sh** - 数据库导入脚本
- - 从 `doc/database/backup/` 文件夹读取备份文件
- - 导入到指定的目标环境(dev/test/prod)
- - 配置已内置在脚本顶部
+ - 从 `doc/database/backup/` 文件夹读取备份文件
+ - 导入到指定的目标环境(dev/test/prod)
+ - 配置已内置在脚本顶部
## 文件结构
@@ -39,17 +39,20 @@
## 前置条件
### 必需工具
+
- MySQL 客户端工具(包含 mysqldump 和 mysql 命令)
- Bash shell 环境(Windows 用户可使用 Git Bash)
- 网络访问权限(能连接源数据库和目标数据库)
### 检查工具是否安装
+
```bash
mysqldump --version
mysql --version
```
如果未安装,请根据操作系统安装 MySQL 客户端:
+
- **Windows**: 安装 MySQL Community Server
- **Linux (Ubuntu/Debian)**: `sudo apt-get install mysql-client`
- **Linux (CentOS/RHEL)**: `sudo yum install mysql`
@@ -75,6 +78,7 @@ DB_NAME="ccdi" # 数据库名称
编辑 `import_database.sh` 脚本顶部配置:
**开发环境:**
+
```bash
DEV_DB_HOST="116.62.17.81" # 开发环境数据库地址
DEV_DB_PORT="3306" # 数据库端口
@@ -84,6 +88,7 @@ DEV_DB_NAME="ccdi" # 数据库名称
```
**测试环境:**
+
```bash
TEST_DB_HOST="your_test_host" # 测试环境数据库地址
TEST_DB_PORT="3306" # 数据库端口
@@ -93,6 +98,7 @@ TEST_DB_NAME="ccdi" # 数据库名称
```
**生产环境:**
+
```bash
PROD_DB_HOST="your_prod_host" # 生产环境数据库地址
PROD_DB_PORT="3306" # 数据库端口
@@ -104,6 +110,7 @@ PROD_DB_NAME="ccdi" # 数据库名称
### 3. 验证配置
查看配置是否正确:
+
```bash
# 查看导出脚本配置
head -20 export_database.sh
@@ -147,26 +154,31 @@ head -30 import_database.sh
### 验证导出文件
**1. 检查文件是否存在**
+
```bash
ls -lh doc/database/backup/
```
应该看到:
+
- `ccdi_structure.sql` - 表结构文件(~60KB)
- `ccdi_data.sql` - 数据文件(~5.7MB)
**2. 检查字符集声明**
+
```bash
head -20 doc/database/backup/ccdi_structure.sql
```
应该包含:
+
```sql
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
```
**3. 检查文件内容**
+
```bash
# 查看表数量
grep "CREATE TABLE" doc/database/backup/ccdi_structure.sql | wc -l
@@ -182,11 +194,13 @@ grep "INSERT" doc/database/backup/ccdi_data.sql | wc -l
**1. 确认目标数据库已创建**
连接到目标数据库服务器:
+
```bash
mysql -h 目标IP -P 3306 -u 用户名 -p
```
创建数据库(如果不存在):
+
```sql
CREATE DATABASE ccdi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
```
@@ -194,6 +208,7 @@ CREATE DATABASE ccdi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
**2. 确认用户权限**
目标数据库用户需要以下权限:
+
- CREATE、ALTER、DROP(创建和修改表)
- INSERT、UPDATE、DELETE(数据操作)
- INDEX(创建索引)
@@ -212,6 +227,7 @@ CREATE DATABASE ccdi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
```
或简写:
+
```bash
./import_database.sh prod
```
@@ -248,11 +264,13 @@ CREATE DATABASE ccdi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
### 1. 验证表数量
连接到目标数据库:
+
```bash
mysql -h 目标IP -P 3306 -u 用户名 -p ccdi
```
查询表数量:
+
```sql
SELECT COUNT(*) FROM information_schema.tables
WHERE table_schema='ccdi';
@@ -263,6 +281,7 @@ WHERE table_schema='ccdi';
### 2. 验证数据行数
查询各表数据行数:
+
```sql
SELECT table_name, table_rows
FROM information_schema.tables
@@ -276,6 +295,7 @@ LIMIT 20;
### 3. 验证字符集
检查数据库字符集:
+
```sql
SHOW CREATE DATABASE ccdi;
```
@@ -283,6 +303,7 @@ SHOW CREATE DATABASE ccdi;
应该显示:`DEFAULT CHARACTER SET utf8mb4`
检查表字符集:
+
```sql
SHOW CREATE TABLE sys_user;
```
@@ -292,6 +313,7 @@ SHOW CREATE TABLE sys_user;
### 4. 验证中文数据
查询包含中文的数据:
+
```sql
-- 查询用户表
SELECT user_name, nick_name FROM sys_user LIMIT 10;
@@ -314,6 +336,7 @@ SELECT name, person_type FROM ccdi_biz_intermediary LIMIT 10;
### 场景:从开发环境迁移到生产环境
**1. 配置数据库连接**
+
```bash
# 编辑导出脚本配置(开发环境)
nano export_database.sh
@@ -325,32 +348,38 @@ nano import_database.sh
```
**2. 导出数据库**
+
```bash
./export_database.sh
```
**3. 验证导出文件**
+
```bash
ls -lh doc/database/backup/
head -20 doc/database/backup/ccdi_structure.sql
```
**4. 先在测试环境验证**
+
```bash
# 确保已在 import_database.sh 中配置测试环境
./import_database.sh test
```
**5. 验证测试环境**
+
- 连接测试数据库验证数据
- 应用程序连接测试环境进行功能测试
**6. 导入到生产环境**
+
```bash
./import_database.sh prod
```
**7. 验证生产环境**
+
- 连接生产数据库验证数据
- 应用程序连接生产环境进行功能测试
@@ -363,6 +392,7 @@ head -20 doc/database/backup/ccdi_structure.sql
**原因**: MySQL 客户端未安装或未添加到 PATH
**解决**:
+
- 安装 MySQL 客户端工具
- 或使用完整路径:`/usr/bin/mysqldump`
@@ -371,6 +401,7 @@ head -20 doc/database/backup/ccdi_structure.sql
**错误信息**: 连接被拒绝或认证失败
**解决**:
+
- 检查脚本顶部的数据库配置是否正确
- 使用 mysql 命令手动测试连接
- 检查防火墙规则
@@ -380,6 +411,7 @@ head -20 doc/database/backup/ccdi_structure.sql
**原因**: 未正确指定字符集
**解决**:
+
- 确保导出文件包含字符集声明
- 导入命令添加 `--default-character-set=utf8mb4` 参数
- 脚本已自动处理,如仍有问题请检查数据库默认字符集
@@ -389,6 +421,7 @@ head -20 doc/database/backup/ccdi_structure.sql
**错误信息**: `ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails`
**解决**:
+
- 脚本已自动添加 `SET FOREIGN_KEY_CHECKS=0;` 和 `SET FOREIGN_KEY_CHECKS=1;`
- 如仍有问题,请检查数据完整性
@@ -397,6 +430,7 @@ head -20 doc/database/backup/ccdi_structure.sql
**错误信息**: `ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes`
**解决**:
+
- 配置文件中的 `MAX_ALLOWED_PACKET=512M` 已处理此问题
- 如数据量特别大,可增大此值
@@ -405,6 +439,7 @@ head -20 doc/database/backup/ccdi_structure.sql
**错误信息**: `ERROR 1044 (42000): Access denied for user`
**解决**:
+
- 使用具有足够权限的用户(如 root)
- 或授予用户必要权限
@@ -413,6 +448,7 @@ head -20 doc/database/backup/ccdi_structure.sql
**错误信息**: `表结构文件不存在: doc/database/backup/ccdi_structure.sql`
**解决**:
+
- 先执行导出:`./export_database.sh`
- 检查 backup 文件夹中是否有 SQL 文件
@@ -427,32 +463,33 @@ head -20 doc/database/backup/ccdi_structure.sql
## 注意事项
1. **安全性**:
- - 数据库配置已内置在脚本中,包含敏感信息
- - 不要将脚本提交到公开的版本控制系统
- - 迁移完成后建议删除脚本中的密码或使用占位符
+ - 数据库配置已内置在脚本中,包含敏感信息
+ - 不要将脚本提交到公开的版本控制系统
+ - 迁移完成后建议删除脚本中的密码或使用占位符
2. **性能**:
- - 大数据库导出/导入可能需要较长时间
- - 建议在低峰期执行迁移
- - 确保有足够的磁盘空间
+ - 大数据库导出/导入可能需要较长时间
+ - 建议在低峰期执行迁移
+ - 确保有足够的磁盘空间
3. **数据一致性**:
- - 导出期间源数据库应避免写入操作
- - 或使用 `--single-transaction` 参数(已包含)
+ - 导出期间源数据库应避免写入操作
+ - 或使用 `--single-transaction` 参数(已包含)
4. **字符集**:
- - 确保所有步骤都使用 utf8mb4 字符集
- - 验证阶段重点检查中文数据
- - 表结构文件不再包含显式的 COLLATE 配置(使用默认 utf8mb4_general_ci)
+ - 确保所有步骤都使用 utf8mb4 字符集
+ - 验证阶段重点检查中文数据
+ - 表结构文件不再包含显式的 COLLATE 配置(使用默认 utf8mb4_general_ci)
5. **脚本配置**:
- - 首次使用前必须在脚本顶部配置数据库信息
- - 三个环境的配置是独立的,可以只配置需要的环境
- - 修改配置后无需其他操作即可使用
+ - 首次使用前必须在脚本顶部配置数据库信息
+ - 三个环境的配置是独立的,可以只配置需要的环境
+ - 修改配置后无需其他操作即可使用
## 技术支持
如遇到问题:
+
1. 检查本文档的常见问题部分
2. 查看脚本执行的错误信息
3. 检查数据库连接和权限
diff --git a/doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md b/assets/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md
similarity index 60%
rename from doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md
rename to assets/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md
index 48cade1..39bde01 100644
--- a/doc/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md
+++ b/assets/design/staff-enterprise-relation/员工实体关系信息维护功能设计文档.md
@@ -3,9 +3,11 @@
## 一、功能概述
### 1.1 功能描述
+
员工实体关系信息维护功能用于管理员工与企业之间的关联关系,记录员工(或员工家庭关联人)在不同企业中担任的职务信息。该功能支持增删改查、批量导入导出等操作,完全参照采购交易管理和招聘信息功能的业务逻辑和UI交互。
### 1.2 参照标准
+
- 后端业务逻辑:完全参照 `CcdiPurchaseTransaction`(采购交易管理)
- 前端UI交互:完全参照 `ccdiPurchaseTransaction/index.vue`
- 异步导入机制:完全参照采购交易的异步导入流程
@@ -13,28 +15,30 @@
## 二、数据库设计
### 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 | - | 否 | 否 | 记录更新时间 |
+| 序号 | 字段名 | 类型 | 默认值 | 是否可为空 | 是否主键 | 注释 |
+|----|----------------------|-------------|-----|-------|------|----------------------------|
+| 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)的记录
- 新增和导入时需要校验唯一性
@@ -74,22 +78,23 @@ com.ruoyi.ccdi
**基础路径:** `/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 |
+| 方法 | 路径 | 说明 | 权限 |
+|--------|--------------------------|----------|-------------------------------------|
+| 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)) {
@@ -98,6 +103,7 @@ if (mapper.existsByPersonIdAndSocialCreditCode(personId, socialCreditCode)) {
```
#### 3.3.2 默认值设置
+
```java
entity.setStatus(1); // 有效
entity.setIsEmployee(0);
@@ -108,16 +114,18 @@ entity.setDataSource("MANUAL"); // 或 "IMPORT"
```
#### 3.3.3 异步导入流程
+
1. 接收文件 → 解析Excel → 生成UUID任务ID → 立即返回
2. @Async异步方法:
- - 批量查询已存在的 person_id + social_credit_code 组合
- - 遍历校验,分类成功/失败
- - 批量插入成功数据(500条/批)
- - 失败记录存Redis(7天过期)
- - 更新导入状态到Redis
+ - 批量查询已存在的 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序列化)
@@ -126,6 +134,7 @@ import:staffEnterpriseRelation:{taskId}:failures // 失败记录(List,JSON
## 四、前端设计
### 4.1 文件结构
+
```
ruoyi-ui/src/
├── views
@@ -138,6 +147,7 @@ ruoyi-ui/src/
### 4.2 列表页设计
#### 4.2.1 查询表单
+
- 身份证号(模糊查询)
- 统一社会信用代码(模糊查询)
- 企业名称(模糊查询)
@@ -145,6 +155,7 @@ ruoyi-ui/src/
- 搜索、重置按钮
#### 4.2.2 操作按钮
+
- 新增
- 导入
- 导出
@@ -152,22 +163,24 @@ ruoyi-ui/src/
- 右侧工具栏(显示搜索、刷新)
#### 4.2.3 表格列
-| 列名 | 字段 | 说明 |
-|------|------|------|
-| 选择框 | - | 多选 |
-| 身份证号 | personId | show-overflow-tooltip |
-| 企业名称 | enterpriseName | show-overflow-tooltip |
-| 关联人在企业的职务 | relationPersonPost | - |
-| 状态 | status | 字典翻译 |
-| 数据来源 | dataSource | 字典翻译 |
-| 创建时间 | createTime | 格式化 |
-| 操作 | - | 详情、编辑、删除 |
+
+| 列名 | 字段 | 说明 |
+|-----------|--------------------|-----------------------|
+| 选择框 | - | 多选 |
+| 身份证号 | personId | show-overflow-tooltip |
+| 企业名称 | enterpriseName | show-overflow-tooltip |
+| 关联人在企业的职务 | relationPersonPost | - |
+| 状态 | status | 字典翻译 |
+| 数据来源 | dataSource | 字典翻译 |
+| 创建时间 | createTime | 格式化 |
+| 操作 | - | 详情、编辑、删除 |
### 4.3 新增/编辑对话框
**宽度:** 800px
**表单字段:**
+
- 身份证号:可搜索下拉(el-select + remote + filterable)
- 统一社会信用代码:输入框 + 18位格式校验
- 企业名称:输入框 + 必填
@@ -176,25 +189,29 @@ ruoyi-ui/src/
- 补充说明: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条
+ - SUCCESS:全部成功!共导入N条数据
+ - PARTIAL_SUCCESS:成功N条,失败M条
4. 如果有失败记录,显示"查看导入失败记录"按钮
#### 4.4.3 查看失败记录
+
- 点击按钮弹窗显示失败列表
- 失败记录包含:personId、socialCreditCode、enterpriseName、errorMessage
- 支持分页
@@ -203,35 +220,39 @@ ruoyi-ui/src/
## 五、数据字典配置
### 5.1 关系状态字典
+
**字典类型:** `ccdi_relation_status`
| 字典值 | 字典标签 | 排序 |
-|--------|----------|------|
-| 0 | 无效 | 2 |
-| 1 | 有效 | 1 |
+|-----|------|----|
+| 0 | 无效 | 2 |
+| 1 | 有效 | 1 |
### 5.2 数据来源字典
+
**字典类型:** `ccdi_data_source`
-| 字典值 | 字典标签 | 排序 |
-|--------|----------|------|
-| MANUAL | 手动录入 | 1 |
-| SYSTEM | 系统同步 | 2 |
-| IMPORT | 批量导入 | 3 |
-| API | 接口获取 | 4 |
+| 字典值 | 字典标签 | 排序 |
+|--------|------|----|
+| MANUAL | 手动录入 | 1 |
+| SYSTEM | 系统同步 | 2 |
+| IMPORT | 批量导入 | 3 |
+| API | 接口获取 | 4 |
## 六、Excel导入模板
### 6.1 模板列定义
-| 列名 | 字段名 | 是否必填 | 校验规则 | 说明 |
-|------|--------|----------|----------|------|
-| 身份证号 | personId | 是 | 18位身份证格式 | 关联员工表 |
-| 统一社会信用代码 | socialCreditCode | 是 | 18位统一信用代码格式 | 关联企业表 |
-| 企业名称 | enterpriseName | 是 | 最大长度200 | 冗余存储 |
-| 关联人在企业的职务 | relationPersonPost | 否 | 最大长度100 | 如:股东、法人、高管等 |
-| 补充说明 | remark | 否 | TEXT类型 | 可选填写 |
+
+| 列名 | 字段名 | 是否必填 | 校验规则 | 说明 |
+|-----------|--------------------|------|-------------|-------------|
+| 身份证号 | personId | 是 | 18位身份证格式 | 关联员工表 |
+| 统一社会信用代码 | socialCreditCode | 是 | 18位统一信用代码格式 | 关联企业表 |
+| 企业名称 | enterpriseName | 是 | 最大长度200 | 冗余存储 |
+| 关联人在企业的职务 | relationPersonPost | 否 | 最大长度100 | 如:股东、法人、高管等 |
+| 补充说明 | remark | 否 | TEXT类型 | 可选填写 |
### 6.2 后端自动设置
+
- status = 1(有效)
- data_source = "IMPORT"
- is_employee = 0
@@ -240,6 +261,7 @@ ruoyi-ui/src/
- is_cust_family = 0
### 6.3 导入校验规则
+
1. 唯一性校验:person_id + social_credit_code 组合重复则失败
2. 格式校验:身份证号18位、统一社会信用代码18位
3. 必填校验:personId、socialCreditCode、enterpriseName
@@ -248,12 +270,14 @@ ruoyi-ui/src/
## 七、菜单权限配置
### 7.1 菜单信息
+
- **菜单名称:** 员工实体关系
- **路由地址:** ccdiStaffEnterpriseRelation
- **组件路径:** ccdiStaffEnterpriseRelation/index
- **上级菜单:** 待定(根据实际菜单结构配置)
### 7.2 权限标识
+
```
ccdi:staffEnterpriseRelation:list # 查询列表
ccdi:staffEnterpriseRelation:query # 查询详情
@@ -267,6 +291,7 @@ ccdi:staffEnterpriseRelation:import # 导入
## 八、一致性校验清单
### 8.1 后端一致性
+
- [ ] Controller接口定义完全一致(路径、参数、返回值)
- [ ] Service层方法命名和逻辑结构一致
- [ ] 异步导入实现方式一致(@Async、Redis存储、轮询机制)
@@ -278,6 +303,7 @@ ccdi:staffEnterpriseRelation:import # 导入
- [ ] 权限注解格式一致
### 8.2 前端一致性
+
- [ ] 列表页布局结构一致(查询表单、按钮栏、表格、分页)
- [ ] 新增/编辑对话框布局一致
- [ ] 详情对话框使用 el-descriptions 展示
@@ -291,6 +317,7 @@ ccdi:staffEnterpriseRelation:import # 导入
## 九、技术要点
### 9.1 关键技术
+
- **MyBatis Plus 3.5.10**:CRUD操作和分页
- **EasyExcel**:Excel导入导出
- **@Async**:异步导入
@@ -298,11 +325,13 @@ ccdi:staffEnterpriseRelation:import # 导入
- **Swagger 3**:API文档
### 9.2 性能优化
+
- 批量插入:500条/批
- 批量查询已存在数据:减少数据库查询次数
- Redis缓存:减少重复查询
### 9.3 安全考虑
+
- 权限注解:@PreAuthorize
- SQL注入防护:使用MyBatis Plus参数绑定
- XSS防护:前端输入校验
@@ -310,6 +339,7 @@ ccdi:staffEnterpriseRelation:import # 导入
## 十、测试要点
### 10.1 功能测试
+
- [ ] 新增功能:唯一性校验
- [ ] 编辑功能:修改各个字段
- [ ] 删除功能:单个删除、批量删除
@@ -318,24 +348,28 @@ ccdi:staffEnterpriseRelation:import # 导入
- [ ] 查询功能:模糊查询、状态筛选
### 10.2 性能测试
+
- [ ] 导入1000条数据的响应时间
- [ ] 查询10万条数据的分页性能
- [ ] 并发导入的处理能力
### 10.3 兼容性测试
+
- [ ] 不同浏览器兼容性
- [ ] Excel 2003/2007/2010格式兼容性
## 十一、附录
### 11.1 参照文件
+
- **后端参照:**
- - `CcdiPurchaseTransactionController.java`
- - `CcdiPurchaseTransactionServiceImpl.java`
- - `CcdiPurchaseTransactionImportServiceImpl.java`
+ - `CcdiPurchaseTransactionController.java`
+ - `CcdiPurchaseTransactionServiceImpl.java`
+ - `CcdiPurchaseTransactionImportServiceImpl.java`
- **前端参照:**
- - `ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue`
- - `ruoyi-ui/src/api/ccdiPurchaseTransaction.js`
+ - `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/excel/ExcelUtil.poi.backup.java b/assets/excel/ExcelUtil.poi.backup.java
similarity index 100%
rename from doc/excel/ExcelUtil.poi.backup.java
rename to assets/excel/ExcelUtil.poi.backup.java
diff --git a/doc/implementation-notes.md b/assets/implementation-notes.md
similarity index 94%
rename from doc/implementation-notes.md
rename to assets/implementation-notes.md
index b5a74a5..f53eb7c 100644
--- a/doc/implementation-notes.md
+++ b/assets/implementation-notes.md
@@ -9,18 +9,22 @@
## Task 1: 数据库索引检查
### 执行时间
+
2026-02-11
### 执行内容
#### 1. 数据库连接配置
+
- **Host:** 116.62.17.81
- **Port:** 3306
- **Database:** ccdi
- **Username:** root
#### 2. 索引检查
+
执行 SQL:
+
```sql
SHOW INDEX FROM ccdi_base_staff WHERE Key_name = 'idx_id_card';
```
@@ -28,7 +32,9 @@ SHOW INDEX FROM ccdi_base_staff WHERE Key_name = 'idx_id_card';
**结果:** 索引不存在
#### 3. 索引创建
+
执行 SQL:
+
```sql
CREATE INDEX idx_id_card ON ccdi_base_staff(id_card);
```
@@ -36,6 +42,7 @@ CREATE INDEX idx_id_card ON ccdi_base_staff(id_card);
**结果:** 成功创建索引
**索引信息:**
+
- Table: ccdi_base_staff
- Key_name: idx_id_card
- Column_name: id_card
@@ -45,7 +52,9 @@ CREATE INDEX idx_id_card ON ccdi_base_staff(id_card);
- Cardinality: 1000
#### 4. 索引验证
+
执行 SQL:
+
```sql
SHOW INDEX FROM ccdi_base_staff WHERE Key_name = 'idx_id_card';
```
@@ -53,15 +62,18 @@ SHOW INDEX FROM ccdi_base_staff WHERE Key_name = 'idx_id_card';
**结果:** 索引已成功创建并生效
### 状态
+
- [x] 数据库索引已创建
### 自我审查结果
+
✅ 索引创建成功
✅ 索引类型为 BTREE,适合等值查询
✅ Cardinality 为 1000,说明索引选择度良好
✅ 允许 NULL 值,符合业务需求
### 备注
+
该索引用于优化 `ccdi_staff_enterprise_relation.person_id = ccdi_base_staff.id_card` 的 JOIN 查询性能。
---
@@ -69,12 +81,15 @@ SHOW INDEX FROM ccdi_base_staff WHERE Key_name = 'idx_id_card';
## Task 2: 修改 VO 类添加员工姓名字段
### 执行时间
+
2026-02-11
### 执行内容
+
修改文件: `ruoyi-info-collection/src/main/java/com/ruoyi/ccdi/domain/vo/CcdiStaffEnterpriseRelationVO.java`
添加字段:
+
```java
/** 员工姓名 */
@Schema(description = "员工姓名")
@@ -82,9 +97,11 @@ private String personName;
```
### 状态
+
- [x] VO类已添加personName字段
### 自我审查结果
+
✅ 字段类型为String,符合数据库VARCHAR类型
✅ 使用@Schema注解,符合Swagger文档规范
✅ 字段名personName符合Java驼峰命名规范
@@ -95,19 +112,25 @@ private String personName;
## Task 3: 修改 Mapper XML - 列表查询
### 执行时间
+
2026-02-11
### 执行内容
+
修改文件: `ruoyi-info-collection/src/main/resources/mapper/ccdi/CcdiStaffEnterpriseRelationMapper.xml`
#### 1. 更新ResultMap
+
添加字段映射:
+
```xml
完成时间: 2026-02-27 | 实施人员: Claude Code
+本次实施完成了创建项目功能的前端部分,包括API接口更新、组件优化、列表展示优化等工作。
+| 任务编号 | +任务描述 | +文件 | +状态 | +验证结果 | +
|---|---|---|---|---|
| Task 1 | +更新 API 接口文件,统一字段名 | +ccdiProject.js |
+ ✅ 已完成 | +无语法错误 | +
| Task 2 | +修改 AddProjectDialog 组件,简化为3个字段 | +AddProjectDialog.vue |
+ ✅ 已完成 | +组件正常 | +
| Task 3 | +修改 ProjectTable 组件,优化显示和交互 | +ProjectTable.vue |
+ ✅ 已完成 | +样式正确 | +
| Task 4 | +修改父组件 index.vue,切换为真实API | +index.vue |
+ ✅ 已完成 | +逻辑正确 | +
| Task 5 | +启动前端服务并测试 | +前端服务 | +✅ 已完成 | +运行正常 | +
| 项目名称 | +项目状态 | +目标人数 | +预警人数 | +创建人 | +创建时间 | +
|---|---|---|---|---|---|
|
+ 2024年Q1初核
+ 2024年第一季度纪检初核排查工作
+ |
+ 进行中 | +500 | +
+
+ 15
+
+
+
+ 风险人数统计
+ ● 高风险: 5 人
+ ● 中风险: 10 人
+ ● 低风险: 0 人
+ |
+ 管理员 | +2024-01-01 | +
|
+ 2023年Q4初核
+ 2023年第四季度纪检初核排查工作
+ |
+ 已完成 | +480 | +
+
+ 23
+
+
+
+ 风险人数统计
+ ● 高风险: 8 人
+ ● 中风险: 15 人
+ ● 低风险: 0 人
+ |
+ 管理员 | +2023-10-01 | +
| 前端字段 | +后端字段 | +数据库字段 | +说明 | +
|---|---|---|---|
projectName |
+ projectName |
+ project_name |
+ 项目名称 | +
description |
+ description |
+ description |
+ 项目描述 | +
status |
+ status |
+ status |
+ 项目状态 | +
configType |
+ configType |
+ config_type |
+ 配置方式 | +
createByName |
+ createByName |
+ create_by_name (关联查询) |
+ 创建人真实姓名 | +
错误信息:
+错误位置:
+建议解决方案:
+del_flag 字段del_flag 查询条件由于后端查询错误,以下测试暂时无法执行:
+| 文件路径 | +变更类型 | +主要修改 | +
|---|---|---|
ruoyi-ui/src/api/ccdiProject.js |
+ 修改 | +更新Mock数据字段名,删除重复函数 | +
ruoyi-ui/src/views/ccdiProject/components/AddProjectDialog.vue |
+ 修改 | +简化为3个字段,字段名统一为description | +
ruoyi-ui/src/views/ccdiProject/components/ProjectTable.vue |
+ 修改 | +优化项目名称和描述显示,添加预警悬停提示 | +
ruoyi-ui/src/views/ccdiProject/index.vue |
+ 修改 | +切换为真实API调用,简化提交逻辑 | +
| 状态 | +检查项 | +备注 | +
|---|---|---|
| ✅ | +API 接口文件更新完成 | +字段名统一为 description 和 status | +
| ✅ | +AddProjectDialog 组件简化完成 | +只保留3个核心字段 | +
| ✅ | +ProjectTable 组件优化完成 | +上下排列、预警悬停 | +
| ✅ | +父组件切换为真实API | +使用 listProject() 调用后端 | +
| ✅ | +前端服务启动成功 | +运行在 http://localhost:82/ | +
| ✅ | +前端编译无错误 | +编译成功 | +
| ❌ | +后端接口查询正常 | +发现 del_flag 字段缺失错误 | +
| ⏳ | +功能测试 | +待后端修复后执行 | +
| ⏳ | +跨浏览器测试 | +待后端修复后执行 | +
| ⏳ | +响应式测试 | +待后端修复后执行 | +
| ⏳ | +代码提交到Git | +待审查后提交 | +
前端实施完成报告 - 生成时间: 2026-02-27
+完成时间: 2026-02-27 | 实施人员: Claude Code
-本次实施完成了创建项目功能的前端部分,包括API接口更新、组件优化、列表展示优化等工作。
-| 任务编号 | -任务描述 | -文件 | -状态 | -验证结果 | -
|---|---|---|---|---|
| Task 1 | -更新 API 接口文件,统一字段名 | -ccdiProject.js |
- ✅ 已完成 | -无语法错误 | -
| Task 2 | -修改 AddProjectDialog 组件,简化为3个字段 | -AddProjectDialog.vue |
- ✅ 已完成 | -组件正常 | -
| Task 3 | -修改 ProjectTable 组件,优化显示和交互 | -ProjectTable.vue |
- ✅ 已完成 | -样式正确 | -
| Task 4 | -修改父组件 index.vue,切换为真实API | -index.vue |
- ✅ 已完成 | -逻辑正确 | -
| Task 5 | -启动前端服务并测试 | -前端服务 | -✅ 已完成 | -运行正常 | -
| 项目名称 | -项目状态 | -目标人数 | -预警人数 | -创建人 | -创建时间 | -
|---|---|---|---|---|---|
|
- 2024年Q1初核
- 2024年第一季度纪检初核排查工作
- |
- 进行中 | -500 | -
-
- 15
-
-
-
- 风险人数统计
- ● 高风险: 5 人
- ● 中风险: 10 人
- ● 低风险: 0 人
- |
- 管理员 | -2024-01-01 | -
|
- 2023年Q4初核
- 2023年第四季度纪检初核排查工作
- |
- 已完成 | -480 | -
-
- 23
-
-
-
- 风险人数统计
- ● 高风险: 8 人
- ● 中风险: 15 人
- ● 低风险: 0 人
- |
- 管理员 | -2023-10-01 | -
| 前端字段 | -后端字段 | -数据库字段 | -说明 | -
|---|---|---|---|
projectName |
- projectName |
- project_name |
- 项目名称 | -
description |
- description |
- description |
- 项目描述 | -
status |
- status |
- status |
- 项目状态 | -
configType |
- configType |
- config_type |
- 配置方式 | -
createByName |
- createByName |
- create_by_name (关联查询) |
- 创建人真实姓名 | -
错误信息:
-错误位置:
-建议解决方案:
-del_flag 字段del_flag 查询条件由于后端查询错误,以下测试暂时无法执行:
-| 文件路径 | -变更类型 | -主要修改 | -
|---|---|---|
ruoyi-ui/src/api/ccdiProject.js |
- 修改 | -更新Mock数据字段名,删除重复函数 | -
ruoyi-ui/src/views/ccdiProject/components/AddProjectDialog.vue |
- 修改 | -简化为3个字段,字段名统一为description | -
ruoyi-ui/src/views/ccdiProject/components/ProjectTable.vue |
- 修改 | -优化项目名称和描述显示,添加预警悬停提示 | -
ruoyi-ui/src/views/ccdiProject/index.vue |
- 修改 | -切换为真实API调用,简化提交逻辑 | -
| 状态 | -检查项 | -备注 | -
|---|---|---|
| ✅ | -API 接口文件更新完成 | -字段名统一为 description 和 status | -
| ✅ | -AddProjectDialog 组件简化完成 | -只保留3个核心字段 | -
| ✅ | -ProjectTable 组件优化完成 | -上下排列、预警悬停 | -
| ✅ | -父组件切换为真实API | -使用 listProject() 调用后端 | -
| ✅ | -前端服务启动成功 | -运行在 http://localhost:82/ | -
| ✅ | -前端编译无错误 | -编译成功 | -
| ❌ | -后端接口查询正常 | -发现 del_flag 字段缺失错误 | -
| ⏳ | -功能测试 | -待后端修复后执行 | -
| ⏳ | -跨浏览器测试 | -待后端修复后执行 | -
| ⏳ | -响应式测试 | -待后端修复后执行 | -
| ⏳ | -代码提交到Git | -待审查后提交 | -
前端实施完成报告 - 生成时间: 2026-02-27
-