# 比利时 EPR 自动生成文件接口文档

## 接口概述

| 项目 | 内容 |
|------|------|
| **接口名称** | 比利时 EPR 自动生成文件接口 |
| **接口地址** | `/server/be_epr_pack_auto_file.php` |
| **请求方式** | `POST` |
| **数据格式** | `application/json` |
| **字符编码** | `UTF-8` |
| **功能说明** | 根据传入的 ID 值，从 SQL Server 数据库提取比利时 EPR 注册信息，自动生成授权书（Mandat）和会员合同签字文件（membership），并上传到 OSS 对象存储后返回文件访问链接。 |

---

## 请求说明

### 1. 请求 URL

```
POST http://{host}/vat_api_se_client/server/be_epr_pack_auto_file.php
```

示例：

```
POST http://localhost/vat_api_se_client/server/be_epr_pack_auto_file.php
```

### 2. 请求头

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| Content-Type | 是 | string | 固定值：`application/json` |
| Authorization | 否 | string | 如系统启用 Token 鉴权，需传 `Bearer {token}` |

### 3. 请求参数

请求体为 JSON 对象：

| 参数名 | 位置 | 必选 | 类型 | 说明 |
|--------|------|------|------|------|
| id | body | 是 | string \| integer | 比利时 EPR 注册信息 ID（对应 EPRRegInfo 表主键 ID） |

### 4. 请求示例

#### 4.1 cURL 示例

```bash
curl -X POST "http://localhost/vat_api_se_client/server/be_epr_pack_auto_file.php" \
  -H "Content-Type: application/json" \
  -d '{"id": 12345}'
```

#### 4.2 JavaScript / fetch 示例

```javascript
fetch('http://localhost/vat_api_se_client/server/be_epr_pack_auto_file.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ id: 12345 })
})
  .then(res => res.json())
  .then(data => console.log(data));
```

#### 4.3 PHP 示例

```php
<?php
$url = 'http://localhost/vat_api_se_client/server/be_epr_pack_auto_file.php';
$data = json_encode(['id' => 12345]);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

$response = curl_exec($ch);
curl_close($ch);

var_dump(json_decode($response, true));
```

#### 4.4 请求体示例

```json
{
  "id": 12345
}
```

---

## 响应说明

### 1. 统一响应结构

接口统一返回以下 JSON 结构：

| 字段名 | 类型 | 说明 |
|--------|------|------|
| code | integer | 响应状态码：`200` 成功，`400` 失败/参数错误/业务异常 |
| msg | string | 响应描述信息：成功时为 `success`，失败时为具体错误原因 |
| data | array \| null | 业务数据：成功时返回对象数组，失败时返回 `null` |

### 2. 成功响应（code = 200）

#### 2.1 data 字段说明

`data` 为一个数组，数组中每个元素是一个对象，包含以下字段：

| 字段名 | 类型 | 说明 |
|--------|------|------|
| Mandat | string | 比利时授权书 PDF 文件 OSS 访问链接（完整 URL） |
| membership | string | 比利时 FostPlus 会员合同签字文件 PDF 的 OSS 访问链接（完整 URL） |

> 注意：data 为**对象数组**格式（即使只有一条数据也被包裹在数组中），便于前端统一遍历处理。

#### 2.2 成功响应示例

```json
{
  "code": 200,
  "msg": "success",
  "data": [
    {
      "Mandat": "https://example-ossbucket.cos.ap-region.myqcloud.com/be_epr/POA_of_CompanyName.pdf",
      "membership": "https://example-ossbucket.cos.ap-region.myqcloud.com/be_epr/FostPlus_Membership.pdf"
    }
  ]
}
```

### 3. 失败响应（code = 400）

#### 3.1 常见失败场景及错误信息

| 场景 | msg 示例 | data |
|------|----------|------|
| 请求体未传入 id 或 id 为空 | `缺少ID参数` | `null` |
| 数据库中未查询到对应 ID 的比利时 EPR 数据 | `没有找到需要处理的比利时EPR自动生成文件数据` | `null` |
| SQL Server 数据库连接失败 | `SQL Server数据库连接失败` / `local SQL Server数据库连接失败` | `null` |
| 授权书文件生成失败 | `BE授权书文件生成失败: {具体原因}` | `null` |
| 会员合同文件生成失败 | `BE会员合同签字文件生成失败: {具体原因}` | `null` |
| Mandat 文件上传 OSS 失败 | `Mandat文件上传失败: {具体原因}` | `null` |
| membership 文件上传 OSS 失败 | `fostPlusResult文件上传失败: {具体原因}` | `null` |
| 其他运行时异常 | 异常消息原文 | `null` |

#### 3.2 失败响应示例

```json
{
  "code": 400,
  "msg": "缺少ID参数",
  "data": null
}
```

```json
{
  "code": 400,
  "msg": "没有找到需要处理的比利时EPR自动生成文件数据",
  "data": null
}
```

```json
{
  "code": 400,
  "msg": "Mandat文件上传失败: OSS签名失败",
  "data": null
}
```

---

## 业务处理流程

1. 接收 `POST` JSON 请求，提取 `id` 参数。
2. 连接 SQL Server（主库 + 本地库）。
3. 使用 `id` 查询 `EPRRegInfo` 表，匹配 `Country = 'BE'` 的比利时 EPR 注册数据。
4. 校验数据字段格式，生成以下文件：
   - **授权书（Mandat）**：基于 `BE_Mandat_Power.docx` 模板动态填充并签名，转为 PDF。
   - **会员合同签字文件（membership）**：基于 FostPlus 模板生成并签名，转为 PDF。
5. 将生成的两份 PDF 上传至 OSS 对象存储。
6. 返回两个文件的 OSS 访问链接（data 为对象数组格式）。
7. 执行完成后清理临时目录 `resources/BE_EPRfile/{id}/`。

---

## 状态码汇总

| code | 含义 | 说明 |
|------|------|------|
| 200 | 成功 | 业务处理成功，data 中返回文件链接 |
| 400 | 请求失败/业务异常 | 参数缺失、数据未找到、文件生成失败、OSS 上传失败、数据库连接失败等 |

---

## 调用测试建议

1. 使用 Postman / Apifox 新建 POST 请求，URL 填入实际接口地址。
2. Headers 添加 `Content-Type: application/json`。
3. Body 选择 `raw` → `JSON`，填写 `{"id": 实际的EPRRegInfoID}`。
4. 发送请求后，检查：
   - HTTP 状态码为 `200`；
   - `code` 字段为 `200`；
   - `data` 为**数组**且内部对象包含 `Mandat` 和 `membership` 两个 URL；
   - 返回的链接可直接在浏览器下载 PDF。

---

## 变更记录

| 版本 | 日期 | 变更说明 |
|------|------|----------|
| v1.0 | 2026-04-20 | 初版接口文档，明确请求参数、统一响应结构（data 为对象数组格式） |
