0

我正在使用 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”等等……)。

谢谢你的帮助!

4

2 回答 2

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)
于 2013-11-01T14:48:34.230 回答
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}')

[...]

于 2013-11-07T11:19:25.710 回答