Наша компания занимается настройкой корпоративных АТС на базе 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");