Отправка уведомлений о задержке по нескольким каналам с помощью класса Apex в системе Salesforce

#salesforce #integration #slack #slack-api #apex

#Система Salesforce #интеграция #slack #slack-api #apex

Вопрос:

У меня есть класс apex, позволяющий отправлять уведомления о задержке на канал. Но я хотел бы иметь возможность отправлять уведомления о замедлении на несколько каналов slack.

У кого-нибудь есть ответ или он может указать мне документацию для достижения этой цели? Спасибо

здесь приведен код, позволяющий отправлять уведомления о задержке на один канал.

 public without sharing class SlackNotificationSupport{
   
public class slackRequest { 
    @InvocableVariable(label='caseNumber')
    public String caseNumber;
    @InvocableVariable(label='status')
    public String status;
    @InvocableVariable(label='nickName')
    public String nickname;
    @InvocableVariable(label='queue')
    public String queue;
    @InvocableVariable(label='accountTier')
    public String accountTier;
    @InvocableVariable(label='accountName')
    public String accountName;
    @InvocableVariable(label='subject')
    public String subject;
    @InvocableVariable(label='businessUnit')
    public String businessUnit;
} 


public static String setChannelName(String queue) {

    String channelName;

    channelName = '#' queue;
    channelName = channelName.toLowerCase('en');
    channelName = channelName.replaceAll('queue', 'bot');
    channelName = channelName.replaceAll('[_]', '-');
    return channelName;
}

@InvocableMethod(label='Publish to Slack')
public static void publishToSlack(List<slackRequest> requests) {

    String webhookURL = system.label.Param_Slack_Token;
    String msg;
    String channelName;

    for(slackRequest r:requests){

        if (r.queue == 'internal'){
            System.debug('### SlackNotificationSupport new internal case');
            channelName = '#' Label.Slack_Internal_Case_Channel;
            msg = 'A new internal case has been created : *' r.caseNumber '* - By User : (*' r.accountName '*) - Subject : (*' r.subject '*)';                
        }
        else if (r.queue == 'caseconcern'){
            System.debug('### SlackNotificationSupport new case concern');
            channelName = '#' Label.Slack_Case_Concern_Channel;
            
            msg = 'A new Case Concern has been created : *' r.caseNumber '* - By User : (*' r.nickName ' ' r.accountName '* From *' r.accountTier '*) - Category : (*' r.subject '*)';
            msg  = 'nLink to Case Concern : ' URL.getOrgDomainUrl().toExternalForm() '/' r.status;
            
        }
        // Team Leads
        else if (r.queue == 'Queue Team Leads') {
            channelName = setChannelName(r.queue);
            msg = 'A customer has opened a new case.n>>>*' 
                r.caseNumber '* - ' r.subject;
                System.debug('### SlackNotificationSupport Queue Team Leads');
        } // New Tier 1 Ticker
        else if (r.accountTier == 'Tier 1' amp;amp; r.accountName != null amp;amp; r.queue != null) {
            System.debug('### SlackNotificationSupport New Tier 1');
            channelName = setChannelName(r.queue);
            msg = 'The customer ' r.accountTier ' - *' r.accountName '* has opened a new case.n>>>*' 
                r.caseNumber '* - ' r.subject;
        }// Assigned ticket, status to Open - Internal notification for awaiting feedback cases
        else if (r.nickname != null amp;amp; r.status != null amp;amp; r.caseNumber != null) {
            System.debug('### SlackNotificationSupport  Status x to Open');
            channelName = '@' r.nickname;
            if(r.queue == 'internal_notification')msg = 'Salesforce Internal Case number *' r.caseNumber '* related to : *' r.subject '* - Status changed to : *' r.status '*.';
            else msg = 'Case number *' r.caseNumber '* has become ' r.status '.';
        }

        // Generate JSON for request
        try {
            if (r.queue != null || r.nickname != null) {
                System.debug('### SlackNotificationSupport Sending message');
                JSONGenerator gen = JSON.createGenerator(true);
                gen.writeStartObject(); //Inserts {
                gen.writeStringField('text', msg);
                gen.writeStringField('channel', channelName);
                gen.writeStringField('username', 'bot-support');
                gen.writeStringField('icon_emoji', ':smartplus:');
                gen.writeEndObject(); //Inserts }
                String body = gen.getAsString(); //Translates JSONGenerator to string to be passed to callout
                System.debug('### SlackNotificationSupport body: '  body);
                System.enqueueJob(new qCallOut(webhookURL, 'POST', body)); // Send request
            }
            else {
                System.debug('### SlackNotificationSupport Queue = '  r.queue);
                return;
            }
        } // try    
        catch (exception e){
            system.debug('### SlackNotificationSupport error:'   e);
        }
    } 
}


public class qCallOut implements System.Queueable, Database.AllowsCallouts {
     
    private final String url;
    private final String method;
    private final String body;
     
    public qCallOut(String url, String method, String body) {
        this.url = url;
        this.method = method;
        this.body = body;
    }
     
    public void execute(System.QueueableContext ctx) {
        HttpRequest req = new HttpRequest();
        req.setEndpoint(url);
        req.setMethod(method);
        req.setBody(body);
        Http http = new Http();
        // to pass when process builder is invoked by another test class
        if(!Test.isRunningTest()){  
          HttpResponse res = http.send(req);
        }
    }
}
 

}

Комментарии:

1. Разве вы не можете создать запрос для каждого канала, а затем передать их publishToSlack() ?

2. Привет, Диего, спасибо за ответ… Это не сработает, поскольку уведомление все равно будет отправлено на один канал. Моя цель — отправлять сообщения на несколько каналов одновременно

3. Почему оно передается только на один канал? Вы указываете только один канал из-за своей очереди и setChannelName() методов? Или вы используете URL-адрес webhook вместо фактической chat.postMessage конечной точки?

4. В соответствии с сообщением Slack: Post класс Salesforce Apex может отправлять только на один канал, поэтому, когда я устанавливаю свой JsonGenerator gen.writeStringField(‘channel’, ChannelName); Я могу отправлять только на один канал. Я могу установить разные условия для отправки на другой канал, но он все равно будет отправлять только на один канал