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

如何用Apex更新Salesforce修订报价中的报价行数量?

在Salesforce中更新修订报价的报价行数量

在Salesforce中,我希望能够更新修订报价中的报价行数量。当前已通过Contract Amender API编写Apex代码生成修订机会与报价,成功获取到修订报价的quoteId,但不清楚后续如何利用该ID更新报价行的数量字段,特此咨询是否可行及实现方式。附现有代码:

public with sharing class AmendedContract{
    
    public QuoteModel load(String contractId, String context) {
        String quoteJSON = SBQQ.ServiceRouter.load('SBQQ.ContractManipulationAPI.ContractAmender', contractId, context);
        return (QuoteModel) JSON.deserialize(quoteJSON, QuoteModel.class);
    }
}

public with sharing class AmendContext {
    public Boolean returnOnlyQuoteId;
}

public String createAmendment(String cID)
{
    system.debug('-----AMENDMENT CREATION STARTED-----');
    AmendContext con1 = new AmendContext();
    con1.returnOnlyQuoteId = false;
    
    String contextJson = JSON.serialize(con1);
    AmendedContract amender = new AmendedContract();
    QuoteModel quote = amender.load(cID, contextJson);
    SBQQ__Quote__c quoteRec = quote.record;
    String quoteId = (String) quoteRec.Id;
    system.debug('Amended quote ID:     ' + quoteId);
    return quoteId;
}

可行性说明

完全可行。拿到修订报价的Quote ID后,可通过SOQL查询关联的报价行记录(SBQQ__QuoteLine__c),直接更新数量字段再通过DML操作保存。

实现步骤及代码示例

1. 确认报价行数量字段API名

默认Salesforce CPQ的报价行数量字段API名为SBQQ__Quantity__c,若你的Org使用自定义字段,请替换为实际字段名。

2. 添加更新逻辑

方式一:在createAmendment中直接更新

在生成修订报价后,批量更新该报价下所有报价行的数量:

public String createAmendment(String cID)
{
    system.debug('-----AMENDMENT CREATION STARTED-----');
    AmendContext con1 = new AmendContext();
    con1.returnOnlyQuoteId = false;
    
    String contextJson = JSON.serialize(con1);
    AmendedContract amender = new AmendedContract();
    QuoteModel quote = amender.load(cID, contextJson);
    SBQQ__Quote__c quoteRec = quote.record;
    String quoteId = (String) quoteRec.Id;
    system.debug('Amended quote ID:     ' + quoteId);

    // --- 新增更新报价行数量的逻辑 ---
    // 查询该报价下所有报价行
    List<SBQQ__QuoteLine__c> quoteLines = [
        SELECT Id, SBQQ__Quantity__c 
        FROM SBQQ__QuoteLine__c 
        WHERE SBQQ__Quote__c = :quoteId
    ];

    // 更新数量(示例:将所有报价行数量改为5,可根据业务逻辑调整)
    Integer targetQuantity = 5;
    for(SBQQ__QuoteLine__c line : quoteLines){
        line.SBQQ__Quantity__c = targetQuantity;
    }

    // 批量保存更新
    if(!quoteLines.isEmpty()){
        update quoteLines;
        system.debug('更新了 ' + quoteLines.size() + ' 条报价行');
    }
    // --- 新增逻辑结束 ---

    return quoteId;
}

方式二:封装独立更新方法

如果需要灵活调用(比如后续单独更新),可封装独立方法:

// 新增方法:根据Quote ID更新报价行数量,支持指定特定行
public void updateQuoteLineQuantity(String quoteId, Integer targetQuantity, List<Id> specificQuoteLineIds = null){
    // 构建查询条件:传入特定行ID则只更新这些行,否则更新所有行
    String soql = 'SELECT Id, SBQQ__Quantity__c FROM SBQQ__QuoteLine__c WHERE SBQQ__Quote__c = :quoteId';
    if(specificQuoteLineIds != null && !specificQuoteLineIds.isEmpty()){
        soql += ' AND Id IN :specificQuoteLineIds';
    }

    List<SBQQ__QuoteLine__c> quoteLines = Database.query(soql);
    for(SBQQ__QuoteLine__c line : quoteLines){
        line.SBQQ__Quantity__c = targetQuantity;
    }

    if(!quoteLines.isEmpty()){
        update quoteLines;
    }
}

// 在createAmendment中调用
public String createAmendment(String cID)
{
    // 原有逻辑不变...
    String quoteId = (String) quoteRec.Id;
    system.debug('Amended quote ID:     ' + quoteId);

    // 调用更新方法:更新该报价下所有行数量为5
    updateQuoteLineQuantity(quoteId, 5);

    return quoteId;
}

3. (可选)触发CPQ重新计算

更新数量后若需自动重新计算总价、折扣等字段,可调用CPQ计算API:

// 在更新报价行后执行
SBQQ.ServiceRouter.call('SBQQ.QuoteCalculatorAPI.Calculate', quoteId);

注意事项

  • 权限控制:类使用with sharing,需确保执行用户对目标报价和报价行有读写权限。
  • 批量操作:使用批量DML避免触发 governor limits。
  • 异常处理:可添加try-catch块捕获DML异常,增强代码稳定性。

内容的提问来源于stack exchange,提问作者A Person

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:20:58