Блог компании MyAsterisk / Записки Астерискера. Составить график дежурств…

в 11:40, , рубрики: asterisk, ip-pbx, ip-телефония

«Мы решили сделать СПРАВЕДЛИВОЕ распределение входящих звонков» — заявило руководство: «Каждый день месяца звонки будут идти РАЗНЫМИ маршрутами на менеджеров. График будем составлять на месяц вперед.»

Так, значит раз в месяц мне понадобится перелопачивать весь диалплан Asterisk в соответствии с установленной схемой. Очень обрадовали ...
Как работало ранее.

Все входящие звонки принимают секретари и переводят на менеджеров типа:

exten => 555,1,Dial(SIP/22&SIP/23&SIP/24&SIP/25)

т.е. одновременно у всех начинают звонить аппараты. Кто первый схватил трубку — «того и тапки».

Но эта схема перестала нравиться. Запросили СЛУЧАЙНОЕ распределение очередности. Ну не вопрос:

exten => 555,1,Set(variant=$[RAND(1,5)])
exten => 555,n,Goto(n(${variant})

exten => 555,n(1),Dial(SIP/22)

Такая конструкция продержалась почти несколько месяцев и никто не жаловался. Вот только сезон продаж стал затихать и… решили менять последовательность звонков. Мол в понедельник сначала 22, потом 25, потом 23 и т.д.

Пришлось прибегнуть к конструкции типа GotoIFTime, а последовательность закинуть в группы по дням недели.
В результате еще пару месяцев все было хорошо.

А вот теперь приняли решение составлять график на каждый месяц! Что ж — будем упрощать процедуру.

Решение.

Для начала я соорудил табличку в базе MySQL вида: Dat(дата месяца) и variant(строка с перечислением последовательности сип-номеров менеджеров). Получилось что-то вроде «12.10.2011»--«2324252122»

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

CREATE
VIEW `view_grafik`
AS
SELECT variant FROM grafik_work WHERE dat=CURDATE();

Остались сущие пустяки:

exten => s,n,MYSQL(Connect uid localhost asterisk 12345678 asterisk)
exten => s,n,MYSQL(Query result ${uid} Select `variant` from view_grafik)
exten => s,n,MYSQL(Fetch row ${result} variant)
exten => s,n,NoOp( — ${row} — ${variant} )
exten => s,n,MYSQL(Disconnect ${uid} )

То есть на выходе получаем в переменной ${variant} саму последовательность. Не забыв проверить на «пустоту» переменной, переходим к вызову:

exten => s,n,Set(count=0)
exten => s,n,While($[ ${count} <= 5 ])
exten => s,n,Set(begin=$[${count}*2]}
exten => s,n,Set(nomer=${variant:$[${begin}]:2})
exten => s,n,Dial(SIP/${nomer})
exten => s,n,Set(count=$[ ${count}+1 ])
exten => s,n,EndWhile()

Все! Остался web-интерфейс заполнения по дням месяца.
Кстати.
Столкнулся с интересной проблемой при решении. Обратите внимание на конструкцию: ${variant:$[${begin}]:2}.
Первоначально она была другого вида: ${variant:${begin}:2}, но… я получал вот что:
232425
2425
25
т.е. вроде бы правильно, но строка состояла не из двух цифр. Вот только после введения квадратных кавычек все стало срабатывать корректно. Интересно — почему?
Автор:

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js