Категория: Разное
Печать

Наша компания занимается настройкой корпоративных АТС на базе Asterisk. 

В данном продукте есть особенность в логике работы команды Queue, а именно с обходом агентов в realtime очереди, т.е. когда у вас список участников очереди хранится в базе данных.

 

Допустим у нас есть очередь myqueue с порядком обзвона участников = linear

Требуемый порядок обзвона участников - SIP/105 , SIP/102 , SIP/101

 

Типовая структура таблицы участников очереди

CREATE TABLE queue_member_table (
uniqueid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
membername varchar(40),
queue_name varchar(128),
interface varchar(128),
penalty INT(11),
paused INT(11),
UNIQUE KEY queue_interface (queue_name, interface)
);

insert into queue_member_table (queue_name,interface) values ('myqueue','SIP/105');

insert into queue_member_table (queue_name,interface) values ('myqueue','SIP/102');

insert into queue_member_table (queue_name,interface) values ('myqueue','SIP/101');

 

Что происходит при вызове команды queue

exten => 900,1, Queue(myqueue)

 

Asterisk делает sql запрос к таблице участников , а именно

SELECT * FROM queue_member_table WHERE interface LIKE '%' AND queue_name = 'myqueue' ORDER BY interface

 

В запросе указан порядок сортировки по полю interface. Результат выборки будет следующим

SIP/101

SIP/102

SIP/105

 

Соответственно логика обзвона участников очереди совсем не та, которую мы ожидаем.

 

Для того чтобы решить эту проблему нами был разработан патч, который вносит исправление в формат запроса к таблице участников. 

Патч гарантированно работает на Asterisk-certified 11.6-cert18 с настроенной конфигурацией через модуль res_odbc

 

1. Скачайте и извлеките из архива ПО asterisk.

2. Сохраните данный код в файл patch_odbc_queue_order.diff в каталог с извлеченными исходниками

--- res/res_config_odbc.c

+++ res/res_config_odbc.c

@@ -375,7 +375,13 @@

        }

        va_end(aq);

 

-       snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " ORDER BY %s", initfield);

+

+       if ( strcmp(initfield,"interface") == 0 ) {

+           snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " ORDER BY %s", "-1");

+       } else {

+           snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " ORDER BY %s", initfield);

+       }

 

        va_copy(cps.ap, ap);

        stmt = ast_odbc_prepare_and_execute(obj, custom_prepare, &cps);

 

3. Перейдите в каталог с исходниками, выполните команду

patch -p0 < patch_odbc_queue_order.diff

 

4. Собирайте asterisk

 

Также вы можете добавить в таблицу queue_member_table  свое поле, определяющее порядок сортировки (например inorder) и заменить в патче 

snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " ORDER BY %s", "-1");

на

snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " ORDER BY %s", "inorder");