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

532 lines
13 KiB
Markdown
Raw Normal View History

# 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)
```