SmarTele语音流程脚本语言是针对“SmartDev语音平台”而设计的,用于实现语音流程定制。SmarTele脚本语言采用开放式结构,以独立文本文件为信息存放基础,文件之间可以相互调用,简便易学,维护方便。
可以使用“TeleEdit.exe脚本编辑器”或写字板等工具编辑修改。
通过SmarTele,可以实现以下功能:
◆ 自动语音应答:如播放语音、菜单选择、收号、录音等。
◆ 支持静态传真的自动收发,图形存储格式采用标准的TIF格式,提供多种文字:如中文、英文转换传真的功能。
◆ 支持动态传真发送,可将中文、英文字符实时地转换为传真发送出去。
◆ 数据库查询采用ODBC与数据库连接,支持MS SQL、Oracle、Sybase、Infomix等主流数据库;支持加减乘除运算、逻辑判断、字符串运算等。
◆ 系统支持通过代理服务器访问数据库,以保证IVR系统访问远程数据库、大型数据库、保密数据库时不受影响。
◆ 支持自动拨号,批量外拨,记录外拨结果,外拨方式不仅支持语音,还可支持传真,人工话务员等。
◆ 系统能够将客户IVR交互活动记录到电话跟踪数据库中。
◆ 以独立文件为信息存放基础。
◆ 采用解释执行的运行方式。
◆ 调用动态连接库(DLL)
系统提供调用动态连接库接口,对于一些不经常变动的功能模块、复杂的运算、需要保密的信息,可以通过动态连接库实现。
◆ 与通信网关服务器接口
在一些大型项目应用中,IVR语音系统需要和其他系统交互信息,访问远程数据库、大型数据库、保密数据库等,这种情况下,需要设立通信网关,作为代理服务器使用。
这种用法经常在“电话银行系统”、“证券委托的交易系统”使用。
◆ 系统提供开放的应用层接口,动态加载新的业务模块。
◆ 系统提供功能强大的应用开发环境:脚本语音控制、DLL功能加载、人工座席控制等。
◆ 提供在线调试工具、预编译功能及错误检查功能。
◆ 系统采用WINDOW NT网络操作系统,服务器可选择性能稳定可靠的工业控制机,从而保证了系统运行的稳定性。清楚的中文菜单,便于使用者进行操作;
◆ 系统可选择模拟电话接口(LPS)、BRI(2B+D)、中国一号信令、ISDN(30B+D)、LineSide E1、七号信令(SS7)、透明传输协议(NOCC)等多种与PSTN或PBX的接口方式。对不同型号的交换机,可很容易地设置系统的各项参数,便于调试及维护;
◆ 支持多种交换机:Awaya、Nortel Meridian1、SIEMENS、TD510、NICE288、EDK21等。
◆ 系统单机容量为2、4、6…1200端口。可根据实际情况,平滑升级。
系统支持分布处理,通过IVR网关,实现多主机共享语音资源,具有很强的扩充能力。
◆ 提供系统监控、工作日志、业务统计、呼叫分析、远程管理功能接口扩展。
◆ 网络通信基于TCP、IP协议族
◆ 系统采用堆叠式模块化设计,用户可以根据自己的实际情况,对任意功能模块进行扩充和重组,在系统配置上进行从小规模到大规模的灵活选择,规模可大可小,并可平滑升级。
◆ 用户无须编写程序,便可生成各种流程的程序,方便快捷,是构造CTI系统的利器。
1)、美国Dialogic公司的产品(全世界应用最广泛的语音产品,包括模拟卡及PCM数字卡)
Proline/2 多功能2线语音卡
Dialgic/4、D/41D、 D/41ESC 4线语音卡
Vfax/40SC、CP/4SC 4线传真卡
DTI/301、 D/300SC-E1 数字中继卡
MSI/80SC 人工座席转接卡
PCCS6-2E1 七号信令卡
2)、美国NMS公司的产品(开放式电信的领导者,完美电信级CTI解决方案)
QX2000(FAX) 4线语音卡(传真)
AG2000 8线语音卡(传真)
AG4000_1E1/2E1/4E1 数字中继卡(1E1、2E2、4E1)
CX1000_R、CX2000_R 人工座席转接卡
TX2000、TX3220 七号信令卡
3)、三汇公司的产品(国产卡)
SHT-8B/PCI(FAX) 8线语音卡(传真)
SHT-8B/PCI(FAX) 16线语音卡(传真)
SHT-120A-CT/PCI 数字中继卡(1E1、2E2、4E1)
5)、其它
QX10000_4LV/8LV 4线/8线语音卡
Talks 4R/8R 4线/8线录音卡
深圳东进语音产品
系统提供四种类型变量,每种变量数量为99个,变量在每次建立呼叫时清空,一次呼叫过程中保持不变。变量名称约定如下:
1.整数型 D1,D2,D3,… D99
2.浮点型 F1,F2,F3,…F99
3.字符串型 S1,S2,S3,… S99
4.内置变量
CALLER:主叫号码,字符串型,按通道存放。
CALLED:被叫号码,字符串型,按通道存放。
CHBUF:通道变量,一般用于存放接收的DTMF码,字符串型,按通道存放。
LASTKEY:
如果是智能总机业务请在流程中将做
LET LASTKEY=A
LASTKEY 是系统内部变量,在整个语音流程中不要再改变这个参数的内容
R168:用来保留小号用户代码
LET F1=S89 #S89是用户输入的小号代码
LET R168=F1 #保存在R168中由系统统一处理
REP:失败后返回的结果
REP 1 被叫占线
2 无人接听
其他
LANG:存放ACD转接的路由号码
LET LANG=1 #第一次路由
LET LANG=2 #第二次路由
LET LANG=3 #第三次路由
CH:执行本流程的通道号,整数型。
GBUF:存放本站点的长途区号(如北京-010,广州-020,西安029)
一个完整的语音流程,可以由一个、或多个语音流程文件组成,一个流程文件是由若干个语音节点组成的。
一个流程文件不能超过10000行,每个节点不能超过100 行。
一个语音节点的模式为:
NODE=1
节点命令 [参数1、参数2 ….. ] NEXT= [下一个节点号] 或
节点命令 [参数1、参数2 ….. ] NEXT= [Sx:下一个节点号] 或
节点命令 [参数1、参数2 ….. ] LINK= [系统流程号]
NODE=2
节点命令 [参数1、参数2 ….. ] NEXT= [下一个节点号]
说明:
1、语音节点
节点格式1:NODE=x
使用时注意以下几点:
A、起始节点必须为:NODE=1
B、节点NODE=0 作为系统保留节点,通道挂机之前调用。只允许执行LET、CALL、WHILE、DB_类命令。
2、节点命令:
完成语音的一个基本操作,如:录音、放音、拨号等。
系统定义了20多个节点命令,如:PLAY_VOX、PLAY_ONE_DTMF等,具体用法详见第四章、系统节点命令描述。
3、参数1、参数2…..:不同的节点命令,需要不同的参数。
NEXT= [下一个节点号] :流程下一步要执行的操作。
NEXT= [Sx:下一个节点号]:Sx:必须为S1-S99,存放流程文件名
下一个节点号:为数字或D1-D99。
LINK= [系统流程号] :将流程下一步连接到应用程序中。
平台常用的系统流程号码:
● 2019 将被叫赋给【CHBUF】,然后LINK=2019即可,听回铃转接;
● 2009将被叫赋给【CHBUF】,然后LINK=2009即可,听音乐转接;
● 3:1001 将信箱号码赋给【CHBUF】,然后LINK到3:1001,实现留言;
● 3:1200 将信箱号码赋给【CHBUF】,然后LINK到3:1200,实现听取留言;
● 6:1430 接收传真
● 6:1450 传真发布
4、例如:
#---Receive 3 digits----- #号后为注释内容
NODE=4 #本节点编号
PLAY_MULT_DTMF C:/V3000/Greeting.voc 3 S1 NEXT=5 #接收3个DTMF码
NODE=5 #接收1个DTMF码,转到流程文件USER2.DAT的节点1。
S1=”C:/V3000/USER2.DAT”
PLAY_ONE_DTMF Greeting.voc S1 NEXT=S1:1
*5、特别说明:
A、# 号后为注释内容
B、所有字母大小写无关
C、LINK= [系统流程号]的用法说明
LINK 用于将流程连接到应用系统的某些固定流程处,同时退出用户定义流程。
系统流程号(TaskProc)的说明可向程序员索取。
用法:XXX LINK =3000 (跳转到本模块) 或
XXX LINK =FUN:3000 (跳转到其它模块)
其中,FUN为语音平台功能模块,定义为:
VMS = 3, //语音信箱
FDM = 6, //传真服务
如:LINK=1000 直接转移到ChProc=1000 处
LINK=1:1000 直接转移到Fun_port=1,ChProc=1000 处
LINK=11:1000 直接转移到Fun_port=11,ChProc=1000 处
参数: 无
例如:
1、 转接(2009为听交换机音乐,2019为听回铃)
NODE=100
LET CHBUF=”596040000001082015269”
PLAY_VOX ../Flow/9560400000105604/VOC/TT19.WAV LINK=2009 #转接中,请稍后
2、 留言
2.1 听取留言
NODE=100
LET CHBUF=604001 - 信箱号码
DELAY 10 LINK=3:1200
2.2 留言
NODE=100
LET CHBUF=604001 - 信箱号码
DELAY 10 LINK=3:1001
3、 传真
3.1 发送传真
NODE=100
LET LASTKEY=4
LET REP=5
LET CHBUF=604001 - 传真信箱号码
DELAY 10 LINK=6:1430
3.2 索取传真
NODE=100
LET CHBUF=604001 - 传真资料代码
DELAY 10 LINK=6:1420
4、 结束
NODE=9999
PLAY_VOX ../Flow/9560400000105555/VOC/009.WAV LINK=2004
> 大于
< 小于
>= 大于等于
<= 小于等于
<> 不等于
== 等于
使用时应配合关键字“IF ”使用。
1、IF 语句的用法
功能:IF 逻辑判断操作, 条件成立,则转到下一个节点;条件不成立, 则分析下一个语句。
语法:IF [param1][op][param2] NEXT=X 条件成立,则转移;条件不成立,查找下一句
IF [param1][op][param2] EXIT 条件成立,则退出流程。
IF EXIST(filename) NEXT=X 文件存在,则转移
参数: op: >、<、>=、<=、<>、=
param1:变量
param2:变量或数字,如果字符串中包含保留字符,例如:+,-,*,/,=,空格,Dxx,Fxx,Sxx等,可以使用‘’或“”。
例如:
#----------------------
NODE=2
IF D1='#' NEXT=3
IF D1='1' NEXT=4
IF D1='6' NEXT=6
PLAY_VOX d:/prompt.wav/lang1/vm5.voc NEXT=100
IF EXIST(c:/v3000/ptday.voc) NEXT=100
2、IF...ELSE...ENDIF 语句的用法
语法1:IF [param1][op][param2]
...[COMMAND1]...
ELSE
...[COMMAND2]...
ENDIF
...[COMMAND3]...
语法2:IF [param1][op][param2]
...[COMMAND1]...
ELSE IF [param1][op][param2]
...[COMMAND2]...
ENDIF
...[COMMAND3]...
条件成立,则执行[COMMAND1],COMMAND1可以是一条或多条合法语句
条件不成立,则执行[COMMAND2]。
例如1:NODE=2
IF D1='#'
LET S1=12345
PLAY_VOX d:/prompt.wav/lang1/vm5.voc NEXT=100
ELSE
LET S1=567890
PLAY_VOX d:/prompt.wav/lang1/vm6.voc NEXT=101
ENDIF
NODE=3
IF EXIST(c:/v3000/ptday.voc) NEXT=100
例如2:NODE=2
IF D1='#'
LET S1= d:/prompt.wav/lang1/vm5.voc
ELSE
LET S1= d:/prompt.wav/lang1/vm6.voc
ENDIF
PLAY_VOX S1 NEXT=101
NODE=3
例如3:NODE=2
IF D1='#'
LET S1= d:/prompt.wav/lang1/vm5.voc
LET S2= d:/prompt.wav/lang1/vm6.voc
ENDIF
PLAY_VOX S1 NEXT=101
NODE=3
例如4:NODE=2
IF D1='1'
LET S1=12345
PLAY_VOX d:/prompt.wav/lang1/vm5.voc NEXT=100
ELSE IF D=’2’
LET S1=567890
PLAY_VOX d:/prompt.wav/lang1/vm6.voc NEXT=101
ELSE
PLAY_VOX d:/prompt.wav/lang1/vm7.voc NEXT=101
ENDIF
NODE=3
IF EXIST(c:/v3000/ptday.voc) NEXT=100
3、WHILE...WEND 语句的用法
语法:WHILE [param1][op][param2]
...[COMMAND]...
WEND
条件成立,则执行[COMMAND],直到条件满足退出循环。
条件不成立,则不执行[COMMAND]。
例如1: NODE=2
LET D1=1
WHILE D1<10
LET D1=D1+1
WEND
PLAY_VOX d:/prompt.wav/lang1/vm6.voc NEXT=101
NODE=3
例如2:NODE=2
LET D1=1
WHILE D1<10
LET D1=D1+1
IF D1>5 NEXT=3
WEND
PLAY_VOX d:/prompt.wav/lang1/vm6.voc NEXT=101
NODE=3
+ 加法
- 减法
* 乘法
/ 除法
@ 取长字符串的子串,不同项目用|号隔开
例如:S4=1234567|156.45|148.23||567.78|
LET S1=S4@1 #取S4第一个|号之前的子串,即1234567
LET F1=S4@2 #取S4第一个|号之后、第二个|号之前的子串,即156.45
LET F2=S4@3 #取S4第二个|号之后、第三个|号之前的子串,即148.23
LET F3=S4@4 #取S4第三个|号之后、第四个|号之前的子串,即“”(空)
LET F3=S4@5 #取S4第四个|号之后、第五个|号之前的子串,即567.78
数据类型的转换,字符串的和并等
◆ 使用时应配合关键字“LET ”使用。
◆ LET四则运算/赋值操作, 完成运算,则分析下一个语句
◆ LET语句可处理负数
◆ 赋值操作可直接使用字符串,如果字符串中包含保留字符,例如:+,-,*,/,=,空格,Dxx,Fxx,Sxx等,可以使用‘’或“”。
语法: LET [param1]=[param2] 将变量param2的值赋给param1。
LET [param1]=[param2][op][param3] 将变量param2 与param3的运算结果赋给param1。
LET [param1]=[param2][op][param3] [op][param4]
Op:+ — * / :
param1 : 变量
param2,param3: 变量或数字
LET Dxx=Sxx 将Sxx中的字符串转换为数字赋给Dxx。
LET Dxx=Fxx 将Fxx中的浮点数转换为数字赋给Dxx。
LET Fxx=Dxx 将Dxx中的数字转换为浮点数赋给Fxx。
LET Fxx=Sxx 将Sxx中的字符串转换为浮点数赋给Fxx。
LET Sxx=Dxx 将Dxx中的数字转换为字符串赋给Sxx。
LET Sxx=Fxx 将Fxx中的浮点数转换为字符串赋给Sxx。
LET Sxx=Sxx1+Sxx2 将后两个中的字符串合并赋给Sxx。
LET Sxx=Sxx1+Dxx2 将后两个中的字符串合并赋给Sxx。
特殊用法1: 将应用程序变量值赋给生成器的变量(只限程序员使用)
LET Sxx=CHBUF 将ChBuf[Channl]的值赋给Sxx变量
LET Sxx=CALLER 将Calling_code[Channl] 的值赋给Sxx变量
LET Sxx=CALLED 将Called_code[Channl] 的值赋给 Sxx变量
LET Fxx=R168 将R168[Channl] 的值赋给Fxx变量
LET Dxx=REP 将Rep[Channl] 的值赋给Dxx变量
LET Sxx=LASTKEY 将Lastkey[Channl] 的值赋给Sxx变量
LET Dxx=CH 将Channl的值赋给Dxx变量
LET Dxx=LANG 将Lang[Channl]的值赋给Dxx变量
LET Sxx=GBUF 将gBuf[Channl]的值赋给Sxx变量
特殊用法2:将生成器的变量值赋给应用程序变量(只限程序员使用)
LET CHBUF=Sxx 将Sxx变量的值或字符串赋给ChBuf[Channl]
LET CALLER=Sxx 将Sxx变量的值或字符串赋给Calling_code[Channl]
LET CALLED=Sxx 将Sxx变量的值或字符串赋给Called_code[Channl]
LET R168=Fxx 将Fxx变量的值或浮点数赋给R168[Channl]
LET REP=Dxx 将Dxx变量的值或数字赋给Rep[Channl]
LET LASTKEY=Sxx 将Sxx变量的第一个字符或单个字符赋给Lastkey[Channl]
LET LANG=Dxx 将Dxx变量的值赋给Lang[Channl]
LET GBUF=Sxx 将Sxx变量的值赋给gBuf[Channl]
例如 : 1、LET CHBUF=604001
2、LET CALLER=123569874
3、LET CALLED=59604000000105236548
4、LET F1=604001
LET R168=F1
5、LET D1=2
LET REP=D1
6、LET LASTKEY=A
7、LET D1=1
LET LANG=D1
8、LET S1=GBUF
语法:CALL DATE(Sxx)
参数: Sxx:存放时间的寄存器,只能为S1..S99.
YYYY:年(1976-2200) MM:月(01-12) DD:日(01-31)
HH:时(00-23) MM:分(00-59) SS:秒(00-59) W:星期(0-6)
语法:CALL STRGET(src,des,position,lenth)
参数: src, 存放源字符串的寄存器,只能为S1..S99。
des, 存放目标字符串的寄存器,只能为S1..S99。
position,取字符串的开始位置。
lenth,取字符串的长度。
例如:LET S1=123456789
CALL STRGET(S1,S2,5,3) // S2 的值为567
语法:CALL STRREV(src,des)
参数: src, 存放源字符串的寄存器,只能为S1..S99。
des, 存放目标字符串的寄存器,只能为S1..S99。
例如:LET S1=123456789
CALL STRREV(S1,S2) // S2 的值为987654321
语法:CALL STRLEN(src,Dxx)
参数: src, 存放源字符串的寄存器,只能为S1,S2.S99。
Dxx, 存放字符串长度的寄存器,只能为D1,D2.D99。
例如:LET S1=123456789
CALL STRLEN(S1,D1) // D1 的值为9
语法:CALL RAMDOM(range,Dxx)
参数: range, 随机数范围值,可以为D1-D99,1-100000。
Dxx, 存放随机数的寄存器,只能为D1-D99.
例如:CALL RAMDOM(100,D1) // D2 的值可能为1-100之间任意一个数值。
语法:CALL CREATEDIR(DirName)
参数: DirName 文件夹名称,如:C:/USERDAT
或存放文件夹名称的寄存器,可以为S1-S99。
语法:CALL DISP(Register)
参数: Register, 存放显示寄存器,可以为D1-D99、F1-F99、S1-S99。
语法:CALL TXT_TO_TIF(REG,FAXFILE,OP)
参数: REG,存放字符串的寄存器,可以为S1-S99。
FAXFILE:传真文件名
OP: = 1 生成传真的第一行,如果文件不存在,自动生成。
= 2 生成传真文件的中间行
= 3生成传真的最后一行
语法:CALL DLL_FUN(DllName,FunctionName, inReg1,inReg2,inReg3,outReg1,outReg2,outReg3)
参数: DllName: 动态连接库(DLL)文件名,可以为S1-S99。
FunctionName: 调用函数名称,可以为S1-S99。
inReg1、inReg2、inReg3:为函数输入变量,可以是S1-S99.
inRegx:为空,可用0或NULL表示。
outReg1、outReg2、outReg3, 为函数返回变量值或结果,可以为S1-S99。
outRegx:为空,可用0或NULL表示。
调用函数名称的入口参数必须为
FunctionName(char * inParm1 , char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3,
语法:CALL SENDBYUDP(strMessage,method)
参数: strMessage:发送的消息,最大长度为250
method:发送方式:
1:发到指定地址,由IVR语音服务器->系统参数->设定TCP/IP通信参数菜单中‘UDP发送数据端口及IP’项设定。
0:广播,由IVR语音服务器->系统参数->设定TCP/IP通信参数菜单中 ‘UDP广播及端口IP地址’项设定。
例如:
如果某些流程需要记录语音节点的访问量可以在流程中通过发送UDP消息的方式将相关信息发送给呼叫监控系统。例如在流程中做以下设置:
NODE=21
LET S1=IREPORT;UID=615; OP=1;OPNAME=投诉
CALL SENDBYUDP(S1,1)
表示615用户的语音流程中的NODE=21是要记录访问量的节点,对应到报表数据的字段为操作1,OPNAME表示本操作节点的名称。
语法:CALL SENDBYTCP(strMessage)
参数: strMessage:发送的消息,最大长度为250
接收端应该与IVR语音服务器建立TCP连接,作为SERVER端, TCP/IP端口值由 “系统参数->设定TCP/IP通信参数菜单中‘使用的TCP/IP端口值’项设定”。
语法:CALL JOIN_CNF(ch,cnfid,mothed)
参数: ch, 加入会议的通道号,可以为D1-D99,1-90。
Ch=0, 为本通道
Cnfid,会议室号,可以为D1-D99,1-30。
Mothed,加入会议方式,1.双工 2.只听
例如:CALL JOIN_CNF(1,2,1)
语法:CALL LEAVE_CNF(ch,mothed)
参数: ch, 退出会议的通道号,可以为D1-D99,1-90。
Ch=0, 为本通道
Mothed,退出会议方式,1.双工 2.只听
例如:CALL LEAVE_CNF(1)
DB 数据库的操作, 完成运算,则分析下一个语句
注:以下语句(SQL),Table Name 可以为Sxx变量
A) 连接ODBC,与指定的数据库相连。
格式:DB_CONNECT DATABASE=[数据库名];UID=[user];PWD=[pass];DSN=[ODBC名]
例如:1) DB_CONNECT DATABASE=PCMDAT;UID=sa;PWD=;DSN=V3000;
B) 断开ODBC,与指定的数据库脱离。
格式:DB_DISCONNECT
C) 查找符合条件的记录,并将结果保存到相应的变量。
格式: DB_FIND [字段1,字段2…字段n] FROM [表名] [WHERE clause]
MAP(REG1,REG2…,REGn) [Dxx]
说明: 1)字段1,字段2…字段n 为数据库中不同的字段。
2)WHERE clause 查询条件,与“SELECT语句”定义一致。
3)REG1,REG2…,REGn 可为D1-D99,F1-F99,S1-S99,用于存放对应
[字段1,字段2…字段n] 的数值,对应位置的数据类型必须一致,例如,
字段5为字符型,REG5应为S1-S99。
4)Dxx:为D1-D99,用于存放查询结果,0 未找到 1, 找到。
5)字段为int,double,str均返回+-值
例如:DB_FIND PASS,SDATE,PT FROM MAILBOX
WHERE MAILNO=608 MAP(S1,S2,D1) D10
D) 查找符合条件的记录,并将MAP中的变量更新到相应的字段。
格式: DB_UPDATE [字段1,字段2…字段n] FROM [表名]
[WHERE clause] MAP(REG1,REG2…,REGn)
说明: 1)字段1,字段2…字段n 为数据库中不同的字段。
2)WHERE clause 查询条件,与“SELECT语句”定义一致。
3)REG1,REG2…,REGn 可为D1-D99,F1-F99,S1-S99,数字,字符串,
用于存放变量值,更新[字段1,字段2…字段n] 的值,对应位置的数据类型必须一致,例如,字段5为字符型,REG5应为S1-S99。
例如: DB_UPDATE PASS,SDATE,PT FROM MAILBOX
WHERE MAILNO=608 MAP(S1,'20000125',D1)
E) 增加新记录,并将MAP中的变量更新到相应的字段中,未列出的字段为0。
格式:DB_ADD [字段1,字段2…字段n] FROM [表名] MAP(REG1,REG2…,REGn)
说明: 1)字段1,字段2…字段n 为数据库中不同的字段。
2)REG1,REG2…,REGn 可为D1-D99,F1-F99,S1-S99,数字,字符串,
用于存放变量值,更新[字段1,字段2…字段n] 的值,对应位置的数据类型必须一致,例如,字段5为字符型,REG5应为S1-S99。
例如:DB_ADD MAILNO,PASS,SDATE,PT FROM MAILBOX
MAP(666,S1,'1234567890',D1)
F) 删除符合条件的记录。
格式:DB_DEL FROM [表名] [WHERE clause]
说明: 1)WHERE clause 查询条件,与“SELECT语句”定义一致。
例如:DB_DEL FROM MAILBOX WHERE MAILNO=666
G) 执行SELECT语句。
格式:DB_SQL SELECT STATE
说明: 1)SELECT STATE,与“SELECT语句”定义一致。
H) 对符合条件的记录进行统计运算,并将结果保存到相应的变量。
格式: DB_FUNCTION function_name[字段] FROM [表名] [WHERE clause]
MAP(REG) [Dxx]
说明: 1)字段为数据库中指定字段。
2)WHERE clause 查询条件,与“SELECT语句”定义一致。
3)REG 可为D1-D99,F1-F99,S1-S99,用于存放 function_name[字段]
运算的结果,对应位置的数据类型必须一致,例如,
字段为整型,REG应为D1-D99。
4)Dxx 为D1-D99,用于存放执行结果,0 执行错误 1, 执行正确。
5) function_name为SQL定义的函数,包括:
SUM():计算某一字段之和,字段只能为数字型。
AVG():计算某一字段的平均值,字段只能为数字型。
COUNT():计算某一字段的个数,字段可为数字型、字符型。
MAX():计算某一字段的最大值,字段可为数字型、字符型、日期。
MIN():计算某一字段的最小值,字段可为数字型、字符型、日期。
例如:DB_FUNCTION SUM(FEE) FROM MAILBOX
WHERE MAILNO=608 MAP(D1) D10
用法:PLAY_VOX [filename] NEXT=X
参数: filename: 播放的语音文件名
例如:
#----------------------
NODE=3
PLAY_VOX d:/prompt/lang1/vm5.voc next=100
用法:PLAY_VOX_VOX [filename1] [filename2] NEXT=X
参数: filename1: 播放的第一个语音文件名
filename2: 播放的第二个语音文件名
例如:
#---------
NODE=4
PLAY_VOX_VOX d:/prompt/lang1/vb1.voc d:/prompt/lang1/ve1.voc next=100
用法:PLAY_ONE_DTMF [filename] [Sxx] NEXT=X
参数: filename: 播放的语音文件名
Sxx: 存放DTMF的寄存器,只能为S1..S99.
例如:
#---------
NODE=4
PLAY_ONE_DTMF d:/prompt/lang1/vm1.voc S1 next=100
用法:PLAY_MULT_DTMF [filename] [DTMFlen] [Sxx] NEXT=X
参数: filename: 播放的语音文件名
DTMFlen: 接收DTMF的个数
Sxx: 存放DTMF的寄存器,只能为S1..S99.
例如:
#---------
NODE=4
PLAY_MULT_DTMF d:/prompt/lang1/vm1.voc 3 S1 next=100
语音提示”您输入的号码是xxx"->"确认按1,修改按2",按1转到下一个节点.
用法:PLAY_MULT_DTMF_UPDATE [filename] [DTMFlen] [Sxx] NEXT=X
参数: filename: 播放的语音文件名
DTMFlen: 接收DTMF的个数
Sxx: 存放DTMF的寄存器,只能为S1..S99.
例如:
#---------
NODE=4
PLAY_MULT_DTMF_UPDATE d:/prompt/lang1/vm1.voc 3 S1 next=100
用法:PLAY_DIGIT_STRING [filename] [DigitBuf] NEXT=X
参数: filename: 播放的语音文件名
DigitBuf: 数字串或存放数字串的寄存器,只能为S1..S99.
例如:
#---------
NODE=4
PLAY_DIGIT_STRING d:/prompt/lang1/vm1.voc 1234567 next=100
用法:PLAY_DIGIT_GSB [filename] [DigitBuf] NEXT=X
参数: filename: 播放的语音文件名
DigitBuf: 数字串或存放数字串的寄存器,只能为F1,F2..F99.
例如:你查询的分数是:"壹百二拾五点六四”.
#---------
NODE=4
PLAY_DIGIT_GSB d:/prompt/lang1/vm1.voc 12345.67 next=100
用法:PLAY_DIGIT_MONEY [filename] [DigitBuf] NEXT=X
参数: filename: 播放的语音文件名
DigitBuf: 数字串或存放数字串的寄存器,只能为F1..F9.
例如: 你查询的余额是:"壹百二拾五元六角四分”
#---------
NODE=4
PLAY_DIGIT_MONEY d:/prompt/lang1/vm1.voc 12345.67 next=100
用法:PLAY_TTS [strText] NEXT=X
参数: strText: 字符串或存放字符串的寄存器,只能为S1,S2..S99.
strText最大长度为100,可以是0-9,A-Z,a-z,支持中文二级字库。
(如:"中华人民共和国”),
例如:
#---------
NODE=4
S1=中华人民共和国
PLAY_TTS S1 next=100
用法:PLAY_RECVOX [playname] [Recname] [RecLen] NEXT=X
参数: playname: 录音前播放提示语(不用提示语则此参数为空)
Recname: 录音的语音文件名
RecLen: 最大录音时长(以秒为单位)
例如:
#----------------------
NODE=3
PLAY_RECVOX d:/prompt/lang1/vr1.voc d:/demo1.voc 100 next=100
重录按2",按1,转到下一个节点.
用法:PLAY_RECVOX_UPDATE [playname] [Recname] [RecLen] NEXT=X
参数: playname: 录音前播放提示语(不用提示语则此参数为空)
Recname: 录音的语音文件名
RecLen: 最大录音时长(以秒为单位)
例如:
#----------------------
NODE=3
PLAY_RECVOX_UPDATE d:/prompt/lang1/vr1.voc d:/demo1.voc 100 next=100
说明:提示"请输入密码",输入之后,提示"请再输入一次密码"两次输入一致,转到下一个节点.
用法:MODIFY_PWD [playname] [PwdLen] [Sxx] NEXT=X
参数: playname: 修改密码前播放提示语(不用提示语则此参数为空)
PwdLen: 修改密码的密码长度
Sxx: 存放密码的寄存器,只能为S1,S2..S99.
例如:
#----------------------
NODE=3
MODIFY_PWD d:/prompt/lang1/vp1.voc 4 S2 next=100
用法:RECEIVE_DIGIT [DTMFLen] [Sxx] NEXT=X
参数: DTMFlen: 接收DTMF的个数
Sxx: 存放DTMF的寄存器,只能为S1,S2..S99.
例如:
#----------------------
NODE=3
RECEIVE_DIGIT 2 S2 next=101
用法:RECEIVE_FAX [faxfilename] [Sxx] NEXT=X
参数: faxfilename: 传真文件名
Sxx : 存接收传真结果的寄存器,只能为S1,S2..S99.
格式:S|PP|ID
S: 接收传真成功 F: 接收传真失败
PP: 接收传真页数 0-99
ID: 远端传真机号码
例如:
#----------------------
NODE=3
RECEIVE_FAX sample.tiff S1 next=100
接收完毕,S1内容为:S|2|82015266 (接收传真成功,页数2,远端号码82015266)
S1内容为:F|0|82015266 (接收传真失败,页数0,远端号码82015266)
用法:SEND_FAX [faxfilename] [parms] [Sxx] NEXT=X
参数: faxfilename: 发送传真文件名
[parms] 设置本机传真机号码、本传真机标题等,可以为S1,S2..S99.
格式:L-H
L: 本机传真机号码,H:本传真机标题 如:82015266-demo
Sxx : 存发送传真结果的寄存器,只能为S1,S2..S99.
格式:S: 接收传真成功 F: 接收传真失败
例如:
#----------------------
NODE=3
SEND_FAX sample.tiff 82015266-demo S1 next=100
用法:PICKUP NEXT=X
参数: 无
转到下一个节点. (摸拟线/数字卡均可使用)
用法1:PLACE_CALL [Called] [Dxx] NEXT=X
用法2:PLACE_CALL [ch] [Called] [Dxx] NEXT=X
参数: ch: 存放指定拨出通道或存放拨出通道的寄存器,只能为D1..D99.
Called: 存放被叫号码或存放被叫号码的寄存器,只能为S1,S2..S99.
Dxx: 存放呼叫结果的寄存器,只能为D1,D2..D99.
定义为: 1. CPT_BUSY 被叫忙
2. CPT_NOANS 被叫无人应答
3. CPT_ANSWER 被叫应答
4. CPT_RINGBACK 被叫开始振铃
5. CPT_FAIL 呼叫失败
6. CPT_FAX 被叫为传真
0. 其它
例如:
#----------------------
NODE=3
PLACE_CALL 82015266 D1 next=100
用法:DIAL [Called] NEXT=X
参数: Called: 存放被叫号码或存放被叫号码的寄存器,只能为S1,S2..S9.
例如:
#----------------------
NODE=3
DIAL 600 next=100
说明:拨号完毕,发生(被叫忙、被叫应答、呼叫失败、被叫为传真、被叫无人应答、被叫开始振铃)转到下一个节点。
用法:DIALP [Called] [Dxx] NEXT=X
参数: Called: 存放被叫号码或存放被叫号码的寄存器,只能为S1,S2..S99.
Dxx: 存放呼叫结果的寄存器,只能为D1,D2..D99.
定义为: 1. CPT_BUSY 被叫忙
2. CPT_NOANS 被叫无人应答
3. CPT_ANSWER 被叫应答
4. CPT_RINGBACK 被叫开始振铃
5. CPT_FAIL 呼叫失败
6. CPT_FAX 被叫为传真
0. 其它
例如:
#----------------------
NODE=3
DIALP 62179971 D1 next=100
用法:FLASH [Len] NEXT=X ,主要用于电话转接.
参数: len: 存放FLASH时长或存放FLASH时长的寄存器,只能为D1,D2..D99,单位10ms.
例如:
#----------------------
NODE=3
FLASH 100 next=100
用法:DELAY [delay] NEXT=X
参数: delay: 存放延时时长或存延时时长的寄存器,只能为D1,D2..D99,单位10ms.
例如:
#----------------------
NODE=3
DELAY 100 next=100
用法:GOTO X 或
GOTO Sx:X (Sx:为S1-S99,存放流程文件名,X:为节点号) 或
GOTO NEXT=X 或
GOTO LINK=X 或
参数: 无
例如: GOTO 100
...
LET S1="../Flow/95105605/Flowdata/USER.DAT"
GOTO S1:100
用法:RETURN 返回上次调用节点
RETURN A1B3 返回指定节点
RETURN [Message] [Dataex] 返回上次调用节点,并回送消息。
RETURN [Message] [Dataex] LINK=1000 返回指定节点。
[Message]:为消息类型。
[Dataex]:附加数据。
说明:发出请求后,等待(最长三分钟)客户端返回消息后,语音流程继续执行下面任务。
用法:REQUEST [inReg] [outReg] NEXT=X 或者
REQUEST [inReg] [outReg] [Delay] NEXT=X
参数: inReg:是向客户端传送的消息变量,可以是S1-S99. 最大长度为250
TCP格式为:IVRCMD;CH=XX;REQUEST=inReg;
outReg:是客户端传回的消息变量,可以是S1-S99. 最大长度为250
客户端返回的消息格式应为:RESPONSE XXX,系统自动将XXX存入outReg中。
Delay:是等待客户端传回的消息变量的时间,可以是D1-D99.
如果在等待过程中,希望系统播放背景音乐等待,需要录制语音文件:
./voc/wait_response.wav即可。
通过这种方法,可以通过代理服务器,访问远程数据库、大型数据库、保密数据库等。
客户端应该与IVR语音服务器建立TCP连接,作为SERVER端, TCP/IP端口值由 “系统参数->设定TCP/IP通信参数菜单中‘使用的TCP/IP端口值’项设定”。
例如:
NODE=40
REQUEST 123456|4455|1|123.45 S1 NEXT=41 #消息变量分别为:帐号|密码|月份|金额
#客户端收到该消息,通过查询数据库返回:RESPONSE 123456|12.11|12.22|12.33|12.44
NODE=41
#S1=123456|12.11|12.22|12.33|12.44
LET S2=S1@1
LET F1=S1@2
LET F2=S1@3
LET F3=S1@3
PLAY_DIGIT_GSB PT1.VOC F1 NEXT=42
用法:NOTHING NEXT=X
例如:
NODE=3
PLACE_CALL 600 D1 NEXT=4
NODE=4
IF D1=1 NEXT=5 #被叫忙,跳转到5
IF D1=2 NEXT=6 #被叫无人应答,跳转到6
IF D1=3 NEXT=7 #被叫应答,跳转到7
NOTHING NEXT=4 #其它,继续等候
用法:RELEASE_CALL
参数: 无
当某通道有电话呼入,系统先识别被叫号码,如被叫号码为“9560400000105604”,系统会到FLOW目录下查找以被叫号码为名的文件夹,如果文件夹不存在系统放一段语音后挂断,文件夹存在,则到文件夹中查找FLOWDATA的文件夹中的AnswerCall.dat,文件存在,执行其中的流程(注:多用此流程进行直转或拒接的功能),此文件不存在,系统在Flowdata文件夹中查找user.dat,并执行流程中定义的流程内容
当流程进行转接的电话转接失败后会自动进入被叫号码目录下的CallExt目录下的CallFail.dat流程,由此流程进行处理
当需要系统记录话单时,在所有流程中加入NODE=0节点,在该节点进行处理记录话单,系统会在挂机时指向NODE=0的节点动作。
系统执行某个流程的流程图:
在业务流程的目录下.flow/9560400000105604/flowdata/ 目录下加一个 AnswerCall.dat ,编写方式如下例:
如95105604 拒接电话号码为“13045678900”
NODE=1
LET S1=CALLER
IF S1==13045678900 NEXT=2
LET R168=100
DELAY 10 LINK=1
NODE=2
PLAY_VOX ./BYEBYE.WAV NEXT=3
NODE=3
RELEASE_CALL
在小号用户 IVR执行流程的NODE=0里通过发送UDP消息将相关信息传给呼叫监控系统。例如在流程中做以下设置:
# CODE VarChar 20 企业代码
# CALLER VarChar 20 主叫号码
# CALLED VarChar 20 被叫号码
# EXTNUM VarChar 20 小号
# CHNUM Smallint NOT NULL KEY 语音通道
# SDATE VarChar 8 NOT NULL KEY 呼叫日期
# STIME VarChar 6 NOT NULL KEY 呼叫时间
# ETIME VarChar 6 结束时间
# SERVERID Smallint NOT NLL KEY 语音节点号
# NODELEN int 时长(秒)
# CALLTYPE Smallint 呼叫类型
NODE=0
LET S84=CHBUF #开始时间日期保存在CHBUF中
LET D1=CH #获得语音通道号
LET D2=REP #语音节点号保存在REP中
LET S85=GBUF #站点号
CALL DATE(S1) #YYYYMMDDHHMMSSW
CALL STRGET(S1,S2,0,8) #取结束日期YYYYMMDD
CALL STRGET(S1,S3,8,6) #取结束时间HHMMSS
CALL STRGET(S84,S4,0,8) #取开始日期YYYYMMDD
CALL STRGET(S84,S5,8,6) #取开始时间HHMMSS
LET S10=./SysDll/ctaCallDll.dll
LET S11=Diff_time_sec
CALL DLL_FUN(S10,S11,S5,S3,0,S6,0,0) #利用DLL函数来计算时差
LET D3=S6 #D3通话时长(秒)
LET S98=CALLED
CALL STRGET(S98,S86,10,6)
LET S98="95"+S86
LET S99=CALLER
LET S1="JF;CALLER="+S99
LET S1=S1+";CALLED="+S98
LET S1=S1+";EXT="+S89 #小号代码保存在S89中
LET S1=S1+";SDATE="+S4
LET S1=S1+";STIME="+S5
LET S1=S1+";EDATE="+S2
LET S1=S1+";ETIME="+S3
LET S1=S1+";SLEN="+S6
LET S1=S1+";CALLTYPE=0;"
CALL SENDBYUDP(S1,1)
RELEASE_CALL
在本机传真 IVR执行流程的NODE=0里通过发送UDP消息将相关信息传给呼叫监控系统。例如在流程中做以下设置:
# CODE VarChar 20 企业代码
# CALLER VarChar 20 主叫号码
# CALLED VarChar 20 被叫号码
# EXTNUM VarChar 20 小号
# CHNUM Smallint NOT NULL KEY 语音通道
# SDATE VarChar 8 NOT NULL KEY 呼叫日期
# STIME VarChar 6 NOT NULL KEY 呼叫时间
# ETIME VarChar 6 结束时间
# SERVERID Smallint NOT NLL KEY 语音节点号
# NODELEN int 时长(秒)
# CALLTYPE Smallint 呼叫类型
NODE=0
LET S84=CHBUF #开始时间日期保存在CHBUF中
LET D1=CH #获得语音通道号
LET D2=REP #语音节点号保存在REP中
LET S85=GBUF #站点号
CALL DATE(S1) #YYYYMMDDHHMMSSW
CALL STRGET(S1,S2,0,8) #取结束日期YYYYMMDD
CALL STRGET(S1,S3,8,6) #取结束时间HHMMSS
CALL STRGET(S84,S4,0,8) #取开始日期YYYYMMDD
CALL STRGET(S84,S5,8,6) #取开始时间HHMMSS
LET S10=./SysDll/ctaCallDll.dll
LET S11=Diff_time_sec
CALL DLL_FUN(S10,S11,S5,S3,0,S6,0,0) #利用DLL函数来计算时差
LET D3=S6 #D3通话时长(秒)
LET S98=CALLED
CALL STRGET(S98,S86,10,6)
LET S98="95"+S86
LET S99=CALLER
LET S1="JF;CALLER="+S99
LET S1=S1+";CALLED="+S98
LET S1=S1+";EXT="
LET S1=S1+";SDATE="+S4
LET S1=S1+";STIME="+S5
LET S1=S1+";EDATE="+S2
LET S1=S1+";ETIME="+S3
LET S1=S1+";SLEN="+S6
LET S1=S1+";CALLTYPE=1;"
CALL SENDBYUDP(S1,1)
RELEASE_CALL
当传真资源已满或传真信箱不存在时,系统会自动查找系统目录下的FaxFail.dat流程文件,由该文件流程对此种情况进行处理(一般情况下将电话转至中心站点进行处理),流程编写如下:
NODE=1
LET S1=CALLED #被叫为9560400000105400
CALL STRGET(S1,S2,13,3) #取企业号码
LET CALLER='10001'+S12
LET CHBUF='594000000002982301008'
DELAY 10 LINK=2019
当有用户需要IVR进行转接,但不希望产生费用,可以采用IVR不摘机转接的方法。此方法通过.flow/9560400000105604/flowdata/ 目录下AnswerCall.dat 来实现,可以在此流程中做查询真实被叫、转接等操作,转接失败仍进入CallFail.dat流程文件,但此时不可以做放音等操作,需要重新LINK到user.dat流程文件中,IVR摘机后才可以实现放音、留言等功能。如某企业IVR不摘机转接,失败后留言,下面以985的流程为例:
1、AnswerCall.dat
NODE=1
LET D99=1
LET S70=CALLER
CALL STRLEN(S70,D70)
LET D71=D70-3
LET D72=D70-4
CALL STRGET(S70,S73,0,1)
CALL STRGET(S70,S74,0,2)
CALL STRGET(S70,S75,0,3)
CALL STRGET(S70,S76,0,4)
CALL STRGET(S70,S77,3,D71)
CALL STRGET(S70,S78,4,D72)
LET S80=GBUF
GOTO 2
NODE=2
IF S75==021 NEXT=211
IF S75==028 NEXT=280
IF S75==057 NEXT=571
IF S76==0531 NEXT=320
LET S99=201985
GOTO 1010
NODE=211
LET S14=015
LET S15=S14+S77
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=280
LET S14=014
LET S15=S14+S77
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=571
LET S14=032
LET S15=S14+S77
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=320
LET S14=026
LET S15=S14+S78
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=10
LET D99=2
LET R168=100
DELAY 10 LINK=1
#PLAY_VOX ../Flow/9560400000105985/VOC/002.WAV NEXT=12
NODE=11
LET D99=3
LET R168=100
DELAY 10 LINK=1
#PLAY_VOX ../Flow/9560400000105985/VOC/001.WAV NEXT=12
NODE=12
IF S73='0'
GOTO 121
ELSE IF S74='13'
GOTO 121
ELSE
LET S91=S80+S70
LET CALLER=S91
GOTO 121
ENDIF
NODE=121
LET CHBUF=985001
DELAY 10 LINK=3:1001
NODE=1010
LET S89=ROUTER
LET S13=ERROR|
GOTO 1011
NODE=1011
LET D79=1
LET S79=D79
LET S11=CALLER
LET S12=S89+";CALLER="
LET S12=S12+S11
LET S12=S12+";CALLED="
LET S12=S12+S99
LET S12=S12+";NUM="
LET S12=S12+S79
LET S12=S12+";TYPE=3;"
REQUEST S12 S13 3 NEXT=1012
NODE=1012
LET S14=S13@1
LET S15=S13@2
LET S16=S13@3
LET S17=S13@4
LET D17=S17
LET LANG=D17
CALL DISP(S16)
IF S14==ERROR NEXT=1013
IF S15==END NEXT=1014
IF S16==01011111111 NEXT=11
IF S16==099111111111 NEXT=10
LET S20='59985' #³
LET S21='00000' #
LET S20=S20+S21
LET S16=S20+S16
LET CHBUF=S16
DELAY 10 LINK=2009
NODE=1013
IF S89==ROUTER1 NEXT=1014
LET S89=ROUTER1
GOTO 1011
NODE=1014
RELEASE_CALL
2、CallFail.dat
NODE=1
LET D79=D79+1
LET S71=D79
LET D1=REP
IF S15==LST NEXT=10
IF S15==END NEXT=10
CALL STRLEN(S15,D15)
IF D15==0 NEXT=10
LET S11=CALLER
LET S12=S89+";CALLER="
LET S12=S12+S11
LET S12=S12+";CALLED="
LET S12=S12+S99
LET S12=S12+";NUM="
LET S12=S12+S71
LET S12=S12+";TYPE=3;"
REQUEST S12 S13 2 NEXT=1011
NODE=1011
LET S14=S13@1
LET S15=S13@2
LET S16=S13@3
LET S17=S13@4
LET D17=S17
LET LANG=D17
CALL DISP(S16)
IF S16==0 NEXT=10
IF D1==1 NEXT=2001
IF D1==2 NEXT=2002
LET S20='59985'
LET S21='00003'
GOTO 2003
NODE=2001
LET S20='59985'
LET S21='00001'
GOTO 2003
NODE=2002
LET S20='59985'
LET S21='00002'
GOTO 2003
NODE=2003
LET S20=S20+S21
LET S16=S20+S16
LET CHBUF=S16
DELAY 10 LINK=2009
NODE=10
CALL DISP(D99)
IF D99==1 NEXT=101
GOTO 102
NODE=101
LET R168=100
DELAY 10 LINK=1
NODE=102
LET D89=0
LET D1=REP
IF D1==1 NEXT=110
IF D1==2 NEXT=111
GOTO 11
NODE=110
LET S1=IREPORT;UID=985;OP=1;OPNAME=æ
CALL SENDBYUDP(S1,1)
GOTO 11
NODE=111
LET S1=IREPORT;UID=985; OP=2;OPNAME=ÎÞÓ¦´ð
CALL SENDBYUDP(S1,1)
GOTO 11
NODE=11
PLAY_VOX ../Flow/9560400000105985/VOC/003.WAV NEXT=13
NODE=13
IF S73='0'
GOTO 131
ELSE IF S74='13'
GOTO 131
ELSE
LET S91=S80+S70
LET CALLER=S91
GOTO 131
ENDIF
NODE=131
DELAY 230 NEXT=121
NODE=121
LET CHBUF=985001
DELAY 10 LINK=3:1001
3、user.dat
NODE=1
CALL DISP(D99)
IF D99==2 NEXT=10
IF D99==3 NEXT=11
IF D99==1 NEXT=101
LET S70=CALLER
CALL STRLEN(S70,D70)
LET D71=D70-3
LET D72=D70-4
CALL STRGET(S70,S73,0,1)
CALL STRGET(S70,S74,0,2)
CALL STRGET(S70,S75,0,3)
CALL STRGET(S70,S76,0,4)
CALL STRGET(S70,S77,3,D71)
CALL STRGET(S70,S78,4,D72)
LET S80=GBUF #OPCODE
GOTO 2
NODE=101 #ADD BY TANGL
LET S69="../Flow/9560400000105985/CallExt/CallFail.dat"
DELAY 10 NEXT=S69:102
NODE=2
IF S75==021 NEXT=211
IF S75==028 NEXT=280
IF S75==057 NEXT=571
IF S76==0531 NEXT=320
LET S99=201985
GOTO 1010
NODE=211
LET S14=015
LET S15=S14+S77
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=280
LET S14=014
LET S15=S14+S77
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=571
LET S14=032
LET S15=S14+S77
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=320
LET S14=026
LET S15=S14+S78
LET CALLER=S15
LET S99=201985
GOTO 1010
NODE=10
PLAY_VOX ../Flow/9560400000105985/VOC/002.WAV NEXT=12
NODE=11
PLAY_VOX ../Flow/9560400000105985/VOC/001.WAV NEXT=12
NODE=12
IF S73='0'
GOTO 121
ELSE IF S74='13'
GOTO 121
ELSE
LET S91=S80+S70
LET CALLER=S91
GOTO 121
ENDIF
NODE=121
LET CHBUF=985001
DELAY 10 LINK=3:1001
NODE=1010
LET S89=ROUTER
LET S13=ERROR|
GOTO 1011
NODE=1011
LET D79=1
LET S79=D79
LET S11=CALLER #»ñµÃÖ÷½Ð
LET S12=S89+";CALLER="
LET S12=S12+S11
LET S12=S12+";CALLED="
LET S12=S12+S99
LET S12=S12+";NUM="
LET S12=S12+S79
LET S12=S12+";TYPE=3;"
REQUEST S12 S13 3 NEXT=1012
NODE=1012
LET S14=S13@1
LET S15=S13@2
LET S16=S13@3
LET S17=S13@4
LET D17=S17
LET LANG=D17
CALL DISP(S16)
IF S14==ERROR NEXT=1013
IF S15==END NEXT=1014
IF S16==01011111111 NEXT=11
IF S16==099111111111 NEXT=10
LET S20='59985'
LET S21='00000'
LET S20=S20+S21
LET S16=S20+S16
LET CHBUF=S16
DELAY 10 LINK=2009
NODE=1013
IF S89==ROUTER1 NEXT=1014
LET S89=ROUTER1
GOTO 1011
NODE=1014
RELEASE_CALL
一、概述
由于Smartele流程生成器的函数有限,有时候不能解决某些比较复杂的操作,例如:处理数据库的记录集、不能对文本文件内容进行读写、不能删除某个文件等。针对这些问题,我们编写了一个名称为ctaCallDll.dll的函数集,专门用来弥补某些直接用流程生成器不能实现的功能。
二、可用函数说明:
1. 删除文件函数
int Killfile(char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1,为要删除的文件名
返回值:outParm1,1-删除成功,0-删除失败
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Killfile
LET S3=C:/V3000/temp.voc
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #将删除C:/V3000/temp.voc
2. 取某个文件的长度
int Getfilelength (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1,文件名
返回值:outParm1,文件大小(字节数)
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Getfilelength
LET S3=C:/V3000/temp.voc
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #S4为该文件的大小(字节数)
3.将输入带*表示小数点的字符串转化成带小数点的字符串
int Getfloat (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1,带*的字符串
返回值:outParm1,带小数点的字符串
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Getfloat
LET S3=123*58
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #S4=123.58
4。将某些内容写入某个文本文件中
int Inputtxt (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 文本文件名称
inParm2 字符串内容
返回值:outParm1 =1 表示操作成功,=0表示操作失败
说明:该函数是以添加的方式写入文本文件,每写一次都自动加回车换行
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Inputtxt
LET S3=C:/txt/ABC.txt
LET S4=12345678
CALL DLL_FUN(S1,S2,S3,S4,0,S5,0,0)
5.从某个文本文件中读取某些内容
int Getfromtxt (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 文本文件名称
inParm2 特征字符串
返回值: outParm1 获得的内容
说明:该函数将inParm1表示的文本文件中某行内容是inParm2=后面的内容赋值给outParm1。
文本中每一行最大长度为150,最多1000行
用法举例:
例如文本文件C:/txt/ABC.txt中有一行内容是:
PASSWORD=12345678,表示密码值为12345678,语音流程中想获得PASSWORD的值。
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Getfromtxt
LET S3=C:/txt/ABC.txt
LET S4=PASSWORD
CALL DLL_FUN(S1,S2,S3,S4,0,S5,0,0) #S5的值为12345678
6.替换字符串里的某个字符
int Replacestr (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 源字符串
inParm2 要插入的内容
inParm3 要替换的字符
返回值:outParm1 替换后的字符串
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Replacestr
LET S3=1234~56
LET S4=8888
LET S5=~
CALL DLL_FUN(S1,S2,S3,S4,S5,S6,0,0) #S6=1234888856
7.获得当前X天以前的日期时间
int Before_x_day (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 天数
返回值:outParm1 X天以前的日期时间,格式为YYYYMMDDHHMMSS
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Before_x_day
LET S3=7
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #S4:7天前的日期时间
8.获得当前X天以后的日期时间
int After_x_day (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 天数
返回值: outParm1 X天以后的日期时间,格式为YYYYMMDDHHMMSS
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=After_x_day
LET S3=7
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #S4:7天后的日期时间
9.获得当前X分钟以前的日期时间
int Before_x_minute (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 分钟数
返回值:outParm1 X分钟以前的日期时间,格式为YYYYMMDDHHMMSS
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Before_x_minite
LET S3=30
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #S4:30分钟前的日期时间
10.获得当前X分钟以后的日期时间
int After_x_minute (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1分钟数
返回值: outParm1 X分钟以后的日期时间,格式为YYYYMMDDHHMMSS
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=After_x_minite
LET S3=30
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #S4:30分钟后的日期时间
11.计算时间差(分钟)
int Diff_time_min (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 起始时间,格式为HHMMSS
inParm2 结束时间,格式为HHMMSS
返回值: outParm1 时间差,单位(分钟)
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Diff_time_min
LET S3=123450
LET S4=132034
CALL DLL_FUN(S1,S2,S3,S4,0,S5,0,0) #S5:时间差(分钟)
12.计算时间差(秒)
int Diff_time_sec (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 起始时间,格式为HHMMSS
inParm2 结束时间,格式为HHMMSS
返回值: outParm1 时间差,单位(秒)
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Diff_time_sec
LET S3=123450
LET S4=132034
CALL DLL_FUN(S1,S2,S3,S4,0,S5,0,0) #S5:时间差(秒)
13.查询数据库符合条件的记录集
int Seekdatabase (char * inParm1,char * inParm2, char * inParm3,
char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1表示相关的ODBC信息,例如:ODBC=XX;UID=XX;PWD=XX;TABLE=XX;RECID=XX;
其中TABLE表示表名,RECID表示符合条件的第XX条记录
inParm2 表示查询条件,格式例如:
CALLER=~613~ AND CHNUM=1
InParm3 表示要查询的字段,最多10个,格式为:L0=XXX;L1=XXX;……;L9=XXX
返回值: outParm1 查询到的各字段内容,用|隔开,格式例如:
|613|2|20030701|132045 表示符合条件的记录各字段内容为依次613、2、20030701、132045
返回END表示没有符合条件的记录
outParm2 符合条件的记录总数
用法举例:
NODE=4
LET S1=ctaCallDll.dll
LET S2=Seekdatabase
LET S3="ODBC=ALLYTALK;UID=sa;PWD=;TABLE=VMHD;RECID=10;"
LET S4="CALLER=~613~ and CHNUM=1"
LET S5="L0=CODE;L1=CHNUM;L2=SDATE;L3=STIME;"
CALL DLL_FUN(S1,S2,S3,S4,S5,S6,S7,0)
CALL DISP(S6) #S6=|613|2|20030701|132045
CALL DISP(S7) #S7为符合条件的记录总数
LET S10=S6@2
LET S11=S6@3
LET S12=S6@4
LET S13=S6@5
CALL DISP(S10)
CALL DISP(S11)
CALL DISP(S12)
CALL DISP(S13)
以上流程表示要从一个ODBC为ALLYTALK的VMHD表里查询符合条件
CALLER=’613’ and CHNUM=1的记录集中的第10条记录的字段CODE、CHNUM、SDATE、STIME的值。
注意:如果查询条件有字符型字段,请用 ~ 代替 '
例如:要查CALLER='12345',在生成器中应该写成 CALLER=~12345~
14.去掉字符串的空格
int Trimstr(char * inParm1,char * inParm2, char * inParm3,char * outParm1 , char * outParm2, char * outParm3)
入口参数:inParm1 带空格的字符串
返回值: outParm2 去掉空格的字符串
用法举例:
NODE=4
LET S1=C:/Dll/ctaCallDll.dll
LET S2=Trimstr
LET S3=" 12345 "
CALL DLL_FUN(S1,S2,S3,0,0,S4,0,0) #S4=12345