Соединение с последним обслужившим оператором — различия между версиями
(Новая страница: «Задача: При входящем звонке соединить клиента с последним обслужившим сотрудником. В дан...») |
м |
||
(не показано 14 промежуточных версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | + | [[Практики | Наверх]] | |
− | В данной статье последний обслуживший сотрудник - любой пользователь, который последний разговаривал с данным клиентом. Для решения этой задачи используется sql-запрос в статистику соединений [a_stat_connections_1x1] базы данных Oktell. | + | '''Цель''': При входящем звонке соединить клиента '''с последним обслужившим сотрудником'''. |
+ | |||
+ | В данной статье последний обслуживший сотрудник - любой пользователь, который последний разговаривал с данным клиентом. Для решения этой задачи используется sql-запрос в статистику соединений '''[a_stat_connections_1x1]''' базы данных Oktell. | ||
+ | |||
+ | '''Главный сценарий''' входящей маршрутизации выглядит следующим образом: | ||
− | |||
[[Файл:Соединениесоператором 001.PNG | center]] | [[Файл:Соединениесоператором 001.PNG | center]] | ||
− | |||
− | + | Компонент присвоения "'''Определяем Caller id'''". В переменную '''callerid''' записываем номер абонента с помощью функции "'''Номер абонента (CallerID)'''" | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Файл:Соединениесоператором 002.PNG | center]] | [[Файл:Соединениесоператором 002.PNG | center]] | ||
− | + | ||
+ | В компоненте '''sql-запроса''' "'''определяем последнего обслужившего сотрудника'''" делаем запрос в таблицу соединений и определяем с кем в последний раз общался данный абонент: | ||
+ | |||
+ | |||
+ | select @prefix=prefix,@name=np.name from | ||
+ | ( | ||
+ | select np.prefix, u.name from A_RuleRecords rr | ||
+ | inner join | ||
+ | A_NumberPlanAction as npa | ||
+ | on rr.ruleid = npa.extraid and npa.numtype=0 | ||
+ | inner join | ||
+ | A_NumberPlan as np | ||
+ | on np.id=npa.numid | ||
+ | inner join | ||
+ | A_Users as u | ||
+ | on rr.reactid = u.id | ||
+ | ) np | ||
+ | where np.Prefix in | ||
+ | ( | ||
+ | select cn.Prefix from | ||
+ | ( | ||
+ | select np.Prefix, count(np.Name) countname from | ||
+ | ( | ||
+ | select np.prefix, u.name from A_RuleRecords rr | ||
+ | inner join | ||
+ | A_NumberPlanAction as npa | ||
+ | on rr.ruleid = npa.extraid and npa.numtype=0 | ||
+ | inner join | ||
+ | A_NumberPlan as np | ||
+ | on np.id=npa.numid | ||
+ | inner join | ||
+ | A_Users as u | ||
+ | on rr.reactid = u.id | ||
+ | ) np | ||
+ | group by np.Prefix | ||
+ | ) cn where cn.countname = 1 | ||
+ | ) | ||
+ | and np.Name in (select top 1 username From | ||
+ | ( select bstr username,TimeAnswer from a_stat_connections_1x1 where astr = @callerid and bstr!='ivr' | ||
+ | union all | ||
+ | select astr username,TimeAnswer from A_Stat_Connections_1x1 where astr !='ivr' and bstr=@callerid)ppp | ||
+ | order by timeanswer desc) | ||
+ | |||
[[Файл:Соединениесоператором 003.PNG | center]] | [[Файл:Соединениесоператором 003.PNG | center]] | ||
− | |||
+ | Переменной запроса '''@callerid''' присваиваем переменную сценария '''callerid''', '''@name''' - '''operator''', '''@prefix''' - '''operatorprefix''' | ||
+ | |||
+ | |||
+ | [[Файл:Соединениесоператором 004.PNG | center]] | ||
+ | |||
+ | |||
+ | Переменная '''operatorprefix''' теперь содержит внутренний номер нужного нам сотрудника, если такой сотрудник не найден, то номер будет пустой. '''SQL запрос''' отсеивает все групповые номера, оставляя только стандартные номера, у которых определен только один пользователь. | ||
+ | |||
+ | |||
+ | Далее запускается отладочное уведомление, в котором показывается значение переменной '''callerid''' и '''operatorprefix'''. Затем в компоненте сравнения определяется пустой ли номер '''operatorprefix'''. | ||
− | |||
[[Файл:Соединениесоператором 006.PNG | center]] | [[Файл:Соединениесоператором 006.PNG | center]] | ||
− | Если номер не пустой и оператор определен, сценарий переходит по ветке ложь на компонент "переключение" (промежуточное отладочное уведомление не рассматривается). В компоненте переключения в свойстве "номер" указана переменная operatorprefix. По желанию, в компоненте можно включить очередь ожидания. | + | |
+ | Если номер не пустой и оператор определен, сценарий переходит по ветке ложь на компонент "'''переключение'''" (промежуточное отладочное уведомление не рассматривается). В компоненте переключения в свойстве "'''номер'''" указана переменная '''operatorprefix'''. По желанию, в компоненте можно включить '''очередь ожидания'''. | ||
+ | |||
[[Файл:Соединениесоператором 007.PNG | center]] | [[Файл:Соединениесоператором 007.PNG | center]] | ||
− | Если данного оператора нет на месте, звонок переводится в главный сценарий входящую маршрутизацию. | + | |
+ | Если данного оператора нет на месте, звонок переводится в главный сценарий входящую маршрутизацию. Сценарий работает при любой коммутации (перевод звонка, перехват, групповой номер) | ||
+ | |||
+ | '''Дополнительно''': Если последний раз клиент общался с директором, то скорее всего при повторном звонке не надо переводить заново на директора, в таком случае, необходимо доработать sql-запрос. Например, создав таблицу имен '''table''', на которых не надо переводить сразу звонок и указав в последней части (''перед order by timeanswer desc'') | ||
+ | |||
+ | and not in table | ||
+ | |||
+ | либо перечислением: | ||
+ | |||
+ | not in ('admin', 'zamdir', 'director') | ||
+ | |||
+ | На этих пользователей клиент сразу не будет переводиться. | ||
+ | |||
+ | '''Скачать сценарий''': [[Media:%D0%A1%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D1%81%D0%BE%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%BC.zip|Соединение с сотрудником]] | ||
+ | |||
+ | <span style="color:red;"> ВНИМАНИЕ: '''Данный сценарий не является готовым решением, а представлен как демонстрационный материал''' | ||
+ | |||
+ | |||
+ | '''Дополнительно:''' SQL-запрос, возвращающий имя и номер последнего обслуживающего оператора и дату последней коммутации с абонентом. Алгоритм определяет номер оператора, в котором суммарно меньше объектов. Таким образом, если вы хотите чтобы у вас точно определялся внутренний номер, то создайте номера, в которых будет только 1 пользователь. | ||
+ | |||
+ | SELECT top 1 @name=t.username, @prefix=np.Prefix, @time=t.TimeStop | ||
+ | FROM | ||
+ | (SELECT TOP 1 | ||
+ | CASE WHEN astr = @callerid THEN bstr ELSE astr END username, | ||
+ | CASE WHEN astr = @callerid THEN BUserId ELSE AUserId END user_id, | ||
+ | TimeStop | ||
+ | FROM a_stat_connections_1x1 | ||
+ | WHERE (astr = @callerid OR bstr = @callerid) | ||
+ | AND (NOT lower(bstr) = 'ivr' AND NOT lower(astr) = 'ivr' ) | ||
+ | ORDER BY TimeStop DESC) t | ||
+ | JOIN A_RuleRecords rr ON rr.reactid= t.user_id | ||
+ | JOIN A_NumberPlanAction AS npa ON rr.ruleid = npa.extraid AND npa.numtype = 0 | ||
+ | LEFT JOIN A_NumberPlan AS np ON np.id = npa.numid | ||
+ | LEFT JOIN A_NumberPlanAction AS npa2 ON npa2.numid = npa.numid AND | ||
+ | npa2.numtype = 0 | ||
+ | LEFT JOIN A_RuleRecords rr2 ON rr2.ruleid = npa2.extraid | ||
+ | GROUP BY t.username, np.Prefix, t.TimeStop | ||
+ | ORDER BY t.TimeStop DESC, count(rr2.reactid) ASC |
Текущая версия на 11:14, 31 марта 2023
Цель: При входящем звонке соединить клиента с последним обслужившим сотрудником.
В данной статье последний обслуживший сотрудник - любой пользователь, который последний разговаривал с данным клиентом. Для решения этой задачи используется sql-запрос в статистику соединений [a_stat_connections_1x1] базы данных Oktell.
Главный сценарий входящей маршрутизации выглядит следующим образом:
Компонент присвоения "Определяем Caller id". В переменную callerid записываем номер абонента с помощью функции "Номер абонента (CallerID)"
В компоненте sql-запроса "определяем последнего обслужившего сотрудника" делаем запрос в таблицу соединений и определяем с кем в последний раз общался данный абонент:
select @prefix=prefix,@name=np.name from ( select np.prefix, u.name from A_RuleRecords rr inner join A_NumberPlanAction as npa on rr.ruleid = npa.extraid and npa.numtype=0 inner join A_NumberPlan as np on np.id=npa.numid inner join A_Users as u on rr.reactid = u.id ) np where np.Prefix in ( select cn.Prefix from ( select np.Prefix, count(np.Name) countname from ( select np.prefix, u.name from A_RuleRecords rr inner join A_NumberPlanAction as npa on rr.ruleid = npa.extraid and npa.numtype=0 inner join A_NumberPlan as np on np.id=npa.numid inner join A_Users as u on rr.reactid = u.id ) np group by np.Prefix ) cn where cn.countname = 1 ) and np.Name in (select top 1 username From ( select bstr username,TimeAnswer from a_stat_connections_1x1 where astr = @callerid and bstr!='ivr' union all select astr username,TimeAnswer from A_Stat_Connections_1x1 where astr !='ivr' and bstr=@callerid)ppp order by timeanswer desc)
Переменной запроса @callerid присваиваем переменную сценария callerid, @name - operator, @prefix - operatorprefix
Переменная operatorprefix теперь содержит внутренний номер нужного нам сотрудника, если такой сотрудник не найден, то номер будет пустой. SQL запрос отсеивает все групповые номера, оставляя только стандартные номера, у которых определен только один пользователь.
Далее запускается отладочное уведомление, в котором показывается значение переменной callerid и operatorprefix. Затем в компоненте сравнения определяется пустой ли номер operatorprefix.
Если номер не пустой и оператор определен, сценарий переходит по ветке ложь на компонент "переключение" (промежуточное отладочное уведомление не рассматривается). В компоненте переключения в свойстве "номер" указана переменная operatorprefix. По желанию, в компоненте можно включить очередь ожидания.
Если данного оператора нет на месте, звонок переводится в главный сценарий входящую маршрутизацию. Сценарий работает при любой коммутации (перевод звонка, перехват, групповой номер)
Дополнительно: Если последний раз клиент общался с директором, то скорее всего при повторном звонке не надо переводить заново на директора, в таком случае, необходимо доработать sql-запрос. Например, создав таблицу имен table, на которых не надо переводить сразу звонок и указав в последней части (перед order by timeanswer desc)
and not in table
либо перечислением:
not in ('admin', 'zamdir', 'director')
На этих пользователей клиент сразу не будет переводиться.
Скачать сценарий: Соединение с сотрудником
ВНИМАНИЕ: Данный сценарий не является готовым решением, а представлен как демонстрационный материал
Дополнительно: SQL-запрос, возвращающий имя и номер последнего обслуживающего оператора и дату последней коммутации с абонентом. Алгоритм определяет номер оператора, в котором суммарно меньше объектов. Таким образом, если вы хотите чтобы у вас точно определялся внутренний номер, то создайте номера, в которых будет только 1 пользователь.
SELECT top 1 @name=t.username, @prefix=np.Prefix, @time=t.TimeStop FROM (SELECT TOP 1 CASE WHEN astr = @callerid THEN bstr ELSE astr END username, CASE WHEN astr = @callerid THEN BUserId ELSE AUserId END user_id, TimeStop FROM a_stat_connections_1x1 WHERE (astr = @callerid OR bstr = @callerid) AND (NOT lower(bstr) = 'ivr' AND NOT lower(astr) = 'ivr' ) ORDER BY TimeStop DESC) t JOIN A_RuleRecords rr ON rr.reactid= t.user_id JOIN A_NumberPlanAction AS npa ON rr.ruleid = npa.extraid AND npa.numtype = 0 LEFT JOIN A_NumberPlan AS np ON np.id = npa.numid LEFT JOIN A_NumberPlanAction AS npa2 ON npa2.numid = npa.numid AND npa2.numtype = 0 LEFT JOIN A_RuleRecords rr2 ON rr2.ruleid = npa2.extraid GROUP BY t.username, np.Prefix, t.TimeStop ORDER BY t.TimeStop DESC, count(rr2.reactid) ASC