datai/datai-scenes/datai-scene-salesforce/docs/api-docs/2026-01-30-004-api.md

532 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 文档 - 查询功能
## 元数据
- 需求编号001-04
- 创建时间2026-01-30
- 创建人AI Assistant
- 版本号v1.0.0
- 状态:已完成
## API 概述
查询功能 API 提供对 Salesforce 数据的查询能力,包括 SOQL 查询、查询所有记录(包括已删除的)、分页查询和 SOSL 搜索四个核心功能。所有接口都需要用户登录后才能访问。
### 基础信息
- **基础路径**`/partner`
- **认证方式**JWT Token通过请求头传入
- **权限要求**:已登录用户
- **数据格式**JSON
### 功能列表
1. **Query** - 执行标准 SOQL 查询
2. **QueryAll** - 查询所有记录(包括已删除的)
3. **QueryMore** - 获取查询结果的下一页
4. **Search** - 执行 SOSL 搜索
## 接口列表
### 1. 执行 SOQL 查询
执行标准的 SOQL 查询语句,返回查询结果。
#### 基本信息
- **接口名称**query
- **请求方式**POST
- **请求路径**`/partner/query`
- **权限要求**`@PreAuthorize("@ss.hasLogin()")`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| soql | String | 是 | SOQL 查询语句 | `SELECT Id, Name FROM Account LIMIT 10` |
| batchSize | Integer | 否 | 批次大小,默认 500最大 2000 | 500 |
#### 请求示例
```json
{
"soql": "SELECT Id, Name, CreatedDate FROM Account WHERE Name LIKE '%Test%' LIMIT 10",
"batchSize": 500
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 状态码200 成功,其他失败) |
| msg | String | 提示信息 |
| data | Object | 查询结果 |
| data.records | List<Map> | 记录列表 |
| data.queryLocator | String | 查询定位器,用于 QueryMore 获取下一页 |
| data.done | Boolean | 是否完成true 表示没有更多数据) |
| data.size | Integer | 记录数量 |
| data.success | Boolean | 是否成功 |
| data.errors | List | 错误信息列表 |
#### 成功响应示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"records": [
{
"Id": "001D000001",
"Name": "Test Account 1",
"CreatedDate": "2026-01-15T10:30:00.000Z"
},
{
"Id": "001D000002",
"Name": "Test Account 2",
"CreatedDate": "2026-01-16T14:20:00.000Z"
}
],
"queryLocator": "01gD0000002J6ozIAC-2000",
"done": false,
"size": 2,
"success": true,
"errors": null
}
}
```
#### 失败响应示例
```json
{
"code": 500,
"msg": "查询失败: INVALID_FIELD: No such column 'InvalidField' on entity 'Account'",
"data": null
}
```
#### SOQL 语法说明
**支持的运算符**
- `=` : 等于
- `!=` : 不等于
- `>` : 大于
- `>=` : 大于等于
- `<` : 小于
- `<=` : 小于等于
- `LIKE` : 模糊匹配(使用 `%` 作为通配符)
- `IN` : 在列表中
- `NOT IN` : 不在列表中
- `= NULL` : 为空
- `!= NULL` : 不为空
**支持的子句**
- `WHERE` : 条件过滤
- `GROUP BY` : 分组
- `HAVING` : 分组过滤
- `ORDER BY` : 排序
- `LIMIT` : 限制返回记录数
- `OFFSET` : 跳过指定数量的记录
**注意事项**
- 不支持 `SELECT *`,必须明确指定字段或使用 `FIELDS(ALL)`、`FIELDS(STANDARD)`、`FIELDS(CUSTOM)`
- 不支持 `BETWEEN` 运算符,请使用 `>=``<=` 组合代替
- 不支持 `JOIN`使用关系查询Relationship Queries`Account.Name`
- 不支持 `UNION`,无法合并两个不相关的结果集
- 查询最多返回 50000 条记录
- `OFFSET` 上限为 2000且必须与 `LIMIT` 一起使用
#### 关系查询示例
```json
{
"soql": "SELECT Id, Name, Account.Name, Account.Industry FROM Contact WHERE Account.Name LIKE '%Acme%'",
"batchSize": 500
}
```
#### 聚合查询示例
```json
{
"soql": "SELECT Industry, COUNT(Id) total FROM Account GROUP BY Industry HAVING COUNT(Id) > 5",
"batchSize": 500
}
```
---
### 2. 查询所有记录(包括已删除的)
执行 SOQL 查询,返回所有记录,包括已删除到回收站中的记录。
#### 基本信息
- **接口名称**queryAll
- **请求方式**POST
- **请求路径**`/partner/queryAll`
- **权限要求**`@PreAuthorize("@ss.hasLogin()")`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| soql | String | 是 | SOQL 查询语句 | `SELECT Id, Name FROM Account LIMIT 10` |
| batchSize | Integer | 否 | 批次大小,默认 500最大 2000 | 500 |
#### 请求示例
```json
{
"soql": "SELECT Id, Name, IsDeleted FROM Account WHERE Name LIKE '%Test%' LIMIT 10",
"batchSize": 500
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 状态码200 成功,其他失败) |
| msg | String | 提示信息 |
| data | Object | 查询结果(结构同 Query 接口) |
#### 成功响应示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"records": [
{
"Id": "001D000001",
"Name": "Test Account 1",
"IsDeleted": false
},
{
"Id": "001D000002",
"Name": "Deleted Account",
"IsDeleted": true
}
],
"queryLocator": null,
"done": true,
"size": 2,
"success": true,
"errors": null
}
}
```
#### 适用场景
- 数据恢复:查找已删除的记录
- 数据审计:查看所有记录的历史状态
- 数据同步:确保数据同步的完整性
---
### 3. 获取查询结果的下一页
使用 QueryLocator 获取查询结果的下一页数据。
#### 基本信息
- **接口名称**queryMore
- **请求方式**POST
- **请求路径**`/partner/queryMore`
- **权限要求**`@PreAuthorize("@ss.hasLogin()")`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| queryLocator | String | 是 | 查询定位器,从 Query 或 QueryAll 的结果中获取 | `01gD0000002J6ozIAC-2000` |
#### 请求示例
```json
{
"queryLocator": "01gD0000002J6ozIAC-2000"
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 状态码200 成功,其他失败) |
| msg | String | 提示信息 |
| data | Object | 查询结果(结构同 Query 接口) |
#### 成功响应示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"records": [
{
"Id": "001D000003",
"Name": "Test Account 3"
},
{
"Id": "001D000004",
"Name": "Test Account 4"
}
],
"queryLocator": "01gD0000002J6ozIAC-4000",
"done": true,
"size": 2,
"success": true,
"errors": null
}
}
```
#### 分页流程说明
1. **首次查询**:调用 Query 或 QueryAll 接口,获取第一批数据
2. **检查是否完成**:查看响应中的 `done` 字段
- 如果 `done``true`,表示没有更多数据,分页结束
- 如果 `done``false`,表示还有更多数据,继续下一步
3. **获取下一页**:使用响应中的 `queryLocator` 调用 QueryMore 接口
4. **重复步骤 2-3**,直到 `done``true`
#### 注意事项
- **有效期限制**queryLocator 通常有 15 分钟的有效期,过期后需要重新查询
- **并发限制**:同一 queryLocator 不支持并发访问
- **数据一致性**:分页查询期间,如果数据发生变化,可能导致数据重复或遗漏
---
### 4. 执行 SOSL 搜索
执行 SOSL 搜索语句,支持跨对象全文搜索。
#### 基本信息
- **接口名称**search
- **请求方式**POST
- **请求路径**`/partner/search`
- **权限要求**`@PreAuthorize("@ss.hasLogin()")`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| sosl | String | 是 | SOSL 搜索语句 | `FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Name)` |
#### 请求示例
```json
{
"sosl": "FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name, Industry), Contact(Id, FirstName, LastName, Email)"
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 状态码200 成功,其他失败) |
| msg | String | 提示信息 |
| data | Object | 搜索结果 |
| data.searchRecords | List | 搜索结果列表 |
| data.searchRecords[0].type | String | 记录类型(如 Account、Contact |
| data.searchRecords[0].record | Map | 记录数据 |
| data.success | Boolean | 是否成功 |
| data.errors | List | 错误信息列表 |
#### 成功响应示例
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"searchRecords": [
{
"type": "Account",
"record": {
"Id": "001D000001",
"Name": "Acme Corporation",
"Industry": "Technology"
}
},
{
"type": "Account",
"record": {
"Id": "001D000002",
"Name": "Acme Ltd",
"Industry": "Manufacturing"
}
},
{
"type": "Contact",
"record": {
"Id": "003D000001",
"FirstName": "John",
"LastName": "Acme",
"Email": "john@acme.com"
}
}
],
"success": true,
"errors": null
}
}
```
#### SOSL 语法说明
**基本语法**
```sql
FIND {搜索关键词}
[IN 搜索范围]
[RETURNING 对象类型(字段列表)]
[WITH 过滤条件]
[LIMIT 结果限制]
```
**搜索范围**
- `IN ALL FIELDS` - 在所有字段中搜索
- `IN NAME FIELDS` - 在名称字段中搜索
- `IN EMAIL FIELDS` - 在邮箱字段中搜索
- `IN PHONE FIELDS` - 在电话字段中搜索
- `IN SIDEBAR FIELDS` - 在侧边栏字段中搜索
**RETURNING 子句**
- 指定要搜索的对象类型和返回的字段
- 支持多个对象类型,用逗号分隔
- 可以为每个对象类型指定 LIMIT
**搜索关键词**
- 使用 `{}` 包裹搜索关键词
- 支持通配符 `*``?`
- 支持逻辑运算符 `AND`、`OR`、`NOT`
#### SOSL 示例
**基本搜索**
```json
{
"sosl": "FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Name)"
}
```
**模糊搜索**
```json
{
"sosl": "FIND {Acme*} IN NAME FIELDS RETURNING Account(Id, Name), Contact(Id, FirstName, LastName)"
}
```
**多关键词搜索**
```json
{
"sosl": "FIND {Acme OR Salesforce} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Name), Lead(Id, Name)"
}
```
**带限制的搜索**
```json
{
"sosl": "FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name LIMIT 10), Contact(Id, Name LIMIT 10)"
}
```
---
## 错误码
### 系统错误码
| 错误码 | 说明 | 处理建议 |
|--------|------|----------|
| 200 | 成功 | 无需处理 |
| 401 | 未授权 | 检查是否已登录Token 是否有效 |
| 403 | 禁止访问 | 检查用户权限 |
| 500 | 服务器内部错误 | 查看错误消息,检查 SOQL/SOSL 语法 |
### 业务错误码
| 错误码 | 说明 | 处理建议 |
|--------|------|----------|
| 1001 | SOQL 语法错误 | 检查 SOQL 语句语法,参考 Salesforce 文档 |
| 1002 | SOSL 语法错误 | 检查 SOSL 语句语法,参考 Salesforce 文档 |
| 1003 | 无效的批次大小 | 确保 batchSize 在 1-2000 范围内 |
| 1004 | 无效的查询定位器 | 确保 queryLocator 有效且未过期 |
| 1005 | 查询超时 | 优化查询条件,减少返回数据量 |
| 1006 | 超出查询限制 | 减少查询复杂度,避免超过 Salesforce 限制 |
### 常见错误消息
| 错误消息 | 说明 | 处理建议 |
|----------|------|----------|
| `INVALID_FIELD` | 无效的字段名 | 检查字段名是否正确,是否存在于对象中 |
| `INVALID_TYPE` | 无效的对象类型 | 检查对象类型名是否正确 |
| `MALFORMED_QUERY` | 查询格式错误 | 检查 SOQL/SOSL 语法 |
| `QUERY_TIMEOUT` | 查询超时 | 优化查询条件,添加 LIMIT |
| `TOO_MANY_QUERY_ROWS` | 查询返回记录过多 | 添加 LIMIT 限制返回记录数 |
| `INVALID_QUERY_LOCATOR` | 无效的查询定位器 | queryLocator 已过期,需要重新查询 |
---
## 相关文档
- [需求文档](../requirements/sub/2026-01-28-001-04-查询功能.md)
- [设计文档](../design/2026-01-30-004-查询功能-设计.md)
- [决策记录](../decisions/2026-01-30-004-ADR-查询功能技术选型.md)
- [提示词文档](../prompts/2026-01-30-004-prompt-查询功能.md)
- [变更日志](../changelog/2026-01-30-004-changelog.md)
- [复盘文档](../retros/2026-01-30-004-retro.md)
- [会话记录](../sessions/2026-01-28-001-session.md)
---
## 附录
### SOQL 快速参考
**基本查询**
```sql
SELECT Id, Name FROM Account
```
**条件查询**
```sql
SELECT Id, Name FROM Account WHERE Name LIKE '%Test%'
```
**排序**
```sql
SELECT Id, Name FROM Account ORDER BY Name ASC
```
**限制返回数量**
```sql
SELECT Id, Name FROM Account LIMIT 100
```
**分页**
```sql
SELECT Id, Name FROM Account LIMIT 100 OFFSET 100
```
**关系查询**
```sql
SELECT Id, Name, Account.Name FROM Contact
```
**聚合查询**
```sql
SELECT Industry, COUNT(Id) FROM Account GROUP BY Industry
```
### SOSL 快速参考
**基本搜索**
```sql
FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name)
```
**多对象搜索**
```sql
FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Name)
```
**模糊搜索**
```sql
FIND {Acme*} IN NAME FIELDS RETURNING Account(Id, Name)
```
**带限制的搜索**
```sql
FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name LIMIT 10)
```