481 lines
13 KiB
Markdown
481 lines
13 KiB
Markdown
# API 文档 - 检查部署和检索状态
|
||
|
||
## 元数据
|
||
- 需求编号:003-07
|
||
- 需求名称:检查部署和检索状态
|
||
- 创建时间:2026-02-06
|
||
- 创建人:AI Assistant
|
||
- 版本号:v1.0.0
|
||
- 状态:已完成
|
||
|
||
## API 概述
|
||
本模块提供 Salesforce Metadata API 的部署和检索状态检查功能,支持单次状态查询、轮询监控和历史记录查询。所有接口都需要用户已登录并具有相应的权限。
|
||
|
||
### 核心功能
|
||
1. **部署状态检查**:查询指定部署操作的当前状态
|
||
2. **检索状态检查**:查询指定检索操作的当前状态
|
||
3. **部署状态轮询**:轮询部署状态直到完成或超时
|
||
4. **检索状态轮询**:轮询检索状态直到完成或超时
|
||
5. **状态查询历史**:查询状态检查的历史记录
|
||
|
||
### 技术特点
|
||
- 支持轻量级调用(`includeDetails=false`)
|
||
- 轮询参数可配置(间隔、超时)
|
||
- 异步记录审计日志
|
||
- 自动同步关联表状态
|
||
|
||
## 接口列表
|
||
|
||
### 1. 检查部署状态
|
||
|
||
#### 接口说明
|
||
查询指定部署操作的当前状态,返回部署结果详情。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:`/salesforce/metadata/status/deploy/{asyncId}`
|
||
- **Content-Type**:application/json
|
||
|
||
#### 路径参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| asyncId | String | 是 | 异步操作 ID,Salesforce 返回的 AsyncResult ID |
|
||
|
||
#### 查询参数
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| includeDetails | Boolean | 否 | true | 是否包含详细信息(如错误详情) |
|
||
|
||
#### 请求示例
|
||
```http
|
||
GET /salesforce/metadata/status/deploy/0Afxx0000004M5sCAE?includeDetails=true
|
||
```
|
||
|
||
#### 响应参数
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | DeployResult 对象 |
|
||
|
||
#### DeployResult 对象
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| id | String | 异步操作 ID |
|
||
| status | String | 部署状态(Queued/InProgress/Succeeded/Failed/Canceled) |
|
||
| numberComponentErrors | Integer | 组件错误数 |
|
||
| numberComponentsDeployed | Integer | 已部署组件数 |
|
||
| numberTestErrors | Integer | 测试错误数 |
|
||
| numberTestsCompleted | Integer | 已完成测试数 |
|
||
| errorMessage | String | 错误消息(失败时) |
|
||
|
||
#### 成功响应示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"id": "0Afxx0000004M5sCAE",
|
||
"status": "Succeeded",
|
||
"numberComponentErrors": 0,
|
||
"numberComponentsDeployed": 5,
|
||
"numberTestErrors": 0,
|
||
"numberTestsCompleted": 10,
|
||
"errorMessage": null
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 失败响应示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "检查部署状态失败: 无效的异步操作 ID",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 检查检索状态
|
||
|
||
#### 接口说明
|
||
查询指定检索操作的当前状态,返回检索结果详情。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:`/salesforce/metadata/status/retrieve/{asyncId}`
|
||
- **Content-Type**:application/json
|
||
|
||
#### 路径参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| asyncId | String | 是 | 异步操作 ID,Salesforce 返回的 AsyncResult ID |
|
||
|
||
#### 查询参数
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| includeDetails | Boolean | 否 | true | 是否包含详细信息(如错误详情) |
|
||
|
||
#### 请求示例
|
||
```http
|
||
GET /salesforce/metadata/status/retrieve/0Afxx0000004M5sCAE?includeDetails=true
|
||
```
|
||
|
||
#### 响应参数
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | RetrieveResult 对象 |
|
||
|
||
#### RetrieveResult 对象
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| id | String | 异步操作 ID |
|
||
| status | String | 检索状态(Queued/InProgress/Succeeded/Failed/Canceled) |
|
||
| success | Boolean | 是否成功 |
|
||
| errorMessage | String | 错误消息(失败时) |
|
||
| zipFile | String | ZIP 文件内容(Base64 编码,成功时) |
|
||
|
||
#### 成功响应示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"id": "0Afxx0000004M5sCAE",
|
||
"status": "Succeeded",
|
||
"success": true,
|
||
"errorMessage": null,
|
||
"zipFile": "UEsDBBQAAAAIA..."
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 失败响应示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "检查检索状态失败: 异步操作未找到",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 轮询部署状态
|
||
|
||
#### 接口说明
|
||
轮询部署状态直到完成(Succeeded/Failed/Canceled)或超时。适用于需要等待部署完成的场景。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:`/salesforce/metadata/status/deploy/poll/{asyncId}`
|
||
- **Content-Type**:application/json
|
||
|
||
#### 路径参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| asyncId | String | 是 | 异步操作 ID,Salesforce 返回的 AsyncResult ID |
|
||
|
||
#### 查询参数
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| interval | Long | 否 | 2000 | 轮询间隔(毫秒) |
|
||
| timeout | Long | 否 | 300000 | 超时时间(毫秒),默认 5 分钟 |
|
||
|
||
#### 请求示例
|
||
```http
|
||
GET /salesforce/metadata/status/deploy/poll/0Afxx0000004M5sCAE?interval=2000&timeout=300000
|
||
```
|
||
|
||
#### 响应参数
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | DeployResult 对象(最终状态) |
|
||
|
||
#### 成功响应示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"id": "0Afxx0000004M5sCAE",
|
||
"status": "Succeeded",
|
||
"numberComponentErrors": 0,
|
||
"numberComponentsDeployed": 5,
|
||
"numberTestErrors": 0,
|
||
"numberTestsCompleted": 10,
|
||
"errorMessage": null
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 超时响应示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "部署轮询超时",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 4. 轮询检索状态
|
||
|
||
#### 接口说明
|
||
轮询检索状态直到完成(Succeeded/Failed/Canceled)或超时。适用于需要等待检索完成的场景。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:`/salesforce/metadata/status/retrieve/poll/{asyncId}`
|
||
- **Content-Type**:application/json
|
||
|
||
#### 路径参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| asyncId | String | 是 | 异步操作 ID,Salesforce 返回的 AsyncResult ID |
|
||
|
||
#### 查询参数
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| interval | Long | 否 | 2000 | 轮询间隔(毫秒) |
|
||
| timeout | Long | 否 | 300000 | 超时时间(毫秒),默认 5 分钟 |
|
||
|
||
#### 请求示例
|
||
```http
|
||
GET /salesforce/metadata/status/retrieve/poll/0Afxx0000004M5sCAE?interval=2000&timeout=300000
|
||
```
|
||
|
||
#### 响应参数
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | RetrieveResult 对象(最终状态) |
|
||
|
||
#### 成功响应示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"id": "0Afxx0000004M5sCAE",
|
||
"status": "Succeeded",
|
||
"success": true,
|
||
"errorMessage": null,
|
||
"zipFile": "UEsDBBQAAAAIA..."
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 中断响应示例
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "轮询被中断",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 5. 获取状态查询历史
|
||
|
||
#### 接口说明
|
||
查询状态检查的历史记录,支持按操作类型筛选。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:`/salesforce/metadata/status/history`
|
||
- **Content-Type**:application/json
|
||
|
||
#### 查询参数
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| operationType | String | 否 | - | 操作类型(DEPLOY/RETRIEVE),不填则查询所有 |
|
||
| limit | Integer | 否 | 50 | 返回数量限制 |
|
||
|
||
#### 请求示例
|
||
```http
|
||
GET /salesforce/metadata/status/history?operationType=DEPLOY&limit=50
|
||
```
|
||
|
||
#### 响应参数
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Integer | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| data | Array | 状态检查历史列表 |
|
||
|
||
#### StatusCheckHistoryVo 对象
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| checkId | String | 检查记录 ID |
|
||
| asyncId | String | 异步操作 ID |
|
||
| operationType | String | 操作类型(DEPLOY/RETRIEVE) |
|
||
| status | String | 状态 |
|
||
| checkTime | String | 检查时间(ISO 8601 格式) |
|
||
| errorMessage | String | 错误消息 |
|
||
|
||
#### 成功响应示例
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": [
|
||
{
|
||
"checkId": "CHK202502060001",
|
||
"asyncId": "0Afxx0000004M5sCAE",
|
||
"operationType": "DEPLOY",
|
||
"status": "Succeeded",
|
||
"checkTime": "2026-02-06T10:30:00Z",
|
||
"errorMessage": null
|
||
},
|
||
{
|
||
"checkId": "CHK202502060002",
|
||
"asyncId": "0Afxx0000004M5sCAF",
|
||
"operationType": "RETRIEVE",
|
||
"status": "Failed",
|
||
"checkTime": "2026-02-06T10:25:00Z",
|
||
"errorMessage": "Invalid metadata type"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 错误码
|
||
|
||
### 状态检查错误码
|
||
| 错误码 | 说明 | 场景 |
|
||
|--------|------|------|
|
||
| STATUS_001 | 会话已过期 | Salesforce 会话过期 |
|
||
| STATUS_002 | 未授权访问 | 用户没有权限访问 |
|
||
| STATUS_003 | 无效的异步操作 ID | asyncId 格式不正确 |
|
||
| STATUS_004 | 异步操作未找到 | 指定的 asyncId 不存在 |
|
||
| STATUS_005 | 检查状态失败 | API 调用失败 |
|
||
| STATUS_006 | 轮询超时 | 轮询时间超过 timeout 参数 |
|
||
| STATUS_007 | 轮询被中断 | 线程被中断 |
|
||
| STATUS_008 | 远程调用失败 | 网络异常或 Salesforce 服务不可用 |
|
||
| STATUS_009 | 查询历史失败 | 数据库查询失败 |
|
||
|
||
### HTTP 状态码
|
||
| 状态码 | 说明 |
|
||
|--------|------|
|
||
| 200 | 请求成功 |
|
||
| 400 | 请求参数错误 |
|
||
| 401 | 未授权 |
|
||
| 403 | 禁止访问 |
|
||
| 404 | 资源不存在 |
|
||
| 500 | 服务器内部错误 |
|
||
|
||
## 数据字典
|
||
|
||
### 部署状态(Deploy Status)
|
||
| 状态值 | 说明 |
|
||
|--------|------|
|
||
| Queued | 已排队,等待执行 |
|
||
| InProgress | 进行中 |
|
||
| Succeeded | 成功完成 |
|
||
| Failed | 失败 |
|
||
| Canceled | 已取消 |
|
||
|
||
### 检索状态(Retrieve Status)
|
||
| 状态值 | 说明 |
|
||
|--------|------|
|
||
| Queued | 已排队,等待执行 |
|
||
| InProgress | 进行中 |
|
||
| Succeeded | 成功完成 |
|
||
| Failed | 失败 |
|
||
| Canceled | 已取消 |
|
||
|
||
### 操作类型(Operation Type)
|
||
| 类型值 | 说明 |
|
||
|--------|------|
|
||
| DEPLOY | 部署操作 |
|
||
| RETRIEVE | 检索操作 |
|
||
|
||
## 使用示例
|
||
|
||
### 场景 1:检查部署状态
|
||
```java
|
||
// 前端调用示例
|
||
fetch('/salesforce/metadata/status/deploy/0Afxx0000004M5sCAE?includeDetails=true')
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
if (data.code === 200) {
|
||
console.log('部署状态:', data.data.status);
|
||
} else {
|
||
console.error('查询失败:', data.msg);
|
||
}
|
||
});
|
||
```
|
||
|
||
### 场景 2:轮询检索状态直到完成
|
||
```java
|
||
// 前端调用示例
|
||
fetch('/salesforce/metadata/status/retrieve/poll/0Afxx0000004M5sCAE?interval=2000&timeout=300000')
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
if (data.code === 200) {
|
||
console.log('检索完成,状态:', data.data.status);
|
||
if (data.data.success) {
|
||
// 处理 ZIP 文件
|
||
console.log('ZIP 文件:', data.data.zipFile);
|
||
}
|
||
} else {
|
||
console.error('轮询失败:', data.msg);
|
||
}
|
||
});
|
||
```
|
||
|
||
### 场景 3:查询部署历史
|
||
```java
|
||
// 前端调用示例
|
||
fetch('/salesforce/metadata/status/history?operationType=DEPLOY&limit=10')
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
if (data.code === 200) {
|
||
data.data.forEach(record => {
|
||
console.log('检查记录:', record.checkId, record.status);
|
||
});
|
||
}
|
||
});
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
### 1. 轮询超时处理
|
||
- 轮询接口可能会长时间阻塞(默认最长 5 分钟)
|
||
- 建议在前端设置更长的超时时间或异步处理
|
||
- 如果超时,可以再次调用轮询接口继续等待
|
||
|
||
### 2. 轻量级调用
|
||
- 如果不需要详细的错误信息,建议设置 `includeDetails=false`
|
||
- 轻量级调用可以减少网络传输和 Salesforce API 调用开销
|
||
|
||
### 3. 审计日志
|
||
- 每次状态检查都会异步记录到数据库
|
||
- 审计日志不影响主流程性能
|
||
- 可以通过历史查询接口查看审计日志
|
||
|
||
### 4. 关联表状态同步
|
||
- 状态检查会自动更新部署日志表和检索记录表的状态
|
||
- 无需手动更新这些表
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/sub/2026-01-28-003-07-检查部署和检索状态.md)
|
||
- [设计文档](../design/2026-02-03-003-07-检查部署和检索状态-设计.md)
|
||
- [决策记录](../decisions/2026-02-03-003-07-ADR-检查部署和检索状态技术选型.md)
|
||
- [变更日志](../changelog/2026-02-06-003-07-changelog.md)
|
||
- [复盘文档](../retros/2026-02-06-003-07-retro.md)
|
||
- [会话记录](../sessions/2026-02-03-003-07-session.md)
|
||
- [部署操作 API 文档](./2026-02-06-003-03-api.md)
|
||
- [检索操作 API 文档](./2026-02-06-003-06-api.md)
|