当前位置: 首页 > 知识库问答 >
问题:

Salesforce APEX方法未膨胀

龚沛
2023-03-14

我编写了一个APEX类,它在客户机发布时发送电子邮件。有一种方法,我认为我已经膨胀了,但我被告知它没有。这是因为此方法调用了另一个函数,该函数实际上执行实际的电子邮件创建,并且没有进行扩展。有人能告诉我如何从方法中提取SOQL查询吗?

global class LM_ChangeAccountRT {

    private static final Profile sysAdmin = [select id from profile where name='System Administrator'];

@AuraEnabled
    public static String resendEmails(List<String> accountIdList) {
        String response = null;
        try {
            //Only send emails if user is either an ARMS Administor or System Administrator
            if (System.label.ARMS_Administrator_Profile_Id == userinfo.getProfileId() || 
                sysAdmin.Id == userinfo.getProfileId()) {
                List<Account> accList = [SELECT Id,Client_Released__c, RecordTypeId,Client_Number__c, Client_Released__c, Email_Sent__c FROM Account WHERE Id IN:accountIdList];

                for(Account acc: accList){
                    if (acc.Client_Number__c != null && acc.Client_Released__c && acc.Email_Sent__c == true) {
                        sendpdfgenerationEmails(acc); //this is the method thats not bulkified.
                        acc.Email_Sent__c = false; 

                        response = 'Email Sent';
                    }else {
                        response= 'Access Denied';
                    }
                }

                    update accList;
            }  
        }catch(Exception e) {
            System.debug(e.getMessage());
            response = 'Error sending emails';
        }
        return response;
    }

 public static void sendpdfgenerationEmails(Account acc){
        system.debug('start of confirmation card and pdf generation');
        //Logic to find which VF template is used to send an email.
        list<EmailTemplate> templateId = new list<EmailTemplate>();  
        string temppartner;
        String partner_opt_in_attachment;
        boolean sendFCAmail;

        List<Dealership_PDF_Generation__c> custsettingdata = Dealership_PDF_Generation__c.getall().values();
        System.debug('custom setting size = ' + custsettingdata.size());
        // Fetch State
        if(acc.Dealership_State__c!=null && acc.Dealership_Partner__c!=null)
        {
            for(Dealership_PDF_Generation__c tempcustsetting :custsettingdata)

            {   
                if(acc.Dealership_Partner__c == tempcustsetting.Dealership_Partner__c && acc.Dealership_State__c==tempcustsetting.State__c  && tempcustsetting.State__c=='WA' && acc.Dealership_State__c=='WA'){

                    //For WA State
                    // temppartner= '%' + tempcustsetting.TEMPLATE_Unique_name__c + '%';
                    temppartner= tempcustsetting.TEMPLATE_Unique_name__c;
                    if(acc.Dealership_Spiff_Payment__c == '% premium'){
                        partner_opt_in_attachment=tempcustsetting.opt_in_form_premium__c;
                    }else{
                        partner_opt_in_attachment=tempcustsetting.opt_in_form_nonpremium__c;
                    }
                } 
                else if(acc.Dealership_Partner__c == tempcustsetting.Dealership_Partner__c && acc.Dealership_State__c==tempcustsetting.State__c  && tempcustsetting.State__c=='TX' && acc.Dealership_State__c=='TX'){
                    //For TX State 
                    //temppartner= '%' + tempcustsetting.TEMPLATE_Unique_name__c + '%'; 
                    temppartner= tempcustsetting.TEMPLATE_Unique_name__c;
                    if(acc.Dealership_Spiff_Payment__c == '% premium'){
                        partner_opt_in_attachment=tempcustsetting.opt_in_form_premium__c;
                    }else{
                        partner_opt_in_attachment=tempcustsetting.opt_in_form_nonpremium__c;
                    }
                }
                else if(acc.Dealership_Partner__c == tempcustsetting.Dealership_Partner__c && acc.Dealership_State__c!=tempcustsetting.State__c && tempcustsetting.State__c!='TX' && acc.Dealership_State__c!='TX' && acc.Dealership_State__c!='WA' &&tempcustsetting.State__c!='WA' ){
                    //For Non TX State
                    //temppartner= '%' + tempcustsetting.TEMPLATE_Unique_name__c + '%';
                    temppartner= tempcustsetting.TEMPLATE_Unique_name__c;
                    if(acc.Dealership_Spiff_Payment__c == '% premium'){
                        partner_opt_in_attachment=tempcustsetting.opt_in_form_premium__c;
                    }else{
                        partner_opt_in_attachment=tempcustsetting.opt_in_form_nonpremium__c;
                    }
                    system.debug('grabbed template: ' + temppartner);
                }
if(acc.Dealership_Partner__c != null && temppartner!=null ){
            templateId.add([Select id,DeveloperName from EmailTemplate where DeveloperName = :temppartner]); //This will probably cause governor limit issues. First problem

        } 

    if (partner_opt_in_attachment != null) {
                StaticResource sr = [Select  s.Name, s.Id, s.Body From StaticResource s where s.Name =: partner_opt_in_attachment]; //'static_resource' is the name of the static resource PDF. This is another SOQL query that will cause problems

                Blob tempBlob = sr.Body;

                Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment();
                efa.setBody(tempBlob);
                efa.setFileName('Opt-in.pdf');

                List<Messaging.EmailFileAttachment> attachments = new List<Messaging.EmailFileAttachment>();
                attachments.add(efa);
                // add attachment to each email
                for (Messaging.SingleEmailMessage email : emails) {
                    email.setFileAttachments(attachments);
                }

            }
            system.debug('email sent: ' + emails.size());
            Messaging.sendEmail(emails); 

        }
    } 
}

我之所以尝试将其庞大化,是因为我编写了一个APEX调度器,每天早上7点调用resendemails方法,检查哪些记录需要发送电子邮件。我担心,如果有100多个客户,那么这将导致问题,无法发送电子邮件。关于如何优化sendpdfemailgeenration()方法,有什么建议吗?非常感谢。

共有1个答案

东方震博
2023-03-14

是的,你是对的-您的resendEmails()方法没有膨胀。

首先,让我解释一下原因:

  • SOQL获取帐户
  • 账户记录列表上的循环1
    • 调用sendpdfgenerationEmails()方法
    • 检索经销商\u PDF\u Generation\u c记录列表
    • 经销商PDF\U Generation\U c记录列表中的循环2
      • SOQL获取StaticResources-非常糟糕!它在双环里面
      • 呼叫信息。sendEmail()方法-非常糟糕!它在双环里面

      您需要记住:

      1.您永远不应该循环执行SOQL!-每笔交易限制100个SOQL

      2.永远不要打电话给信息。sendmail()在循环中每笔交易限制10次呼叫

      现在,让我来指导您如何重构此方法:

      @AuraEnabled
      public static String resendEmails(List<String> accountIdList) {
          // 1. SOQL for List of Account records
          // 2. Retrieve list of Dealership_PDF_Generation__c records
          // 3. SOQL for List of StaticResources for all Names from Dealership_PDF_Generation__c records
          // 4. Declaration of new List variable for Messaging.SingleEmailMessage objects
          // 5. Loop 1 on List of Account records
          //      6. Call new "prepareEmailsForAccount()" method, which prepares and returns list of Messaging.SingleEmailMessage objects
          //      7. Add returned Messaging.SingleEmailMessage objects to list from point 4
          //      8. End of loop 1
          // 9. Call "Messaging.sendEmail()" method with list from point 4
          // 10. Update on List of Account records
      }
      

      这样可以避免SOQL和调用消息传递。循环中的sendmail()方法。

 类似资料:
  • 对于上面的modbus轮询查询,我没有得到哪个是crc值,以及使用了什么类型的crc。它是怎么来的,77是设备的id。请指引我。 我从轮询设备得到以下响应

  • 我试图将我的GLSurfaceView设置在xml布局以及其他UI元素上,并不断获得错误inflating类com.vi.cubo01。MyGLSurfaceView在LogCat. 以下是java代码: 以及xml:

  • 我在自定义控件中膨胀MvxImageView时遇到问题。 从我所做的研究中,我发现了几个嫌疑人 > < li >我是否应该将“如果”添加到“什么”中?(我看到这是关于android地图视图膨胀错误。 < li> 我创建的用户控件是不是都错了?我看到了一个使用SetContentView()而不是inflate的建议,因为它通过mvvmcross机制传递indlate请求,但在自定义视图中没有这样的

  • 问题内容: 您好,我是android dev和admob的新手。我正在尝试制作一个带有按钮,几个页面和底部的admob的简单测试应用程序。一切正常,直到我尝试实施admob。这是我的代码: HelloAndroid.java: main.xml: 您好android清单: logcat输出: 我正在使用GoogleAdMobAdsSdkAndroid-6.0.0。再次,我对此非常陌生,我尝试在多个

  • 问题内容: 错误日志: 10-26 12:22:33.144 26926-26926 /?E / AndroidRuntime:致命例外:主进程:ksmk.sahip.com.ecom,PID:26926 java.lang.RuntimeException:无法启动活动ComponentInfo {ksmk.sahip.com.ecom / ksmk.sahip.com.ecom.MainAct

  • 我在三星SM G920F(Galaxy S6)5.1.1版中发现了Crashlytics的崩溃报告(在所有其他设备上,我没有检索到相同的错误)。 这是我的网络视图的布局(样式为空样式): 以下是我如何将其包括在活动布局中: 报告的错误是XML错误,所以我提供了所有代码(简化)。这是一个单一的报告,所以它只在这个设备上发生过一次,有人能解释一下为什么吗? 编辑(完成堆栈跟踪)