如何根据数组长度动态生成含多个OrderItem的JSON请求体
动态生成Salesforce复合请求OrderItem解决方案
功能说明
完全支持你需要的两种使用场景:
- 动态生成指定数量的OrderItem对象,追加到已有复合请求条目之后
- 从零生成包含前置Account/Contact/Order节点 + 全量OrderItem的完整请求体
核心实现代码
1. 单条OrderItem生成函数
/** * 生成单个OrderItem请求节点 * @param {number} index OrderItem序号(用于生成唯一referenceId) * @param {object} itemData 单条商品的所有填充数据,需包含以下字段: * productId, quantity, entryResult, prodResult, date * @returns {object} 符合要求的OrderItem请求节点 */ function generateOrderItem(index, itemData) { const { productId, quantity, entryResult, prodResult, date } = itemData; return { // OrderItem "method": "POST", "url": "/services/data/v52.0/sobjects/OrderItem", "referenceId": `refOrderItem${index}`, "body": { "Product2Id": productId, "OrderId": "@{refOrder.id}", "Quantity": quantity, "PricebookEntryId": entryResult.records[0].Id, "UnitPrice": entryResult.records[0].UnitPrice, "blng__BillableUnitPrice__c": entryResult.records[0].UnitPrice, "SBQQ__ChargeType__c": prodResult.records[0].SBQQ__ChargeType__c, "blng__TaxRule__c": prodResult.records[0].blng__TaxRule__c, "blng__BillingRule__c": prodResult.records[0].blng__BillingRule__c, "blng__RevenueRecognitionRule__c": prodResult.records[0].blng__RevenueRecognitionRule__c, "ServiceDate": date, "blng__LastChargeToDate__c": date } } }
2. 场景1:向已有请求体追加OrderItem
假设你已经有初始化的请求体baseRequest,持有所有OrderItem的数据源数组orderItemDataList,直接批量生成后追加即可:
// 你的原始基础请求体(已包含Account、Contact、Order节点) const baseRequest = { "compositeRequest": [ { // Account "method": "POST", "url": "/services/data/v52.0/sobjects/Account", "referenceId": "refAccount", "body": { "Name": req.body.accName } }, { // Contact "method": "POST", "url": "/services/data/v52.0/sobjects/Contact", "referenceId": "refContact", "body": { "LastName": req.body.conLastName, "AccountId": "@{refAccount.id}" } }, { // Order "method": "POST", "url": "/services/data/v52.0/sobjects/Order", "referenceId": "refOrder", "body": { "AccountId": "@{refAccount.id}", "Pricebook2Id": PBResult.records[0].Id, "EffectiveDate": date, "Status": "Draft" } } ] }; // 你的OrderItem数据源数组,长度为你需要生成的OrderItem数量 const orderItemDataList = [ // 每个元素对应一条OrderItem的所有填充数据,示例结构如下 { productId: 'xxx', quantity: 2, entryResult: {...}, prodResult: {...}, date: '2024-01-01' }, { productId: 'yyy', quantity: 5, entryResult: {...}, prodResult: {...}, date: '2024-01-01' } ]; // 批量生成OrderItem并追加到请求数组末尾 orderItemDataList.forEach((item, index) => { const orderItem = generateOrderItem(index + 1, item); baseRequest.compositeRequest.push(orderItem); }); // 处理后的baseRequest即为完整可用的请求体
3. 场景2:从零生成完整请求体
如果需要完全动态生成所有节点,直接按逻辑拼接即可:
function generateFullRequest(baseParams, orderItemDataList) { const { req, PBResult, date } = baseParams; // 先初始化前置公共节点 const request = { compositeRequest: [ { "method": "POST", "url": "/services/data/v52.0/sobjects/Account", "referenceId": "refAccount", "body": { "Name": req.body.accName } }, { "method": "POST", "url": "/services/data/v52.0/sobjects/Contact", "referenceId": "refContact", "body": { "LastName": req.body.conLastName, "AccountId": "@{refAccount.id}" } }, { "method": "POST", "url": "/services/data/v52.0/sobjects/Order", "referenceId": "refOrder", "body": { "AccountId": "@{refAccount.id}", "Pricebook2Id": PBResult.records[0].Id, "EffectiveDate": date, "Status": "Draft" } } ] }; // 追加所有动态生成的OrderItem orderItemDataList.forEach((item, index) => { request.compositeRequest.push(generateOrderItem(index + 1, item)); }); return request; } // 调用示例 const fullRequest = generateFullRequest( { req, PBResult, date: '2024-01-01' }, orderItemDataList );
注意事项
- Salesforce复合请求要求所有子节点的
referenceId全局唯一,上述代码通过索引后缀保证不会重复 - 单条复合请求最多支持25个子节点,超出限制需要拆分请求
- 请确保传入的
orderItemDataList每条数据包含所有需要的字段,避免请求体缺失参数报错
内容的提问来源于stack exchange,提问作者MBsola
相关产品推荐
相关产品推荐

