Примеры пользовательских процедур — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
Строка 6: Строка 6:
  
 
Пользовательская процедура применяется в Call-центре для динамического распределения операторов внутри задачи. Процедура часто используется в тех случаях, когда каждому клиенту необходимо предоставлять различный набор операторов для обслуживания. В частности, формируемый список может зависеть от квалификации оператора и степени важности клиента. Нередко пользовательская процедура применяется для закрепления абонента за оператором, например в задачах с автоматическим перезвоном.  
 
Пользовательская процедура применяется в Call-центре для динамического распределения операторов внутри задачи. Процедура часто используется в тех случаях, когда каждому клиенту необходимо предоставлять различный набор операторов для обслуживания. В частности, формируемый список может зависеть от квалификации оператора и степени важности клиента. Нередко пользовательская процедура применяется для закрепления абонента за оператором, например в задачах с автоматическим перезвоном.  
 +
 +
'''Техническая документация:''' [[Задачи:Ресурсы#procedura|Пользовательская процедура]]
  
 
Чтобы установить пользовательскую процедуру в задаче необходимо выполнить следующие шаги:  
 
Чтобы установить пользовательскую процедуру в задаче необходимо выполнить следующие шаги:  
  
 +
'''1.''' В настройках задачи на вкладке "'''Ресурсы'''" выберите "'''Вариант обхода операторов'''" - Пользовательская процедура.
 +
 +
 +
[[Пример пользовательских процедур.png|center]]
 +
 +
 +
'''2.''' Измените текст хранимой процедуры A_TaskManager_OperatorsAll_Get_Custom. Запрос должен возвращать столбец с GUID-идентификаторами операторов в порядке уменьшения приоритета. В процессе выделения оператора, задача пробегается по полученному от хранимой процедуры списку сверху вниз и берет первого доступного оператора, который работает по данной задаче (является ресурсом для данной задачи). В запросе вы можете использовать следующие входные переменные
 +
*@idtask - идентификатор задачи
 +
*@idlist - идентификатор таблицы абонентов
 +
*@idabonent - номер абонента в списке
 +
*@idline - идентификатор внешней линии
 +
*@dtnow - текущее время сервера
 +
 +
Чтобы пользовательская процедура срабатывала только для определенной задачи следует воспользоваться конструкцией ''if'':
 +
 +
if (@idtask = 'B77E5601-A103-4A41-B1FD-6E82EEB6B46A')
 +
 +
ID задачи можно узнать в таблице '''A_TaskManager_Tasks'''
 +
 +
 +
Для изменения текста пользовательской процедуры используйте SQL Server Management Studio (SSMS). Найдите хранимую процедуру в списке и нажмите "Изменить". Запрос следует вставлять в специально предназначенное для этого место после комментария (см. рисунок). После изменения выполните запрос.
 +
 +
 +
[[Файл:Перезвон-013.png|center]]
 +
 +
 +
Далее в статье представлены некоторые примеры пользовательских процедур, которые вы можете использовать для решения собственных задач.
  
  
 
== Выбор оператора в зависимости от его приоритета ==  
 
== Выбор оператора в зависимости от его приоритета ==  
  
таблица создана с полями id name mark  
+
Если в компании операторы имеют некоторое значение квалификации, можно настроить задачу таким образом, чтобы все поступающие абоненты приоритетно распределялись на менее опытных, а если они заняты - то на более опытных специалистов. Для этого создана таблица [oktell].[dbo].[Poryadok_operatory] с полями id (идентификатор оператора), name (имя оператора), mark (оценка квалификации). Хранимая процедура создана таким образом, что в случайном порядке берет менее опытных операторов с оценкой меньше 50, а затем добавляет к списку более опытных.
берет первых менее опытных операторов с оценкой меньше 50 и более опытных после если прочие заняты.
+
в случайном порядке чтобы не нагружать одного если потом слишком маленький
+
  
 
<pre>
 
<pre>
DECLARE @Id uniqueidentifier
+
if (@idtask = '703DDF3A-47E5-4C87-AF0C-5E90130819A8')
IF (@idtask = '703DDF3A-47E5-4C87-AF0C-5E90130819A8')
+
begin
    BEGIN
+
select *
      SELECT * FROM (SELECT TOP 1000 [id]
+
from (
      FROM [oktell].[dbo].[Poryadok_operatory]  
+
select top 1000 [id]
      wHERE mark < 50 order by NEWID()) a
+
from [oktell].[dbo].[Poryadok_operatory]
      UNION ALL
+
where mark < 50
      SELECT * FROM
+
order by NEWID()
          (SELECT TOP 1000 [id]
+
) a
          FROM [oktell].[dbo].[Poryadok_operatory]  
+
          WHERE mark >= 50
+
union all
          ORDER BY NEWID()
+
          ) b
+
select *
    END
+
from (
 +
select top 1000 [id]
 +
from [oktell].[dbo].[Poryadok_operatory]
 +
where mark >= 50
 +
order by NEWID()
 +
) b
 +
end
 
</pre>
 
</pre>
  
==С закреплением оператора==
+
==С закреплением оператора за абонентом==
  
Пользовательская процедур
+
Пользовательская процедура позволяет прикрепить абонента за оператором.
  
 
<pre>
 
<pre>
Строка 61: Строка 94:
  
  
==С закреплением оператора и проверкой статуса ==
+
==С закреплением оператора за абонентом и проверкой статуса оператора ==
  
 
<pre>
 
<pre>

Версия 09:02, 22 декабря 2014

Наверх

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

Пользовательская процедура применяется в Call-центре для динамического распределения операторов внутри задачи. Процедура часто используется в тех случаях, когда каждому клиенту необходимо предоставлять различный набор операторов для обслуживания. В частности, формируемый список может зависеть от квалификации оператора и степени важности клиента. Нередко пользовательская процедура применяется для закрепления абонента за оператором, например в задачах с автоматическим перезвоном.

Техническая документация: Пользовательская процедура

Чтобы установить пользовательскую процедуру в задаче необходимо выполнить следующие шаги:

1. В настройках задачи на вкладке "Ресурсы" выберите "Вариант обхода операторов" - Пользовательская процедура.


center


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

  • @idtask - идентификатор задачи
  • @idlist - идентификатор таблицы абонентов
  • @idabonent - номер абонента в списке
  • @idline - идентификатор внешней линии
  • @dtnow - текущее время сервера

Чтобы пользовательская процедура срабатывала только для определенной задачи следует воспользоваться конструкцией if:

if (@idtask = 'B77E5601-A103-4A41-B1FD-6E82EEB6B46A')

ID задачи можно узнать в таблице A_TaskManager_Tasks


Для изменения текста пользовательской процедуры используйте SQL Server Management Studio (SSMS). Найдите хранимую процедуру в списке и нажмите "Изменить". Запрос следует вставлять в специально предназначенное для этого место после комментария (см. рисунок). После изменения выполните запрос.


Перезвон-013.png


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


Выбор оператора в зависимости от его приоритета

Если в компании операторы имеют некоторое значение квалификации, можно настроить задачу таким образом, чтобы все поступающие абоненты приоритетно распределялись на менее опытных, а если они заняты - то на более опытных специалистов. Для этого создана таблица [oktell].[dbo].[Poryadok_operatory] с полями id (идентификатор оператора), name (имя оператора), mark (оценка квалификации). Хранимая процедура создана таким образом, что в случайном порядке берет менее опытных операторов с оценкой меньше 50, а затем добавляет к списку более опытных.

if (@idtask = '703DDF3A-47E5-4C87-AF0C-5E90130819A8')
begin
	select *
	from (
		select top 1000 [id]
		from [oktell].[dbo].[Poryadok_operatory]
		where mark < 50
		order by NEWID()
		) a
	
	union all
	
	select *
	from (
		select top 1000 [id]
		from [oktell].[dbo].[Poryadok_operatory]
		where mark >= 50
		order by NEWID()
		) b
end

С закреплением оператора за абонентом

Пользовательская процедура позволяет прикрепить абонента за оператором.

IF (@idtask = 'B8A22910-BFA4-480D-BFB1-151D0C06F93B')
 BEGIN

  SELECT @Id = operatorid
  FROM TableMain 
  WHERE Id = @idabonent
  
  IF (@Id is NULL)
    BEGIN
      SELECT u.Id
      FROM A_Users u
      INNER JOIN A_UserParams up ON u.Id = up.Iduser
      WHERE IsOperator = 1
      ORDER BY NEWID()
    END
  ELSE
    BEGIN
    SELECT @Id Id
    END


С закреплением оператора за абонентом и проверкой статуса оператора

 IF (@idtask = 'B77E5601-A103-4A41-B1FD-6E82EEB6B46A')  
 BEGIN
 
 DECLARE @state INT 

 SELECT @ID = idoperator
 FROM clients
 WHERE id = @idabonent

 SELECT top 1  @state = h.state 
 FROM A_Users u
 LEFT JOIN 
        (SELECT h.*
         FROM 
            (SELECT UserId, max(TimeChange) TimeChange
            FROM A_UserStateHistory 
            GROUP BY UserId ) t
        JOIN A_UserStateHistory h 
        ON t.UserId = h.UserId AND h.TimeChange = t.TimeChange
 ) h ON h.UserId = u.Id
 WHERE u.id   = @ID

 IF (@state= 0 or @state is null)
   BEGIN
     SELECT u.Id
     FROM A_Users u
     INNER JOIN A_UserParams up 
     ON u.Id = up.Iduser
     WHERE IsOperator = 1
     ORDER BY NEWID()
   END
 ELSE
   BEGIN
     SELECT @ID Id
   END
 END