# 员工实体关系管理 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

- 初始版本: 完成员工实体关系管理基础功能
