当前位置:文档之家› ATClient控件开发手册

ATClient控件开发手册

ATClient控件开发手册
ATClient控件开发手册

ToneThink.soft

ATClient

客户端控件开发手册

2010年

一、概述

1.1、CallThink呼叫中心简介

CallThink 呼叫中心系统是针对企业级客服中心而设计的,一个以电话通信、计算机网络集成为核心的智能通信平台,它将交换技术、CTI技术、网络技术有机的结合起来,和企业的管理、企业的文化、企业的工作流程通过这个平台,以信息技术的方式得以实施。它自1998年推向市场以来,以其功能齐全、性能稳定、价格合理、使用方便等特点,已广泛应用于大中型企业的技术支持、售后服务、产品订购、报刊发行等领域。

CallThink 呼叫中心系统主要由三部分组成:

◆前端通信平台

◆客户业务应用(CRM)

◆质量检验和业务统计

前端通信平台,包含了排队机、CTI服务器、IVR服务器、传真服务器、全程录音设备等几个部分,是客服中心实施的基础。

在后端主要由客户关系管理(CRM)以及支撑客户业务的数据库系统、业务处理系统等组成,该部分将用户的业务流程和管理理念,通过计算机网络技术实现。

质量检验通过技术手段,可以对业务员的工作量、服务态度、技能水平、工作效率等业务能力进行考察;通过实时监测,录音监听等手段,可以抽查业务员处理业务的每一个细节,为掌控整个客服中心的服务水平技术上的支持。

业务统计报表可以从业务量、工作效率、系统使用率、座席繁忙率、用户地域分布、客户资源挖掘等多方面着手,提供给管理人员详尽、真实的第一手材料,为合理使用人力、物力资源,提高客服中心的接通率提供依据。

CallThink 呼叫中心平台是一个开放式智能系统,通过系统提供的API开发包,可以满足所有业务开发的需求。针对IVR语音业务,提供SmarTele流程生成器平台,可以满足用户定制语音流程的各种需求;针对CRM业务开发,提供“CRM客户端控件ATClient.ocx”,本手册将对客户端控件的使用作详细的说明。

1.2、系统框架结构

如图所示,前端通信平台,主要由程控交换机、CTI服务器、IVR语音/传真服务器、在线录音监听服务器等几个部分组成。ATClient控件可以与CTI服务器和tLog服务器直接进行连接,实现控制交换机电话的呼入、呼出、转接、通话、强插、强拆、会议、监听等主要功能。值得注意得是,ATClient客户端控件并未直接与ctsIVR服务器连接,而是通过UltraCTI服务器作为中转设备进行连接及信息交互。

CTI 服务器是呼叫中心的关键部分,它是将电话网与计算机网络集成的纽带,一方面,它通过交换机的CTILink获取交换机的状态并实现对交换机的控制,另一方面,它与交换机、IVR语音传真服务器、在线录音监听服务器、座席员客户端协调工作,完成诸如:用户资料同步弹出、电话及用户资料协同转移、软摘机、软挂机、智能电话外呼预拨功能、座席与IVR 随意切换、传真自动收发等功能。

通过前端通信平台,主要完成以下功能:

■电话的呼入、呼出、转接、通话、强插、强拆、会议、监听等软电话操作(注:强插、强拆及监听等功能的软电话操做是否能实现跟使用的交换机有关,目前Avaya和

Hipath4000交换机支持)。

■操作人员登入,登出,置忙,事后处理

■提供API开发包,可以扩展CRM、IVR功能

以上功能,都是通过“ATClient客户端控件”来完成的。

1.3、客户业务应用(CRM)

在系统后端,主要由客户关系管理(CRM)系统、以及支撑客户业务的数据库系统、业务处理系统、以及座席(业务代表)等业务组成。

客户关系管理(CRM)功能在每一台Agent工作站上实现。实时的用户资料显示:通过DNIS和ANI,呼叫中心将在建立路由的同时,启动数据库系统,将客户资料同步显示在业务代表的电脑上;实时信息管理:呼叫中心能够对呼叫及响应的数据进行实时存储、统计、输出,并且具备生成各种报表的能力。

人工座席是客户服务中心直接为客户提供服务的组件之一。一个人工座席一般会配置一台PC、一部分机电话(可以是数字话机,也可以是模拟话机)。分机电话与PC在人工座席上实现了逻辑上的集成,在座席的PC上,不仅运行了电话应用程序,而且还具有完整的业务功能,可以为客户提供业务方面的服务。

人工座席分为普通席,班长席和值班经理席,不同级别的座席具有不同的功能,普通席采用话务量分担分配话务。班长席可以参与话务分担,也可以不予设置,班长席接听普通席转来的话务,具有监听普通席并进行录音的功能。值班经理席不参与话务分担,可以监听所有其它座席,具有录音功能,录音长度为每次一个人工通话。普通席可以为自己录音,班长席与值班经理席可以对所有低一级座席的通话进行录音。

人工席的录音、转接、发传真操作可以通过工作站键盘操作完成,也可以通过电话键操作完成,系统维护人员只要设置好即可。

人工座席可以将用户的来话转移给值班经理或异地的技术工程师。完备的通话流程记录系统提供完备的通话记录库,并对系统管理人员开放,使得系统管理人员能进行各种分析、统计。

CRM系统的优劣,直接影响到客服中心的效果,好的后端业务系统,可以充分发挥系统平台的作用,提高整体业务水平。

CallThink 呼叫中心平台提供提供API开发包和支持,用户可根据需要定制CRM。

1.4、CRM开发及相关技术支持

CallThink 呼叫中心平台提供标准的ActiveX开发接口,便于内部IT人员二次开发后端业务流程;ActiveX接口是一种标准的API开发接口,几乎目前所有的开发工具都能使用这种开发接口,而且它已经成为事实上WINDOWS操作系统下的开发接口标准。

系统提供标准的ActiveX模式的API开发包,实现以下功能:

■使用标准的ActiveX控件进行开发,保证系统的可移植性。

■充分实现所有软电话功能(软摘机,软挂机,呼叫转移,三方会议,保持/取消保持等)

■提供呼出设定功能,提高操作人员工作效率。

■及时弹出来电用户相关资料,提高工作人员处理速度。

■可根据用户要求,为用户定制CRM系统并使之与呼叫中心系统完美结合。

■可开放两级标准应用接口(TCP/IP通信接口和ActiveX控件接口),满足Intranet应用程序开发。

ATClient.ocx客户端控件使用说明:

1)ATClient.ocx仅供使用CallThink 呼叫中心系统进行应用系统的开发者使用

2)ATClient.ocx连接的呼叫中心服务器系统包括CTI服务器,录音服务器

3)ATClient.ocx客户端控件与服务器系统采用TCP/IP协议中的TCP协议进行信

息传递。

4)ATClient.ocx客户端控件包括事件、方法和属性三部分,使用方法可以对呼叫中心服务器系统进行控制操作,从属性中可以取得各个录音通道,呼叫中心

系统座席和外线的状态。事件用以通知应用系统服务器状态发生了变化。

ATClient.ocx控件以方法、属性及事件三种方式与客户端应用程序交互信息。当应用程序要求CTI服务器进行操作时,调用ATClient.ocx的方法向

CTI服务器或录音服务器发送请求。当CTI服务器或录音服务器向客户端发送

系统状态时,ATClient.ocx控件以事件方式通知应用程序,状态数据存储在

ATClient.ocx的属性中。

通过使用方法可以对呼叫中心服务器系统进行控制操作,例如:实现所有软电话功能(软摘机,软挂机,呼叫转移,三方会议,强插监听,

保持/取消保持等)

通过属性中可以取得座席员、座席分机、外线、队列状态,实现实时通信功能

事件用以通知应用系统服务器状态发生了变化,及时弹出来电用户相关资料,提供工作人员处理速度

(注:ATClient是个通用接口,在不同通信平台(交换机)、不同应用场合(分布式、集中式)可能会有差异。这种情况,一般只和平台

有关,和本控件没有关系)

二、使用客户端控件开发业务系统

2.1 开发流程概述

在使用ATClient控件进行客户端CRM应用软件开发时,一般要按以下步骤进行软件编程开发:

说明:ATClient在运行过程中,会收到所有由CTI服务器控制的座席的消息,在事件中会带有发生事件的座席标识,应用程序应根据需要过滤不同座席的事件消息,如普通座席只显示自已座席的状态,则可以根据事件的座席标识只处理本座席的事件消息,而不处理其它座席的消息。所有座席的状态数据均由ATClient自行保存,应用程序在要使用其它座席的数据时,只要将ATClient的UidSelected属性设置为相应的座席工号,然后再取出的各种数据均是对应于这个座席工号的。例如,要取工号为8601座席的电话状态,则先将UidSelected设为8601,然后再取UidCall_Status的值就可以得到8601座席的状态。

2.2 典型应用之.NET 、VB、VC

2.2.1、客户端登录到CTI服务器

具体做法:

1、将控件用REGSVR32 $path注册。$path为文件路径。如regsvr32 c:\ ATClient.ocx

2、打开开发环境,将ATClient.ocx拖到要设计的窗体中,并设置好控件名。(以.net为例)

3、使用以下方法建立与CTI系统的连接

private int Login_check()

{

int nReturn = -1;

string Result;

ATClient.ATConnect(“168.192.0.1”,18005); //端口号和CTI服务器中设置的端

口号一致

ATClient.ATLogin("8601", "1234", "601","");

//工号、密码、座席号、组号(组号为本工号所登录的组,为空则表示登录数据库中设定的工号所属组)

Result = ATClient.ATCommandResult;

if ((Result == "OK") || (Result == "OK_L1") || (Result == "OK_L2"))

{

nReturn = 1;

}

else if (Result == "ERROR_UID")

{

MessageBox.Show("Local:登录失败,请检查工号是否正确!");

nReturn = -1;

}

else if (Result == "ERROR_PWD")

{

MessageBox.Show ("Local:登录失败,请检查密码是否正确!");

nReturn = -1;

}

else if (Result == "ERROR_REP")

{

MessageBox.Show ("Local:对不起,该帐号正在使用!");

nReturn = -1;

}

else

{

MessageBox.Show ("座席与UltraCTI连接失败,请检查UltraCTI工作是否正常!");

nReturn = -1;

}

return nReturn;

}

4、当程序运行结束时,应断开与CTI系统的连接

ATClient. ATLogout ("8601"); //座席员登出,参数为座席工号

ATClient. ATDisconnect () ; //断开与CTI服务器的连接。

5、特别说明

座席员资料保存在数据库CallThink的CTS_OPIDK表中,包含了工号、密码等信息,座席员资料可通过CtsAdmin完成,CTI服务器认证时要通过检查CTS_OPIDK 和CTS_ACDGP_MEMBER表,要注意V400版本的CTS_ACDGP_MEMBER与

CTS_OPGP_MEMBER的区别,登录时的组号如果为空,CTI就会自动到

CTS_ACDGP_MEMBER中找座席默认所属组。

座席号码与PBX的分机号码是绑定的,其对应关系员资料在CTS_EXT表中设定。在整个呼叫中心系统中,座席号是固定的,座席员可以在不同的座席位置上登录。2.2.2、关于客户资料弹出

1、当用户电话呼入呼叫中心平台,电话呼叫通过CTI服务器分配到本座席时,弹出窗口通过控件ATClient的事件onReceiveCTI_EventChanged触发。

例子:

private void MyATClient_onReceiveCTI_EventChanged(object sender,

AxATClientLib._DATClientEvents_onReceiveCTI_EventChangedEvent e)

{

string strStatus = "";

string strSeStatus = "";

string strCaller = "";

string strCause = "";

int lencause_idx;

string strEventData = "";

switch (e.eventCode)

{

case 0: //显示信息

rem("EventCode=" + e.eventCode.ToString() + ",EventData=" + e.eventData);

break;

case 1://1:表示座席员状态发生变化,EventData 表示座席员工号

ATClient.UidSelected = "8601";

strSeStatus = ATClient.UidStatus; //座席状态,当用户来电还在IVR的时候,CTI 一旦选中座席,便有此消息,这时客户端就可以去数据库查找客户信息,当电话振铃时,客户资料大约已被调出

if (strSeStatus == "05")

{

strCause = ATClient.UidStatus_cause; //收取IVR通道消息

if (strCause.Contains("-"))

{

lencause_idx = strCause.IndexOf('-');

ATClient.ExtSelected = strCause.Substring(lencause_idx + 1);

strCaller = ATClient.ExtCaller; //获取相应IVR通道的主叫号码

strEventData = e.eventData.ToString();

if (strCaller.Length > 0 && strEventData == pmAgent.uid) //只获取本座席的被选中消息

{

//在这里添加弹出客户资料的代码

}

}

}

break;

case 2://表示座席员呼叫状态发生变化,EventData 表示座席员工号

break;

case 3://3:表示外线状态发生变化,EventData 表示外线号码

break;

case 4://4:表示分机状态发生变化,EventData 表示分机号

break;

case 5://5:表示其它座席传来消息,EventData 表示消息内容

break;

case 6://6:表示有用户呼入信息:应用程序依靠此消息弹出用户资料,EventData 表示分机号

ATClient.ExtSelected = "601"; //为要查询的分机付值

Callin_Caller = ATClient.ExtCaller; //获取主叫号码,必须结合ExtSelected

使用

if ((ATClient.ExtDirection == 2) || (ATClient.ExtDirection == 4))

{

Callin_Caller = ATClient.ExtCalled;

}

strValue = ATClient.Ext_UserInfo;//获取从IVR流程传来的消息,相当于以前的IVRInfo

Ivrinfo = strValue;

//在这里添加根据主叫号码弹出客户资料的代码

break;

case 7://7:表示有OEM呼入信息,可能是FAX、VMS、EMAIL、SMS、CHAT等

break;

case 10://10:表示呼叫进入排队,EventData 表示呼叫标识

case 11://11:表示呼叫结束排队,EventData 表示呼叫标识

break;

case 100://100:表示与服务器的连接中断

break;

}

}

由上可见,在两种情况下可以弹出客户资料,第一是在CTI选中座席的时候,会给座席送“座席状态发生变化”的消息,里面包含主叫的一些信息,客户端可以分析出消息中的主叫号码,进行弹出客户资料。第二就是座席分机振玲的时候,CTI会给客户端送来“有用户呼入的消息”,消息里包含主叫号码的信息,客户端也可以在此时弹出客户资料。

注:在CTI选中座席的时候就会给客户端发消息,再到座席振铃,这中间大概有3-4秒的时间,这段时间客户端就可以用来进行处理弹出客户资料的处理,以后的所有客户端也尽量应该采用这种方式来弹出客户资料

2.2.3、关于座席之间转接电话的实现方法

座席之间转接电话一般有两种方式,即单步转接电话方式和发起转移协商方式,单步呼叫转移是指直接将一个分机上的呼叫转移到另外一个分机上,被转移的分机就处于断开状态(数字分机)或空闲状态(模拟分机)。

这是一种比较快速的转接方法,不像一般的转接要先HOLD,然后再呼叫目标分机,最后再完成转接。

这种转接方式受到交换机类型的限制,SIEMENS和AVAYA交换机可以实现这项功能

1、单步转接电话方式,例如下:

int bResult;

string strTemp;

bResult = ATClient.ATTranCall("8616", "601");

//8616为本座席工号,601转移的目的电话

if (bResult == 1)

strTemp = "转接到分机601成功!";

else

strTemp = "转接接分机601失败!";

2、发起转移协商方式,例如下:

private void btnCons_Click(object sender, EventArgs e)

{

ATClient.ATConsTrans("8616", "601");

}

//先发起转移协商,然后再发起转移和结束

private void btnTranOver_Click(object sender, EventArgs e)

{

ATClient.ATTranOver("8616", "");

}

2.2.4、关于座席之间消息传送,工单转发、CallBack的实现方法

1、客户端发送消息

string deTemp = "发送消息!";

string SSmsg = "发送消息!";

SSmsg = String.Format("SHORTMSG;FROM=8616;TO=8601;CALLID={0};", deTemp);

ATClient.ATSendMsg ("8616", "8601", SSmsg);

2、客户端接收消息

当其它座席发送消息到本座席时,弹出窗口通过控件ATClient.ocx的事件onReceiveCTI_EventChanged触发

private void ATClient_onReceiveCTI_EventChanged(object sender, int EventCode, string EventData) {

string strValue;

string strStatus;

string strMsg;

switch (EventCode)

{

case 5://5:表示其它座席传来消息,EventData 表示消息内容

//在这里添加根据消息进行处理后,显示别人发过来的消息内容的代码

break;

}

}

2.2.5、如何获取其它座席、中继线的状态

当其它座席、中继线状态发生变化时,通过控件ATClient.ocx的事件

onReceiveCTI_EventChanged触发。

private void myATClient_onReceiveCTI_EventChanged(object sender, int EventCode, string EventData)

{

string strValue;

string strStatus;

string strMsg;

switch (EventCode)

{

case 0: //显示信息

break;

case 1://1:表示座席员状态发生变化,EventData 表示座席员工号

ATClient.UidSelected = EventData;

strStatus = ATClient.UidCall_Status;

//ATClient.UidCall_Status属性取出的是当前座席分机的状态,不同值表示的含义为:

//01:空闲,02:摘机,03:分机振铃,04:回铃,05:通话,06:断开,07:其他

Change_Status_Ext(EventData, strStatus);

//Change_Status_Ext为处理实时显示其他座席员状态的方法

strStatus = ATClient.Uid_Status; //座席状态发生变化时除了分机的状态变化

外,还会有座席本身的状态变化,z这里的Uid_Status就是用

来获取指定座席员状态,

00:已注销 01:可工作 02:置忙 03:事后处理 04:离席

break;

case 2://表示座席员呼叫状态发生变化,EventData 表示座席员工号

break;

case 3://3:表示外线状态发生变化,EventData 表示外线号码

ATClient.TrunkSelected = EventData;

strStatus = ATClient.TrunkStatus; //取出中继线当前状态: 01:空闲,02:摘机,

03:分机振铃,04:回铃,05:通话,06:断开,

07:其他

Change_Status_Line(EventData, strStatus);

//Change_Status_Line为处理实时显示外线状态的方法

break;

case 4://4:表示分机状态发生变化,EventData 表示分机号

ATClient.ExtSelected = EventData;

strStatus = ATClient.ExtStatus; //取出当前分机的状态: 01:空闲,02:摘机,

03:分机振铃,04:回铃,05:通话,06:断开,

07:其他

break;

case 5://5:表示其它座席传来消息,EventData 表示消息内容

break;

case 6://6:表示有用户呼入信息:应用程序依靠此消息弹出用户资料,EventData 表示分机号

ATClient.ExtSelected = EventData;

string strCaller = myATClient.ExtCaller; //取出来电号码

break;

case 7://7:表示有OEM呼入信息,可能是FAX、VMS、EMAIL、SMS、CHAT等

break;

case 10://10:表示呼叫进入排队,EventData 表示呼叫标识

case 11://11:表示呼叫结束排队,EventData 表示呼叫标识

break;

case 100://100:表示与服务器的连接中断

break;

}

}

2.2.6、通过控件控制电话的常见方法

CRM业务系统还可能用到控件ATClient.ocx以下功能,视具体业务需求而定。

1、摘机应答呼叫。

string myUid = "8616";

ATClient.ATAnswer(myUid, "");

2、座席挂机。

string myUid = "8616";

ATClient.ATHangup(myUid, "");

3、发起呼叫。

string myUid = "8616";

string strTemp = "601";

ATClient.ATPlaceCall(myUid, strTemp);

4、保持当前呼叫。

string myUid = "8616";

ATClient.ATHoldCall(myUid);

5、呼叫转移。

string myUid = "8616";

string strTemp = "601";

ATClient.ATTranCall(myUid, strTemp);

6、代接指定被叫的呼入电话。

string myUid = "8616";

string strTemp = "601";

ATClient.ATPickCall(myUid, strTemp,"");

7、完成当前的呼叫转移。

string myUid = "8616";

ATClient.ATTranOver(myUid, "");

8、在座席或外线之间召开会议。

string myUid = "8616";

string strTemp = "601";

ATClient.ATConf_est(myUid, strTemp);

9、将呼叫转移至IVR。

int ret;

string strIVRInfo = "START.DAT";//START.DAT传给IVR,指定走的流程脚本

string strIVRNode = "1"; //指定走的流程脚本的节点

string tranivr = "";

string myUid = "8616";

string myExt = "616"; //当前座席分机号码

string otherInfo = "测试";

myATClient.ExtSelected = myExt;

string strCallId = myATClient.ExtCallId; //当前分机的呼叫标识

tranivr = "AC_SWITCHIVR;;CALLID="+ strCallId +";EXT="+ myExt + ";IVRFILE="+ strIVRInfo + ";NODE=" + strIVRNode + ";IVRMSG=" + otherInfo + ";";

ret = myForm.myATClient.ATTranCall_toIVR(myUid, 0, "", tranivr);

if (ret == 1)

{

//转接到ivr成功

}

else

{

MessageBox.Show("IVR端口全忙,转接失败!");//转到ivr端口失败,此时可能ivr端口全忙,

或者ivr分机的权限不正确,需要检查

callthink数据库中cts_Ext_Ivr表中,ivr

分机的权限(Ext_Levels字段)的值是否大

于0

}

10、将当前保持的呼叫恢复通话状态。

string myUid = "8616";

ATClient.ATRetriveCall(pmAgent.uid, "");

11、将指定座席置忙。

ACD将不会把外线呼叫分配到此座席。

string myUid = "8616";

ATClient.ATSetBusy(myUid, 1, "")

12、将指定座席取消置忙。

string myUid = "8616";

ATClient.ATSetBusy(myUid, 0, "")

13、设置座席进入事后处理状态。

ACD将不会把外线呼叫分配到此座席,应用程序应注意在适当的时候取消息此状态。

string myUid = "8616";

ATClient.ATSetAfterWorking(myUid,1, "");

14、取消座席事后处理状态。

string myUid = "8616";

ATClient.ATSetAfterWorking(myUid,0, "");

2.2.7、关于用户留言、短信、传真、邮件、WebChat在客户端弹出的实现方法

当用户呼入电话进入IVR服务器,用户通过选择按键选择投诉留言、发送传真功能时,由IVR 服务器处理,留言完毕,系统将语音文件存放在指定路径,同时通过控件事件通知选定座席的CRM系统,CRM系统收到这个事件后,提示座席人员有语音留言或传真消息,座席人员再在CRM上点击一个按钮,选择听取留言或查看传真内容,具体实现过程如下:

座席端CRM通过控件ATClient收到事件onReceiveCTI_EventChanged

private void ATClient_onReceiveCTI_EventChanged(object sender, int EventCode, string EventData) {

string strValue;

string strStatus;

string strMsg;

switch (EventCode)

{

case 7://7:表示有OEM呼入信息,可能是FAX、VMS、EMAIL、SMS、CHAT等

strValue = ATClient.ATGetOEMMessage(EventData);

if(strValue.Length>0)

Popup_Callin_MCI(EventData, strValue);

break;

}

}

说明:当EventCode = 7时,表示有OEM消息,这时CRM进入Popup_Callin_MCI的方法来处理

private void Popup_Callin_MCI(string strSubKey,string strMsgInfo)

{

string strItem;

if (strSubKey == "IVRTOAGENT")

{

//消息格式如下

// strMsgInf的格式如下:"VMS_RECV;VMSBOX=XX;FILEPATH=XX;SDATE=YYYYMMDD;STIME=HHMMSS;”

strItem //取出第一个分号前的内容,做如下判断

if (strItem == "VMS_RECV") //接收留言消息

{

//在这里添加处理接收到的留言的代码

/strMsgInfo= "CALLID=XXX; SDATE =XXX; STIME =XXX; FILEPATH =XXX;"

//VMS_RECV:表示语音留言消息

CALLID:为留言标识,可以通过此留言标识中到CallThink数据库的IVR_VMRECV表中找到此留言

FILEPATH:表示留言文件在服务器中的存放路径。

SDATE:留言日期

STIME:留言时间

}

if (strItem == "FAX_RECV") //接收传真消息

{

//在这里添加处理接收到的传真的代码

strMsgInfo= FAX_RECV; FILEPATH=XX;SDATE=YYYYMMDD;STIME=HHMMSS;”

其中:

FAX_RECV:表示传真接收消息

FILEPATH:表示传真文件的全文件名。

SDATE:接收传真日期

STIME:接收传真时间

}

}

else if (strSubKey == "SMSTOAGENT") //接收手机短信息

{

//在这里添加处理接收到手机短信息的代码

strMsgInfo=SMS_RECV;CALLID=XX;FROM=xxx;TO=xxx;SUBJ=xx; SDATE=YYYYMMDD,HHMMSS;”

其中:

CALLID:该SMS的标识(存于数据库中)

以下信息不是必须,只是显示方便,详细信息需根据CALLID到Callthink数据库的MCI_SMS_RECV表中读取

FROM:表示发送人发送短消息的移动电话号码

TO:表示收送人电话号码

SUBJ:SMS主题

SDATE:给CTI发送消息时的当前时间

}

else if (strSubKey == "EMAILTOAGENT") //接收EMAIL消息

{

//在这里添加处理接收到的邮件的代码

strMsgInfo= EMAIL_RECV;CALLID=XX;FROM=xxx;TO=xxx;SUBJ=xx;”

其中:

CALLID:该邮件的标识(存于数据库中)

以下信息不是必须,只是显示方便,详细信息需根据CALLID到Callthink数据库的MCI_Email_RECV表中读取

FROM 表示发送人地址,如:John@https://www.doczj.com/doc/ae16229950.html,,(可选项)

TO 表示收送人地址,如:John@https://www.doczj.com/doc/ae16229950.html,,必须填

SUBJ:邮件主题,使用GZIP压缩后,转为16进制字串

}

}

2.3 典型应用之B/S开发

B/S实例中介绍如何加载控件和登录退出CTI服务器,以及弹出客户资料的处理,其他可以参考C/S实例部分

2.3.1、加载ATConnect.ocx到Web页面

将控件注册后,从注册表中查找,可以获取ATConnect.ocx在注册表中的CSLID,然后在htm 中加入object,如下例:

2.3.2、客户端登录和退出CTI服务器

在htm中申明js方法,作连接和登录操作,如下例

//连接CTI服务器

function Connect_CTI()

{

var strIP;

strIP=document.frmDemo.txtIP.value;

document.ut_atocx.ATConnect(strIP,18000);

return false;

}

//断开与CTI服务器的连接

function DisConnect_CTI()

{

document.ut_atocx.ATDisconnect();

return false;

}

//座席靠工号登录

function client_login()

{

myUid=document.frmDemo.txtOPID.value;

myPwd = document.frmDemo.txtPassword.value;

if (myPwd == "") myPwd = "";

myExt=document.frmDemo.txtExt.value;

document.ut_atocx.ATLogin(myUid,myPwd,myExt,"1"); //工号,密码,分机号var Result = document.ut_atocx.ATCommandResult(); //获取登录结果

if(Result == "OK")

{

isConnect_CTI=1;

alert("连接成功!");

}

else if (Result == "ERROR_UID")

{

alert("Local:登录失败,请检查工号是否正确!");

}

else if (Result == "ERROR_PWD")

{

alert("Local:登录失败,请检查密码是否正确!");

}

else if (Result == "ERROR_REP")

{

alert("Local:对不起,该帐号正在使用!");

}

else if (Result == "FAIL")

{

alert("Local:登录失败,请检查工号或密码是否正确!");

}

else

{

alert("Local:登录失败,请检查CTI Server 是否运行正常!");

}

//return false;

}

//座席退出登录

function client_logout()

{

document.ut_atocx.ATLogout(myUid);

document.ut_atocx.ATDisconnect();

alert("座席成功退出");

return false;

}

2.3.3、关于客户资料弹出

在调用ATClient事件之前在htm源文件中先调用javascript作一个事件映射方法,如下例

当发生事件消息的时候,便可以进入方法名为ut_atocx_ATMsgEvent的js函数中,便从中获取事件消息进行分析,如下例

function ut_atocx_ATMsgEvent(sender, EventCode, EventData)

{

var caller, called, call_trunk;

var monitor_form_is_on = true;

caller = "";

called = "";

call_trunk = "";

var seat_status;

var strDisp, strPrompt;

var caller_code, ext_code, in_out_call;

var strStatus, lbl_name;

var rc;

var strCause,arrCause,IvrExt;

var IvrInfo;

switch (EventCode) {

case 0: //显示信息

break;

case 1: //1:表示座席员状态发生变化

document.ut_atocx.UidSelected=myUid;

myStatus=document.ut_atocx.UidCall_Status;

myUidStatus=document.ut_atocx.UidStatus;//UidStatus=05座席被选中

if(myUidStatus=="05")

{

strCause = document.ut_atocx.UidStatus_cause;//2010210000-2000

if (strCause.indexOf("-")!=-1)

{

arrCause = strCause.split("-");

IvrExt=arrCause[1];

document.ut_atocx.ExtSelected = IvrExt;

caller = document.ut_atocx.ExtCaller;

IvrInfo=document.ut_atocx.Ext_UserInfo;

if(caller.length>0 && EventData==myUid)

相关主题
文本预览
相关文档 最新文档