почему могут быть проблемы с периодическим не попаданием в CDR last_application = Hangup?
коллеги.
Есть диалплан следующего содержания, используемый как для АМИ вызово, так и для обычных звонков. Если выполняется АМИ, то первым плечом мы попавдаем в ami-originate
, оттуда при ответе агента в orig-answer-channel
.
Далее вызов попадает вторым плечом в sub-outbound, мы делаем ChannelRedirect LocalChannela
, после чего звонок в штатном режиме идет через тот же контекст sub-outbound.
По окончании вызова идет проверка на DIALSTATUS
и если он был "CONGESTION
" или "CHANUNAVAIL
" то мы пробуем позвонить еще раз со след транка.
Либо же отправляемся в sub-no-answered-call-finished
, где в зависимости от статуса проигрываем нужное сообщение о занятости или недоступности абонента и завершаем звонок, попав в hangup_handler = outbound-hangup-handler
[ami-originate]
exten => _X!,1,NoOp(Init dial from AMI) same => n,NoCDR() same => n,Set(MASTER_CHANNEL(destinationChannel)=${originalCalledNumber}) same => n,Dial(PJSIP/${EXTEN},60,TtU(orig-answer-channel),s,1))
[orig-answer-channel] exten => s,1,NoOp(Set source channel) same => n,NoOP(${CHANNEL(name)}) same => n,Set(MASTER_CHANNEL(sourceChannel)=${CHANNEL}) same => n,Return()
[sub-outbound] exten => _.,1,NoOp(Call attempt via outbound route) same => n,ExecIf($[ "${sourceChannel}x" != "x" ]?NoCDR()) same => n,ExecIf($[ "${sourceChannel}x" != "x" ]?ChannelRedirect(${sourceChannel},${ARG1},${destinationChannel},1)) same => n,ExecIf($[ "${sourceChannel}x" != "x" ]?Set(amiFirstPart=yes)) same => n,ExecIf($[ "${sourceChannel}x" != "x" ]?Hangup()) same => n,Set(CHANNEL(hangup_handler_push)=outbound-hangup-handler,s,1) same => n,Dial(PJSIP/1234567@ProviderName,60,TU(sub-record-call,s,1)) same
=> n,GotoIf($[$[ "${ARG2}" = "yes" ] & $[ "${DIALSTATUS}" = "CONGESTION" | "${DIALSTATUS}" = "CHANUNAVAIL" ]]?return:callend) same => n(return),HangupCauseClear() same => n,Return() same => n(callend),GoSub(sub-no-answered-call-finished,s-${DIALSTATUS},1)
exten => h,1,NoOp(Hangup first leg AMI call) same => n,Hangup()
[outbound-hangup-handler] exten => s,1,NoOp() same => n,GotoIf($[ "${amiFirstPart}" = "yes" ]?callend) same => n,Set(CDR(last_call_attempt)=yes) same => n(callend),Return()
[sub-no-answered-call-finished] exten => s-BUSY,1,Playback(is-curntly-busy) exten => s-BUSY,n,Playtones(busy) exten => s-BUSY,n,Wait(3) exten => s-BUSY,n,Hangup()
Столкнулись с такой проблемой.
При звонке через AMI Originate, если вызываемый абонент сбрасывает звонок (звонящий получает сигнал «занято»), то в CDR не попадает последнее отработавшее приложение Hangup.
Если сделать звонок напрямую, то все отрабатывает корректно. Если через AMI вызов закончился успешно, все также отрабатывает корректно.
Также заметили, что и при АМИ вызове в CDR попадает требуемая запись, но как-то случайно, два раза попала, потом 50 раз нет.
В случаях, когда запись не попадает, соответственно не отрабатывает Set(CDR(last_call_attempt)=yes
, и логика СДР ломается.
Подскажите, пожалуйста, почему могут быть проблемы с периодическим не попаданием в CDR last_application = Hangup
?