我正在使用Asterisk IVR进行组织内部调查(我们的员工通过按键调用并回答几个问题)。按键被立即转储到数据库中,并不实际连接到扩展或IVR菜单结构。现在,我在没有任何AGI脚本的情况下这样做,如果可能的话,我希望保持这种状态。
示例:
[from-internal-custom]
exten => 1234,1,Answer
exten => 1234,2,Wait(1)
exten => 1234,3,Playback(custom/Welcome_message)
exten => 1234,4,Authenticate(0000)
exten => 1234,5,Goto(MyCustomApp,s,1)
[MyCustomApp]
exten => s,1,Set(TIMEOUT(digit)=7)
exten => s,n,Set(TIMEOUT(response)=10)
exten => s,n,Playback(custom/QA1)
exten => s,n,Read(QA1,beep,1,,3,5)
exten => s,n,SayDigits(${QA1})
exten => s,n,MYSQL(Connect connid 127.0.0.1 DB_USER DB_PASS DB_NAME)
exten => s,n,MYSQL(Query r ${connid} Insert Into question_answers SET question_id='0', user_id=${CALLERID(num)}, result=${QA1})
[... more questions and finally hangup ...]
现在的问题是,如果QA1的播放指示呼叫者“按1表示是或2表示否”,但是用户按3,则3被转储到数据库中,这显然没有用。如何限制每个问题的允许密钥?我知道“i”扩展,但我想这不会让我到处都是。有没有办法准确指定哪些键是允许的,哪些不是?最好不要把头包在AGI周围?有些问题是肯定/没有问题,但其他一些问题有更多选择(“如果x小于100按1,小于200按2,小于300按3”等等。)
感谢您的帮助!
答案 0 :(得分:1)
你做得很奇怪。只需使用GotoIF就可以将2以上的数据转储到数据库中,你就可以了。
您也可以使用WaitExten& Background
exten => s,n,Background(message);play message
exten => s,n,WaitExten(10);wait upto 10 sec for input
exten => s,n,Noop(no input here)
exten => 1,1,Noop(1 choice)
exten => 2,2,Noop(2 choice)
答案 1 :(得分:0)
这就是我完成所需工作的方式(例如,对于选项1,2,3和4的问题):
[...]
exten => s,3,Playback(custom/QA1)
exten => s,4,Read(QA1,beep,1,,3,5)
exten => s,5,SayDigits(${QA1})
exten => s,6,GotoIF($[ "${QA1}" = "1" | "${QA1}" = "2" | "${QA1}" = "3" | "${QA1}" = "4" ]?s,9:s,7)
exten => s,7,Playback(pbx-invalid)
exten => s,8,Goto(s,3)
exten => s,9,MYSQL(Connect connid 127.0.0.1 USER PASSWORD DB)
exten => s,10,MYSQL(Query r ${connid} Insert Into TABLE_NAME SET question_id='0', user_id='${CALLERID(num)}', result='${QA1}')
[...]