Урок 28 Служебный сценарий обработки контента — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
 
(не показано 26 промежуточных версии этого же участника)
Строка 10: Строка 10:
 
==Введение==
 
==Введение==
  
Сценарий обработки контента - служебный сценарий, который запускается после завершения звонка (коммутации) на внешней линии. Сценарий предназначен для постобработки внешнего звонка и анализа специальной XML-структуры, называемой ''контентом линии''. Разберемся с этой структурой поподробнее.
+
Сценарий обработки контента - служебный сценарий, который запускается после завершения звонка на внешней линии. Сценарий предназначен для постобработки внешнего звонка и анализа специальной XML-структуры, называемой ''контентом линии''. Разберемся с этой структурой поподробнее.
  
 
Контент линии - это идентификационная информация по линии, абоненту, времени, а также перечень всех коммутаций с указанием имени сценария, идентификатора и имени оператора, времени начала, времени конца, продолжительности и пр. Контент линии существует только у внешних линий,  начинает заполняться с момента поступления звонка по каналу и сбрасывается при завершении этого звонка. Иными словами, данная информация существует только во время звонка. Контент линии помогает отследить все действия внешнего абонента, по каким сценариям IVR он проходил, какие операторы говорили с ним, а какие операторы пропустили звонок.  
 
Контент линии - это идентификационная информация по линии, абоненту, времени, а также перечень всех коммутаций с указанием имени сценария, идентификатора и имени оператора, времени начала, времени конца, продолжительности и пр. Контент линии существует только у внешних линий,  начинает заполняться с момента поступления звонка по каналу и сбрасывается при завершении этого звонка. Иными словами, данная информация существует только во время звонка. Контент линии помогает отследить все действия внешнего абонента, по каким сценариям IVR он проходил, какие операторы говорили с ним, а какие операторы пропустили звонок.  
  
Наряду с контентом линии, в Oktell существует контент цепочки коммутаций. Контент цепочки существует в рамках цепочки коммутаций и в отличие от предыдущего аналога, его можно получить как для внешних, так и для внутренних линий.  
+
<blockquote>Рассмотрим следующую ситуацию: клиент позвонил в компанию и соединился с секретарем Марией. Мария осуществляет консультативный перевод на сотрудника Станислава, заранее предупреждая его о переключении. Клиент соединяется со Станиславом и после разговора, попадает в сценарий вместо отбоя, где оценивает качество консультации. </blockquote>
  
Следует отметить, что контенты линии и цепочки коммутаций отличаются друг от друга. Представим ситуацию, в которой секретарь консультативно переключил внешнего абонента на другого сотрудника. В контент линии попадут две коммутации абонента с секретарем и абонента с сотрудником. В контент цепочки коммутации в данном случае попадут три коммутации - абонента с секретарем, секретаря с сотрудником и абонента с сотрудником, потому как все три вызова были сделаны в рамках одной цепочки.
+
После того как линия положит трубку в контент линии попадут 4 коммутации:
 +
*соединение абонента с главным IVR сценарием
 +
*разговор абонента с секретарем Марией
 +
*разговор абонента с сотрудником Станиславом
 +
*соединение абонента со сценарием вместо отбоя
 +
Следует отметить, что коммутация между сотрудниками Марией и Станиславом в контент линии не попадет, потому как в этом разговоре не участвовала внешняя линия абонента. В контент линии попадают только те разговоры, в которых участвовала линия клиента. Далее показан пример контента линии для указанной ситуации (повторяющиеся моменты вырезаны).
  
Получить контент линии или цепочки коммутаций можно в любой момент с помощью одноименных функций в компоненте "Статус объекта".
 
  
 +
[[Файл:Урок 28 -001+.png|center]]
  
  
  
 +
Наряду с контентом линии, в Oktell существует ''контент цепочки коммутаций'' (еще его называют ''контент сессии''). Контент сессии существует в рамках цепочки коммутаций и в отличие от контента линии его можно получить как для внешних, так и для внутренних линий.
  
Сценарий запускается после завершения коммутации с внешней линией и предназначен для постобработки внешнего звонка. На вход сценария поступает контент линии - XML структура с идентификационной информацией по линии, абоненту, времени, а также перечень всех коммутаций с указанием имени сценария, идентификатора и имени оператора, времени начала, времени конца, продолжительности и пр. Для разбора полученной структуры следует использовать компонент "Парсер" с алгоритмом OQuery. Код инициатора запуска служебного сценария - 25.
+
Следует отметить, что контенты линии и сессии отличаются друг от друга. В контент сессии для данной ситуации попадет еще разговор секретаря Марии с сотрудником Станиславом во время консультативного перевода, потому как этот вызов, как и другие был сделан в рамках одной цепочки. Также в контенте цепочки коммутаций фиксируется информация о пройденных очередях ожидания. Ниже показан пример контента цепочки коммутаций для того же примера (повторяющиеся моменты вырезаны).
  
В ходе обработки внешнего звонка сервером производится сбор так называемого контента. Это идентификационная информация по линии, абоненту, времени, а также перечень всех коммутаций с указанием имени сценария, идентификатора и имени оператора, времени начала, времени конца, продолжительности и пр.
 
  
 +
[[Файл:Урок 28 -001++.png|center]]
  
  
Осуществляет чтение или изменение пользовательского поля выбранного контента. В ходе работы с каналом системой производится сбор и формирование контента. Это XML документ, который существует в памяти сервера и постоянно пополняется происходящими действиями в ходе обработки вызова. Контент линии существует только у внешних линий, формируется при поступлении или совершении звонка по каналу, и сбрасывается при завершении этого звонка.  
+
Получить контент линии или цепочки коммутаций можно в любой момент с помощью одноименных функций в компоненте "'''Статус объекта'''" (действие — определить). Для линии вы можете определить как контент линии (XML), так и цепочки коммутаций (XML, Json). Для сессии (цепочки) доступно только определение контента цепочки коммутаций.  
  
  
Может быть передан в служебный сценарий, запускаемый по окончании обработки вызова по внешнему каналу. Также существует контент цепочки коммутаций, который формируется пока существует обозначенная цепочка. При присоединении или отбое каналов из цепочки ее контент существует, наполняется и может быть обработан внешним образом.
+
[[Файл:Урок 28 -002.png|1000px|center]]
  
  
 +
В каждом из представленных контентов есть специальные пользовательские поля, куда вы можете заносить свою информацию. Иногда эту нужно для указания служебных данных или передачи некоторых параметров между сценариями, которые запускаются не в рамках одной сессии. В контенте линии пользовательское поле располагается в заголовке (показано на рисунке выше):
 +
:<code><property_cdata key="custominfo"><![CDATA[''Любые данные'']]></property_cdata></code>
  
 +
В контенте цепочки коммутаций это несколько полей — одно в заголовке контента сессии и по одному на каждую коммутацию (показано на рисунке выше):
 +
:<code><property_cdata key="custom"><![CDATA[''Любые данные'']]></property_cdata></code>
 +
:<code><property_cdata key="custom"><![CDATA[''Любые данные'']]></property_cdata></code>
  
Запуск данного сценария происходит автоматически после окончания звонка.  Какой именно служебный сценарий будет отвечать за обработку контента выбираем и назначаем в разделе Администрирование / Общие настройки / Сценарии АТС / Служебный сценарий обработки контента.
+
Определить и установить свои значения в эти пользовательские поля вы можете с помощью одноименных функций в компоненте "'''Статус объекта'''". Для линии доступны пользовательские поля обоих типов контентов, для сессии доступен только контент цепочки.
  
Прежде чем обрабатывать контент,нужно ознакомиться в каком виде он нам становиться доступным. Для этого создадим простой служебный сценарий - "обработка контента".
 
  
 +
[[Файл:Урок 28 -003.png|1000px|center]]
  
[[Файл:con01.png|center]]
 
  
 +
==Сценарий обработки контента ==
  
В компоненте старт, выбираем параметры запуска, а точнее создаем переменную в которую система передаст эти самые параметры запуска,в нашем случае это и будет контент.
+
Как было сказано в начале, сценарий обработки контента запускается автоматически после окончания звонка на внешней линии. На вход в качестве параметра запуска сценарию поступает контент линии в формате XML. Получить контент линии можно также с помощью функции "''Входной параметр 1''". Далее в сценарии вы можете проанализировать эту структуру и определить различные параметры звонка. Рассмотрим этот процесс на примере задачи.
  
 +
'''Задача:''' необходимо определять пропущенные звонки от клиентов и реализовать автоматическую отправку email директору с указанием номера абонента (callerid), набранного номера (calledid) и времени звонка. Пропущенным звонком в данной задаче будем считать такой, у которого не было ни одного соединения с оператором.
  
[[Файл:con02.png|center]]
+
Чтобы решить эту задачу, нужно посмотреть на различие контентов между звонками, в которых были соединения с операторами и в которых их не было.
  
Далее используем компонент "Сохранение контента" для того что бы создать физический файл в который сохраниться наш контент. Для этого,в качестве контента указываем нашу переменную "Контент", затем для удобства последующего просмотра выбираем тип - txt.  
+
[[Файл:Урок 28 -009.png|center]]
  
Файл - выбираем категорию где наш файл создастся и указываем название файла. После этого сохраняем сценарий,назначаем его в качестве "Служебного сценария сбора контента", после чего производим звонок.
 
  
Переходим в категорию,которую указали для сохранения контента и раскрываем с помощью блокнота.
+
Как видно из рисунка, соединения с операторами отмечается дополнительным тегом <code><abonent index="1"></code> внутри основного тега <code><commutation index="1"></code>. Исходя из этого, если количество таких тегов равняется нулю, звонок можно считать пропущенным. Остальные параметры — направление звонка, CallerId, CalledId и время звонка можно также посмотреть из контента, на рисунке они отмечены синим цветом.  
  
 +
Итоговый сценарий выглядит следующим образом:
  
[[Файл:con1.png|center]]
 
  
 +
[[Файл:Урок 28 -004.png|center]]
  
Как видно из данного файла - весь контент "обрамлен" в xml. Соответственно для последующего разбора данных мы будем использовать компонент парсер текста, с использованием поискового языка OQuery.
 
  
Давайте рассмотрим структуру более подробно. Для примера возьмем строчку из контента:
+
Компонент "'''Старт'''". Сохраняет контент линии в переменную '''content'''.
 +
* Параметр запуска - переменная '''content''' (строковая)
  
:'''<property_simple key="idchain" value="21819d69-6d1e-40b5-898b-a6c387a555bc" />'''
 
  
В данной строке property_simple - является тегом,
+
Компонент "'''Вывод контента'''". Отладочное уведомление для вывода контента линии.
key="idchain" - уточняющий атрибут,
+
* Текст - переменная '''content'''.
value="21819d69-6d1e-40b5-898b-a6c387a555bc" - конкретизирующий атрибут.
+
* Способ оповещения - Всплывающее уведомление
 +
* Ключ получателя - внутренний номер администратора. Указать ключ в таком виде намного легче, чем выбирать пользователя в свойстве "Адресат".
  
Таким образом для того что бы получить значение ID цепочки коммутации строим следующий поисковый запрос:
 
  
:'''property_simple[key="idchain"]'''
+
Компонент "'''Количество коммутаций'''". Парсер определяет из контента количество коммутаций с абонентами. Поскольку контент представляет из себя XML структуру, используется алгоритм OQuery.
 +
* Документ - переменная '''content'''
 +
* Алгоритм - Язык OQuery для HTML
 +
* Поисковый запрос - строка
 +
<code>commutation:has(property_simple[name='abonent'])</code>
 +
Запрос ищет все теги ''commutation'', внутри который есть тег ''property_simple'' с атрибутом ''name="abonent"''
 +
* Функция - Количество элементов
 +
* Результат в переменную - переменная '''count''' (строковая)
 +
* Переход и Переход, неудача - на компонент "Пропущенный?". Переход по неудаче сделан для случая, если в контенте не будет ни одной коммутации с абонентом. Дело в том, что если парсер не находит нужных тегов, он возвращает ошибку.
  
Где, следуя синтаксису OQuery, property_simple - тег,[key="idchain"] - атрибут с известным нам значением и названием.
+
[[Файл:Урок 28 -005.png|center]]
  
Далее рассмотрим служебный сценарий сбора контента, в котором используя последовательный парсинг контента, мы получим необходимые значения и сохраним все в БД.
 
  
Во первых создадим таблицу в БД, в которую будем в итоге складировать все полученные данные. В ходе примера получим следующие данные:
+
Компонент "'''Пропущенный?'''". Если парсер не нашел нужных тегов, то он перейдет по неудаче, а в переменную он возвратит пустое значение. Компонент сравнивает переменную '''count''' с пустой строкой, тем самым определяя пропущенный это звонок или нет.
*ID цепочки коммутации,
+
* Аргумент 1 - переменная '''count'''
*Номер внешней линии,
+
* Аргумент 2 - пустая строка
*CallerID,
+
* Тип сравнение - "="
*CalledID,
+
* Переход, если правда - на компонент "Определяем направление"
*Время начала,
+
* Переход, если ложь - на компонент "Стоп 1"
*Время конца,
+
*Имя пользователя, обслужившего вызов последним,
+
*Номер линии,обслужившей вызов последней,
+
*ID пользователя,обслужившего вызов последним.
+
  
Из такого набора данным все поля делаем NVarchar,кроме Время начала,Время конца,которые создаем как Date/time.
 
  
 +
Компонент "'''Определяем направление'''". Определяет направление звонка - входящий или исходящий. Требуемое значение находится в теге <code><property_simple key="direction" value="1" name="cdIncoming" /></code> в атрибуте name.
 +
* Документ - переменная '''content'''
 +
* Алгоритм - Язык OQuery для HTML
 +
* Поисковый запрос - строка
 +
<code>property_simple[key='direction']</code>
 +
Запрос ищет все теги property_simple с атрибутом key="direction"
 +
* Функция - Значение атрибута
 +
* Номер элемента - 1
 +
* Атрибут - строка "name"
 +
* Результат в переменную - переменная '''direction''' (строковая)
 +
* Переход и Переход, неудача - на компонент "Входящий звонок?".
  
[[Файл:con7.png|center]]
 
  
 +
Компонент "'''Входящий звонок?'''". Поскольку в задании требуется определять только входящие звонки, у которых не было ни одной коммутации, компонент сравнивает полученное направление со строкой "cdIncoming".
 +
* Аргумент 1 - переменная '''direction'''
 +
* Аргумент 2 - строка "cdIncoming"
 +
* Тип сравнение - "="
 +
* Переход, если правда - на компонент "CallerId"
 +
* Переход, если ложь - на компонент "Стоп 2"
  
Далее переходим непосредственно к нашему сценарию.
+
[[Файл:Урок 28 -006.png|center]]
  
[[Файл:con2.png|center]]
 
  
Рассмотрим настройки компонента "Парсер"
+
Компонент "'''CallerId'''". Определяет CallerId. Требуемое значение находится в теге <code><property_simple key="callerid" value="88432110000" /></code> в атрибуте value.
*Документ - переменная "Контент".
+
* Документ - переменная '''content'''
*Алгоритм - Язык OQuery
+
* Алгоритм - Язык OQuery для HTML
*Поисковый запрос - property_simple[key="idchain"]
+
* Поисковый запрос - строка
*Функция - что нужно нам найти в документе - значение атрибута.
+
<code>property_simple[key='callerid']</code>
*Номер элемента - оставляем пустым.
+
Запрос ищет все теги property_simple с атрибутом key="callerid"
*Атрибут - value
+
* Функция - Значение атрибута
*Результат в переменную - указываем переменную в которую будем сохранять результат парсера.
+
* Номер элемента - 1
 +
* Атрибут - строка "value"
 +
* Результат в переменную - переменная '''callerid''' (строковая)
 +
* Переход и Переход, неудача - на компонент "CalledId".
  
[[Файл:con3.png|center]]
 
  
Таким же образом настраиваем и все последующие парсеры,не забывая изменять значение атрибута
+
Компонент "'''CalledId'''". Определяет CalledId. Требуемое значение находится в теге <code><property_simple key="calledid" value="88001112233" /></code> в атрибуте value.
key в поисковом запросе на соответствующий нашему запросу, т.е. следующий парсер будет уже искать
+
* Документ - переменная '''content'''
номер линии соответственно: property_simple[key="linenumber"]
+
* Алгоритм - Язык OQuery для HTML
а так же указываем другую переменную.
+
* Поисковый запрос - строка
 +
<code>property_simple[key='calledid']</code>
 +
Запрос ищет все теги property_simple с атрибутом key="calledid"
 +
* Функция - Значение атрибута
 +
* Номер элемента - 1
 +
* Атрибут - строка "value"
 +
* Результат в переменную - переменная '''calledid''' (строковая)
 +
* Переход и Переход, неудача - на компонент "TimeStart".
  
Стоит отметить, что парсер позволяет сохранить информацию только в текстовом виде, соответственно
 
при получении временных данных, их прежде всего сохраняем в строковую переменную,а затем при
 
необходимости преобразуем в переменную типа Дата/время.
 
  
Так же для того что бы найти первый тег можно использовать указательный суффикс ":first" и для поиска последнего значения ":last".
+
Компонент "'''TimeStart'''". Определяет время начала звонка. Требуемое значение находится в теге <code><property_simple key="timestart" value="06.05.2015 10:06:43.462" /></code> в атрибуте value.
Таким образом для поиска времени поступления звонка воспользуемся суффиксом :first, поисковый запрос будет выглядеть так:
+
* Документ - переменная '''content'''
:'''(property_simple[key="timestart"]):first'''.
+
* Алгоритм - Язык OQuery для HTML
 +
* Поисковый запрос - строка
 +
<code>property_simple[key='timestart']</code>
 +
Запрос ищет все теги property_simple с атрибутом key="timestart"
 +
* Функция - Значение атрибута
 +
* Номер элемента - 1
 +
* Атрибут - строка "value"
 +
* Результат в переменную - переменная '''timestart''' (строковая)
 +
* Переход и Переход, неудача - на компонент "Вывод параметров".
  
 +
[[Файл:Урок 28 -007.png|center]]
  
[[Файл:con4.png|center]]
 
  
 +
Компонент "'''Вывод параметров'''". Отладочное уведомление для вывода всех найденных параметров звонка
 +
* Текст - выражение:
 +
'ПРОПУЩЕННЫЙ ЗВОНОК'+endline+
 +
'[callerid] '+[callerid]+endline+
 +
'[calledid] '+[calledid]+endline+
 +
'[timestart] '+[timestart]+endline+
 +
'[direction] '+[direction]
 +
* Способ оповещения - Всплывающее уведомление
 +
* Ключ получателя - внутренний номер администратора.
  
А для поиска времени окончания коммутации используем суффикс ":last" - '''(property_simple[key="timestop"]):last'''.
 
  
 +
Компонент "'''Отправка Email'''". Отправляет электронное письмо по пропущенному звонку.
 +
* Почтовый сервер - Согласно общим настройкам. Используются данные для подключения из модуля ''Общие настройки / Настройки E-mail''
 +
* Кому - строка ''director@oktell.ru''
 +
* От кого - строка ''info@oktell.ru'', как правило совпадает с логином для подключения к SMTP-серверу.
 +
* Тема - строка ''Пропущенный звонок''
 +
* Формат - текст
 +
* Содержание письма - выражение:
 +
'ПРОПУЩЕННЫЙ ЗВОНОК'+endline+
 +
'Номер абонента: '+[callerid]+endline+
 +
'Набранный номер: '+[calledid]+endline+
 +
'Время: '+[timestart]
  
[[Файл:con5.png|center]]
+
[[Файл:Урок 28 -008.png|center]]
  
  
Так же суффиксом ":last" воспользуемся,для того что бы определить имя последнего оператора,принявшего звонок, его id и номер его линии.
+
'''Скачать сценарий:''' [http://wiki.oktell.ru/images/a/aa/%D0%A1%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B9_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%D0%B0.oscr Сценарий обработки контента.oscr] (''собран на версии 2.12.0.150423'')
  
Затем произведем преобразование строчной даты и времени в тип Дата\время и произведем запись в БД,в нашу таблицу.
 
  
 +
==Назначение сценария==
  
[[Файл:con6.png|center]]
+
Сценарий обработки контента назначается в модуле ''Администрирование/Общие настройки'' на вкладке "'''Сценарии АТС'''". Для того, чтобы назначить сценарий выберите его в выпадающем списке напротив соответствующей строки и поставьте крестик для его активации, затем сохраните настройки. Выбранный сценарий в списке обозначается серым цветом.  
  
  
После чего сохраним сценарий на сервере и совершим тестовый звонок. Открыв нашу таблицу мы увидим данные,которые мы собрали с помощью служебного сценария сбора контента.
+
[[Файл:Урок 28 -010.png |center|700px]]
  
 
[[Файл:con8.png|center]]
 
 
 
Пример сценария:
 
 
[[Файл:Content.zip]]
 
  
  
Строка 159: Строка 213:
  
 
== Вопросы и задания ==
 
== Вопросы и задания ==
 
+
* Зачем нужен сценарий обработки контента? Что такое контент, какие виды контента существуют?
 
+
* Дополните данный сценарий информацией о том, какой внутренний номер пропустил данный звонок. Передать значение из главного сценария в сценарий контента вы можете с помощью сессионной переменной, либо через пользовательское поле в контенте. Попробуйте оба варианта.
 +
* Реализуйте в сценарии определение параметров успешного звонка: CallerId, CalledId, время звонка, номер внешней линии, имя и идентификатор последнего обслужившего сотрудника. Все найденные параметры сохраняйте в базу данных.
 +
* Настройте сценарий обработки контента для отправки всех записей разговоров в цепочке коммутаций на электронную почту. Таким образом, если клиент разговаривал с несколькими сотрудниками, в письмо должны быть вложены все разговоры клиента. Используйте статью: [http://wiki.oktell.ru/Отправка_записей_разговоров_на_e-mail Отправка записей разговоров на e-mail]. Модифицируйте сценарий для отправки записей разговоров только в тех случаях, когда клиент поставил оценку 1 или 2 в сценарии вместо отбоя.
  
 
{|cellpadding="10" cellspacing="0" border="0"
 
{|cellpadding="10" cellspacing="0" border="0"

Текущая версия на 10:10, 6 мая 2015

Наверх К предыдущему уроку К следующему уроку

Введение

Сценарий обработки контента - служебный сценарий, который запускается после завершения звонка на внешней линии. Сценарий предназначен для постобработки внешнего звонка и анализа специальной XML-структуры, называемой контентом линии. Разберемся с этой структурой поподробнее.

Контент линии - это идентификационная информация по линии, абоненту, времени, а также перечень всех коммутаций с указанием имени сценария, идентификатора и имени оператора, времени начала, времени конца, продолжительности и пр. Контент линии существует только у внешних линий, начинает заполняться с момента поступления звонка по каналу и сбрасывается при завершении этого звонка. Иными словами, данная информация существует только во время звонка. Контент линии помогает отследить все действия внешнего абонента, по каким сценариям IVR он проходил, какие операторы говорили с ним, а какие операторы пропустили звонок.

Рассмотрим следующую ситуацию: клиент позвонил в компанию и соединился с секретарем Марией. Мария осуществляет консультативный перевод на сотрудника Станислава, заранее предупреждая его о переключении. Клиент соединяется со Станиславом и после разговора, попадает в сценарий вместо отбоя, где оценивает качество консультации.

После того как линия положит трубку в контент линии попадут 4 коммутации:

  • соединение абонента с главным IVR сценарием
  • разговор абонента с секретарем Марией
  • разговор абонента с сотрудником Станиславом
  • соединение абонента со сценарием вместо отбоя

Следует отметить, что коммутация между сотрудниками Марией и Станиславом в контент линии не попадет, потому как в этом разговоре не участвовала внешняя линия абонента. В контент линии попадают только те разговоры, в которых участвовала линия клиента. Далее показан пример контента линии для указанной ситуации (повторяющиеся моменты вырезаны).


Урок 28 -001+.png


Наряду с контентом линии, в Oktell существует контент цепочки коммутаций (еще его называют контент сессии). Контент сессии существует в рамках цепочки коммутаций и в отличие от контента линии его можно получить как для внешних, так и для внутренних линий.

Следует отметить, что контенты линии и сессии отличаются друг от друга. В контент сессии для данной ситуации попадет еще разговор секретаря Марии с сотрудником Станиславом во время консультативного перевода, потому как этот вызов, как и другие был сделан в рамках одной цепочки. Также в контенте цепочки коммутаций фиксируется информация о пройденных очередях ожидания. Ниже показан пример контента цепочки коммутаций для того же примера (повторяющиеся моменты вырезаны).


Урок 28 -001++.png


Получить контент линии или цепочки коммутаций можно в любой момент с помощью одноименных функций в компоненте "Статус объекта" (действие — определить). Для линии вы можете определить как контент линии (XML), так и цепочки коммутаций (XML, Json). Для сессии (цепочки) доступно только определение контента цепочки коммутаций.


Урок 28 -002.png


В каждом из представленных контентов есть специальные пользовательские поля, куда вы можете заносить свою информацию. Иногда эту нужно для указания служебных данных или передачи некоторых параметров между сценариями, которые запускаются не в рамках одной сессии. В контенте линии пользовательское поле располагается в заголовке (показано на рисунке выше):

<property_cdata key="custominfo"><![CDATA[Любые данные]]></property_cdata>

В контенте цепочки коммутаций это несколько полей — одно в заголовке контента сессии и по одному на каждую коммутацию (показано на рисунке выше):

<property_cdata key="custom"><![CDATA[Любые данные]]></property_cdata>
<property_cdata key="custom"><![CDATA[Любые данные]]></property_cdata>

Определить и установить свои значения в эти пользовательские поля вы можете с помощью одноименных функций в компоненте "Статус объекта". Для линии доступны пользовательские поля обоих типов контентов, для сессии доступен только контент цепочки.


Урок 28 -003.png


Сценарий обработки контента

Как было сказано в начале, сценарий обработки контента запускается автоматически после окончания звонка на внешней линии. На вход в качестве параметра запуска сценарию поступает контент линии в формате XML. Получить контент линии можно также с помощью функции "Входной параметр 1". Далее в сценарии вы можете проанализировать эту структуру и определить различные параметры звонка. Рассмотрим этот процесс на примере задачи.

Задача: необходимо определять пропущенные звонки от клиентов и реализовать автоматическую отправку email директору с указанием номера абонента (callerid), набранного номера (calledid) и времени звонка. Пропущенным звонком в данной задаче будем считать такой, у которого не было ни одного соединения с оператором.

Чтобы решить эту задачу, нужно посмотреть на различие контентов между звонками, в которых были соединения с операторами и в которых их не было.

Урок 28 -009.png


Как видно из рисунка, соединения с операторами отмечается дополнительным тегом <abonent index="1"> внутри основного тега <commutation index="1">. Исходя из этого, если количество таких тегов равняется нулю, звонок можно считать пропущенным. Остальные параметры — направление звонка, CallerId, CalledId и время звонка можно также посмотреть из контента, на рисунке они отмечены синим цветом.

Итоговый сценарий выглядит следующим образом:


Урок 28 -004.png


Компонент "Старт". Сохраняет контент линии в переменную content.

  • Параметр запуска - переменная content (строковая)


Компонент "Вывод контента". Отладочное уведомление для вывода контента линии.

  • Текст - переменная content.
  • Способ оповещения - Всплывающее уведомление
  • Ключ получателя - внутренний номер администратора. Указать ключ в таком виде намного легче, чем выбирать пользователя в свойстве "Адресат".


Компонент "Количество коммутаций". Парсер определяет из контента количество коммутаций с абонентами. Поскольку контент представляет из себя XML структуру, используется алгоритм OQuery.

  • Документ - переменная content
  • Алгоритм - Язык OQuery для HTML
  • Поисковый запрос - строка
commutation:has(property_simple[name='abonent'])

Запрос ищет все теги commutation, внутри который есть тег property_simple с атрибутом name="abonent"

  • Функция - Количество элементов
  • Результат в переменную - переменная count (строковая)
  • Переход и Переход, неудача - на компонент "Пропущенный?". Переход по неудаче сделан для случая, если в контенте не будет ни одной коммутации с абонентом. Дело в том, что если парсер не находит нужных тегов, он возвращает ошибку.
Урок 28 -005.png


Компонент "Пропущенный?". Если парсер не нашел нужных тегов, то он перейдет по неудаче, а в переменную он возвратит пустое значение. Компонент сравнивает переменную count с пустой строкой, тем самым определяя пропущенный это звонок или нет.

  • Аргумент 1 - переменная count
  • Аргумент 2 - пустая строка
  • Тип сравнение - "="
  • Переход, если правда - на компонент "Определяем направление"
  • Переход, если ложь - на компонент "Стоп 1"


Компонент "Определяем направление". Определяет направление звонка - входящий или исходящий. Требуемое значение находится в теге <property_simple key="direction" value="1" name="cdIncoming" /> в атрибуте name.

  • Документ - переменная content
  • Алгоритм - Язык OQuery для HTML
  • Поисковый запрос - строка
property_simple[key='direction']

Запрос ищет все теги property_simple с атрибутом key="direction"

  • Функция - Значение атрибута
  • Номер элемента - 1
  • Атрибут - строка "name"
  • Результат в переменную - переменная direction (строковая)
  • Переход и Переход, неудача - на компонент "Входящий звонок?".


Компонент "Входящий звонок?". Поскольку в задании требуется определять только входящие звонки, у которых не было ни одной коммутации, компонент сравнивает полученное направление со строкой "cdIncoming".

  • Аргумент 1 - переменная direction
  • Аргумент 2 - строка "cdIncoming"
  • Тип сравнение - "="
  • Переход, если правда - на компонент "CallerId"
  • Переход, если ложь - на компонент "Стоп 2"
Урок 28 -006.png


Компонент "CallerId". Определяет CallerId. Требуемое значение находится в теге <property_simple key="callerid" value="88432110000" /> в атрибуте value.

  • Документ - переменная content
  • Алгоритм - Язык OQuery для HTML
  • Поисковый запрос - строка
property_simple[key='callerid']

Запрос ищет все теги property_simple с атрибутом key="callerid"

  • Функция - Значение атрибута
  • Номер элемента - 1
  • Атрибут - строка "value"
  • Результат в переменную - переменная callerid (строковая)
  • Переход и Переход, неудача - на компонент "CalledId".


Компонент "CalledId". Определяет CalledId. Требуемое значение находится в теге <property_simple key="calledid" value="88001112233" /> в атрибуте value.

  • Документ - переменная content
  • Алгоритм - Язык OQuery для HTML
  • Поисковый запрос - строка
property_simple[key='calledid']

Запрос ищет все теги property_simple с атрибутом key="calledid"

  • Функция - Значение атрибута
  • Номер элемента - 1
  • Атрибут - строка "value"
  • Результат в переменную - переменная calledid (строковая)
  • Переход и Переход, неудача - на компонент "TimeStart".


Компонент "TimeStart". Определяет время начала звонка. Требуемое значение находится в теге <property_simple key="timestart" value="06.05.2015 10:06:43.462" /> в атрибуте value.

  • Документ - переменная content
  • Алгоритм - Язык OQuery для HTML
  • Поисковый запрос - строка
property_simple[key='timestart']

Запрос ищет все теги property_simple с атрибутом key="timestart"

  • Функция - Значение атрибута
  • Номер элемента - 1
  • Атрибут - строка "value"
  • Результат в переменную - переменная timestart (строковая)
  • Переход и Переход, неудача - на компонент "Вывод параметров".
Урок 28 -007.png


Компонент "Вывод параметров". Отладочное уведомление для вывода всех найденных параметров звонка

  • Текст - выражение:
'ПРОПУЩЕННЫЙ ЗВОНОК'+endline+
'[callerid] '+[callerid]+endline+
'[calledid] '+[calledid]+endline+
'[timestart] '+[timestart]+endline+
'[direction] '+[direction]
  • Способ оповещения - Всплывающее уведомление
  • Ключ получателя - внутренний номер администратора.


Компонент "Отправка Email". Отправляет электронное письмо по пропущенному звонку.

  • Почтовый сервер - Согласно общим настройкам. Используются данные для подключения из модуля Общие настройки / Настройки E-mail
  • Кому - строка director@oktell.ru
  • От кого - строка info@oktell.ru, как правило совпадает с логином для подключения к SMTP-серверу.
  • Тема - строка Пропущенный звонок
  • Формат - текст
  • Содержание письма - выражение:
'ПРОПУЩЕННЫЙ ЗВОНОК'+endline+
'Номер абонента: '+[callerid]+endline+
'Набранный номер: '+[calledid]+endline+
'Время: '+[timestart]
Урок 28 -008.png


Скачать сценарий: Сценарий обработки контента.oscr (собран на версии 2.12.0.150423)


Назначение сценария

Сценарий обработки контента назначается в модуле Администрирование/Общие настройки на вкладке "Сценарии АТС". Для того, чтобы назначить сценарий выберите его в выпадающем списке напротив соответствующей строки и поставьте крестик для его активации, затем сохраните настройки. Выбранный сценарий в списке обозначается серым цветом.


Урок 28 -010.png


Поздравляем! Теперь вы знаете как проанализировать звонок после соединения. Можете переходить к следующему уроку.

Техническая документация: Сценарии АТС


Вопросы и задания

  • Зачем нужен сценарий обработки контента? Что такое контент, какие виды контента существуют?
  • Дополните данный сценарий информацией о том, какой внутренний номер пропустил данный звонок. Передать значение из главного сценария в сценарий контента вы можете с помощью сессионной переменной, либо через пользовательское поле в контенте. Попробуйте оба варианта.
  • Реализуйте в сценарии определение параметров успешного звонка: CallerId, CalledId, время звонка, номер внешней линии, имя и идентификатор последнего обслужившего сотрудника. Все найденные параметры сохраняйте в базу данных.
  • Настройте сценарий обработки контента для отправки всех записей разговоров в цепочке коммутаций на электронную почту. Таким образом, если клиент разговаривал с несколькими сотрудниками, в письмо должны быть вложены все разговоры клиента. Используйте статью: Отправка записей разговоров на e-mail. Модифицируйте сценарий для отправки записей разговоров только в тех случаях, когда клиент поставил оценку 1 или 2 в сценарии вместо отбоя.
Наверх К предыдущему уроку К следующему уроку