почему могут быть проблемы с периодическим не попаданием в 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 ?


Ответы (0 шт):