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(sender,EventCode,EventData);
当发生事件消息的时候,便可以进入方法名为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)