任务预约超时后转接来电

问题描述

我正在使用 Twilio Flex 来支持呼叫中心。我设置了 TaskRouter 工作流,其中 Task Reservation Timeout 设置为 120 秒。在它的过滤器中,我创建了两个路由步骤。第一个在主队列中找到匹配的 worker,超时时间为 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,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);
        
};

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

解决方法

这里是 Twilio 开发者布道者。

当您从任务重定向调用时,它的任务会以“重定向”为由取消,因此您无需自行取消。

由于您的代码与 Twilio 取消的任务之间存在竞争条件,您的代码有时无法更新任务。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...