我正在使用 cdr_adaptive_odbc 将 CDR 写入 mssql 表。从记录在调用后写入的意义上讲,这种方法很有效。
但是我想在电话接通时、接听/中止之前写入 cdr_record。
原因:我想在我们的 CRM 系统中添加一项功能:单击此按钮并查看来电的电话号码,其中 CDR 记录是“响铃”或类似内容。然后将电话号码与客户记录进行匹配,并在屏幕上显示呼叫者信息。
(我不想将号码推送到 CRM,必须通过拉取方式)
我尝试过这个:
exten => 13,1,noop()
same => n,forkcdr()
same => n,Wait(2)
same => n,dial(SIP/L13)
same => n,hangup()
但这不会在数据库中创建新记录。
答案1
我没有使用 CDR,而是将 CEL 记录到表中。然后我可以看到已启动的呼叫(事件类型 1,CHANNEL_START),并查看 linkedid 是否有相应的事件类型为 4 ANSWER 的事件和事件类型为 2 CHANNEL_END 的事件
然后,我找到具有该电话号码的最新客户 ID(客户可能使用同一个号码多次注册),并显示相应的名称。
我最终(只是为了好玩)展示了 CDR 记录中的通话时间和配置。
SELECT TOP 10 a.cid_num,
a.eventtime 'begin',
b.eventtime 'answer',
c.eventtime 'end',
mk.maxid,
navn,
cdr.duration,
cdr.billsec,
cdr.disposition
FROM asteriskcel a
LEFT JOIN asteriskcel b
ON b.eventtype = 4 -- ANSWER
AND b.linkedid = b.uniqueid
AND b.linkedid = a.linkedid
LEFT JOIN asteriskcel c
ON c.eventtype = 2 -- CHANNEL_END
AND c.linkedid = c.uniqueid
AND c.linkedid = a.linkedid
LEFT JOIN (SELECT RIGHT(telefon, 8) tlf,
Max(id) maxid
FROM t_kunder
GROUP BY RIGHT(telefon, 8)) mk
ON RIGHT(a.cid_num, 8) = mk.tlf
LEFT JOIN t_kunder k
ON mk.maxid = k.id
LEFT JOIN bit_cdr cdr
ON cdr.linkedid = a.linkedid
WHERE a.eventtype = 1 -- CHANNEL_START
AND a.linkedid = a.uniqueid
AND a.context = 'default'
ORDER BY a.eventtime DESC
答案2
您可以使用 forkCDR 应用程序在启动时删除另一个 cdr