【发布时间】:2021-05-20 07:45:06
【问题描述】:
希望每个人都安全。 我正在尝试使用顶点代码生成一个 csv 文件。从 salesforce 我只想从具有已付款状态的付款对象中取出所有付款,然后检查 Number 字段的值(来自 salesforce 中的付款对象)是否存在于我的付款 api 响应中。我只想为该记录生成 csv 文件并将其通过电子邮件发送给自己。 现在在 salesforce 沙盒中,当我测试 csv 时,我得到了很好的结果,所有支付状态的付款记录都显示在 csv 文件中,但是
当我开始生产时,我的 csv 文件中只有 1 条记录。别 知道为什么在沙盒中它运行良好,但在生产中却不是。
public with sharing class EmailCsv {
public static String APIAccessID;
public static String APISecureKey;
public static String orgId;
Public static String locId;
public static String apiBaseUrl;
public static String finalstr;
@InvocableMethod(label=‘Invoke From Flow' description=‘Invokable Method')
public static void invokeFromFlow() {
makeCallout();
}
@future(callout=true)
public static void makeCallout() {
List<String> paymentNo = new List<String>();
List<Payments__c> paymentQuery= [SELECT Number__c, Status__c FROM Payments__c where Status__c = ‘Paid’];
for(Payments__c pNo : paymentQuery){
paymentNo.add(pNo.Number__c);
}
string header = 'Order Number,Status,Amount,Received Date,Received Time \n';
finalstr = header;
if(Test.isRunningTest()) {
APIAccessID = '';
APISecureKey = '';
orgId = '';
apiBaseUrl = '';
locId = '';
} else {
APIAccessID = Email_Csv__c.getInstance('APIAccessID').value__c;
APISecureKey = Email_Csv__c.getInstance('APISecureKey').value__c;
orgId = Email_Csv__c.getInstance('orgId').value__c;
apiBaseUrl = Email_Csv__c.getInstance('apiBaseUrl').value__c;
locId = Email_Csv__c.getInstance('locId').value__c;
}
String authHeader = 'Basic ' + EncodingUtil.base64Encode(Blob.valueOf(APIAccessID + ':' + APISecureKey));
String endpoint = apiBaseUrl + '/organizations/' + orgId + '/locations/' + locId + '/transactions/';
System.debug('Endpoint is ==> ' +endpoint);
HTTP http = new HTTP();
HTTPRequest request = new HTTPRequest();
request.setEndpoint(endpoint);
request.setMethod('GET');
request.setHeader('Accept', 'application/json');
request.setHeader('Authorization', authHeader);
request.setHeader('X-Forte-Auth-Organization-Id', orgId);
request.setTimeout(5000);
HttpResponse response = http.send(request);
if(response.getStatusCode() == 200) {
EmailCsvWrapper resWrapper = EmailCsvWrapper.parse(response.getBody());
for(Integer i=0; i<resWrapper.results.size(); i++) {
EmailCsvWrapper.Results res = resWrapper.results.get(i);
String s = res.received_date;
Double authAmount = res.authorization_amount;
String authAmountConverted = String.valueOf(authAmount);
String oNumber = res.order_number;
if(oNumber != null){
String[] splittedoNumber = oNumber.split(',');
oNumber = oNumber.contains(',') ? splittedoNumber[0] : oNumber;
}
for(String s : paymentNo){
if(s == oNumber){
String cfn = +oNumber + ',' +res.status + ',' +authAmountConverted + ',' +s + '\n';
finalstr = finalstr +cfn;
System.debug('CSV => ' +cfn);
}
}
}
List<Messaging.SingleEmailMessage> emails = new List<Messaging.SingleEmailMessage>();
Messaging.SingleEmailMessage semail = new Messaging.SingleEmailMessage();
Messaging.EmailFileAttachment attach = new Messaging.EmailFileAttachment();
blob csvBlob = blob.valueOf(finalstr);
attach.setFileName(‘Payments.csv');
attach.setBody(csvBlob);
List<String> emailAddresses = new List<String>();
emailAddresses.addAll((Email_Csv__c.getInstance('EmailAddresses').value__c).split(';'));
semail.setSubject('Csv File’);
semail.setToAddresses(emailAddresses);
semail.setPlainTextBody(‘Transactions csv file’);
semail.setFileAttachments(new Messaging.EmailFileAttachment[]{attach});
emails.add(semail);
Messaging.sendEmail(emails);
}
}
}
【问题讨论】:
-
SELECT Number__c, Status__c FROM Payments__c where Status__c = 'Paid'- 好吧,这会在生产中返回超过 1 行吗?以系统管理员或最终用户身份运行,也许您有一些共享规则问题。如果您向 API 发送了 1 条以上的记录,但只收到 1 条结果 - 您必须联系支持此 API 的人员,这不完全是 Salesforce 问题... -
是的,它在生产中显示了 17 行
-
我没有向 API 发送记录。我只是比较 salesforce 对象(支付对象)中的记录,然后比较 API Get 调用中是否存在特定记录(基于 API 响应和 Salesforce 字段中常见的 Number)。如果存在特定记录,我想在 csv 文件中显示(简而言之,将 Salesforce 字段数据与 API 响应数据进行比较)
-
API 是否返回超过 1 行。也许您的拆分逻辑在生产中必须不同,订单号由相同的标识符分隔?您确定您在 SF 中有超过 1 条记录应该匹配吗?老实说,我会这样做,首先调用 API,将收到的订单号收集到
Set<String>,然后只查询WHERE Status__c = 'Paid' AND Number__c IN :paymentNumbers。使用调试日志并检查返回的 API,比较数字。没有样本(甚至是混淆)数据很难为您提供帮助 -
Api 总共返回 600 行,但与 salesforce 付款对象比较时,它应该显示 17 条状态为已付款的此类记录。我已经在 API 中测试了 10 行,并且它可以工作,但对于更多行它不起作用。请求.setTimeout(5000)。我认为是因为这个 setTimeout 为 5sec
标签: csv salesforce apex apex-code