You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据数组长度动态生成含多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:36:01