# 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 ``` **未认证响应** (401): ```json { "statusCode": 401, "code": "UNAUTHORIZED", "message": "Unauthorized", "timestamp": "2024-01-15T10:30:00.000Z" } ``` ## 9. 限流 | 端点类型 | 限制 | |----------|------| | 读取操作 | 100 次/分钟 | | 生成报表 | 10 次/分钟 | | 导出操作 | 20 次/分钟 | 超出限制返回 HTTP 429 Too Many Requests。