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