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

能否通过Apex Toolkit实现同一recipientId绑定多签名标签合并签署?

能否通过Apex Toolkit实现同一签署人绑定多份文档签名标签的需求?

绝对可以通过Apex Toolkit实现你的核心需求——让同一签署人(比如Bob)作为单个收件人绑定多份文档的签名标签,仅收到一封邮件完成所有签署操作。以下是具体的实现思路和关键步骤:

核心实现逻辑

Apex Toolkit的设计本身就支持单个Recipient关联多份文档的签名标签,你只需要确保同一签署人仅被创建一次Recipient实例,然后在所有需要该签署人签字的文档标签中复用这个实例的ID即可。

关键步骤拆解

  • 统一创建唯一Recipient

    1. 遍历选中的所有Opportunity Documents,通过签署人的邮箱或Salesforce User ID做去重,提取出唯一的签署人列表
    2. 为每个唯一签署人创建一个dfsle.Recipient对象,配置姓名、邮箱、角色等必要信息,每个签署人只创建一次
    3. 把签署人和对应的Recipient实例存入Map,方便后续快速查找
  • 生成文档并绑定签名标签

    1. 针对每份选中的商机文档,调用对应的Gen模板生成PDF文档,转换为dfsle.Document对象
    2. 根据文档的Signer字段,从之前的Map中取出对应的Recipient实例
    3. 创建签名标签(如dfsle.SignHere)时,将标签的recipientId设置为该Recipient的ID,同时指定标签在文档中的位置(页码、坐标)
    4. 把带签名标签的文档添加到同一个Envelope中
  • 创建Envelope并跳转至审核视图

    1. 将所有唯一的Recipient实例添加到Envelope中
    2. 使用dfsle.EnvelopeService.sendEnvelope()方法,通过dfsle.SendOptions启用预览模式,直接跳转到发送方审核视图,让用户可以在发送前确认所有内容

关键代码示例

// 1. 提取唯一签署人并创建Recipient映射
Map<String, dfsle.Recipient> signerRecipientMap = new Map<String, dfsle.Recipient>();
List<Opportunity_Document__c> selectedDocs = [SELECT Id, Name, Signer__r.Id, Signer__r.Name, Signer__r.Email, Template__c, Opportunity__c FROM Opportunity_Document__c WHERE Id IN :selectedDocIds];

for(Opportunity_Document__c doc : selectedDocs) {
    User signer = doc.Signer__r;
    String uniqueKey = signer.Email; // 用邮箱作为唯一标识去重,也可用User Id
    if(!signerRecipientMap.containsKey(uniqueKey)) {
        dfsle.Recipient recipient = new dfsle.Recipient();
        recipient.fullName = signer.Name;
        recipient.email = signer.Email;
        recipient.roleName = 'Signer';
        recipient.routingOrder = 1; // 可根据需求设置签署顺序
        signerRecipientMap.put(uniqueKey, recipient);
    }
}

// 2. 初始化Envelope
dfsle.Envelope envelope = new dfsle.Envelope();
envelope.emailSubject = '请签署商机相关文档';
envelope.emailBlurb = '请查看并签署以下商机关联文档';

// 3. 处理每份文档,绑定对应签署人的签名标签
for(Opportunity_Document__c doc : selectedDocs) {
    // 调用Gen模板生成文档内容(此处省略具体Gen调用逻辑,返回Blob格式的PDF)
    Blob docBlob = generateDocumentFromGenTemplate(doc.Template__c, doc.Opportunity__c);
    
    // 创建DocuSign Document对象
    dfsle.Document dsDocument = dfsle.Document.fromBlob(
        docBlob, 
        doc.Name + '.pdf', 
        dfsle.Document.DocumentType.PDF
    );
    
    // 获取当前文档对应的Recipient
    User signer = doc.Signer__r;
    dfsle.Recipient targetRecipient = signerRecipientMap.get(signer.Email);
    
    // 创建签名标签并绑定Recipient ID
    dfsle.SignHere signHereTab = new dfsle.SignHere();
    signHereTab.recipientId = targetRecipient.id;
    signHereTab.documentId = dsDocument.id;
    signHereTab.pageNumber = 1; // 设置签名所在页码
    signHereTab.xPosition = 150; // 签名标签X坐标
    signHereTab.yPosition = 400; // 签名标签Y坐标
    
    // 将标签添加到文档
    dsDocument.addTabs(signHereTab);
    
    // 将文档加入Envelope
    envelope.addDocument(dsDocument);
}

// 4. 将所有唯一Recipient加入Envelope
for(dfsle.Recipient rec : signerRecipientMap.values()) {
    envelope.addRecipient(rec);
}

// 5. 配置发送选项,跳转至发送方审核视图
dfsle.SendOptions sendOpts = new dfsle.SendOptions();
sendOpts.preview = true; // 启用预览,进入审核视图
sendOpts.returnUrl = '/lightning/r/Opportunity/' + selectedDocs[0].Opportunity__c + '/view'; // 审核完成后返回商机页面

// 发起Envelope创建并跳转
dfsle.EnvelopeService.sendEnvelope(envelope, sendOpts);

注意事项

  • 去重逻辑可根据业务调整:如果存在同一邮箱对应多个Salesforce用户的情况,建议用User ID作为唯一标识
  • Gen模板生成的文档需为PDF格式,确保DocuSign可以正常添加签名标签
  • 可通过routingOrder字段设置签署顺序,若需要多人按顺序签署,给不同Recipient设置不同的顺序值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:04:54