|
@@ -0,0 +1,419 @@
|
|
1
|
+/**
|
|
2
|
+201606
|
|
3
|
+
|
|
4
|
+基于WebSocket的坐席客户端范例
|
|
5
|
+
|
|
6
|
+1 验证码赋值 这个是向服务端验证身份的 变量名称固定为 authCode
|
|
7
|
+2 new一个TLWSA对象,每个页面只能有一个实例
|
|
8
|
+3 在页面载入完成后,调用一次 tlwsa的 initTLWSA方法,用于初始化
|
|
9
|
+4 写事件callack函数,并赋值给tlwsa的callback
|
|
10
|
+
|
|
11
|
+5 依次调用tlwsa的tlaOpen 方法连接服务器,tlaLogin方法登录,如果是IP坐席,还要调用 tlaSetPhoneNumber方法报告坐席使用的ip话机的电话号码
|
|
12
|
+6 等待呼入,或者调用 tlwsa的 tlaCallagc方法/tlaCall方法呼叫坐席和外线
|
|
13
|
+
|
|
14
|
+其他功能的调用方法请参考相关代码
|
|
15
|
+
|
|
16
|
+**/
|
|
17
|
+// var phoneNumber = '';
|
|
18
|
+var authCode="tlwsab"; //验证码,必须与服务端配置的验证码相同,否则不能通过验证,无法登录到服务器
|
|
19
|
+
|
|
20
|
+var tlwsa=new TLWSA(); //生成一个坐席客户端实例 每个页面只能有一个实例
|
|
21
|
+window.onload=function() //必须第一个调用的方法,初始化websocket相关变量
|
|
22
|
+{
|
|
23
|
+ tlwsa.initTLWSA();
|
|
24
|
+}
|
|
25
|
+
|
|
26
|
+//函数调用的应答 注意 是类TLWSA 不是实例tlwsa
|
|
27
|
+// TLWSA.onOpenreturn=onopenreturn;
|
|
28
|
+TLWSA.onOpenslaveserverreturn=onopenslaveserverreturn;
|
|
29
|
+
|
|
30
|
+// TLWSA.onLoginreturn=onloginreturn;
|
|
31
|
+TLWSA.onMutereturn=onmutereturn;
|
|
32
|
+TLWSA.onUnmutereturn=onunmutereturn;
|
|
33
|
+// TLWSA.onSetphonenumberreturn=onsetphonenumberreturn;
|
|
34
|
+// TLWSA.onLogoffreturn=onlogoffreturn; //主动注销结果
|
|
35
|
+// TLWSA.onAcwreturn=onacwreturn;
|
|
36
|
+// TLWSA.onWcareturn=onwcareturn;
|
|
37
|
+
|
|
38
|
+// TLWSA.onCallreturn=oncallreturn;
|
|
39
|
+TLWSA.onCancelcallreturn=oncancelcallreturn;
|
|
40
|
+// TLWSA.onTransferreturn=ontransferreturn;//调用转移方法之后,返回该事件 如果错误码为0,仅仅表示开始转移,不代表转移目标已经接听或已经拒绝
|
|
41
|
+TLWSA.onCanceltransferreturn=oncanceltransferreturn;
|
|
42
|
+TLWSA.onBlindtransferreturn=onblindtransferreturn;
|
|
43
|
+TLWSA.onTransfertoivrreturn=ontransfertoivrreturn;
|
|
44
|
+TLWSA.onTransfertoivrandwaitreturn=ontransfertoivrandwaitreturn;
|
|
45
|
+TLWSA.onStartlistenreturn=onstartlistenreturn;
|
|
46
|
+TLWSA.onStoplistenreturn=onstoplistenreturn;
|
|
47
|
+// TLWSA.onKillreturn=onkillreturn;
|
|
48
|
+TLWSA.onForceonhookreturn=onforceonhookreturn;
|
|
49
|
+TLWSA.onIntrudereturn=onintrudereturn;
|
|
50
|
+TLWSA.onGetcallreturn=ongetcallreturn;
|
|
51
|
+TLWSA.onAnswercallreturn=onanswercallreturn;
|
|
52
|
+TLWSA.onOnhookreturn=ononhookreturn;
|
|
53
|
+TLWSA.onHoldcallreturn=onholdcallreturn;
|
|
54
|
+TLWSA.onSwapcallreturn=onswapcallreturn;
|
|
55
|
+TLWSA.onActivatecallreturn=onactivatecallreturn;
|
|
56
|
+TLWSA.onUnholdcallreturn=onunholdcallreturn;
|
|
57
|
+TLWSA.onLoginotheragentreturn=onloginotheragentreturn;
|
|
58
|
+TLWSA.onSendmessagetoagentreturn=onsendmessagetoagentreturn;
|
|
59
|
+TLWSA.onAnswerqueuereturn=onanswerqueuereturn;
|
|
60
|
+TLWSA.onSubscribestateinforeturn=onsubscribestateinforeturn;
|
|
61
|
+
|
|
62
|
+TLWSA.onConsulttransferreturn=onconsulttransferreturn;
|
|
63
|
+TLWSA.onCompleteconsulttransferreturn=oncompleteconsulttransferreturn;
|
|
64
|
+TLWSA.onGetnodestatereturn=ongetnodestatereturn;
|
|
65
|
+TLWSA.onTransfernodereturn=ontransfernodereturn;
|
|
66
|
+//会议相关
|
|
67
|
+TLWSA.onConferencestartreturn=onconferencestartreturn;
|
|
68
|
+TLWSA.onConferenceappendmemberreturn=onconferenceappendmemberreturn;
|
|
69
|
+TLWSA.onConferencequeryreturn=onconferencequeryreturn;
|
|
70
|
+TLWSA.onConferencedismissreturn=onconferencedismissreturn;
|
|
71
|
+TLWSA.onConferencekickoutreturn=onconferencekickoutreturn;
|
|
72
|
+TLWSA.onConferencechangememberstatereturn=onconferencechangememberstatereturn;
|
|
73
|
+//主动事件
|
|
74
|
+// TLWSA.onCallin=oncallin;
|
|
75
|
+// TLWSA.onCallend=oncallend;
|
|
76
|
+// TLWSA.onAcw=onacw;
|
|
77
|
+// TLWSA.onWca = onwca;
|
|
78
|
+TLWSA.onLogoff = onlogoff; //被强制注销事件
|
|
79
|
+// TLWSA.onCallresult=oncallresult;
|
|
80
|
+// TLWSA.onTransferresult=ontransferresult;
|
|
81
|
+TLWSA.onConsulttransfercalleeanswer=onconsulttransfercalleeanswer;
|
|
82
|
+TLWSA.onBlindtransferresult=onblindtransferresult;
|
|
83
|
+// TLWSA.onAnswer=onanswer;
|
|
84
|
+// TLWSA.onClosed=onclosed;
|
|
85
|
+TLWSA.onSlaveserverclosed=onslaveserverclosed; //备用服务器网络中断
|
|
86
|
+TLWSA.onHoldcallreleased=onholdcallreleased;
|
|
87
|
+TLWSA.onKeepcallreleased=onkeepcallreleased;
|
|
88
|
+TLWSA.onCalleealerting=oncalleealerting;
|
|
89
|
+TLWSA.onQueue=onqueue;
|
|
90
|
+TLWSA.onQuitqueue=onquitqueue;
|
|
91
|
+TLWSA.onRecvmsg=onrecvmsg;
|
|
92
|
+TLWSA.onHookstate=onhookstate;
|
|
93
|
+TLWSA.onHardwarefail=onhardwarefail;
|
|
94
|
+// TLWSA.onMisscall=onmisscall;
|
|
95
|
+TLWSA.onConferencememberstate=onconferencememberstate;
|
|
96
|
+TLWSA.onSlaveserverfail=onslaveserverfail; //备用服务器故障 例如硬件故障或者中继失步
|
|
97
|
+TLWSA.onSwitchtoslaveserver=onswitchtoslaveserver;
|
|
98
|
+// TLWSA.onStatechange=onstatechange;
|
|
99
|
+TLWSA.onMyStatechange=onmystatechange;
|
|
100
|
+//应答回调
|
|
101
|
+// function onopenreturn(err)
|
|
102
|
+// {
|
|
103
|
+// err = Number(err);
|
|
104
|
+// if(!err){
|
|
105
|
+// console.log('呼叫中心连接成功-----seimin');
|
|
106
|
+// //如果设置过话机
|
|
107
|
+// if(localStorage.getItem('phoneNumber')){
|
|
108
|
+// // 登录并设置号码
|
|
109
|
+// phoneNumber = localStorage.getItem('phoneNumber');
|
|
110
|
+// tlwsa.tlaLogin(phoneNumber,1,-1);
|
|
111
|
+// }
|
|
112
|
+// }else{
|
|
113
|
+// console.log('呼叫中心连接失败-----seimin');
|
|
114
|
+// }
|
|
115
|
+// // console.log('应答:连接服务器结果 '+err);
|
|
116
|
+// }
|
|
117
|
+function onopenslaveserverreturn(err)
|
|
118
|
+{
|
|
119
|
+ console.log('应答:连接备用服务器结果 '+err);
|
|
120
|
+}
|
|
121
|
+
|
|
122
|
+// function onloginreturn(err) //登录结果
|
|
123
|
+// {
|
|
124
|
+// err = Number(err);
|
|
125
|
+// if(!err){
|
|
126
|
+// console.log('登录成功-----seimin');
|
|
127
|
+// setTimeout(function(){
|
|
128
|
+// console.log('开始设置号码【'+phoneNumber+'】-----seimin');
|
|
129
|
+// tlwsa.tlaSetphonenumber(phoneNumber);
|
|
130
|
+// },0)
|
|
131
|
+// }else{
|
|
132
|
+// console.log('登录失败-----seimin');
|
|
133
|
+// }
|
|
134
|
+// console.log('应答:登录请求结果 '+err);
|
|
135
|
+// }
|
|
136
|
+function onmutereturn(err)
|
|
137
|
+{
|
|
138
|
+ console.log('应答:静音请求结果 '+err);
|
|
139
|
+}
|
|
140
|
+function onunmutereturn(err)
|
|
141
|
+{
|
|
142
|
+ console.log('应答:取消静音请求结果 '+err);
|
|
143
|
+}
|
|
144
|
+// function onsetphonenumberreturn(err)
|
|
145
|
+// {
|
|
146
|
+// err = Number(err);
|
|
147
|
+// if(!err){
|
|
148
|
+// console.log('设置号码成功-----seimin');
|
|
149
|
+// }else{
|
|
150
|
+// console.log('设置号码失败-----seimin');
|
|
151
|
+// }
|
|
152
|
+// console.log('应答:报告坐席电话号码请求结果 '+err);
|
|
153
|
+// }
|
|
154
|
+// function onlogoffreturn(err) //注销请求结果
|
|
155
|
+// {
|
|
156
|
+// console.log('应答:注销请求结果 '+err);
|
|
157
|
+// }
|
|
158
|
+
|
|
159
|
+// function onacwreturn(err)
|
|
160
|
+// {
|
|
161
|
+// console.log('应答:离席请求结果 '+err);
|
|
162
|
+// }
|
|
163
|
+// function onwcareturn(err)
|
|
164
|
+// {
|
|
165
|
+// console.log('应答:复席请求结果 '+err);
|
|
166
|
+// }
|
|
167
|
+// function oncallreturn(err)
|
|
168
|
+// {
|
|
169
|
+// console.log('应答:呼叫请求结果 '+err);
|
|
170
|
+// }
|
|
171
|
+function oncancelcallreturn(err) {
|
|
172
|
+ console.log('应答:停止呼叫请求结果 ' + err);
|
|
173
|
+}
|
|
174
|
+// function ontransferreturn(err) {
|
|
175
|
+// console.log('应答:转移请求结果 ' + err);
|
|
176
|
+// }
|
|
177
|
+function oncanceltransferreturn(err) {
|
|
178
|
+ console.log('应答:停止转移请求结果 ' + err);
|
|
179
|
+}
|
|
180
|
+function onblindtransferreturn(err) {
|
|
181
|
+ console.log('应答:盲转请求结果 ' + err);
|
|
182
|
+}
|
|
183
|
+function ontransfertoivrreturn(err) {
|
|
184
|
+ console.log('应答:转ivr请求结果 ' + err);
|
|
185
|
+}
|
|
186
|
+function ontransfertoivrandwaitreturn(err) {
|
|
187
|
+ console.log('应答:转ivr并等待请求结果 ' + err);
|
|
188
|
+}
|
|
189
|
+function onstartlistenreturn(err) {
|
|
190
|
+ console.log('应答:监听请求结果 ' + err);
|
|
191
|
+}
|
|
192
|
+function onstoplistenreturn(err) {
|
|
193
|
+ console.log('应答:停止监听请求结果 ' + err);
|
|
194
|
+}
|
|
195
|
+// function onkillreturn(err) {
|
|
196
|
+// console.log('应答:强制处理请求结果 ' + err);
|
|
197
|
+// }
|
|
198
|
+function onforceonhookreturn(err) {
|
|
199
|
+ console.log('应答:强拆坐席请求结果 ' + err);
|
|
200
|
+}
|
|
201
|
+function onintrudereturn(err) {
|
|
202
|
+ console.log('应答:强插请求结果 ' + err);
|
|
203
|
+}
|
|
204
|
+function ongetcallreturn(err,caller,callee,data,crs) {
|
|
205
|
+ console.log('应答:代接请求结果 ' + err+' '+caller);
|
|
206
|
+}
|
|
207
|
+function onanswercallreturn(err) {
|
|
208
|
+ console.log('应答:应答请求结果 ' + err);
|
|
209
|
+}
|
|
210
|
+function ononhookreturn(err) {
|
|
211
|
+ console.log('应答:挂机请求结果 ' + err);
|
|
212
|
+}
|
|
213
|
+function onholdcallreturn(err) {
|
|
214
|
+ console.log('应答:保持请求结果 ' + err);
|
|
215
|
+}
|
|
216
|
+function onswapcallreturn(err) {
|
|
217
|
+ console.log('应答:切换呼叫请求结果 ' + err);
|
|
218
|
+}
|
|
219
|
+function onactivatecallreturn(err) {
|
|
220
|
+ console.log('应答:激活呼叫请求结果 ' + err);
|
|
221
|
+}
|
|
222
|
+function onunholdcallreturn(err) {
|
|
223
|
+ console.log('应答:取回保持呼叫请求结果 ' + err);
|
|
224
|
+}
|
|
225
|
+function onloginotheragentreturn(err) {
|
|
226
|
+ console.log('应答:登录其他坐席请求结果 ' + err);
|
|
227
|
+}
|
|
228
|
+function onsendmessagetoagentreturn(err) {
|
|
229
|
+ console.log('应答:发送消息请求结果 ' + err);
|
|
230
|
+}
|
|
231
|
+function onanswerqueuereturn(err) {
|
|
232
|
+ console.log('应答:应答队列中的外线请求结果 ' + err);
|
|
233
|
+}
|
|
234
|
+function onsubscribestateinforeturn(err){
|
|
235
|
+ console.log('应答:订阅状态变化消息请求结果 ' + err);
|
|
236
|
+}
|
|
237
|
+function onconsulttransferreturn(err){
|
|
238
|
+ console.log('应答:咨询转移请求结果 '+err);
|
|
239
|
+}
|
|
240
|
+
|
|
241
|
+function oncompleteconsulttransferreturn(err){
|
|
242
|
+ console.log('应答:完成咨询转移请求结果 '+err);
|
|
243
|
+}
|
|
244
|
+function ongetnodestatereturn(jso)
|
|
245
|
+{
|
|
246
|
+ console.log('node state 结果 '+JSON.stringify(jso));
|
|
247
|
+}
|
|
248
|
+function ontransfernodereturn(jso)
|
|
249
|
+{
|
|
250
|
+ console.log('transfer node 结果 '+JSON.stringify(jso))
|
|
251
|
+}
|
|
252
|
+function onconferencestartreturn(jso)
|
|
253
|
+{
|
|
254
|
+ console.log('启动会议 结果 '+jso.err+' 会议ID='+jso.conferenceid);
|
|
255
|
+ if(jso.err == 0)
|
|
256
|
+ conferenceid.value=jso.conferenceid;
|
|
257
|
+}
|
|
258
|
+function onconferenceappendmemberreturn(jso)
|
|
259
|
+{
|
|
260
|
+ console.log('添加会议成员 结果 '+JSON.stringify(jso))
|
|
261
|
+}
|
|
262
|
+function onconferencequeryreturn(jso)
|
|
263
|
+{
|
|
264
|
+ console.log('会议状态查询 结果 '+JSON.stringify(jso))
|
|
265
|
+}
|
|
266
|
+function onconferencedismissreturn(jso)
|
|
267
|
+{
|
|
268
|
+ console.log('解散会议 结果 '+JSON.stringify(jso))
|
|
269
|
+}
|
|
270
|
+function onconferencekickoutreturn(jso)
|
|
271
|
+{
|
|
272
|
+ console.log('踢出成员 结果 '+JSON.stringify(jso))
|
|
273
|
+}
|
|
274
|
+function onconferencechangememberstatereturn(jso)
|
|
275
|
+{
|
|
276
|
+ console.log('改变成员状态 结果 '+jso.err)
|
|
277
|
+}
|
|
278
|
+//主动事件回调
|
|
279
|
+// function oncallin(jso) //呼入通知
|
|
280
|
+// {
|
|
281
|
+// console.log('事件:呼入通知,相关数据: '+JSON.stringify(jso));
|
|
282
|
+// }
|
|
283
|
+// function oncallend(jso) //呼叫结束通知
|
|
284
|
+// {
|
|
285
|
+// console.log('事件:通话结束' + JSON.stringify(jso));
|
|
286
|
+// }
|
|
287
|
+// function onacw()
|
|
288
|
+// {
|
|
289
|
+// console.log('事件:你已经进入离席状态');
|
|
290
|
+// }
|
|
291
|
+// function onwca()
|
|
292
|
+// {
|
|
293
|
+// console.log('事件:你已经进入就绪状态');
|
|
294
|
+// }
|
|
295
|
+function onlogoff() //被动注销事件(网络中断 / 被踢)
|
|
296
|
+{
|
|
297
|
+ console.log('事件:您已经被注销');
|
|
298
|
+}
|
|
299
|
+// function oncallresult(err)
|
|
300
|
+// {
|
|
301
|
+// console.log('事件:呼叫结果 '+JSON.stringify(err));
|
|
302
|
+// }
|
|
303
|
+// function ontransferresult(err) {
|
|
304
|
+// console.log('事件:转移结果 ' + JSON.stringify(err));
|
|
305
|
+// }
|
|
306
|
+function onconsulttransfercalleeanswer(crs){
|
|
307
|
+ console.log('事件:咨询转移被叫应答 crs=' + crs);
|
|
308
|
+}
|
|
309
|
+function onblindtransferresult(err) {
|
|
310
|
+ console.log('事件:盲转结果 ' + JSON.stringify(err));
|
|
311
|
+}
|
|
312
|
+// function onanswer(err) {
|
|
313
|
+// console.log('事件:应答'+err);
|
|
314
|
+// }
|
|
315
|
+// function onclosed(err) {
|
|
316
|
+// console.log('事件:与服务器的网络连接中断');
|
|
317
|
+// }
|
|
318
|
+function onslaveserverclosed(err)
|
|
319
|
+{
|
|
320
|
+ console.log('事件:与备用服务器的网络连接中断');
|
|
321
|
+}
|
|
322
|
+function onholdcallreleased(err) {
|
|
323
|
+ console.log('事件:被保持的对方已挂机');
|
|
324
|
+}
|
|
325
|
+function onkeepcallreleased(err) {
|
|
326
|
+ console.log('事件:转回ivr并等待的外线已挂机');
|
|
327
|
+}
|
|
328
|
+function oncalleealerting(err) {
|
|
329
|
+ console.log('事件:呼叫的外线已经开始振铃');
|
|
330
|
+}
|
|
331
|
+function onqueue(crs,caller,callee,data)
|
|
332
|
+{
|
|
333
|
+ console.log('事件:外线进入队列,crs,caller,callee,data= '+crs+' '+caller+' '+callee+' '+data)
|
|
334
|
+}
|
|
335
|
+// function onstatechange()
|
|
336
|
+// {
|
|
337
|
+// console.log('事件:状态变化----------------------------------------------------');
|
|
338
|
+// queryAgentState();
|
|
339
|
+// }
|
|
340
|
+function onmystatechange(jso)
|
|
341
|
+{
|
|
342
|
+ console.log('事件:状态变化----------------------------------------------------');
|
|
343
|
+ console.log(JSON.stringify(jso));
|
|
344
|
+}
|
|
345
|
+function onquitqueue(crs)
|
|
346
|
+{
|
|
347
|
+ console.log('事件:外线退出队列,crs= '+crs)
|
|
348
|
+}
|
|
349
|
+function onrecvmsg(msg, from) {
|
|
350
|
+ console.log('事件:收到来自'+ from+'的消息:' + msg);
|
|
351
|
+}
|
|
352
|
+function onhookstate(jso) {
|
|
353
|
+ console.log('事件:坐席叉簧状态'+JSON.stringify(jso));
|
|
354
|
+}
|
|
355
|
+function onhardwarefail(err) {
|
|
356
|
+ console.log('事件:keygoe交换机硬件故障');
|
|
357
|
+}
|
|
358
|
+// function onmisscall(err) {
|
|
359
|
+// console.log('事件:呼损');
|
|
360
|
+// }
|
|
361
|
+//新状态 1-呼叫失败 2-呼叫应答进入会议 3-会议中挂机退出会议
|
|
362
|
+function onconferencememberstate(jso)
|
|
363
|
+{
|
|
364
|
+ console.log('会议成员状态发生变化 ' + JSON.stringify(jso));
|
|
365
|
+}
|
|
366
|
+function onslaveserverfail(jso)
|
|
367
|
+{
|
|
368
|
+ console.log('注意:备用服务器已失联');
|
|
369
|
+}
|
|
370
|
+function onswitchtoslaveserver(jso)
|
|
371
|
+{
|
|
372
|
+ console.log('注意:主服务器故障,已经切换到备用服务器');
|
|
373
|
+}
|
|
374
|
+//事件回调函数结束
|
|
375
|
+
|
|
376
|
+function queryAgentState()
|
|
377
|
+{
|
|
378
|
+ console.log('排队外线数量 '+tlwsa.tlaGetacdlength());
|
|
379
|
+
|
|
380
|
+ console.log('外线总数量 '+tlwsa.tlaGettrknumber());
|
|
381
|
+
|
|
382
|
+ var agcount=tlwsa.tlaGetagentcount();
|
|
383
|
+ console.log('登录坐席数量 '+agcount);
|
|
384
|
+ for(var ind=0;ind<agcount;ind++)
|
|
385
|
+ {
|
|
386
|
+ console.log('agnet No. ' + ind + ' workid is '+tlwsa.tlaGetagentwid(ind) + ' state is ' + tlwsa.tlaGetagentstate(ind) + ' '+getStateInfo(tlwsa.tlaGetagentstate(ind) ) )
|
|
387
|
+ }
|
|
388
|
+}
|
|
389
|
+
|
|
390
|
+function getLicenseInfo()
|
|
391
|
+{
|
|
392
|
+ ajo=tlwsa.tlaGetlicenseinfo();
|
|
393
|
+ console.log('授权有效期 '+ajo.validdate+' 授权线数 '+ajo.lines+' 卡号 '+ajo.cardno);
|
|
394
|
+
|
|
395
|
+}
|
|
396
|
+function getStateInfo(state)
|
|
397
|
+{
|
|
398
|
+ switch(state)
|
|
399
|
+ {
|
|
400
|
+ case '0':
|
|
401
|
+ return '未登录';
|
|
402
|
+ case '1':
|
|
403
|
+ return '空闲';
|
|
404
|
+ case '2':
|
|
405
|
+ return '离席';
|
|
406
|
+ case '3':
|
|
407
|
+ return '正在振铃';
|
|
408
|
+ case '4':
|
|
409
|
+ return '播报工号';
|
|
410
|
+ case '5':
|
|
411
|
+ return '通话中';
|
|
412
|
+ case '6':
|
|
413
|
+ return '正在外呼';
|
|
414
|
+ case '7':
|
|
415
|
+ return '正在转移';
|
|
416
|
+ case '8':
|
|
417
|
+ return '正在监听';
|
|
418
|
+ }
|
|
419
|
+}
|