【问题标题】:Forwarding an incoming call after task reservation timeout任务预留超时后转接来电
【发布时间】:2021-03-29 06:50:55
【问题描述】:

我正在使用 Twilio Flex 来支持呼叫中心。我设置了一个 TaskRouter 工作流,其中任务预留超时设置为 120 秒。在它的过滤器中,我创建了两个路由步骤。第一个在主队列中找到匹配的工作人员,超时时间为 120 秒。 120 秒后,它应该移动到呼叫转移队列。在呼叫转发队列中,不存在任何工作人员(目标工作人员表达式:1==2)。我正在使用“trEventListener”函数捕获所有这些事件。将任务移入呼叫转移队列后,我将调用“callForward”函数,该函数使用 twiml.dial() 将呼叫连接到外部号码。我还使用自定义原因将此任务的状态更改为“已取消”,以便我可以在 flex 洞察力中对其进行跟踪。我正在使用此链接中的指南来形成我的逻辑:https://support.twilio.com/hc/en-us/articles/360021082934-Implementing-Voicemail-with-Twilio-Flex-TaskRouter-and-WFO

呼叫转接工作正常,但根据 Flex 洞察,有些呼叫会在 120 秒(120 到 300 秒之间)后得到处理。理想情况下,这些也应该被转发。也没有记录任何错误让我追查为什么只有少数几个电话会发生这种情况。

此外,在某些情况下,当我尝试使用自定义原因更改任务状态以取消时,它会显示以下错误:无法取消任务,因为它不是待处理或保留的。在其他情况下,它工作正常。再次很难弄清楚为什么它会选择性地工作并且行为不一致。

这是功能代码。

trEventListener.js:

exports.handler = function(context, event, callback) {
    
    const client = context.getTwilioClient();
    let task = '';
    let workspace = '';
    console.log(`__[trEventStream]__: Event recieved of type: ${event.EventType}`);
    
    // setup an empty success response
    let response = new Twilio.Response();
    response.setStatusCode(204);
    
    // switch on the event type
    switch(event.EventType) {
        case 'task-queue.entered':
            // ignore events that are not entering the 'Call Forward' TaskQueue 
            if (event.TaskQueueName !== 'Call Forward') {
                console.log(`__[trEventStream]__: Entered ${event.TaskQueueName} queue - no forwarding required!`);
                return callback(null, response);
            }
    
            console.log(`__[trEventStream]__: entered ${event.TaskQueueName} queue - forwarding call!`);
            task = event.TaskSid;
            workspace = event.WorkspaceSid;
            const ta = JSON.parse(event.TaskAttributes);
            const callSid = ta.call_sid;
    
            let url = `https://${context.DOMAIN_NAME}/forwardCall`;
    
            // redirect call to forwardCall function
            client.calls(callSid).update({
                method: 'POST',
                url: encodeURI(url),
            }).then(() => { 
                console.log(`__[trEventStream]__: [SUCCESS] ~> Task with id ${task} forwarded to external DID`);
                // change task status to canceled so it doesn't appear in flex or show up as a pending task
                client.taskrouter.workspaces(workspace)
                 .tasks(task)
                 .update({
                    assignmentStatus: 'canceled',
                    reason: 'Call forwarded'
                  })
             .then(task => {
                    console.log(`__[trEventStream]__: [SUCCESS] ~> Task canceled`);
                    return callback(null, response); 
                 }).catch(err => { 
                    console.log(`__[trEventStream]__: [ERROR] ~> Task not marked complete: `, err);
                    // doesn't warrant reponse 500 since call still forwarded :)
                    return callback(null, response);
                 });
            }).catch(err => {
                console.log(`__[trEventStream]__: [ERROR] ~> Task failed to forward to external DID: `, err);
                response.setStatusCode(500);
                return callback(err, response);
            });
    break;
    default:
        return callback(null, response);
    }
};

callForward.js:

exports.handler = function(context, event, callback) {
    console.log(`forwarding call`);
    // set-up the variables that this Function will use to forward a phone call using TwiML
    // REQUIRED - you must set this
    let phoneNumber = event.PhoneNumber || context.NUMBER;
    // OPTIONAL
    let callerId =  event.CallerId || null;
    // OPTIONAL
    let timeout = event.Timeout || null;
    // OPTIONAL
    let allowedCallers = event.allowedCallers || [];

    let allowedThrough = true;
    if (allowedCallers.length > 0) {
      if (allowedCallers.indexOf(event.From) === -1) {
        allowedThrough = false;    
      }
    }
    
    // generate the TwiML to tell Twilio how to forward this call
    let twiml = new Twilio.twiml.VoiceResponse();

    let dialParams = {};
    if (callerId) {
      dialParams.callerId = callerId;
    }
    if (timeout) {
      dialParams.timeout = timeout;
    }
    
    if (allowedThrough) {
      twiml.dial(dialParams, phoneNumber); // making call :)
    }
    else {
      twiml.say('Sorry, you are calling from a restricted number. Good bye.');
    }
    
    // return the TwiML
    callback(null, twiml);
        
};

我们将不胜感激任何形式的帮助和/或指导。

【问题讨论】:

  • 我对这两个问题都不太确定。也许this will help give you an idea about tasks and their timeouts。至于任务更新失败,我的猜测是从任务中转发调用会导致它取消,但是 Twilio 取消任务和您的代码之间存在竞争条件,这就是为什么您并不总是看到错误.
  • 感谢您的回复和资源。如果我能够弄清楚,我将进一步调查并提供更新。
  • @philnash 你是对的 - 这是因为我取消任务和 Twilio 取消任务的竞争条件。当您使用twiml.dial() 重定向任务时,默认行为是取消该任务,原因是“redirected”
  • 啊酷,很高兴你完成了那部分!
  • @philnash 所以有两种情况下一个呼叫会被转移到呼叫转移队列中: 1. 没有找到匹配的工人并且计时器达到 120 秒 2. 在 120 秒之前找到匹配的工人,计时器再次从 0 开始,如果代理在 120 秒内未接听呼叫 - 它将被重定向。但是,如果代理接听电话,则总等待时间将 = 找到匹配工作人员所用的时间 + 匹配工作人员接听电话所用的时间,这个总时间可能远远超过 2 分钟。这就是 flex 洞察力显示等待时间超过 120 秒的呼叫的原因。

标签: twilio twilio-functions twilio-flex twilio-taskrouter


【解决方案1】:

这里是 Twilio 开发者宣传员。

当你从一个任务重定向一个调用时,它的任务被取消,原因是“重定向”,所以你不需要自己取消它。

由于您的代码与被 Twilio 取消的任务之间的竞争条件,您的代码偶尔无法更新任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多