Переадресация входящего звонка после тайм-аута резервирования задачи

Я использую Twilio Flex для поддержки колл-центра. У меня есть рабочий процесс TaskRouter, в котором время ожидания резервирования задано равным 120 секундам. В его фильтре я создал два шага маршрутизации. Первый находит подходящих рабочих в основной очереди и имеет таймаут 120 секунд. Через 120 секунд он должен перейти в очередь переадресации вызовов. В очереди переадресации вызовов не существует рабочих (целевое выражение рабочего рабочего: 1 == 2). Я улавливаю все эти события с помощью функции trEventListener. Как только задача перемещается в очередь переадресации вызовов, я вызываю функцию callForward, которая использует twiml.dial () для соединения вызова с внешним номером. Я также меняю статус этой задачи на «Отменено по индивидуальной причине», чтобы я мог отслеживать ее с помощью аналитики гибкости. Я использую руководство по этой ссылке, чтобы сформировать свою логику: 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);
        
};

Мы будем благодарны за любую помощь и / или руководство.


person Hamza    schedule 29.03.2021    source источник
comment
Я не совсем уверен ни в одном из вопросов. Возможно, это поможет вам получить представление о задачах и их тайм-аутах. Что касается неудачного обновления задачи, я предполагаю, что переадресация вызова от задачи приводит к ее отмене, но существует состояние гонки между Twilio, отменяющим задачу, и вашим кодом, поэтому вы не всегда видите ошибку .   -  person philnash    schedule 29.03.2021
comment
Спасибо за ответ и ресурсы. Я буду исследовать дальше и дам обновление, если смогу понять это.   -  person Hamza    schedule 29.03.2021
comment
@philnash, вы правы - это происходит из-за состояния гонки, когда я отменяю задачу, а Twilio отменяет задачу. Когда вы используете twiml.dial() для перенаправления задачи, по умолчанию эта задача отменяется по причине перенаправлено.   -  person Hamza    schedule 31.03.2021
comment
Круто, рад, что ты справился с этой частью!   -  person philnash    schedule 31.03.2021
comment
@philnash Итак, есть два случая, когда вызов будет перемещен в очередь переадресации вызовов: 1. Соответствующий работник не найден, а таймер достигает 120 секунд 2. Соответствующий работник обнаружен раньше 120 секунд, таймер снова запускается с 0 и если агент не заберет звонок в течение 120 секунд - он будет перенаправлен. Но если агент выбирает вызов, общее время ожидания будет = время, которое потребовалось для поиска подходящего работника + время, которое потребовалось для ответа на вызов, и это общее время может превышать 2 минуты. Вот почему Flex Insights показывал звонки с временем ожидания более 120 секунд.   -  person Hamza    schedule 31.03.2021
comment
Ах, хорошо, так что все сводится к добавлению тайм-аута очереди задач и тайм-аута резервирования. Я думаю, вы можете настроить каждый из них, чтобы сократить время ожидания, в зависимости от того, что лучше всего подходит для вас.   -  person philnash    schedule 31.03.2021
comment
Мой вариант использования - перенаправить звонок, если он не обслуживается в течение 120 секунд. Сокращение тайм-аута на самом деле не помогает, потому что это может привести к сценариям, когда вызов перенаправляется менее чем за 120 секунд. Мне нужно найти выход, чтобы, независимо от того, был ли найден подходящий работник или нет, общее время коммутирующего ожидания никогда не должно превышать 120 секунд. Как только будет 120 - сразу должен перенаправить. Возможно, для этого придется поиграться с функциями twilio.   -  person Hamza    schedule 31.03.2021


Ответы (1)


Проповедник разработчиков Twilio здесь.

Когда вы перенаправляете вызов из задачи, ее задача отменяется с перенаправлением причины, поэтому вам не нужно отменять ее самостоятельно.

Ваш код иногда не мог обновить задачу из-за состояния гонки между вашим кодом и задачей, отмененной Twilio.

person philnash    schedule 31.03.2021