语音呼叫系统IVR流程编写文档整理

博客园博客开通之后便很少发表文章,一是本人技术水平有限,二是工作比较忙,前段时间忙于开发语音呼叫系统占据了自己大部分的时间,现在将开发过程中的部分文档贴下,谨此给那些像我一样初次接触的朋友提供些许帮助!

 


 

一、系统功能概述

SmarTele语音流程脚本语言是针对SmartDev语音平台”而设计的,用于实现语音流程定制。SmarTele脚本语言采用开放式结构,以独立文本文件为信息存放基础,文件之间可以相互调用,简便易学,维护方便。

可以使用“TeleEdit.exe脚本编辑器”或写字板等工具编辑修改。

        通过SmarTele,可以实现以下功能:

1、基本功能

       自动语音应答:如播放语音、菜单选择、收号、录音等。

       支持静态传真的自动收发,图形存储格式采用标准的TIF格式,提供多种文字:如中文、英文转换传真的功能。

       支持动态传真发送,可将中文、英文字符实时地转换为传真发送出去。

       数据库查询采用ODBC与数据库连接,支持MS SQLOracleSybaseInfomix等主流数据库;支持加减乘除运算、逻辑判断、字符串运算等。

       系统支持通过代理服务器访问数据库,以保证IVR系统访问远程数据库、大型数据库、保密数据库时不受影响。

       支持自动拨号,批量外拨,记录外拨结果,外拨方式不仅支持语音,还可支持传真,人工话务员等。

       系统能够将客户IVR交互活动记录到电话跟踪数据库中。

       以独立文件为信息存放基础。

       采用解释执行的运行方式。

2、扩展功能

       调用动态连接库(DLL)

系统提供调用动态连接库接口,对于一些不经常变动的功能模块、复杂的运算、需要保密的信息,可以通过动态连接库实现。

       与通信网关服务器接口

在一些大型项目应用中,IVR语音系统需要和其他系统交互信息,访问远程数据库、大型数据库、保密数据库等,这种情况下,需要设立通信网关,作为代理服务器使用。

这种用法经常在“电话银行系统”、“证券委托的交易系统”使用。

 

3、系统其它特点

       系统提供开放的应用层接口,动态加载新的业务模块。

       系统提供功能强大的应用开发环境:脚本语音控制、DLL功能加载、人工座席控制等。

       提供在线调试工具、预编译功能及错误检查功能。

 


 

二、系统性能指标

1、性能指标

       系统采用WINDOW NT网络操作系统,服务器可选择性能稳定可靠的工业控制机,从而保证了系统运行的稳定性。清楚的中文菜单,便于使用者进行操作;

       系统可选择模拟电话接口(LPS)、BRI2B+D)、中国一号信令、ISDN30B+D)、LineSide E1、七号信令(SS7)、透明传输协议(NOCC)等多种与PSTNPBX的接口方式。对不同型号的交换机,可很容易地设置系统的各项参数,便于调试及维护;

       支持多种交换机:AwayaNortel Meridian1SIEMENSTD510NICE288EDK21等。

       系统单机容量为246…1200端口。可根据实际情况,平滑升级。

系统支持分布处理,通过IVR网关,实现多主机共享语音资源,具有很强的扩充能力。

       提供系统监控、工作日志、业务统计、呼叫分析、远程管理功能接口扩展。

       网络通信基于TCPIP协议族

       系统采用堆叠式模块化设计,用户可以根据自己的实际情况,对任意功能模块进行扩充和重组,在系统配置上进行从小规模到大规模的灵活选择,规模可大可小,并可平滑升级。

       用户无须编写程序,便可生成各种流程的程序,方便快捷,是构造CTI系统的利器。

 

2、平台支持的语音产品

1)、美国Dialogic公司的产品(全世界应用最广泛的语音产品,包括模拟卡及PCM数字卡)

   Proline/2                     多功能2线语音卡

   Dialgic/4D/41D D/41ESC 4线语音卡

   Vfax/40SCCP/4SC          4线传真卡 

   DTI/301 D/300SC-E1       数字中继卡

   MSI/80SC                   人工座席转接卡

 PCCS6-2E1                   七号信令卡

 

2)、美国NMS公司的产品(开放式电信的领导者,完美电信级CTI解决方案)

QX2000(FAX)           4线语音卡(传真)

AG2000                  8线语音卡(传真)

AG4000_1E1/2E1/4E1      数字中继卡(1E12E24E1

CX1000_R、CX2000_R      人工座席转接卡

TX2000、TX3220          七号信令卡

 

3)、三汇公司的产品(国产卡)

SHT-8B/PCI(FAX)        8线语音卡(传真)

SHT-8B/PCI(FAX)        16线语音卡(传真)

SHT-120A-CT/PCI          数字中继卡(1E12E24E1

 

 

5)、其它

QX10000_4LV/8LV            4线/8线语音卡

 Talks 4R/8R                4线/8线录音卡

 深圳东进语音产品


 

三、系统功能模块

3.1系统提供四种类型变量

   系统提供四种类型变量,每种变量数量为99个,变量在每次建立呼叫时清空,一次呼叫过程中保持不变。变量名称约定如下:

1.整数型   D1D2D3… D99

   2.浮点型   F1F2F3…F99

   3.字符串型 S1S2S3… 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)

3.2系统流程节点

一个完整的语音流程,可以由一个、或多个语音流程文件组成,一个流程文件是由若干个语音节点组成的。

一个流程文件不能超过10000行,每个节点不能超过100

一个语音节点的模式为:

   NODE=1

节点命令 [参数1、参数2 ….. ] NEXT= [下一个节点号

节点命令 [参数1、参数2 ….. ] NEXT= [Sx:下一个节点号]

节点命令 [参数1、参数2 ….. ] LINK= [系统流程号]

NODE=2

节点命令 [参数1、参数2 ….. ] NEXT= [下一个节点号]

说明:

1、语音节点

节点格式1NODE=x

使用时注意以下几点:

A、起始节点必须为:NODE=1

B、节点NODE=0 作为系统保留节点,通道挂机之前调用。只允许执行LETCALLWHILEDB_类命令。

2、节点命令:

完成语音的一个基本操作,如:录音、放音、拨号等。

                   系统定义了20多个节点命令,如:PLAY_VOXPLAY_ONE_DTMF等,具体用法详见第四章、系统节点命令描述。

3、参数1、参数2…..:不同的节点命令,需要不同的参数。

      NEXT= [下一个节点号] :流程下一步要执行的操作。

NEXT= [Sx:下一个节点号]Sx:必须为S1-S99,存放流程文件名

                           下一个节点号:为数字或D1-D99

      LINK= [系统流程号] :将流程下一步连接到应用程序中。

                     平台常用的系统流程号码:

     2019 将被叫赋给【CHBUF】,然后LINK=2019即可,听回铃转接;

     2009将被叫赋给【CHBUF】,然后LINK=2009即可,听音乐转接;

     31001 将信箱号码赋给【CHBUF,然后LINK31001,实现留言;

     31200 将信箱号码赋给【CHBUF,然后LINK31200,实现听取留言;

     61430 接收传真

     61450 传真发布

    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、所有字母大小写无关

CLINK= [系统流程号]的用法说明

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

          

3.3系统提供以下几种类型逻辑运算

       >   大于

         <   小于

         >=   大于等于

         <=   小于等于

         <>   不等于

         ==   等于

使用时应配合关键字“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]。

    例如1NODE=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

例如2NODE=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

例如3NODE=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

   例如4NODE=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

例如2NODE=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

3.4系统提供以下几种类型四则运算

+   加法

-           减法

*   乘法

/   除法

取长字符串的子串,不同项目用|号隔开

例如: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]

 

 例如 : 1LET CHBUF=604001

       2LET CALLER=123569874

          3LET CALLED=59604000000105236548

4LET F1=604001

LET R168=F1

5LET D1=2

LET REP=D1

          6LET LASTKEY=A

               7LET D1=1

                      LET LANG=D1

          8LET S1=GBUF

         

3.5系统提供以下几种类型函数

1、DATE() 取日期时间,格式为:YYYYMMDDHHMMSSW。

语法: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)

2、STRGET() 截取字符串

语法: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

3、STRREV() 字符串取反。

语法:CALL STRREV(src,des)

参数: src, 存放源字符串的寄存器,只能为S1..S99。

    des, 存放目标字符串的寄存器,只能为S1..S99

例如:LET S1=123456789

      CALL STRREV(S1,S2)   // S2 的值为987654321

4.STRLEN() 取字符串长度。

语法:CALL STRLEN(src,Dxx)

参数: src, 存放源字符串的寄存器,只能为S1,S2.S99。

Dxx, 存放字符串长度的寄存器,只能为D1,D2.D99

例如:LET S1=123456789

     CALL STRLEN(S1,D1)   // D1 的值为9

5.RAMDOM() 在一定范围内取随机数。

语法:CALL  RAMDOMrange,Dxx

参数: range, 随机数范围值,可以为D1-D99,1-100000。

Dxx, 存放随机数的寄存器,只能为D1-D99.

例如:CALL RAMDOM(100,D1)   // D2 的值可能为1-100之间任意一个数值。

6.CREATEDIR() 创建文件夹

语法:CALL CREATEDIRDirName

参数: DirName 文件夹名称,如:C:\USERDAT

或存放文件夹名称的寄存器,可以为S1-S99。

7.DISP() 显示寄存器的数值

语法:CALL DISPRegister

参数: Register, 存放显示寄存器,可以为D1-D99、F1-F99、S1-S99。

8.TXT_TO_TIF() 将字符串转换为传真文件

语法:CALL TXT_TO_TIFREG,FAXFILE,OP

参数: REG,存放字符串的寄存器,可以为S1-S99。

      FAXFILE:传真文件名

OP: = 1 生成传真的第一行,如果文件不存在,自动生成。

= 2 生成传真文件的中间行

= 3生成传真的最后一行

9DLL_FUN() 调用动态连接库(DLL)

语法:CALL DLL_FUN(DllName,FunctionName, inReg1,inReg2,inReg3,outReg1,outReg2,outReg3)

参数: DllName: 动态连接库(DLL)文件名,可以为S1-S99。

FunctionName: 调用函数名称,可以为S1-S99。

inReg1inReg2inReg3:为函数输入变量,可以是S1-S99.

inRegx:为空,可用0NULL表示。

outReg1outReg2outReg3, 为函数返回变量值或结果,可以为S1-S99。

outRegx:为空,可用0NULL表示。

调用函数名称的入口参数必须为

FunctionName(char * inParm1 , char * inParm2, char * inParm3,

char * outParm1 , char * outParm2, char * outParm3,

10.SENDBYUDP() 通过UDP发送消息

语法:CALL SENDBYUDPstrMessage,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是要记录访问量的节点,对应到报表数据的字段为操作1OPNAME表示本操作节点的名称。

 

11.SENDBYTCP() 通过TCP发送消息

语法:CALL SENDBYTCPstrMessage

参数: strMessage:发送的消息,最大长度为250

接收端应该与IVR语音服务器建立TCP连接,作为SERVER端, TCP/IP端口值由 “系统参数->设定TCP/IP通信参数菜单中‘使用的TCP/IP端口值’项设定”。

12.JOIN_CNF() 将指定的通道加入会议

语法:CALL JOIN_CNFch,cnfid,mothed

参数: ch, 加入会议的通道号,可以为D1-D99,1-90。

       Ch=0, 为本通道

      Cnfid,会议室号,可以为D1-D99,1-30。

      Mothed,加入会议方式,1.双工 2.只听

例如:CALL JOIN_CNF121

13.LEAVE_CNF() 指定的通道退出会议

语法:CALL LEAVE_CNFch,mothed

参数: ch, 退出会议的通道号,可以为D1-D99,1-90。

       Ch=0, 为本通道

      Mothed,退出会议方式,1.双工 2.只听

例如:CALL LEAVE_CNF(1)

 

3.6系统提供以下几种类型数据库操作

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 为数据库中不同的字段。

      2WHERE clause 查询条件,与“SELECT语句”定义一致。

3REG1,REG2…,REGn 可为D1-D99F1-F99S1-S99,用于存放对应

[字段1,字段2…字段n] 的数值,对应位置的数据类型必须一致,例如,

字段5为字符型,REG5应为S1-S99

4Dxx:为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 为数据库中不同的字段。

      2WHERE clause 查询条件,与“SELECT语句”定义一致。

3REG1,REG2…,REGn 可为D1-D99F1-F99S1-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 为数据库中不同的字段。

      2REG1,REG2…,REGn 可为D1-D99F1-F99S1-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)字段为数据库中指定字段。

      2WHERE clause 查询条件,与“SELECT语句”定义一致。

3REG 可为D1-D99F1-F99S1-S99,用于存放 function_name[字段]

运算的结果,对应位置的数据类型必须一致,例如,

字段为整型,REG应为D1-D99

4Dxx D1-D99,用于存放执行结果,0 执行错误 1, 执行正确。

5) function_nameSQL定义的函数,包括:

    SUM():计算某一字段之和,字段只能为数字型。

AVG():计算某一字段的平均值,字段只能为数字型。

COUNT():计算某一字段的个数,字段可为数字型、字符型。

MAX():计算某一字段的最大值,字段可为数字型、字符型、日期。

MIN():计算某一字段的最小值,字段可为数字型、字符型、日期。

 

例如:DB_FUNCTION  SUM(FEE)  FROM  MAILBOX

         WHERE  MAILNO=608  MAP(D1) D10

 


 

四、系统节点命令描述

1PLAY_VOX 播放一个文件,播放完毕转到下一个节点

        用法:PLAY_VOX [filename] NEXT=X    

        参数: filename: 播放的语音文件名

        例如:

           #----------------------

            NODE=3

            PLAY_VOX d:\prompt\lang1\vm5.voc next=100

2PLAY_VOX_VOX 连续播放两个语音文件,播放完毕转到下一个节点

    用法: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

3PLAY_ONE_DTMF 播放文件完毕后,收一个DTMF转到下一个节点

    用法: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

4PLAY_MULT_DTMF 播放文件完毕后,收多个DTMF, 收满长度或遇到'#',转到下一个节点

        用法: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

5PLAY_MULT_DTMF_UPDATE 播放文件完毕后,收多个DTMF, 收满长度或遇到'#',

    语音提示您输入的号码是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

 

6PLAY_DIGIT_STRING  播放完语音再播放纯数字串,播放完毕后,转到下一个节点.

        用法:PLAY_DIGIT_STRING [filename] [DigitBuf] NEXT=X   

        参数: filename: 播放的语音文件名

              DigitBuf: 数字串或存放数字串的寄存器,只能为S1..S99.             

        例如:

           #---------

            NODE=4

            PLAY_DIGIT_STRING d:\prompt\lang1\vm1.voc 1234567 next=100

 

7PLAY_DIGIT_GSB 播放完语音文件,再播放十进制数字串, 播放完毕后,转到下一个节点

用法: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

8PLAY_DIGIT_MONEY 播放完语音文件,再播放货币字符串,播放完毕后,转到下一个节点.

        用法: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

9.PLAY_TTS 播放由文本转换为语音的字符串播放完毕后,转到下一个节点.

        用法: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

 

10PLAY_RECVOX  播放提示语后录音,录音结束后转到下一个节点.

        用法: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

11PLAY_RECVOX_UPDATE 播放提示语后录音,录音结束后,提示"重放按1,

      重录按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

 

12MODIFY_PWD 修改密码,

说明:提示"请输入密码",输入之后,提示"请再输入一次密码"两次输入一致,转到下一个节点.

        用法: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

13RECEIVE_DIGIT  收多个DTMF, 收满长度或遇到'#',转到下一个节点.

        用法:RECEIVE_DIGIT [DTMFLen] [Sxx] NEXT=X   

        参数: DTMFlen: 接收DTMF的个数

 Sxx: 存放DTMF的寄存器,只能为S1,S2..S99.

        例如:

           #----------------------

            NODE=3

RECEIVE_DIGIT 2 S2 next=101

14.RECEIVE_FAX 接收传真文件,接收结束后转到下一个节点.

        用法: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)

15.SEND_FAX 发送传真文件,发送结束后转到下一个节点.

        用法: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

16.PICKUP 处理端口摘机操作, 操作完毕,转到下一个节点.

    用法:PICKUP NEXT=X   

        参数: 无

17PLACE_CALL  系统自动选择一个空闲端口,摘机后,向外拨号,拨号完毕,

      转到下一个节点. (摸拟线/数字卡均可使用)

        用法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

18.DIAL 由指定端口向外拨号(DTMF),拨号完毕,转到下一个节点.

        用法:DIAL [Called] NEXT=X   

        参数: Called: 存放被叫号码或存放被叫号码的寄存器,只能为S1,S2..S9.

        例如:

           #----------------------

            NODE=3

DIAL 600 next=100

19.DIALP 由指定端口向外拨号(DTMF),监视呼叫结果

说明:拨号完毕,发生(被叫忙、被叫应答、呼叫失败、被叫为传真、被叫无人应答、被叫开始振铃)转到下一个节点。

        用法: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

20.FLASH 处理端口Flash操作, 操作完毕,转到下一个节点.

        用法:FLASH [Len] NEXT=X    ,主要用于电话转接.

        参数: len: 存放FLASH时长或存放FLASH时长的寄存器,只能为D1,D2..D99,单位10ms.

        例如:

           #----------------------

            NODE=3

FLASH 100 next=100

21.DELAY 处理端口延时操作, 操作完毕,转到下一个节点.

        用法:DELAY [delay] NEXT=X   

        参数: delay: 存放延时时长或存延时时长的寄存器,只能为D1,D2..D99,单位10ms.

        例如:

           #----------------------

            NODE=3

DELAY 100 next=100

22.GOTO 直接转到下本流程文件的一个节点,或另一个本流程文件某一节点。

        用法: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

23.RETURN 返回调用节点.

        用法:RETURN 返回上次调用节点

RETURN A1B3 返回指定节点

RETURN [Message] [Dataex] 返回上次调用节点,并回送消息。

RETURN [Message] [Dataex] LINK=1000 返回指定节点。

[Message]:为消息类型。

[Dataex]:附加数据。

24.REQUEST IVR语音平台向代理服务器(客户端)发出一个请求。

说明:发出请求后,等待(最长三分钟)客户端返回消息后,语音流程继续执行下面任务。

用法: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

 

25NOTHING 什么工作也不做,指针指到下一个节点

        用法: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 #其它,继续等候

26RELEASE_CALL 处理端口挂机操作, 操作完毕,转到下一个节点

        用法:RELEASE_CALL    

        参数: 无


 

五、典型应用

1、如何进入SMARTELE生成器系统

当某通道有电话呼入,系统先识别被叫号码,如被叫号码为“9560400000105604”,系统会到FLOW目录下查找以被叫号码为名的文件夹,如果文件夹不存在系统放一段语音后挂断,文件夹存在,则到文件夹中查找FLOWDATA的文件夹中的AnswerCall.dat,文件存在,执行其中的流程(注:多用此流程进行直转或拒接的功能),此文件不存在,系统在Flowdata文件夹中查找user.dat,并执行流程中定义的流程内容

当流程进行转接的电话转接失败后会自动进入被叫号码目录下的CallExt目录下的CallFail.dat流程,由此流程进行处理

当需要系统记录话单时,在所有流程中加入NODE=0节点,在该节点进行处理记录话单,系统会在挂机时指向NODE=0的节点动作。

系统执行某个流程的流程图:

2、如何实现拒接的功能

在业务流程的目录下.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

3如何记录小号用户及本机传真话单

       1.小号用户话单输出

在小号用户 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

2.本机传真话单输出

在本机传真 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

4、如何处理传真资源不足的情况

       当传真资源已满或传真信箱不存在时,系统会自动查找系统目录下的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

5、如何实现IVR不摘机转接功能

       当有用户需要IVR进行转接,但不希望产生费用,可以采用IVR不摘机转接的方法。此方法通过.flow\9560400000105604\flowdata\ 目录下AnswerCall.dat 来实现,可以在此流程中做查询真实被叫、转接等操作,转接失败仍进入CallFail.dat流程文件,但此时不可以做放音等操作,需要重新LINKuser.dat流程文件中,IVR摘机后才可以实现放音、留言等功能。如某企业IVR不摘机转接,失败后留言,下面以985的流程为例:

1AnswerCall.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

 

 

2CallFail.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

 

3user.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流程生成器通过调用DLL函数的用法

一、概述

由于Smartele流程生成器的函数有限,有时候不能解决某些比较复杂的操作,例如:处理数据库的记录集、不能对文本文件内容进行读写、不能删除某个文件等。针对这些问题,我们编写了一个名称为ctaCallDll.dll的函数集,专门用来弥补某些直接用流程生成器不能实现的功能。

 

二、可用函数说明:

1. 删除文件函数

 int Killfilechar * inParm1,char * inParm2, char * inParm3,

                 char * outParm1 , char * outParm2, char * outParm3 

 

入口参数:inParm1,为要删除的文件名

返回值:outParm11-删除成功,0-删除失败

用法举例:

 NODE=4

LET S1=C:\Dll\ctaCallDll.dll 

LET S2=Killfile

LET S3=C:\V3000\temp.voc 

CALL DLL_FUNS1,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) #S47天前的日期时间

 

 

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) #S47天后的日期时间

 

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) #S430分钟前的日期时间

 

 

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) #S430分钟后的日期时间

 

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 表示符合条件的记录各字段内容为依次613220030701132045

返回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)

            以上流程表示要从一个ODBCALLYTALKVMHD表里查询符合条件

CALLER=’613’ and CHNUM=1的记录集中的第10条记录的字段CODECHNUMSDATESTIME的值。

注意:如果查询条件有字符型字段,请用 ~ 代替 '

例如:要查CALLER='12345',在生成器中应该写成 CALLER=~12345~

 

14.去掉字符串的空格

 int Trimstrchar * 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

 

 

posted on 2010-01-05 17:20  Warriors  阅读(3361)  评论(2编辑  收藏  举报

导航