datai/datai-scenes/datai-scene-salesforce/docs/api-docs/partner-api/PartnerBatchController/004-batch-upsert.md

230 lines
5.6 KiB
Markdown
Raw Permalink Normal View History

# API 文档 - 批量 Upsert 记录
## 元数据
- 需求编号001
- 子需求编号001-01
- 接口编号004
- 创建时间2026-02-02
- 创建人AI Assistant
- 状态:已完成
## 接口概述
批量更新或插入 Salesforce 记录,支持最多 1000 条记录,每批最多 200 条,自动分批处理。
## 基本信息
- **功能描述**:批量更新或插入 Salesforce 记录
- **请求方式**POST
- **请求路径**`/partner/batch/upsert`
- **权限要求**`@PreAuthorize("@ss.hasLogin()")`
## 请求参数
### 请求体JSON
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|--------|------|------|------|--------|
| objectType | String | 是 | 对象类型 | Account |
| externalIdField | String | 是 | 外部 ID 字段 | ExternalId__c |
| records | Array[Object] | 是 | 记录列表(每条记录必须包含外部 ID 字段) | [{"ExternalId__c": "EXT001", "Name": "Test"}] |
| allOrNone | Boolean | 否 | 是否全部成功或全部失败,默认 false | false |
| sleepTime | Long | 否 | 批次间休眠时间(毫秒),默认 100 | 100 |
### 请求示例
```json
{
"objectType": "Account",
"externalIdField": "ExternalId__c",
"records": [
{
"ExternalId__c": "EXT001",
"Name": "Test Account 1",
"Industry": "Technology",
"Phone": "555-1234"
},
{
"ExternalId__c": "EXT002",
"Name": "Test Account 2",
"Industry": "Finance",
"Phone": "555-5678"
}
],
"allOrNone": false,
"sleepTime": 100
}
```
## 响应参数
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | Integer | 状态码200 成功,其他失败) |
| msg | String | 提示信息 |
| data | Object | 响应数据 |
| data.success | Boolean | 是否全部成功 |
| data.successCount | Integer | 成功数量 |
| data.failureCount | Integer | 失败数量 |
| data.createdCount | Integer | 创建数量 |
| data.updatedCount | Integer | 更新数量 |
| data.totalCount | Integer | 总数量 |
| data.results | Array | 结果列表 |
| data.results[].success | Boolean | 是否成功 |
| data.results[].id | String | 记录 ID |
| data.results[].errors | Array | 错误列表 |
| data.results[].created | Boolean | 是否创建 |
| data.results[].index | Integer | 索引 |
| data.errorMessage | String | 错误消息 |
### 成功响应示例(全部创建)
```json
{
"code": 200,
"msg": "批量 Upsert 成功",
"data": {
"success": true,
"successCount": 2,
"failureCount": 0,
"createdCount": 2,
"updatedCount": 0,
"totalCount": 2,
"results": [
{
"success": true,
"id": "001xx0000001Gw2EAA",
"errors": null,
"created": true,
"index": 0
},
{
"success": true,
"id": "001xx0000001Gw3EAA",
"errors": null,
"created": true,
"index": 1
}
],
"errorMessage": null
}
}
```
### 成功响应示例(部分更新)
```json
{
"code": 200,
"msg": "批量 Upsert 成功",
"data": {
"success": true,
"successCount": 2,
"failureCount": 0,
"createdCount": 1,
"updatedCount": 1,
"totalCount": 2,
"results": [
{
"success": true,
"id": "001xx0000001Gw2EAA",
"errors": null,
"created": true,
"index": 0
},
{
"success": true,
"id": "001xx0000001Gw4EAA",
"errors": null,
"created": false,
"index": 1
}
],
"errorMessage": null
}
}
```
### 部分失败响应示例
```json
{
"code": 200,
"msg": "批量 Upsert 部分失败",
"data": {
"success": false,
"successCount": 1,
"failureCount": 1,
"createdCount": 1,
"updatedCount": 0,
"totalCount": 2,
"results": [
{
"success": true,
"id": "001xx0000001Gw2EAA",
"errors": null,
"created": true,
"index": 0
},
{
"success": false,
"id": null,
"errors": [
{
"statusCode": "REQUIRED_FIELD_MISSING",
"message": "Required fields are missing: [Name]",
"fields": ["Name"]
}
],
"created": null,
"index": 1
}
],
"errorMessage": null
}
}
```
### 失败响应示例
```json
{
"code": 500,
"msg": "批量 Upsert 记录失败",
"data": {
"success": false,
"successCount": 0,
"failureCount": 0,
"createdCount": 0,
"updatedCount": 0,
"totalCount": 0,
"results": null,
"errorMessage": "Invalid external ID field: InvalidField__c"
}
}
```
## 错误码
| 错误码 | 说明 | 处理建议 |
|--------|------|----------|
| 200 | 操作成功 | - |
| 400 | 请求参数错误 | 检查请求参数格式和必填项 |
| 401 | 未登录或登录已过期 | 请重新登录 |
| 500 | 服务器内部错误 | 请联系管理员或稍后重试 |
## 注意事项
1. 单次最多 Upsert 1000 条记录
2. 每批最多 200 条记录,超过会自动分批
3. 每条记录必须包含外部 ID 字段
4. 外部 ID 字段必须在 Salesforce 对象中定义为 External ID
5. 如果外部 ID 已存在,则更新记录;否则创建新记录
6. allOrNone 为 true 时,任何一条记录失败都会导致整个操作失败
7. sleepTime 用于控制批次间的间隔,避免 API 限流
8. created 字段指示记录是创建还是更新
## 相关文档
- [需求文档](../../requirements/2026-01-28-001-PartnerAPI源org实现.md)
- [设计文档](../../design/2026-01-29-001-01-认证和会话管理-设计.md)
- [决策记录](../../decisions/2026-01-29-001-01-ADR-认证和会话管理技术选型.md)