# API 参考文档

## 1. 概述

Reporting Service 提供 RESTful API，用于报表的生成、查询和导出。

**Base URL**: `/api/v1`

**响应格式**: 所有响应均使用统一的 JSON 格式

```json
{
  "success": true,
  "data": { ... },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

**错误响应格式**:

```json
{
  "statusCode": 400,
  "code": "BAD_REQUEST",
  "message": "Validation failed",
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

## 2. 健康检查 API

### 2.1 健康检查

**Endpoint**: `GET /health`

检查服务是否运行正常。

**响应示例**:

```json
{
  "success": true,
  "data": {
    "status": "ok",
    "service": "reporting-service",
    "timestamp": "2024-01-15T10:30:00.000Z"
  },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

### 2.2 就绪检查

**Endpoint**: `GET /health/ready`

检查服务是否准备好处理请求（包括数据库连接等）。

**响应示例**:

```json
{
  "success": true,
  "data": {
    "status": "ready",
    "service": "reporting-service",
    "timestamp": "2024-01-15T10:30:00.000Z"
  },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

## 3. 报表定义 API

### 3.1 获取所有报表定义

**Endpoint**: `GET /reports/definitions`

获取所有可用的报表定义列表。

**响应示例**:

```json
{
  "success": true,
  "data": [
    {
      "id": "1",
      "reportCode": "RPT_LEADERBOARD",
      "reportName": "排行榜报表",
      "reportType": "LEADERBOARD_REPORT",
      "description": "用户排行榜数据报表",
      "parameters": {
        "required": ["startDate", "endDate"],
        "optional": ["limit", "offset"]
      },
      "isActive": true,
      "scheduleCron": "0 0 1 * * *",
      "createdAt": "2024-01-01T00:00:00.000Z"
    }
  ],
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

### 3.2 获取单个报表定义

**Endpoint**: `GET /reports/definitions/:code`

根据报表代码获取报表定义详情。

**路径参数**:

| 参数 | 类型 | 描述 |
|------|------|------|
| code | string | 报表代码 (如 `RPT_LEADERBOARD`) |

**响应示例**:

```json
{
  "success": true,
  "data": {
    "id": "1",
    "reportCode": "RPT_LEADERBOARD",
    "reportName": "排行榜报表",
    "reportType": "LEADERBOARD_REPORT",
    "description": "用户排行榜数据报表",
    "parameters": {
      "required": ["startDate", "endDate"],
      "optional": ["limit", "offset"]
    },
    "isActive": true,
    "scheduleCron": "0 0 1 * * *",
    "lastGeneratedAt": "2024-01-14T01:00:00.000Z",
    "createdAt": "2024-01-01T00:00:00.000Z",
    "updatedAt": "2024-01-14T01:00:00.000Z"
  },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

**错误响应** (404):

```json
{
  "statusCode": 404,
  "code": "NOT_FOUND",
  "message": "Report definition not found: RPT_INVALID",
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

## 4. 报表生成 API

### 4.1 生成报表

**Endpoint**: `POST /reports/generate`

生成新的报表快照。

**请求体**:

```json
{
  "reportCode": "RPT_LEADERBOARD",
  "reportPeriod": "DAILY",
  "startDate": "2024-01-01",
  "endDate": "2024-01-01",
  "filterParams": {
    "limit": 100,
    "category": "all"
  }
}
```

**请求参数说明**:

| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| reportCode | string | 是 | 报表代码 |
| reportPeriod | enum | 是 | 报表周期: `DAILY`, `WEEKLY`, `MONTHLY`, `QUARTERLY`, `YEARLY`, `CUSTOM` |
| startDate | string | 是 | 开始日期 (ISO 8601 格式) |
| endDate | string | 是 | 结束日期 (ISO 8601 格式) |
| filterParams | object | 否 | 额外筛选参数 |

**响应示例**:

```json
{
  "success": true,
  "data": {
    "id": "12345",
    "reportCode": "RPT_LEADERBOARD",
    "reportType": "LEADERBOARD_REPORT",
    "reportPeriod": "DAILY",
    "periodKey": "2024-01-01",
    "rowCount": 100,
    "status": "COMPLETED",
    "generatedAt": "2024-01-15T10:30:00.000Z"
  },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

**验证错误** (400):

```json
{
  "statusCode": 400,
  "code": "BAD_REQUEST",
  "message": "reportPeriod must be one of the following values: DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, CUSTOM",
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

## 5. 报表快照 API

### 5.1 查询报表快照列表

**Endpoint**: `GET /reports/snapshots`

查询报表快照列表，支持分页和筛选。

**查询参数**:

| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| reportCode | string | 否 | 按报表代码筛选 |
| reportPeriod | enum | 否 | 按报表周期筛选 |
| startDate | string | 否 | 开始日期范围 |
| endDate | string | 否 | 结束日期范围 |
| page | number | 否 | 页码 (默认: 1) |
| limit | number | 否 | 每页数量 (默认: 20, 最大: 100) |

**请求示例**:

```
GET /reports/snapshots?reportCode=RPT_LEADERBOARD&reportPeriod=DAILY&page=1&limit=10
```

**响应示例**:

```json
{
  "success": true,
  "data": [
    {
      "id": "12345",
      "reportCode": "RPT_LEADERBOARD",
      "reportType": "LEADERBOARD_REPORT",
      "reportPeriod": "DAILY",
      "periodKey": "2024-01-15",
      "rowCount": 100,
      "periodStartAt": "2024-01-15T00:00:00.000Z",
      "periodEndAt": "2024-01-15T23:59:59.999Z",
      "generatedAt": "2024-01-16T01:00:00.000Z"
    }
  ],
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

### 5.2 获取快照详情

**Endpoint**: `GET /reports/snapshots/:id`

根据快照ID获取详细数据。

**路径参数**:

| 参数 | 类型 | 描述 |
|------|------|------|
| id | string | 快照ID |

**响应示例**:

```json
{
  "success": true,
  "data": {
    "id": "12345",
    "reportCode": "RPT_LEADERBOARD",
    "reportType": "LEADERBOARD_REPORT",
    "reportPeriod": "DAILY",
    "periodKey": "2024-01-15",
    "snapshotData": {
      "rows": [
        { "rank": 1, "userId": 1001, "username": "user1", "score": 9850 },
        { "rank": 2, "userId": 1002, "username": "user2", "score": 9720 }
      ],
      "summary": {
        "totalEntries": 100,
        "averageScore": 5432,
        "maxScore": 9850
      }
    },
    "summaryData": {
      "totalEntries": 100,
      "generationTime": "2.5s"
    },
    "rowCount": 100,
    "dataSource": ["leaderboard-service"],
    "periodStartAt": "2024-01-15T00:00:00.000Z",
    "periodEndAt": "2024-01-15T23:59:59.999Z",
    "generatedAt": "2024-01-16T01:00:00.000Z"
  },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

### 5.3 获取最新快照

**Endpoint**: `GET /reports/snapshots/:code/latest`

获取指定报表代码的最新快照。

**路径参数**:

| 参数 | 类型 | 描述 |
|------|------|------|
| code | string | 报表代码 |

**响应示例**:

```json
{
  "success": true,
  "data": {
    "id": "12345",
    "reportCode": "RPT_LEADERBOARD",
    "reportPeriod": "DAILY",
    "periodKey": "2024-01-15",
    "rowCount": 100,
    "generatedAt": "2024-01-16T01:00:00.000Z"
  },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

**错误响应** (404):

```json
{
  "statusCode": 404,
  "code": "NOT_FOUND",
  "message": "No snapshot found for report: RPT_INVALID",
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

## 6. 导出 API

### 6.1 导出报表

**Endpoint**: `POST /export`

将报表快照导出为指定格式。

**请求体**:

```json
{
  "snapshotId": "12345",
  "format": "EXCEL",
  "options": {
    "includeCharts": true,
    "sheetName": "排行榜数据"
  }
}
```

**请求参数说明**:

| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| snapshotId | string | 是 | 快照ID |
| format | enum | 是 | 导出格式: `EXCEL`, `CSV`, `PDF`, `JSON` |
| options | object | 否 | 导出选项 |

**导出选项 (按格式)**:

**Excel 选项**:
| 选项 | 类型 | 描述 |
|------|------|------|
| includeCharts | boolean | 是否包含图表 |
| sheetName | string | 工作表名称 |

**PDF 选项**:
| 选项 | 类型 | 描述 |
|------|------|------|
| title | string | PDF标题 |
| orientation | string | 方向: `portrait`, `landscape` |

**响应示例**:

```json
{
  "success": true,
  "data": {
    "fileId": "file_67890",
    "fileName": "RPT_LEADERBOARD_2024-01-15.xlsx",
    "format": "EXCEL",
    "fileSize": 102400,
    "downloadUrl": "/api/v1/files/file_67890/download",
    "expiresAt": "2024-01-22T10:30:00.000Z",
    "createdAt": "2024-01-15T10:30:00.000Z"
  },
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

### 6.2 获取导出文件列表

**Endpoint**: `GET /export/files`

查询已导出的文件列表。

**查询参数**:

| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| snapshotId | string | 否 | 按快照ID筛选 |
| format | enum | 否 | 按格式筛选 |
| page | number | 否 | 页码 |
| limit | number | 否 | 每页数量 |

**响应示例**:

```json
{
  "success": true,
  "data": [
    {
      "fileId": "file_67890",
      "fileName": "RPT_LEADERBOARD_2024-01-15.xlsx",
      "format": "EXCEL",
      "fileSize": 102400,
      "snapshotId": "12345",
      "createdAt": "2024-01-15T10:30:00.000Z"
    }
  ],
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

### 6.3 下载文件

**Endpoint**: `GET /files/:fileId/download`

下载导出的文件。

**路径参数**:

| 参数 | 类型 | 描述 |
|------|------|------|
| fileId | string | 文件ID |

**响应**: 文件二进制流

**响应头**:
```
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename="RPT_LEADERBOARD_2024-01-15.xlsx"
```

## 7. 错误码参考

| HTTP状态码 | 错误码 | 描述 |
|------------|--------|------|
| 400 | BAD_REQUEST | 请求参数验证失败 |
| 401 | UNAUTHORIZED | 未认证 |
| 403 | FORBIDDEN | 无权限访问 |
| 404 | NOT_FOUND | 资源不存在 |
| 409 | CONFLICT | 资源冲突 (如重复生成) |
| 422 | UNPROCESSABLE_ENTITY | 业务逻辑错误 |
| 500 | INTERNAL_ERROR | 服务器内部错误 |
| 503 | SERVICE_UNAVAILABLE | 服务不可用 |

## 8. 认证

API 支持 JWT Bearer Token 认证（可配置）。

**请求头**:
```
Authorization: Bearer <token>
```

**未认证响应** (401):
```json
{
  "statusCode": 401,
  "code": "UNAUTHORIZED",
  "message": "Unauthorized",
  "timestamp": "2024-01-15T10:30:00.000Z"
}
```

## 9. 限流

| 端点类型 | 限制 |
|----------|------|
| 读取操作 | 100 次/分钟 |
| 生成报表 | 10 次/分钟 |
| 导出操作 | 20 次/分钟 |

超出限制返回 HTTP 429 Too Many Requests。
