Соединение с последним обслужившим оператором — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
м
 
(не показано 9 промежуточных версии этого же участника)
Строка 1: Строка 1:
Задача: При входящем звонке соединить клиента '''с последним обслужившим сотрудником'''.  
+
[[Практики | Наверх]]
 +
 
 +
'''Цель''': При входящем звонке соединить клиента '''с последним обслужившим сотрудником'''.  
  
 
В данной статье последний обслуживший сотрудник - любой пользователь, который последний разговаривал с данным клиентом. Для решения этой задачи используется sql-запрос в статистику соединений '''[a_stat_connections_1x1]''' базы данных Oktell.
 
В данной статье последний обслуживший сотрудник - любой пользователь, который последний разговаривал с данным клиентом. Для решения этой задачи используется sql-запрос в статистику соединений '''[a_stat_connections_1x1]''' базы данных Oktell.
Строка 51: Строка 53:
 
  ) cn where cn.countname = 1
 
  ) cn where cn.countname = 1
 
  )
 
  )
  and np.Name in (select top 1 bstr from a_stat_connections_1x1  
+
  and np.Name in (select top 1 username From
where astr = @callerid   
+
( select bstr username,TimeAnswer from a_stat_connections_1x1 where astr = @callerid  and bstr!='ivr'
and bstr!='ivr'  
+
union all
order by timeanswer desc)
+
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]]
  
Строка 69: Строка 72:
  
  
Далее запускается отладочное уведомление, в котором показывается значение переменной '''callerid''' и '''operatorprefix'''. Затем в компоненте сравнения определяется пустой ли номер '''callerid'''.  
+
Далее запускается отладочное уведомление, в котором показывается значение переменной '''callerid''' и '''operatorprefix'''. Затем в компоненте сравнения определяется пустой ли номер '''operatorprefix'''.  
  
  
Строка 83: Строка 86:
 
Если данного оператора нет на месте, звонок переводится в главный сценарий входящую маршрутизацию. Сценарий работает при любой коммутации (перевод звонка, перехват, групповой номер)
 
Если данного оператора нет на месте, звонок переводится в главный сценарий входящую маршрутизацию. Сценарий работает при любой коммутации (перевод звонка, перехват, групповой номер)
  
'''Дополнительно''': Если последний раз клиент общался с директором, то скорее всего при повторном звонке не надо переводить заново на директора, в таком случае, необходимо доработать sql-запрос. Например, создав таблицу имен table, на которых не надо переводить сразу звонок  и указав в последней части (перед order by timeanswer desc)  
+
'''Дополнительно''': Если последний раз клиент общался с директором, то скорее всего при повторном звонке не надо переводить заново на директора, в таком случае, необходимо доработать sql-запрос. Например, создав таблицу имен '''table''', на которых не надо переводить сразу звонок  и указав в последней части (''перед order by timeanswer desc'')  
  
 
  and not in table  
 
  and not in table  
Строка 93: Строка 96:
 
На этих пользователей клиент сразу не будет переводиться.  
 
На этих пользователей клиент сразу не будет переводиться.  
  
'''Скачать сценарий''': [[Файл:Соединение с сотрудником.zip]]
+
'''Скачать сценарий''': [[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.

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


Соединениесоператором 001.PNG


Компонент присвоения "Определяем Caller id". В переменную callerid записываем номер абонента с помощью функции "Номер абонента (CallerID)"


Соединениесоператором 002.PNG


В компоненте 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


Переменной запроса @callerid присваиваем переменную сценария callerid, @name - operator, @prefix - operatorprefix


Соединениесоператором 004.PNG


Переменная operatorprefix теперь содержит внутренний номер нужного нам сотрудника, если такой сотрудник не найден, то номер будет пустой. SQL запрос отсеивает все групповые номера, оставляя только стандартные номера, у которых определен только один пользователь.


Далее запускается отладочное уведомление, в котором показывается значение переменной callerid и operatorprefix. Затем в компоненте сравнения определяется пустой ли номер operatorprefix.


Соединениесоператором 006.PNG


Если номер не пустой и оператор определен, сценарий переходит по ветке ложь на компонент "переключение" (промежуточное отладочное уведомление не рассматривается). В компоненте переключения в свойстве "номер" указана переменная operatorprefix. По желанию, в компоненте можно включить очередь ожидания.


Соединениесоператором 007.PNG


Если данного оператора нет на месте, звонок переводится в главный сценарий входящую маршрутизацию. Сценарий работает при любой коммутации (перевод звонка, перехват, групповой номер)

Дополнительно: Если последний раз клиент общался с директором, то скорее всего при повторном звонке не надо переводить заново на директора, в таком случае, необходимо доработать 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