Я использую 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);
};
Мы будем благодарны за любую помощь и / или руководство.
twiml.dial()
для перенаправления задачи, по умолчанию эта задача отменяется по причине перенаправлено. - person Hamza   schedule 31.03.2021