Чат  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

"Сворачивание" CEL для выдачи в виде "старого" CDR

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модератор: april22

"Сворачивание" CEL для выдачи в виде "старого" CDR

Сообщение Volosko » 06 апр 2018, 18:45

Если можно сильно не бейте!

В связи с тем что в 13ой версии CDR стал выдавать информацию несколько иначе чем раньше в связи с чем посыпалась логика подсчета звонков, был написан sql для выдергивания из cel информации и приведению её к виду "старого" cdr.

Что он делает:
Из таблицы cel тащатся записи, которые потом "сворчаиваются" запросом в одну строку с началом разговора, концом разговора, подсчетом секунд разговора, и прочей информацией типа кто кому позвонил. Если вдруг интересно посмотрите пожалуйста у себя?
Если найдете ошибки буду рад замечаниям и исправлениям, ну и конечно дополнениям.


Код: выделить все

use asterisk;

select cel_start.id as start_id,
        cel_start.eventtime as start_eventtime,
        cel_app.eventtime as app_eventtime,
        cel_answer.eventtime as answer_eventtime,
        cel_end.eventtime as end_eventtime,
        cel_start.context as start_context,
        cel_start.cid_name as start_cid_name,
        cel_start.cid_num as start_cid_num,
        cel_start.exten as start_exten,
        cel_answer.cid_num as answer_cid_num,
        cel_answer.cid_name as answer_cid_name,
        cel_start.uniqueid as start_uniqueid,
        timestampdiff(SECOND, cel_start.eventtime, cel_end.eventtime) as delta_call_time,
        timestampdiff(SECOND, cel_app.eventtime, cel_end.eventtime) as delta_app_time,
        timestampdiff(SECOND, cel_answer.eventtime, cel_end.eventtime) as delta_answer_time
from (select * from cel where eventtype like 'CHAN_START' and uniqueid = linkedid and LENGTH(exten) > 3) as cel_start
   left join (select min(id) as id, min(eventtime) as eventtime, uniqueid from cel where eventtype like 'APP_START' group by uniqueid) as cel_app
   on cel_app.uniqueid = cel_start.uniqueid
   left join (select id, eventtime, uniqueid from cel where eventtype like 'CHAN_END') as cel_end
   on cel_end.uniqueid = cel_start.uniqueid
   left join (select cel_min_brige.id, cel_min_brige.eventtime, cel_min_brige.uniqueid, cel_min_brige.linkedid, cel_min_brige.cid_name, cel_min_brige.cid_num from cel as cel_min_brige
               inner join (select if(tran_cel.id_tran is null, min(с0.id), tran_cel.id_secbri) as id from cel as с0 
                           left join (select с1.id as id_tran, с1.linkedid, с2.id as id_secbri from cel as с1
                                       left join (select с3.id, с3.linkedid from cel as с3 where с3.eventtype like 'BRIDGE_ENTER' and с3.uniqueid != с3.linkedid) as с2
                                       on с2.linkedid = с1.linkedid and с2.id > с1.id
                                    where с1.eventtype like '%TRANSF%') as tran_cel
                           on tran_cel.linkedid = с0.linkedid
                        where eventtype like 'BRIDGE_ENTER' and с0.uniqueid != с0.linkedid
                        group by с0.linkedid, tran_cel.id_tran, tran_cel.id_secbri) as min_bridge
               on min_bridge.id = cel_min_brige.id) as cel_answer
    on cel_answer.linkedid = cel_start.uniqueid
Volosko
 
Сообщений: 9
Зарегистрирован: 03 апр 2018, 15:46

Re: "Сворачивание" CEL для выдачи в виде "старого" CDR

Сообщение Vlad1983 » 07 апр 2018, 10:13

в таких фильтрах "eventtype like 'BRIDGE_ENTER'", "eventtype like 'CHAN_END'", "c3.eventtype like 'BRIDGE_ENTER'"...
"like" лучше заменить на "="

это "с1.eventtype like '%TRANSF%'" это можно развернуть на несколько OR или IN ибо ограниченное число комбинаций попадающих под маску
Мобильные РФ 1.2 руб./мин. + НДС с посекундной тарификацией, CLI
Telegram: @rostel
Vlad1983
 
Сообщений: 4125
Зарегистрирован: 09 авг 2011, 11:51

Re: "Сворачивание" CEL для выдачи в виде "старого" CDR

Сообщение shader » 18 апр 2018, 20:06

а зачем всё это?
Для простых событий (позвонил->поговорил->положил трубку) и CDR модуля с головой.
А если сложные события типа attended transfer (pick up и прочее). Никогда такой универсальный запрос не напишете.

Рекомендация(если хочется в серьез обуздать CEL):

https://postgrespro.ru/docs/postgresql/9.6/plpgsql.html
shader
 
Сообщений: 92
Зарегистрирован: 09 авг 2013, 10:33


Вернуться в Вопросы новичков

Кто сейчас на форуме

Сейчас этот форум просматривают: Bogdanvxu и гости: 12

© 2008 — 2018 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH