我正在尝试制作一个网页,列出来自CDR的未接来电。在来电时,所有软电话和一些手机同时振铃。星号版本是1.8.5。
以下是针对单个 ANSWERED 电话写入CDR表的内容:
╔═════════════════════╦══════╦═════════╦═════╦══════════╦═══════════════════════════╦═══════════════════════════╦═════════╦═══════════════════════╦══════════╦═════════╦═════════════╦══════════╦═════════════╦═══════════╦════════════════╦══════════╗ ║ calldate ║ clid ║ src ║ dst ║ dcontext ║ channel ║ dstchannel ║ lastapp ║ lastdata ║ duration ║ billsec ║ disposition ║ amaflags ║ accountcode ║ userfield ║ uniqueid ║ imported ║ ╠═════════════════════╬══════╬═════════╬═════╬══════════╬═══════════════════════════╬═══════════════════════════╬═════════╬═══════════════════════╬══════════╬═════════╬═════════════╬══════════╬═════════════╬═══════════╬════════════════╬══════════╣ ║ 2012-02-06 12:40:45 ║ ║ 5020971 ║ 595 ║ OUTGOING ║ Local/595@OUTGOING-5d9a;2 ║ SIP/help.desk-000000b8 ║ Dial ║ SIP/help.desk/595,,Tt ║ 8 ║ 0 ║ ANSWERED ║ 3 ║ ║ ║ 1328524845.301 ║ 0 ║ ║ 2012-02-06 12:40:45 ║ ║ 5020971 ║ 599 ║ OUTGOING ║ Local/599@OUTGOING-038b;2 ║ SIP/help.desk-000000b9 ║ Dial ║ SIP/help.desk/599,,Tt ║ 8 ║ 0 ║ NO ANSWER ║ 3 ║ ║ ║ 1328524845.303 ║ 1 ║ ║ 2012-02-06 12:40:44 ║ ║ 5020971 ║ s ║ to_tech ║ SIP/help.desk-000000b6 ║ Local/595@OUTGOING-5d9a;1 ║ Queue ║ TECH,Tt,,,300 ║ 111 ║ 110 ║ ANSWERED ║ 3 ║ ║ ║ 1328524844.298 ║ 0 ║ ╚═════════════════════╩══════╩═════════╩═════╩══════════╩═══════════════════════════╩═══════════════════════════╩═════════╩═══════════════════════╩══════════╩═════════╩═════════════╩══════════╩═════════════╩═══════════╩════════════════╩══════════╝
获取未应答呼叫的SQL是:
SELECT * FROM cdr WHERE disposition = 'NO ANSWER' AND imported='0'
不用说,我通过实际回答的电话得到误报。 :-)
他们只链接我看到NO ANSWER和ANSWERED行之间的时间间隔非常短(并且它们共享相同的src编号)。
现在,在我开始检查是否有一些来自相同号码的ANSWERED呼叫以及接近的时间间隔(例如3秒)之前,我想知道是否有人知道更好的方法来解决这个问题。
我不会说extensions.conf非常流利,实际上我们拨号计划的人早已不见了但我在extensions.conf中注意到了这一点:
[class1] exten => s,n,SET(CDR(accountcode)=${UNIQUEID}) include => accounts include => OUTGOING
如果我直截了当,那么扩展线应该将CDR表中的帐户代码字段设置为来电的唯一ID值?无论如何它不起作用,因为帐户代码字段永远不会填入表格。
答案 0 :(得分:3)
如果我正确地读取该输出,似乎呼叫进入并被放入队列,然后Queue()应用程序将呼叫转移到没有应答的代理(599),因此呼叫是转移到另一个代理人(595),然后接听电话。
此外,似乎每次调用由Queue()应用程序处理时,都会给它一个新的调用ID,因此很难跟踪。
对于Queues的这个特定问题,我建议使用QueueLog功能,该功能可以与SQL集成。然后,您可以在QueueLog表中跟踪调用,并跟踪每个步骤并在QueueLog SQL表中进行传输。
然后可以构造一个SQL查询来将QueueLog表与cdr表连接起来,以查看哪些唯一的调用是未应答的,而不是像您当前那样的情况。
编辑:
可在以下位置找到分步说明:http://www.voip-info.org/wiki/view/Asterisk+queue_log+on+MySQL。然后将队列事件插入到表中,如下所示:
mysql> select * from queue_log;
+----+------------+--------------+------------------+-------+------------+-------+
| id | time | callid | queuename | agent | event | data |
+----+------------+--------------+------------------+-------+------------+-------+
| 1 | 1198356717 | 1198356717.0 | voipsolutions.ru | NONE | ENTERQUEUE | |serg |
| 2 | 1198356719 | 1198356717.0 | voipsolutions.ru | NONE | ABANDON | 1|1|2 |
+----+------------+--------------+------------------+-------+------------+-------+
然后,您可以使用此表跟踪队列活动。
希望有所帮助。
答案 1 :(得分:0)
此查询在00:01 am通过电子邮件发送报告
<?php
/* Переменные для соединения с базой данных */
$hostname = "localhost";
$username = "asteriskcdruser";
$password = "asteriskcdrpass";
$dbName = "asteriskcdrdb";
/* Таблица MySQL, в которой хранятся данные */
$cdrtable = "cdr";
/* Переменные для определения вчерашней даты */
$time = mktime(date('H'), date('i'), date('s'), date('m'), date('d')-1, date('Y'));
$ydate = date("d.m.Y", $time);
/* создать соединение */
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
/* выбрать базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($dbName) or die(mysql_error());
/* запрос данных . номерация у нас трехзначная, поэтому LENGTH( `src` ) >3, отсекаем исходящие вызовы */
$query = "SELECT `dst` , `src` , `duration` , `dstchannel` , `calldate`
FROM `cdr`
WHERE DATE_SUB( CURDATE( ) , INTERVAL 1 DAY ) <= `calldate`
AND CURDATE( ) > `calldate`
AND `disposition` = 'NO ANSWER'
AND LENGTH( `src` ) >3";
/* Выполнить запрос. Если произойдет ошибка - вывести ее. */
$res=mysql_query($query) or die(mysql_error());
/* Как много нашлось строк */
$number = mysql_num_rows($res);
/* заголовок письма */
$mes="Отчет о пропущенных вызовах за $ydate.\r\n\r\n";
/* готовим текст письма*/
if ($number == 0) {
$mes .= "Пропущенных вызовов не было";
} else {
/* Получать по одной строке из таблицы в массив $row, пока строки не кончатся */
while ($row=mysql_fetch_array($res)) {
$mes .= " ".$row['calldate'].". От ".$row['src'];
$mes .= " Абонент ".mb_substr($row['dstchannel'],4,3);
$mes .= ". Ожидание ".$row['duration']." сек.\r\n";
}
}
/* Отправляем письмо */
mail('name@domain.com.ua', $ydate.' Missed calls report', $mes);
echo "Отчеты были отправлены на почту...";
?>
答案 2 :(得分:-1)
对于只有未接来电,请使用mysql请求:
SELECT `src`,`dst` , `duration` , `dstchannel` , `calldate`
FROM `cdr`
WHERE DATE_SUB( CURDATE( ) , INTERVAL 1 DAY ) <= `calldate`
AND CURDATE( ) > `calldate`
AND `disposition` = 'NO ANSWER'
AND LENGTH( `dst` ) <4 AND LENGTH( `src` ) >3 ;