datai/datai-scenes/datai-scene-salesforce/docs/api-docs/2026-02-06-003-07-api.md

481 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | 是 | 异步操作 IDSalesforce 返回的 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 | 是 | 异步操作 IDSalesforce 返回的 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 | 是 | 异步操作 IDSalesforce 返回的 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 | 是 | 异步操作 IDSalesforce 返回的 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)