# 电子签名后端对接说明

## 目标

支持前端在“点击使用电子签名”时，自动获取当前登录人员已配置的电子签名并回填。

当当前人员未配置电子签名时，后端返回提示：

`暂未设置电子签名，请在个人资料内设置后重试或使用手动签名`

## 数据设计

### 表名

`sys_user_electronic_signature`

### 核心设计说明

- 一条记录对应“当前登录人员”的一份电子签名配置
- 人员唯一性通过 `tenant_id + person_key` 控制
- `person_key` 生成规则：`loginPort:companyId:businessUserId`
- 当 `businessUserId` 为空时，回退为 `loginPort:companyId:userId`
- 签名文件本体继续复用现有 OSS 表，不重复存文件内容，只存 `sign_oss_id`
- 支持“清空签名”：保留记录，将 `status` 置为 `0`，并清空 `sign_oss_id`

### 主要字段

- `person_key`：当前登录人员唯一键
- `user_id`：系统用户 ID
- `business_user_id`：业务人员 ID，例如驾驶员/安全员 ID
- `company_id`：当前企业 ID
- `login_port`：当前登录端口
- `sign_oss_id`：电子签名图片 OSS ID
- `sign_name`：签署人名称快照
- `status`：`1=已设置`，`0=未设置`

建表脚本见：

- `sql/1289/3_user_electronic_signature.sql`

## 接口列表

统一前缀：

- `/system/user/profile`

### 1. 查询当前登录人员电子签名信息

- 方法：`GET`
- 路径：`/system/user/profile/electronic-signature/info`
- 用途：个人资料页进入时查询当前签名配置状态
- 特点：即使未配置，也返回成功，前端通过 `data.configured` 判断

响应示例：

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "id": 1,
    "configured": true,
    "personKey": "port-driver:1001:DRV0001",
    "userId": 20001,
    "businessUserId": "DRV0001",
    "companyId": 1001,
    "loginPort": "port-driver",
    "signOssId": 98765,
    "signUrl": "https://xxx/signature.png",
    "signName": "张三",
    "status": "1"
  }
}
```

未配置时示例：

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "configured": false,
    "personKey": "port-driver:1001:DRV0001",
    "userId": 20001,
    "businessUserId": "DRV0001",
    "companyId": 1001,
    "loginPort": "port-driver",
    "signOssId": null,
    "signUrl": null,
    "signName": "张三",
    "status": "0"
  }
}
```

### 2. 业务页获取当前电子签名并回填

- 方法：`GET`
- 路径：`/system/user/profile/electronic-signature/current`
- 用途：点击“使用电子签名”时直接调用
- 特点：已配置时返回签名信息；未配置时直接返回失败提示，前端弹出 `msg` 即可

已配置响应示例：

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "configured": true,
    "signOssId": 98765,
    "signUrl": "https://xxx/signature.png",
    "signName": "张三"
  }
}
```

未配置响应示例：

```json
{
  "code": 500,
  "msg": "暂未设置电子签名，请在个人资料内设置后重试或使用手动签名",
  "data": null
}
```

前端建议处理：

- 当接口成功时，将 `data.signUrl` 回填到下方签名展示区域
- 同时保留 `data.signOssId`，提交业务表单时直接透传
- 当接口失败时，直接提示后端返回的 `msg`

### 3. 保存当前登录人员电子签名

- 方法：`PUT`
- 路径：`/system/user/profile/electronic-signature`
- 用途：个人资料页设置或更换电子签名

请求参数：

```json
{
  "signOssId": 98765
}
```

说明：

- `signOssId` 必填
- 文件需要先通过现有 OSS 上传接口上传成功
- 后端会校验该文件是否存在，且是否为图片格式

成功响应示例：

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "configured": true,
    "signOssId": 98765,
    "signUrl": "https://xxx/signature.png",
    "signName": "张三",
    "status": "1"
  }
}
```

### 4. 清空当前登录人员电子签名

- 方法：`DELETE`
- 路径：`/system/user/profile/electronic-signature`
- 用途：个人资料页删除当前电子签名配置

成功响应示例：

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": null
}
```

## 与前端交互建议

### 个人资料页

1. 页面加载时调用 `GET /electronic-signature/info`
2. 若 `configured = true`，展示当前签名图片
3. 用户更换签名时，先调用现有 OSS 上传接口，再把返回的 `ossId` 提交到保存接口
4. 用户删除签名时，调用清空接口

### 业务签署页

1. 点击“使用电子签名”
2. 调用 `GET /electronic-signature/current`
3. 若成功：
   - 回填 `signUrl`
   - 保存 `signOssId`
4. 若失败：
   - 直接提示 `msg`
   - 保留“手动签名”入口

## 依赖的现有上传接口

上传签名图片时继续复用现有 OSS 上传能力：

- 方法：`POST`
- 路径：`/resource/oss/upload`
- 表单字段：`file`

返回示例中的 `data.ossId` 即为后续保存电子签名所需的 `signOssId`。
