Метод Salesforce APEX не распространен - PullRequest
0 голосов
/ 15 ноября 2018

Я написал класс 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, который ежедневно вызывает метод resendemailsв 7 утра, чтобы проверить, какие записи должны быть отправлены по электронной почте.Я боюсь, что если будет более 100 клиентов, это вызовет проблемы и не отправит письма.Любые предложения о том, как я могу оптимизировать метод sendpdfemailgeenration ()?Спасибо

1 Ответ

0 голосов
/ 18 ноября 2018

Да, вы правы - ваш resendEmails() метод не обобщен.


Во-первых, позвольте мне объяснить, почему это так:

  • SOQL для получения учетных записей
  • Loop 1 в списке записей учетной записи
    • вызов sendpdfgenerationEmails() метод
    • получение списка записей Dealership_PDF_Generation__c
    • Loop 2 в списке записей Dealership_PDF_Generation__c
      • SOQL для получения StaticResources - Очень плохо!Это внутри двойной петли!
      • Вызов Messaging.sendEmail() метод - Очень плохо!Это внутри двойной петли!
  • Обновление списка учетных записей

Вы должны помнить, что:

1.Вы никогда не должны делать SOQL в циклах! - Ограничение 100 SOQL на транзакцию

2.Вы никогда не должны звонить Messaging.sendEmail() в циклах! - Ограничение 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 и вызова метода Messaging.sendEmail() в циклах.

...