Перехват звонков из очереди
Содержание
Цель: Настроить внешний модуль с возможностью перехвата любого звонка, находящегося в очереди ожидания в системе Oktell.
Задача актуальна в целях разгрузки очереди. Известно, что в часы наибольшей нагрузки в систему поступает большое количество звонков и часто доступные операторы не способны справиться с поступающим потоком абонентов. В эти моменты, супервизору может быть удобен мониторинг текущих очередей в системе и возможность перехватить абонента, который находится в очереди дольше всех.
Функционал реализовывается во внешнем модуле с частотой обновления раз в 2 секунды. При создании сценариев было обращено особое внимание на минимальное количество обращений в базу данных с целью снижения нагрузки на сервер баз данных.
Рассмотрим детальнее процесс реализации данной задачи.
Сценарий получения списка внешних линий
Сценарий предназначен для записи в глобальную переменную xml-структуры со списком всех внешних линий. Это нужно для того, чтобы не нагружать сервер БД при мониторинге, запрашивая их список. Глобальная переменная доступна во всех запускаемых сценариях.
Сценарий рекомендуется один раз в день, например, при запуске системы (при условии, что список внешних линий не меняется в течении дня).
Вид сценария представлен на рисунке:
- Компонент "Получение списка линий" - делает запрос в БД Oktell на получение списка внешних линий в XML-формате. Используется следующий SQL-запрос:
declare @lines xml set @lines = ( select SystemNumStr from A_ServerExtLines for XML path ('')) select @lines as "lines_queus"
В параметрах SQL-запроса переменные не указываются. Запрос возвращает результат в столбце lines_queus, поэтому для передачи значения в сценарии создается глобальная переменная lines_queus. Результат SQL-запроса lines_queus будет автоматически присвоен переменной сценария lines_queus.
ВНИМАНИЕ: Если имя переменной сценария не будет совпадать с именем возвращаемого столбца в SQL-запросе, то значение не будет передано.
ВНИМАНИЕ: Замечено, что SQL-запрос не работает для версий MSSQL 2000 и ниже. Используйте следующий SQL-запрос, однако максимальный размер возвращаемой строки не более 2000 символов:
declare @lines nVARCHAR(4000) SET @lines = select @lines = @lines +'<SystemNumStr>'+ SystemNumStr + '</SystemNumStr>'from A_ServerExtLines select @lines as "lines_queus"
- Компонент "Ув1" - отладочное уведомление для вывода на экран значения в переменной lines_queus.
Настройка служебной задачи
Для того, чтобы сценарий получения списка внешних линий запускался каждый раз при запуске системы, его необходимо назначить в служебную задачу.
- Перейдите в "Администрирование" - "Общие настройки"
- Перейдите на вкладку "Служебные задачи"
- Нажмите "Добавить"
- Настройте служебную задачу
- Служебный сценарий - выберите служебный сценарий получения списка внешних линий. В примере, Очередь_Список внешних линий
- Тип запуска - При запуске сервера
- Нажмите "Сохранить"
- Активируйте созданную служебную задачу
ВНИМАНИЕ: Для того, чтобы глобальная переменная lines_queus получила список внешних линий, перезапустите сервер Oktell, либо вручную запустите служебный сценарий получения списка внешних линий.
Модификация главного сценария
Модификация сценария заключается в добавлении в контент линии информации о переключении. Эта информация позволяет разделять абонентов в списке, видеть на какую группу операторов звонит тот или иной абонент.
Рассмотрим упрощенный вид главного сценария. В примере перед переключением на номер отдела менеджеров (105), в контент линии абонента заносится строка "Менеджеры".
- Компонент "Контент линии" - добавляет информацию в контент линии. Установлены следующие настройки:
- Действие - Установить
- Тип объекта - Линия
- Ключ линии - Функция "Номер линии"
- Свойство/действие - Поле контента линии
- Значение - строка, например, "Менеджеры".
- Компонент "Переключение" - переключает абонента на пользователя или группу пользователей. Из основных настроек:
- Назначение - Внутрь
- Номер - например, 105
- Очередь ожидания - Да
ВНИМАНИЕ: Добавляйте или изменяйте информацию в контенте линии перед каждым переключением в вашей системе. Данная модификация также в некоторых случаях может применяться к сценарию переключения.
Сценарий мониторинга для внешнего модуля
Сценарий опрашивает каждую внешнюю линию из списка в глобальной переменной lines_queus и определяет находится ли линия в очереди. Если линия находится в очереди, то с помощью контента линии определяются все характеристики абонента (номер телефона, время в очереди, информации о переключении). Полученная информация в виде html-страницы выводится на экран в настроенном внешнем модуле.
Вид сценария представлен на рисунке:
- Компонент "Старт 1" - в качестве параметра запуска используется переменная user (строковая). В этой переменной будет храниться ID пользователя, от имени которого запущен данный сценарий.
- Компонент "URL" - присвоение переменной URL (строковая) строки с подключением к вашему Web-серверу. Строка должна содержать
- базовую авторизацию (для версий Oktell старше 2.9).
- IP-адрес сервера Oktell
- Порт для подключений к Web-серверу Oktell
Подробнее о настройке можно прочитать в статье: Настройка Web-сервера Oktell. В примере, http://user1:1@192.168.0.82:4055.
- Компонент "Ув1" - отладочное уведомление с выводом значения глобальной переменной lines_queus и переменной user
- Компонент "Id=1" - присваивает переменной id (число) значение 1. Переменная id будет счетчиком в цикле.
- Компонент "HTML-1" - присваивает переменной html (строковая) выражение:
'<html> <head> <meta charset="utf-8"> <title>Очереди</title> <script type="text/javascript"> function locs() { document.location.href=""; } setTimeout("locs()", 2000); </script> </head> <body > <iframe name="invisible" style="display:none"></iframe> <table border="1" align="center" style="font: 20px arial;"> <tr> <td>Абонент</td> <td>Набранный номер</td> <td>Описание</td> <td>Время в ожидании</td> <td>Порядок в очереди</td> <td>Перехватить</td> </tr>'
В переменной html будет содержаться html-страница, которая будет показываться во внешнем модуле. Некоторые особенности:
- в строке setTimeout("locs()", 2000); вы можете поменять период автообновления страницы. Для этого замените число 2000 на время в миллисекундах.
- в строке <table border="1" align="center" style="font: 20px arial;"> вы можете поменять размер шрифта. Для этого измените выражение 20px.
- с помощью тега <td> вы сможете добавить или удалить столбцы в показываемой форме
- Компонент "Rowcount" - определяет количество внешних линий (тег <SystemNumStr>) в XML-структуре lines_queues. В парсере определяются следующие настройки:
- Документ - глобальная переменная lines_queus
- Алгоритм - Язык OQuery для HTML
- Поисковый запрос - SystemNumStr
- Функция - Количество элементов
- Результат в переменную - переменная rowcount (число)
- Компонент "Id>Rowcount" - определяет просмотрены ли все линии в XML-структуре. Происходит сравнение:
- Аргумент 1 - переменная "id"
- Аргумент 2 - переменная "rowcount"
- Тип сравнения - ">"
- Компонент "Line" - определяет содержимое тега <SystemNumStr> с номером id из XML-структуры. Результатом является номер линии.
- Документ - глобальная переменная lines_queus
- Алгоритм - Язык OQuery для HTML
- Поисковый запрос - SystemNumStr
- Функция - Содержимое
- Номер элемента - переменная id
- Результат в переменную - переменная line (строковая)
- Компонент "Позиция в очереди" - определяется текущая позиция в очереди у выбранной линии.
- Действие - Определить
- Тип объекта - Линия
- Ключ линии - переменная "line"
- Функция - Текущая позиция в очереди
- Значение в переменную - переменная "prioritet"
- Линии, которые не участвуют в коммутации имеют значение позиции "-1". Значение позиции "0" обозначает, что в данный момент линия коммутируется с конкретным объектом (например, групповой номер менеджеров). Значение позиции "1", "2" и т.д. обозначают, что линия находится в очереди и ожидает освобождения объекта.
- Компонент "Позиция >=0" - производит отсев линий, которые не участвуют в коммутации. Происходит сравнение:
- Аргумент 1 - переменная "prioritet"
- Аргумент 2 - число "0"
- Тип сравнения - ">="
- Компонент "Контент линии" - определяет контент выбранной линии в XML-формате. С помощью контента линии можно определить все параметры соединения.
- Действие - Определить
- Тип объекта - Линия
- Ключ линии - переменная "line"
- Функция - Контент линии (XML)
- Значение в переменную - переменная "content_of_line" (строковая)
ВНИМАНИЕ: Замечено, что на версиях 2.9 и ниже контент линии сохраняется в виде, например <![CDATA[Менеджеры]]>. Чтобы выделить нужную информацию используйте компонент с выражением:
Remove( Remove( [content_of_line], Len( [content_of_line] )-3, 3 ),0 , 9 )
- Компонент "Ув2" - отладочное уведомление для вывода значения переменной "content_of_line"
- Компонент "Description" - определяет из контента линии информацию по соединению, которая задается в главном сценарии (см.выше) и помещает значение в переменную description.
- Документ - переменная content_of_line
- Алгоритм - Язык OQuery для HTML
- Поисковый запрос - call>property_cdata[key="custominfo"]
- Функция - Содержимое
- Номер элемента - не указан
- Результат в переменную - переменная description (строковая)
- Компонент "Timestart" - определяет из контента линии время постановки в очередь.
- Документ - переменная content_of_line
- Алгоритм - Язык OQuery для HTML
- Поисковый запрос - commutation:last>property_simple[key="timestart"]
- Функция - Значение атрибута
- Номер элемента - не указан
- Атрибут - строка "value"
- Результат в переменную - переменная timestart (строковая)
- Компонент "CallerID" - определяет из контента линии номер абонента (CallerID)
- Документ - переменная content_of_line
- Алгоритм - Язык OQuery для HTML
- Поисковый запрос - call>property_simple[key="callerid"]
- Функция - Значение атрибута
- Номер элемента - не указан
- Атрибут - строка "value"
- Результат в переменную - переменная callerid (строковая)
- Компонент "CalledID" - определяет из контента линии набранный номер (CalledID)
- Документ - переменная content_of_line
- Алгоритм - Язык OQuery для HTML
- Поисковый запрос - call>property_simple[key="calledid"]
- Функция - Значение атрибута
- Номер элемента - не указан
- Атрибут - строка "value"
- Результат в переменную - переменная calledid (строковая)
- Компонент "TimeInQueu" - определение продолжительности нахождения абонента в очереди. В компоненте переменной timeinqueu присваивается выражение datediff(ss,datetime([timestart]),now)
- Компонент "Ув3" - отладочное уведомление для вывода всех найденных значений из контента линии.
- Компонент "HTML-2" - добавляет в HTML страницу строку с информацией об абоненте. В компоненте происходит присвоение переменной html выражения
[html]+endline+ '<tr> <td>'+[callerid]+'</td> <td>'+[calledid]+'</td> <td>'+[description]+'</td> <td>'+[timeinqueu]+'</td> <td>'+[prioritet]+'</td> <td><a target="invisible" href="'+[URL]+'/execsvcscriptplain?name=Очередь_Перехват&startparam1='+[line]+'&startparam2='+[user]+'&async=0&timeout=10">Перехватить</a></td> </tr>'
В последней колонке используется метод execsvcscriptplain серверного HTTP интерфейса, который запускает служебный сценарий для вывода звонка из очереди с последующим перехватом. Этому сценарию передаются два стартовых параметра - line (какую линию надо перехватить) и user (на какого пользователя переключить).
- Компонент "Id++" - инкрементирует счетчик Id. На следующей ветке цикла происходят те же действия со следующей линией.
- Компонент "HTML-3" - завершает генерацию HTML-страницы. Переменной html присваивается выражение
[html]+endline+'</table> </body> </html>'
- Компонент "Ув4" - отладочное уведомление для вывода сгенерированной html-страницы.
- Компонент "Возвращаемое значение" - передача html-страницы во внешний модуль. В компоненте служебной переменной Возвращаемое значение 1 (строка) присваивается значение html.
Настройка внешнего модуля
Сценарий мониторинга назначается на запуск внешнего модуля с помощью серверного HTTP-интерфейса.
- Перейдите в раздел "Администрирование" - "Внешние модули".
- Перейдите на вкладку "Разделы меню"
- Нажмите кнопку "Добавить"
- Настройте свойства внешнего модуля. Основные настройки:
- Тип: Веб-страница
- Адрес страницы веб-сервиса: Используется метод execsvcscriptplain, на вход которого передается параметр [user_guid] (ID пользователя). Укажите базовую авторизацию и IP-адрес Web-сервера Oktell.
http://user1:1@192.168.0.82:4055/execsvcscriptplain?name=Очередь_Мониторинг&startparam1=[user_guid]&async=0&timeout=10
- Назначьте права доступа на соответствующей вкладке
- Нажмите "Сохранить"
ВНИМАНИЕ: Для появления внешнего модуля, необходимо перезапустить клиентское приложение.
Сценарий перехвата
Сценарий перехвата запускается, когда пользователь системы нажал кнопку "Перехватить" во внешнем модуле. Данный служебный сценарий предназначен для вывода линии из очереди с помощью "Мягкого сброса". В процессе работы сценарий добавляет отличительную информацию в контент линии. После работы мягкого сброса, линия попадает в сценарий вместо отбоя внешней линии.
Ниже представлен вид сценария:
- Компонент "Старт 1" - в качестве входного параметра используется переменная line (строковая). В переменной будет содержаться номер линии, которую нужно перехватить.
- Компонент "user" - присваивает переменной user (строковая) значение функции "Входной параметр 2".
ВНИМАНИЕ: Все входные параметры передаются в web-запросе при нажатии на кнопку "Перехватить" (см.выше)
- Компонент "Ув1" - отладочное уведомление с выводом стартовых параметров line и user.
- Компонент "Получить Content" - определяет контент линии для последующего добавления служебной информации.
- Действие - Определить
- Тип объекта - Линия
- Ключ линии - переменная "line"
- Функция - Поле контента линии
- Значение в переменную - переменная "content" (строковая)
- Компонент "Ув2" - отладочное уведомление для вывода содержание переменной content.
- Компонент "Добавление ключа" - добавляет в контент линии ключ и информацию о пользователе. Ключ нужен для того, чтобы в сценарии вместо отбоя внешней линии определить, что это именно тот абонент, которого нужно перехватить. Таким образом добавляется уникальный признак в контент линии, позволяющий отделить ее от остальной массы линий, которые попадают в сценарий. В сценарии используется Ключ:Перехват. Для удобства парсинга все данные в контенте разделяются знаком дефиса.
- Действие - Установить
- Тип объекта - Линия
- Ключ линии - переменная "line"
- Свойство/действие - Поле контента линии
- Значение - выражение [content]+'-Ключ:Перехват-Пользователь:'+[user]
- Компонент "Мягкий сброс" - производит действие "мягкий сброс" на линии line.
- Действие - Установить
- Тип объекта - Линия
- Ключ линии - переменная "line"
- Свойство/действие - Мягкий сброс
Сценарий вместо отбоя внешней линии
Сценарий IVR вместо отбоя внешней линии в данном кейсе запускается после применения действия "Мягкий сброс" к линии. Основная цель сценария - определить, что линия пришла из перехвата и переключить ее на того пользователя, который нажал кнопку "Перехватить". Определение линии на принадлежность к перехвату определяется путем парсинга контента линии.
Сценарий выглядит следующим образом:
ВНИМАНИЕ: В данном примере, если линия не относится к перехвату то отрабатывает компонент "Обрыв связи". Если ваш сценарий вместо отбоя внешней линии сложнее, то вместо обрыва связи производите другие действия с линией.
- Компонент "Контент линии" - определяет контент линии
- Действие - Определить
- Тип объекта - Линия
- Ключ линии - функция "Номер линии"
- Функция - Поле контента линии
- Значение в переменную - переменная "Контент" (строковая)
- Компонент "Ув1" - отладочное уведомление для вывода значения переменной "Контент"
- Компонент "Контент пустой?" - если переменная "Контент" пустая, то линия не относится к перехвату. В компоненте происходит сравнение:
- Аргумент 1 - переменная "Контент"
- Аргумент 2 - пустая строка
- Тип сравнения - "="
- Компонент "Определить ключ" - если контент линии не пустой, это еще не означает, что линия относится к перехвату. В данном компоненте определяется ключ, находящийся в линии. Используются регулярные выражения.
- Документ - переменная Контент
- Алгоритм - Регулярные выражения
- Поисковый запрос - -Ключ:([^/-]+)
- Функция - Содержимое
- Номер элемента - 0
- Результат в переменную - переменная Ключ (строковая)
- Компонент "Ключ=Перехват?" - определяет содержится ли в переменной "Ключ" значение "Перехват".
- Аргумент 1 - переменная "Ключ"
- Аргумент 2 - строка "Перехват"
- Тип сравнения - "="
- Компонент "Определить user" - определяет из контента линии ID пользователя, на которого нужно переключить.
- Документ - переменная Контент
- Алгоритм - Регулярные выражения
- Поисковый запрос - -Пользователь:([^/r/n]+)
- Функция - Содержимое
- Номер элемента - 0
- Результат в переменную - переменная user (строковая)
- Компонент "Имя пользователя" - определяет по ID пользователя его имя.
- Действие - Определить
- Тип объекта - Пользователь
- Ключ пользователя - переменная "user"
- Функция - Имя пользователя
- Значение в переменную - переменная "user" (строковая)
- Компонент "Замена контента" - Очищает пользовательский контент линии и записывает в него имя пользователя.
- Действие - Установить
- Тип объекта - Линия
- Ключ линии - функция "Номер линии"
- Свойство/действие - Поле контента линии
- Значение - переменная "user" (строковая)
- Компонент "Пользователь на месте" - нужен для тех ситуаций, когда перехватывающий находится в состоянии "Перерыв". С помощью данного компонента пользователь принудительно ставится в состоянии "На месте".
- Действие - Установить
- Тип объекта - Пользователь
- Ключ пользователя - переменная "user"
- Свойство/действие - Изменить статус
- Значение - 1
- Компонент "Номер пользователя" - определяет внутренний номер пользователя, на который затем будет переключаться абонент.
- Действие - Определить
- Тип объекта - Пользователь
- Ключ пользователя - переменная "user"
- Функция - Внутренний номер
- Значение в переменную - переменная "Номер" (строковая)
- Компонент "Ув2" - отладочное уведомление для вывода на экран "Номер" и "user"
- Компонент "На пользователя " - соединение абонента и перехватывающего пользователя.
- Назначение - Внутрь
- Номер - Номер
- Очередь ожидания - Да
ВНИМАНИЕ: Включенная очередь ожидания позволяет перехватывать неограниченное количество абонентов. Все абоненты попадут в очередь к перехватывающему.
ВНИМАНИЕ: В сценарии не рассматривается обработка неудачного соединения. Вы можете самостоятельно назначить соответствующие переходы (Занято, Не отвечает, Отсутствует и т.д.), если в этом возникнет необходимость
Результаты работы
При открытии внешнего модуля пользователь видит таблицу со всеми абонентами, ожидающими в очередях:
При нажатии на кнопку "Перехватить" пользователь соединяется с абонентом. При этом пользователь может находиться в состоянии "Перерыв"
Пользователь Oktell во время разговора может добавить в свою очередь ожидания еще несколько абонентов. В описании будет отмечено к какому пользователю относится очередь.
Сценарий можно доработать таким образом, чтобы пользователи Oktell могли видеть только определенные очереди ожидания. Например, супервизор А видит всех абонентов кто звонит в отдел менеджеров, а супервизор Б только тех, кто звонит в отдел технической поддержки. Для этого необходимо внести дополнительные условия в сценарий мониторинга.
Внешний модуль может быть доступен только определенным пользователям. Для этого необходимо настроить права доступа для модуля.
Скачать сценарии: Перехват из очереди.zip
Основные моменты при установке:
- Импортируйте сценарии
- Модифицируйте главный сценарий, согласно примеру
- Настройте служебную задачу получения списка внешних линий
- Добавьте в сценарий мониторинга ваш URL для подключения к Web-серверу Oktell
- Настройте внешний модуль, согласно инструкции (см.выше)
- Перезагрузите сервер Oktell