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

970 lines
20 KiB
Markdown
Raw Normal View History

# API 文档
## 元数据
- 需求编号001
- 子需求编号001-02
- 创建时间2026-01-30
- 创建人AI Assistant
- 版本号v1.0.0
## API 概述
本 API 文档描述了 Salesforce Partner API 的 CRUD 操作接口,包括 Create创建、Retrieve查询、Update更新、Delete删除、Upsert更新或插入、Merge合并六个核心操作。所有接口都支持单条记录和批量记录操作最多 200 条),并提供完整的参数验证、异常处理、权限控制和 Swagger 文档。
### 核心功能
- **创建记录Create**:创建新的 Salesforce 记录,支持单条记录和批量记录创建
- **查询记录Retrieve**:查询 Salesforce 记录,支持单条记录和批量记录查询
- **更新记录Update**:更新现有的 Salesforce 记录,支持单条记录和批量记录更新
- **删除记录Delete**:删除 Salesforce 记录,支持单条记录和批量记录删除
- **更新或插入记录Upsert**:更新或插入 Salesforce 记录,支持单条记录和批量记录 Upsert
- **合并记录Merge**:合并三条 Salesforce 记录
### 技术栈
- **框架**Spring Boot 3.x、Spring Security 6.x、若依框架
- **API 规范**RESTful API
- **文档工具**Swagger/OpenAPI
- **权限控制**Spring Security@PreAuthorize
- **参数验证**Spring Boot Validation
- **异常处理**datai-salesforce-common 模块异常体系
### 认证方式
所有接口都需要用户认证,使用 Spring Security 的 `@PreAuthorize("@ss.hasLogin()")` 注解进行权限控制。用户必须登录后才能访问这些接口。
### 基础 URL
```
http://localhost:8080/partner/crud
```
### 响应格式
所有接口使用统一的响应格式:
```json
{
"code": 200,
"msg": "操作成功",
"data": {}
}
```
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 状态码200 成功,其他失败) |
| msg | String | 提示信息 |
| data | Object | 返回数据 |
## 接口列表
### 接口 1创建记录
#### 功能描述
创建新的 Salesforce 记录,支持单条记录和批量记录创建(最多 200 条)。
#### 请求方式
POST
#### 请求路径
`/partner/crud/create`
#### 请求参数
**单条记录创建**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| fields | Map<String, Object> | 是 | 字段值(如 {"Name": "Test Account", "BillingCity": "San Francisco"} |
| records | List<Map<String, Object>> | 否 | 批量创建记录列表(如果提供,则忽略 objectType 和 fields |
**批量记录创建**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| records | List<Map<String, Object>> | 是 | 批量创建记录列表(最多 200 条) |
#### 请求示例
**单条记录创建**
```json
{
"objectType": "Account",
"fields": {
"Name": "Test Account",
"BillingCity": "San Francisco",
"BillingState": "CA",
"AnnualRevenue": 1000000.00
}
}
```
**批量记录创建**
```json
{
"records": [
{
"Name": "Account 1",
"BillingCity": "San Francisco"
},
{
"Name": "Account 2",
"BillingCity": "New York"
},
{
"Name": "Account 3",
"BillingCity": "Los Angeles"
}
]
}
```
#### 响应参数
**单条记录创建**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 记录 ID |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
| created | Boolean | 是否创建 |
**批量记录创建**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| - | List<RecordResultVo> | 记录操作结果列表 |
#### 响应示例
**成功示例(单条记录)**
```json
{
"code": 200,
"msg": "创建成功",
"data": {
"id": "001xx000003DHb2AAG",
"success": true,
"errors": [],
"created": true
}
}
```
**成功示例(批量记录)**
```json
{
"code": 200,
"msg": "批量创建成功",
"data": [
{
"id": "001xx000003DHb2AAG",
"success": true,
"errors": [],
"created": true
},
{
"id": "001xx000003DHb3AAH",
"success": true,
"errors": [],
"created": true
},
{
"id": "001xx000003DHb4AAI",
"success": true,
"errors": [],
"created": true
}
]
}
```
**失败示例**
```json
{
"code": 500,
"msg": "创建记录失败: INVALID_FIELD: No such column 'InvalidField' on sobject of type Account",
"data": null
}
```
#### 错误码
| 错误码 | 说明 |
|--------|------|
| 500 | 创建记录失败 |
| INVALID_FIELD | 字段不存在或无效 |
| INVALID_ID | ID 无效 |
| MALFORMED_QUERY | 查询语法错误 |
| INVALID_OPERATION | 操作无效 |
| DUPLICATE_VALUE | 值重复 |
| ENTITY_IS_DELETED | 记录已删除 |
| INSUFFICIENT_ACCESS | 权限不足 |
| INVALID_CROSS_REFERENCE_KEY | 跨引用键无效 |
---
### 接口 2查询记录
#### 功能描述
查询 Salesforce 记录,支持单条记录和批量记录查询(最多 200 条)。
#### 请求方式
GET
#### 请求路径
`/partner/crud/retrieve`
#### 请求参数
**单条记录查询**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| id | String | 是 | 记录 ID |
| fieldNames | String | 否 | 字段名称列表(逗号分隔,如 "Name,BillingCity,BillingState" |
**批量记录查询**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| ids | String | 是 | 记录 ID 列表(逗号分隔,最多 200 条) |
| fieldNames | String | 否 | 字段名称列表(逗号分隔,如 "Name,BillingCity,BillingState" |
#### 请求示例
**单条记录查询**
```
GET /partner/crud/retrieve?objectType=Account&id=001xx000003DHb2AAG&fieldNames=Name,BillingCity,BillingState
```
**批量记录查询**
```
GET /partner/crud/retrieve?objectType=Account&ids=001xx000003DHb2AAG,001xx000003DHb3AAH,001xx000003DHb4AAI&fieldNames=Name,BillingCity,BillingState
```
#### 响应参数
**单条记录查询**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| objectType | String | 对象类型 |
| id | String | 记录 ID |
| fields | Map<String, Object> | 字段值 |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
**批量记录查询**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| - | List<RetrieveResultVo> | 查询结果列表 |
#### 响应示例
**成功示例(单条记录)**
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"objectType": "Account",
"id": "001xx000003DHb2AAG",
"fields": {
"Name": "Test Account",
"BillingCity": "San Francisco",
"BillingState": "CA"
},
"success": true,
"errors": []
}
}
```
**成功示例(批量记录)**
```json
{
"code": 200,
"msg": "查询成功",
"data": [
{
"objectType": "Account",
"id": "001xx000003DHb2AAG",
"fields": {
"Name": "Account 1",
"BillingCity": "San Francisco",
"BillingState": "CA"
},
"success": true,
"errors": []
},
{
"objectType": "Account",
"id": "001xx000003DHb3AAH",
"fields": {
"Name": "Account 2",
"BillingCity": "New York",
"BillingState": "NY"
},
"success": true,
"errors": []
},
{
"objectType": "Account",
"id": "001xx000003DHb4AAI",
"fields": {
"Name": "Account 3",
"BillingCity": "Los Angeles",
"BillingState": "CA"
},
"success": true,
"errors": []
}
]
}
```
**失败示例**
```json
{
"code": 500,
"msg": "查询记录失败: INVALID_ID: Invalid ID: 001xx000003DHb2AAG",
"data": null
}
```
#### 错误码
| 错误码 | 说明 |
|--------|------|
| 500 | 查询记录失败 |
| INVALID_ID | ID 无效 |
| INVALID_FIELD | 字段不存在或无效 |
| ENTITY_IS_DELETED | 记录已删除 |
| INSUFFICIENT_ACCESS | 权限不足 |
---
### 接口 3更新记录
#### 功能描述
更新现有的 Salesforce 记录,支持单条记录和批量记录更新(最多 200 条)。
#### 请求方式
PUT
#### 请求路径
`/partner/crud/update`
#### 请求参数
**单条记录更新**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| id | String | 是 | 记录 ID |
| fields | Map<String, Object> | 是 | 字段值(如 {"BillingCity": "New York"} |
| records | List<UpdateRecordItem> | 否 | 批量更新记录列表(如果提供,则忽略 objectType、id 和 fields |
**批量记录更新**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| records | List<UpdateRecordItem> | 是 | 批量更新记录列表(最多 200 条) |
**UpdateRecordItem**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | String | 是 | 记录 ID |
| fields | Map<String, Object> | 是 | 字段值 |
#### 请求示例
**单条记录更新**
```json
{
"objectType": "Account",
"id": "001xx000003DHb2AAG",
"fields": {
"BillingCity": "New York",
"BillingState": "NY",
"AnnualRevenue": 2000000.00
}
}
```
**批量记录更新**
```json
{
"records": [
{
"id": "001xx000003DHb2AAG",
"fields": {
"BillingCity": "New York",
"BillingState": "NY"
}
},
{
"id": "001xx000003DHb3AAH",
"fields": {
"BillingCity": "Los Angeles",
"BillingState": "CA"
}
},
{
"id": "001xx000003DHb4AAI",
"fields": {
"BillingCity": "Chicago",
"BillingState": "IL"
}
}
]
}
```
#### 响应参数
**单条记录更新**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 记录 ID |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
**批量记录更新**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| - | List<RecordResultVo> | 记录操作结果列表 |
#### 响应示例
**成功示例(单条记录)**
```json
{
"code": 200,
"msg": "更新成功",
"data": {
"id": "001xx000003DHb2AAG",
"success": true,
"errors": []
}
}
```
**成功示例(批量记录)**
```json
{
"code": 200,
"msg": "批量更新成功",
"data": [
{
"id": "001xx000003DHb2AAG",
"success": true,
"errors": []
},
{
"id": "001xx000003DHb3AAH",
"success": true,
"errors": []
},
{
"id": "001xx000003DHb4AAI",
"success": true,
"errors": []
}
]
}
```
**失败示例**
```json
{
"code": 500,
"msg": "更新记录失败: INVALID_ID: Invalid ID: 001xx000003DHb2AAG",
"data": null
}
```
#### 错误码
| 错误码 | 说明 |
|--------|------|
| 500 | 更新记录失败 |
| INVALID_ID | ID 无效 |
| INVALID_FIELD | 字段不存在或无效 |
| ENTITY_IS_DELETED | 记录已删除 |
| INSUFFICIENT_ACCESS | 权限不足 |
---
### 接口 4删除记录
#### 功能描述
删除 Salesforce 记录,支持单条记录和批量记录删除(最多 200 条)。
#### 请求方式
DELETE
#### 请求路径
`/partner/crud/delete`
#### 请求参数
**单条记录删除**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| id | String | 是 | 记录 ID |
| ids | String | 否 | 记录 ID 列表(逗号分隔,最多 200 条) |
**批量记录删除**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| ids | String | 是 | 记录 ID 列表(逗号分隔,最多 200 条) |
#### 请求示例
**单条记录删除**
```
DELETE /partner/crud/delete?objectType=Account&id=001xx000003DHb2AAG
```
**批量记录删除**
```
DELETE /partner/crud/delete?objectType=Account&ids=001xx000003DHb2AAG,001xx000003DHb3AAH,001xx000003DHb4AAI
```
#### 响应参数
**单条记录删除**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 记录 ID |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
**批量记录删除**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| - | List<RecordResultVo> | 记录操作结果列表 |
#### 响应示例
**成功示例(单条记录)**
```json
{
"code": 200,
"msg": "删除成功",
"data": {
"id": "001xx000003DHb2AAG",
"success": true,
"errors": []
}
}
```
**成功示例(批量记录)**
```json
{
"code": 200,
"msg": "批量删除成功",
"data": [
{
"id": "001xx000003DHb2AAG",
"success": true,
"errors": []
},
{
"id": "001xx000003DHb3AAH",
"success": true,
"errors": []
},
{
"id": "001xx000003DHb4AAI",
"success": true,
"errors": []
}
]
}
```
**失败示例**
```json
{
"code": 500,
"msg": "删除记录失败: INVALID_ID: Invalid ID: 001xx000003DHb2AAG",
"data": null
}
```
#### 错误码
| 错误码 | 说明 |
|--------|------|
| 500 | 删除记录失败 |
| INVALID_ID | ID 无效 |
| ENTITY_IS_DELETED | 记录已删除 |
| ENTITY_IS_LOCKED_FOR_DELETION | 记录被锁定,无法删除 |
| INSUFFICIENT_ACCESS | 权限不足 |
---
### 接口 5更新或插入记录
#### 功能描述
更新或插入 Salesforce 记录,支持单条记录和批量记录 Upsert最多 200 条)。如果记录存在则更新,如果不存在则创建。
#### 请求方式
POST
#### 请求路径
`/partner/crud/upsert`
#### 请求参数
**单条记录 Upsert**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| externalIdField | String | 是 | 外部 ID 字段名称(如 "ExternalId__c" |
| fields | Map<String, Object> | 是 | 字段值(必须包含外部 ID 字段的值) |
| records | List<Map<String, Object>> | 否 | 批量 Upsert 记录列表(如果提供,则忽略 objectType、externalIdField 和 fields |
**批量记录 Upsert**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| externalIdField | String | 是 | 外部 ID 字段名称(如 "ExternalId__c" |
| records | List<Map<String, Object>> | 是 | 批量 Upsert 记录列表(最多 200 条,每条记录必须包含外部 ID 字段的值) |
#### 请求示例
**单条记录 Upsert**
```json
{
"objectType": "Account",
"externalIdField": "ExternalId__c",
"fields": {
"ExternalId__c": "EXT001",
"Name": "Test Account",
"BillingCity": "San Francisco"
}
}
```
**批量记录 Upsert**
```json
{
"objectType": "Account",
"externalIdField": "ExternalId__c",
"records": [
{
"ExternalId__c": "EXT001",
"Name": "Account 1",
"BillingCity": "San Francisco"
},
{
"ExternalId__c": "EXT002",
"Name": "Account 2",
"BillingCity": "New York"
},
{
"ExternalId__c": "EXT003",
"Name": "Account 3",
"BillingCity": "Los Angeles"
}
]
}
```
#### 响应参数
**单条记录 Upsert**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 记录 ID |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
| created | Boolean | 是否创建 |
**批量记录 Upsert**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| - | List<RecordResultVo> | 记录操作结果列表 |
#### 响应示例
**成功示例(单条记录,创建)**
```json
{
"code": 200,
"msg": "Upsert 成功",
"data": {
"id": "001xx000003DHb2AAG",
"success": true,
"errors": [],
"created": true
}
}
```
**成功示例(单条记录,更新)**
```json
{
"code": 200,
"msg": "Upsert 成功",
"data": {
"id": "001xx000003DHb2AAG",
"success": true,
"errors": [],
"created": false
}
}
```
**成功示例(批量记录)**
```json
{
"code": 200,
"msg": "批量 Upsert 成功",
"data": [
{
"id": "001xx000003DHb2AAG",
"success": true,
"errors": [],
"created": true
},
{
"id": "001xx000003DHb3AAH",
"success": true,
"errors": [],
"created": false
},
{
"id": "001xx000003DHb4AAI",
"success": true,
"errors": [],
"created": true
}
]
}
```
**失败示例**
```json
{
"code": 500,
"msg": "Upsert 记录失败: INVALID_FIELD: No such column 'ExternalId__c' on sobject of type Account",
"data": null
}
```
#### 错误码
| 错误码 | 说明 |
|--------|------|
| 500 | Upsert 记录失败 |
| INVALID_FIELD | 字段不存在或无效 |
| INVALID_ID | ID 无效 |
| ENTITY_IS_DELETED | 记录已删除 |
| INSUFFICIENT_ACCESS | 权限不足 |
| DUPLICATE_VALUE | 值重复 |
---
### 接口 6合并记录
#### 功能描述
合并三条 Salesforce 记录,将两条记录合并到主记录中。
#### 请求方式
POST
#### 请求路径
`/partner/crud/merge`
#### 请求参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| objectType | String | 是 | 对象类型(如 "Account"、"Contact" |
| masterRecordId | String | 是 | 主记录 ID |
| recordToMergeIds | List<String> | 是 | 待合并记录 ID 列表(最多 2 条) |
#### 请求示例
```json
{
"objectType": "Account",
"masterRecordId": "001xx000003DHb2AAG",
"recordToMergeIds": [
"001xx000003DHb3AAH",
"001xx000003DHb4AAI"
]
}
```
#### 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| id | String | 记录 ID |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
#### 响应示例
**成功示例**
```json
{
"code": 200,
"msg": "合并成功",
"data": {
"id": "001xx000003DHb2AAG",
"success": true,
"errors": []
}
}
```
**失败示例**
```json
{
"code": 500,
"msg": "合并记录失败: INVALID_ID: Invalid ID: 001xx000003DHb2AAG",
"data": null
}
```
#### 错误码
| 错误码 | 说明 |
|--------|------|
| 500 | 合并记录失败 |
| INVALID_ID | ID 无效 |
| ENTITY_IS_DELETED | 记录已删除 |
| INSUFFICIENT_ACCESS | 权限不足 |
| CANNOT_MERGE_RECORD | 无法合并记录(如记录类型不同) |
---
## 数据模型
### RecordResultVo
记录操作结果。
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | String | 记录 ID |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
| created | Boolean | 是否创建(仅 Upsert 操作) |
### RetrieveResultVo
查询结果。
| 字段名 | 类型 | 说明 |
|--------|------|------|
| objectType | String | 对象类型 |
| id | String | 记录 ID |
| fields | Map<String, Object> | 字段值 |
| success | Boolean | 是否成功 |
| errors | List<ErrorVo> | 错误信息列表 |
### ErrorVo
错误信息。
| 字段名 | 类型 | 说明 |
|--------|------|------|
| statusCode | String | 状态代码 |
| message | String | 错误消息 |
| fields | List<String> | 相关字段列表 |
## 错误码
### 通用错误码
| 错误码 | 说明 |
|--------|------|
| 200 | 操作成功 |
| 400 | 请求参数错误 |
| 401 | 未授权 |
| 403 | 权限不足 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
### Salesforce 错误码
| 错误码 | 说明 |
|--------|------|
| INVALID_FIELD | 字段不存在或无效 |
| INVALID_ID | ID 无效 |
| MALFORMED_QUERY | 查询语法错误 |
| INVALID_OPERATION | 操作无效 |
| DUPLICATE_VALUE | 值重复 |
| ENTITY_IS_DELETED | 记录已删除 |
| ENTITY_IS_LOCKED_FOR_DELETION | 记录被锁定,无法删除 |
| INSUFFICIENT_ACCESS | 权限不足 |
| INVALID_CROSS_REFERENCE_KEY | 跨引用键无效 |
| CANNOT_MERGE_RECORD | 无法合并记录 |
## 相关文档
- [需求文档](../requirements/sub/2026-01-28-001-02-CRUD操作.md)
- [设计文档](../design/2026-01-30-002-CRUD操作-设计.md)
- [决策记录](../decisions/2026-01-30-002-ADR-CRUD操作技术选型.md)
- [提示词](../prompts/2026-01-30-002-prompt-CRUD操作.md)
- [变更日志](../changelog/2026-01-30-002-changelog.md)
- [复盘文档](../retros/2026-01-30-002-retro.md)
- [会话记录](../sessions/2026-01-28-001-session.md)