Перехват звонков из очереди
Содержание
Цель: Настроить внешний модуль с возможностью перехвата любого звонка, находящегося в очереди ожидания в системе 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-запросе, то значение не будет передано.
- Компонент "Ув1" - отладочное уведомление для вывода на экран значения в переменной lines_queus.
Модификация главного сценария
Модификация сценария заключается в добавлении в контент линии информации о переключении. Эта информация позволяет разделять абонентов в списке, видеть на какую группу операторов звонит тот или иной абонент.
Рассмотрим упрощенный вид главного сценария. В примере перед переключением на номер отдела менеджеров (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" - отладочное уведомление для вывода значения переменной "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.
Сценарий перехвата
=== Сценарий вместо отбоя внешней линии ===