能否通过Apex Toolkit实现同一recipientId绑定多签名标签合并签署?
能否通过Apex Toolkit实现同一签署人绑定多份文档签名标签的需求?
绝对可以通过Apex Toolkit实现你的核心需求——让同一签署人(比如Bob)作为单个收件人绑定多份文档的签名标签,仅收到一封邮件完成所有签署操作。以下是具体的实现思路和关键步骤:
核心实现逻辑
Apex Toolkit的设计本身就支持单个Recipient关联多份文档的签名标签,你只需要确保同一签署人仅被创建一次Recipient实例,然后在所有需要该签署人签字的文档标签中复用这个实例的ID即可。
关键步骤拆解
统一创建唯一Recipient
- 遍历选中的所有Opportunity Documents,通过签署人的邮箱或Salesforce User ID做去重,提取出唯一的签署人列表
- 为每个唯一签署人创建一个
dfsle.Recipient对象,配置姓名、邮箱、角色等必要信息,每个签署人只创建一次 - 把签署人和对应的Recipient实例存入Map,方便后续快速查找
生成文档并绑定签名标签
- 针对每份选中的商机文档,调用对应的Gen模板生成PDF文档,转换为
dfsle.Document对象 - 根据文档的Signer字段,从之前的Map中取出对应的Recipient实例
- 创建签名标签(如
dfsle.SignHere)时,将标签的recipientId设置为该Recipient的ID,同时指定标签在文档中的位置(页码、坐标) - 把带签名标签的文档添加到同一个Envelope中
- 针对每份选中的商机文档,调用对应的Gen模板生成PDF文档,转换为
创建Envelope并跳转至审核视图
- 将所有唯一的Recipient实例添加到Envelope中
- 使用
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
相关产品推荐
相关产品推荐

