Browse Source

呼叫中心暂存

seimin 1 week ago
parent
commit
c70dd3412b

+ 6 - 2
angular.json

@@ -39,7 +39,9 @@
39 39
             ],
40 40
             "scripts": [
41 41
               "node_modules/echarts/dist/echarts.min.js",
42
-              "./node_modules/swiper/swiper-bundle.min.js"
42
+              "./node_modules/swiper/swiper-bundle.min.js",
43
+              "src/assets/libs/TLWebSocketAgent.js",
44
+              "src/assets/libs/ola_api.js"
43 45
             ]
44 46
           },
45 47
           "configurations": {
@@ -110,7 +112,9 @@
110 112
             ],
111 113
             "scripts": [
112 114
               "node_modules/echarts/dist/echarts.min.js",
113
-              "./node_modules/swiper/swiper-bundle.min.js"
115
+              "./node_modules/swiper/swiper-bundle.min.js",
116
+              "src/assets/libs/TLWebSocketAgent.js",
117
+              "src/assets/libs/ola_api.js"
114 118
             ]
115 119
           }
116 120
         },

+ 2 - 2
src/app/components/bind-extension-number/bind-extension-number.component.html

@@ -58,10 +58,10 @@
58 58
     </div>
59 59
     <div class="btns display_flex justify-content_flex-center">
60 60
       <button class="btn" nz-button nzType="primary" [nzLoading]="websocketLoading" (click)="saveOrderScope()">
61
-        绑定
61
+        {{activeScopeTab.value == 1 ? '绑定' : '签入'}}
62 62
       </button>
63 63
       <button class="btn cancel" nz-button nzType="default" (click)="cancelInit()">
64
-        知道了
64
+        取消
65 65
       </button>
66 66
     </div>
67 67
   </div>

+ 1 - 2
src/app/components/bind-extension-number/bind-extension-number.component.ts

@@ -4,7 +4,6 @@ import { MainService } from 'src/app/services/main.service';
4 4
 import { ToolService } from 'src/app/services/tool.service';
5 5
 import { NzMessageService } from 'ng-zorro-antd';
6 6
 import { WebsocketIncomingService } from 'src/app/services/websocket-incoming.service';
7
-import http from "../../../assets/js/http";
8 7
 
9 8
 @Component({
10 9
   selector: 'app-bind-extension-number',
@@ -177,7 +176,7 @@ export class BindExtensionNumberComponent implements OnInit {
177 176
           return;
178 177
         }
179 178
         this.icomingService.setSign('callCenter');
180
-        this.icomingService.setSocketUrl(`${http.wsName}://${this.callCenterConfigObj.socketUrl}`);
179
+        this.icomingService.setSocketUrl(this.callCenterConfigObj.socketUrl);
181 180
         this.confirmModal.emit(this.formData2.number);
182 181
       }
183 182
     }else{

+ 2 - 0
src/app/components/configurationCenter/configuration-dictionary/configuration-dictionary.component.ts

@@ -100,6 +100,7 @@ export class ConfigurationDictionaryComponent implements OnInit {
100 100
           this.btnLoading = false;
101 101
           this.delModal = false;
102 102
           if (data.status == 200) {
103
+            this.mainService.clearDictionary();
103 104
             this.showPromptModal(this.tipsMsg2, true, "");
104 105
           } else {
105 106
             this.showPromptModal(this.tipsMsg2, false, data.msg);
@@ -240,6 +241,7 @@ export class ConfigurationDictionaryComponent implements OnInit {
240 241
       .subscribe((result) => {
241 242
         this.btnLoading = false;
242 243
         if (result.status == 200) {
244
+          this.mainService.clearDictionary();
243 245
           this.showPromptModal('保存', true, '');
244 246
         } else {
245 247
           this.showPromptModal('保存', false, result.msg || '');

+ 4 - 107
src/app/services/websocket-hjzx.service.ts

@@ -2,121 +2,18 @@
2 2
  * @Author: seimin
3 3
  * @Date: 2024-09-24 16:34:47
4 4
  * @LastEditors: seimin
5
- * @LastEditTime: 2024-09-24 16:38:01
5
+ * @LastEditTime: 2024-09-29 09:40:39
6 6
  * @Description: 呼叫中心websocket服务
7 7
  */
8 8
 import { Injectable } from "@angular/core";
9
-import { Subject, Observable, from } from "rxjs";
10
-import * as Atmosphere from "atmosphere.js";
11
-
9
+declare const tlwsa: any;
12 10
 @Injectable({
13 11
   providedIn: "root",
14 12
 })
15 13
 export class WebsocketHjzxService {
16 14
   constructor() { }
17
-  private lockReconnect = false; //避免ws重复连接
18
-  ws = null; //定义websocket
19
-  private url = ""; //ws连接地址
20
-  private urlParams; //ws连接传参
21
-  private isHandler = false; //是否手动
22
-  private subject;
23
-  private reconnectTimer = null;//重连的计时器
24
-  // 连接websocket
25
-  connectWs(url, data): Observable<any> {
26
-    this.url = url;
27
-    this.urlParams = data;
28
-    this.subject = new Subject<any>();
29
-    let request: any = {
30
-      webSocketUrl: url,
31
-      trackMessageLength: true, //校验数据完整性
32
-      transport: "websocket",
33
-      handleOnlineOffline: false,
34
-      suspend: false,
35
-      maxReconnectOnClose: 0,
36
-    };
37
-
38
-    request.onOpen = (response) => {
39
-      console.log("ws连接成功" + new Date().toLocaleString());
40
-      this.heartCheck.reset().start(this);
41
-      console.log(response);
42
-      this.ws.push(JSON.stringify(data));
43
-    };
44
-
45
-    request.onMessage = (response) => {
46
-      this.heartCheck.reset().start(this);
47
-      let message = response.responseBody;
48
-      try {
49
-        console.log("收到消息" + message);
50
-        if (message !== "pong") {
51
-          this.subject.next(JSON.parse(message));
52
-        }
53
-      } catch (e) {
54
-        console.log("This doesn't look like a valid JSON: ", message);
55
-        return;
56
-      }
57
-    };
58
-
59
-    request.onClose = (response) => {
60
-      console.log("ws连接关闭" + new Date().toLocaleString(), this.isHandler);
61
-      this.ws = null;
62
-      console.log(response)
63
-      if (!this.isHandler && response.status === 408) {
64
-        this.reconnect(this.url, this.urlParams);
65
-      }
66
-    };
67
-
68
-    request.onError = (response) => {
69
-      console.log("ws连接错误", this.isHandler);
70
-      this.ws = null;
71
-      if (response.status === 0) {
72
-        this.reconnect(this.url, this.urlParams);
73
-      }
74
-    };
75
-    this.ws = Atmosphere.subscribe(request);
76
-    return this.subject.asObservable();
77
-  }
78
-  //断线重连
79
-  private reconnect(url, data) {
80
-    if (this.lockReconnect) return;
81
-    this.lockReconnect = true;
82
-    this.reconnectTimer = setTimeout(() => {
83
-      //没连接上会一直重连,设置延迟避免请求过多
84
-      this.connectWs(url, data);
85
-      this.lockReconnect = false;
86
-    }, 15000);
87
-  }
88
-  private heartCheck = {
89
-    timeout: 30000, //发一次心跳的间隔时间
90
-    timeoutObj: null,
91
-    serverTimeoutObj: null,
92
-    reset: function () {
93
-      clearTimeout(this.timeoutObj);
94
-      clearTimeout(this.serverTimeoutObj);
95
-      return this;
96
-    },
97
-    start: function (_this) {
98
-      this.timeoutObj = setTimeout(() => {
99
-        //这里发送一个心跳,后端收到后,返回一个心跳消息,
100
-        //onmessage拿到返回的心跳就说明连接正常
101
-        if (_this.ws) {
102
-          _this.ws.push("ping");
103
-        }
104
-        this.serverTimeoutObj = setTimeout(() => {
105
-          //如果超过一定时间还没重置,说明后端主动断开了
106
-          _this.closeWs(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
107
-        }, this.timeout);
108
-      }, this.timeout);
109
-    },
110
-  };
111 15
 
112
-  // 断开websocket
113
-  closeWs(flag: boolean = false) {
114
-    this.isHandler = flag;
115
-    if (flag) {
116
-      clearTimeout(this.reconnectTimer);
117
-    }
118
-    if (this.ws) {
119
-      this.ws.close();
120
-    }
16
+  closeWs(){
17
+    tlwsa.tlaClose();
121 18
   }
122 19
 }

+ 29 - 14
src/app/services/websocket-incoming.service.ts

@@ -2,7 +2,7 @@
2 2
  * @Author: seimin
3 3
  * @Date: 2024-09-24 16:34:47
4 4
  * @LastEditors: seimin
5
- * @LastEditTime: 2024-09-26 11:09:46
5
+ * @LastEditTime: 2024-09-29 10:13:56
6 6
  * @Description: 来电弹屏websocket服务
7 7
  */
8 8
 import { Injectable } from "@angular/core";
@@ -23,13 +23,11 @@ export class WebsocketIncomingService {
23 23
   ) { }
24 24
 
25 25
   // 连接websocket { userCount }
26
-  private user = JSON.parse(localStorage.getItem("user")); //用户信息
26
+  private user = JSON.parse(sessionStorage.getItem("user")); //用户信息
27 27
   connectWs(): Observable<any> {
28 28
     let userCount = this.user.user.account + "|" + this.getPhoneNumber();
29 29
     if(this.getSign() === 'box'){
30 30
       return this.phoneService.connectWs(http.phoneWs, { userCount });
31
-    }else if(this.getSign() === 'callCenter'){
32
-      return this.hjzxService.connectWs(this.getSocketUrl(), { userCount });
33 31
     }
34 32
   }
35 33
   // 断开websocket
@@ -38,7 +36,7 @@ export class WebsocketIncomingService {
38 36
     if(this.getSign() === 'box'){
39 37
       this.phoneService.closeWs(flag);
40 38
     }else if(this.getSign() === 'callCenter'){
41
-      this.hjzxService.closeWs(flag);
39
+      this.hjzxService.closeWs();
42 40
     }
43 41
   }
44 42
 
@@ -46,54 +44,71 @@ export class WebsocketIncomingService {
46 44
   private phoneNumber:string = '';
47 45
   // 获取绑定分机号码
48 46
   getPhoneNumber() {
49
-    return this.phoneNumber || localStorage.getItem('phoneNumber');
47
+    return this.phoneNumber || sessionStorage.getItem('phoneNumber');
50 48
   }
51 49
   // 设置绑定分机号码
52 50
   setPhoneNumber(phoneNumber: string) {
53 51
     this.phoneNumber = phoneNumber;
54
-    localStorage.setItem('phoneNumber', phoneNumber);
52
+    sessionStorage.setItem('phoneNumber', phoneNumber);
55 53
   }
56 54
   // 删除绑定分机号码
57 55
   removePhoneNumber() {
58 56
     this.phoneNumber = '';
59
-    localStorage.removeItem('phoneNumber');
57
+    sessionStorage.removeItem('phoneNumber');
60 58
 
61 59
     this.removeSign();
62 60
     this.removeSocketUrl();
63 61
   }
64 62
 
63
+  // 上次绑定的分机号码
64
+  private phoneNumberPre:string = '';
65
+  // 获取上次绑定分机号码
66
+  getPhoneNumberPre() {
67
+    return this.phoneNumberPre || sessionStorage.getItem('phoneNumberPre');
68
+  }
69
+  // 设置上次绑定分机号码
70
+  setPhoneNumberPre(phoneNumberPre: string) {
71
+    this.phoneNumberPre = phoneNumberPre;
72
+    sessionStorage.setItem('phoneNumberPre', phoneNumberPre);
73
+  }
74
+  // 删除上次绑定分机号码
75
+  removePhoneNumberPre() {
76
+    this.phoneNumberPre = '';
77
+    sessionStorage.removeItem('phoneNumberPre');
78
+  }
79
+
65 80
   // 标识(呼叫中心或录音盒)
66 81
   // callCenter|box
67 82
   private sign:string = '';
68 83
   // 获取绑定标识
69 84
   getSign() {
70
-    return this.sign || localStorage.getItem('sign');
85
+    return this.sign || sessionStorage.getItem('sign');
71 86
   }
72 87
   // 设置绑定标识
73 88
   setSign(sign: string) {
74 89
     this.sign = sign;
75
-    localStorage.setItem('sign', sign);
90
+    sessionStorage.setItem('sign', sign);
76 91
   }
77 92
   // 删除绑定标识
78 93
   removeSign() {
79 94
     this.sign = '';
80
-    localStorage.removeItem('sign');
95
+    sessionStorage.removeItem('sign');
81 96
   }
82 97
 
83 98
   // 呼叫中心服务地址
84 99
   private socketUrl:string = '';
85 100
   // 获取呼叫中心服务地址
86 101
   getSocketUrl() {
87
-    return this.socketUrl || localStorage.getItem('socketUrl');
102
+    return this.socketUrl || sessionStorage.getItem('socketUrl');
88 103
   }
89 104
   // 设置呼叫中心服务地址
90 105
   setSocketUrl(socketUrl: string) {
91 106
     this.socketUrl = socketUrl;
92
-    localStorage.setItem('socketUrl', socketUrl);
107
+    sessionStorage.setItem('socketUrl', socketUrl);
93 108
   }
94 109
   // 删除呼叫中心服务地址
95 110
   removeSocketUrl() {
96 111
     this.socketUrl = '';
97
-    localStorage.removeItem('socketUrl');
112
+    sessionStorage.removeItem('socketUrl');
98 113
   }
99 114
 }

+ 0 - 1
src/app/type/types.ts

@@ -11,7 +11,6 @@ export enum SourceId {
11 11
  * 接口地址
12 12
  */
13 13
 export interface baseUrlType {
14
-  wsName: string;//ws/wss
15 14
   domain: string; //chrome下载地址
16 15
   host: string; //接口地址
17 16
   specimenViewHost: string; //业务视图地址

+ 6 - 0
src/app/views/data-dictionary/data-dictionary.component.ts

@@ -321,6 +321,9 @@ export class DataDictionaryComponent implements OnInit {
321 321
         this.hideModal();
322 322
         this.btnLoading = false;
323 323
         if (result["status"] == 200) {
324
+          if(this.checkedDictionary.type === 'dictionary'){
325
+            this.mainService.clearDictionary();
326
+          }
324 327
           this.showPromptModal(this.add ? "新增" : "编辑", true, "");
325 328
         } else {
326 329
           this.showPromptModal(
@@ -359,6 +362,9 @@ export class DataDictionaryComponent implements OnInit {
359 362
       this.hideDelDictionaryModal();
360 363
       this.btnLoading = false;
361 364
       if (result.status == 200) {
365
+        if(this.checkedDictionary.type === 'dictionary'){
366
+          this.mainService.clearDictionary();
367
+        }
362 368
         this.showPromptModal("删除", true, "");
363 369
       } else {
364 370
         this.showPromptModal("删除", false, result.msg);

+ 27 - 0
src/app/views/fuwutai/fuwutai.component.html

@@ -925,11 +925,38 @@
925 925
             </div>
926 926
           </div>
927 927
         </div>
928
+        <!-- 录音盒状态 -->
928 929
         <div class="fixedMenu" *ngIf="incomingService.getPhoneNumber() && incomingService.getSign() === 'box'">
929 930
           <div class="menuItems">
930 931
             <i class="icon_transport transport-shixian call-icon"></i>
931 932
           </div>
932 933
         </div>
934
+        <!-- 呼叫中心状态 -->
935
+         <!-- 来电 -->
936
+        <div class="fixedMenu" *ngIf="jry_state=='laidian' && incomingService.getSign() === 'callCenter'">
937
+          <div class="menuItems">
938
+            <i class="icon_transport transport-laidian call-icon"></i>
939
+          </div>
940
+        </div>
941
+        <!-- 示忙  -->
942
+        <div class="fixedMenu" *ngIf="jry_state=='shimang' && incomingService.getSign() === 'callCenter'">
943
+          <div class="menuItems">
944
+            <i class="icon_transport transport-shimang1 call-icon"></i>
945
+          </div>
946
+        </div>
947
+        <!-- 示闲  -->
948
+        <div class="fixedMenu" *ngIf="jry_state=='shixian' && incomingService.getSign() === 'callCenter'">
949
+          <div class="menuItems">
950
+            <i class="icon_transport transport-shixian call-icon"></i>
951
+          </div>
952
+        </div>
953
+        <!-- 通话中  -->
954
+        <div class="fixedMenu" *ngIf="jry_state=='tonghuazhong' && incomingService.getSign() === 'callCenter'">
955
+          <div class="menuItems">
956
+            <i class="icon_transport transport-tonghuazhong call-icon"></i>
957
+          </div>
958
+        </div>
959
+
933 960
         <div class="fixedMenu" hidden>
934 961
           <div class="menuItems">
935 962
             <button nz-button nzType="link" class="item itemLink call-status">

+ 523 - 95
src/app/views/fuwutai/fuwutai.component.ts

@@ -26,6 +26,9 @@ import { HttpRequest, HttpClient, HttpResponse } from '@angular/common/http';
26 26
 import cloneDeep from 'lodash-es/cloneDeep'
27 27
 import { WebsocketIncomingService } from 'src/app/services/websocket-incoming.service';
28 28
 
29
+declare const tlwsa: any;
30
+declare const TLWSA: any;
31
+
29 32
 // 日期禁用
30 33
 function range(start: number, end: number): number[] {
31 34
   const result: number[] = [];
@@ -919,12 +922,19 @@ export class FuwutaiComponent implements OnInit {
919 922
 
920 923
   // 连接websocket
921 924
   websocketLoading:boolean = false; //websocket连接状态
925
+  preState:any = '';//最近一次示忙还是示闲的状态
926
+  isShixian = false;//是否示闲
927
+  jry_state = '';//话机状态
928
+  jry_extnNumberObj = {
929
+    // tel1: '',//目的号码对象
930
+    // tel2: '',//转接坐席对象
931
+  }
922 932
   getWebsocketPhone() {
923 933
     this.websocketLoading = true;
924
-    this.incomingService.connectWs().subscribe((data) => {
925
-      const sign = this.incomingService.getSign();
926
-      if(sign === 'box'){
927
-        // 录音盒
934
+    const sign = this.incomingService.getSign();
935
+    if(sign === 'box'){
936
+      // 录音盒
937
+      this.incomingService.connectWs().subscribe((data) => {
928 938
         // data = { status: 201, phone: '013581394341' };//ceshi
929 939
         console.log(data);
930 940
         this.websocketLoading = false;
@@ -934,35 +944,7 @@ export class FuwutaiComponent implements OnInit {
934 944
           this.cancelBindExtensionNumber();
935 945
         } else if (data.status == 201 && data.phone) {
936 946
           this.incidentModel.incomingPhone = this.callNumber = data.phone;
937
-          let dataObj = {
938
-            idx: 0,
939
-            sum: 10,
940
-            department: {
941
-              searchType: 2,
942
-              phone: data.phone,
943
-            },
944
-          };
945
-          this.mainService
946
-            .getFetchDataList("data", "department", dataObj)
947
-            .subscribe((result) => {
948
-              if (result.status == 200) {
949
-                console.log(result);
950
-                if (result.list.length > 0) {
951
-                  //绑定了科室
952
-                  if (!this.newOrderShow && !this.newOrderShowOpen) {
953
-                    this.applyDeptMiddle = result.list[0];
954
-                    this.showNewOrder("yes", data.phone, true);
955
-                  }
956
-                } else {
957
-                  //没绑定科室
958
-                  console.log(this.newOrderShow);
959
-                  if (!this.newOrderShow && !this.newOrderShowOpen) {
960
-                    this.applyDept = null;
961
-                    this.showNewOrder("no", data.phone, true);
962
-                  }
963
-                }
964
-              }
965
-            });
947
+          this.searchBxDept();
966 948
         } else if (data.status == 201 && data.phone === "") {
967 949
           //没绑定科室
968 950
           if (!this.newOrderShow && !this.newOrderShowOpen) {
@@ -970,72 +952,516 @@ export class FuwutaiComponent implements OnInit {
970 952
             this.showNewOrder("no", data.phone, true);
971 953
           }
972 954
         }
973
-      }else if(sign === 'callCenter'){
974
-        // 呼叫中心
975
-        console.log(data);
976
-        this.websocketLoading = false;
977
-        // this.incidentModel.callID = data.callId || undefined;
978
-        // if (data.status == 200 && data.phone) {
979
-        //   this.cancelBindExtensionNumber();
980
-        // } else if (data.status == 201 && data.phone) {
981
-        //   let dataObj = {
982
-        //     idx: 0,
983
-        //     sum: 10,
984
-        //     department: {
985
-        //       searchType: 2,
986
-        //       phone: data.phone,
987
-        //     },
988
-        //   };
989
-        //   this.mainService
990
-        //     .getFetchDataList("data", "department", dataObj)
991
-        //     .subscribe((result) => {
992
-        //       if (result.status == 200) {
993
-        //         console.log(result);
994
-        //         if (result.list.length > 0) {
995
-        //           //绑定了科室
996
-        //           if (!this.newOrderShow && !this.newOrderShowOpen) {
997
-        //             this.applyDeptMiddle = result.list[0];
998
-        //             this.showNewOrder("yes");
999
-        //           }
1000
-        //         } else {
1001
-        //           //没绑定科室
1002
-        //           console.log(this.newOrderShow);
1003
-        //           if (!this.newOrderShow && !this.newOrderShowOpen) {
1004
-        //             this.applyDept = null;
1005
-        //             this.showNewOrder("no", data.phone);
1006
-        //           }
1007
-        //         }
1008
-        //       }
1009
-        //     });
1010
-        // } else if (data.status == 201 && data.phone === "") {
1011
-        //   //没绑定科室
1012
-        //   if (!this.newOrderShow && !this.newOrderShowOpen) {
1013
-        //     this.applyDept = null;
1014
-        //     this.showNewOrder("no", data.phone);
1015
-        //   }
1016
-        // }
955
+      });
956
+    }else if(sign === 'callCenter'){
957
+      // 呼叫中心----start
958
+      let _this = this;
959
+      _this.websocketLoading = false;
960
+      _this.preState = '';
961
+      //连接
962
+      tlwsa.tlaOpen(_this.incomingService.getSocketUrl());
963
+      // 状态回调函数
964
+      // TLWSA.onStatechange = onstatechange;
965
+      // function onstatechange() {
966
+      //   console.log('事件:状态变化----------------------------------------------------');
967
+      //   _this.getState();
968
+      // }
969
+      //连接呼叫中心回调函数
970
+      TLWSA.onOpenreturn = (err) => {
971
+        err = Number(err);
972
+        if (!err) {
973
+          _this.cancelBindExtensionNumber();
974
+          console.log('呼叫中心连接成功-----seimin');
975
+          _this.getState(0);
976
+          _this.msg.success('呼叫中心连接成功')
977
+
978
+          //如果设置过话机
979
+          if (_this.incomingService.getPhoneNumberPre()) {
980
+            //强制签出,然后签入
981
+            tlwsa.tlaKillworkid(_this.incomingService.getPhoneNumberPre());
982
+          }else{
983
+            // 签入并绑定分机
984
+            tlwsa.tlaLogin(_this.user.user.id, 1, -1);
985
+          }
986
+        } else {
987
+          console.log('呼叫中心连接失败-----seimin');
988
+          _this.getState(0);
989
+          _this.msg.error('呼叫中心连接失败')
990
+        }
1017 991
       }
1018
-    });
992
+      //绑定分机回调函数
993
+      TLWSA.onSetphonenumberreturn = function (err) {
994
+        err = Number(err);
995
+        if (!err) {
996
+          console.log('绑定分机成功-----seimin');
997
+          _this.msg.success('绑定分机成功')
998
+          _this.incomingService.setPhoneNumberPre(_this.user.user.id);
999
+          _this.qShimang(1);
1000
+        } else {
1001
+          console.log('绑定分机失败-----seimin');
1002
+          _this.getState(0);
1003
+          _this.msg.error('绑定分机失败')
1004
+        }
1005
+      }
1006
+      //强制示忙回调函数
1007
+      // TLWSA.onAcw = onacw;
1008
+      // function onacw(err) {
1009
+      //   err = Number(err);
1010
+      //   if (!err) {
1011
+      //     console.log('强制示忙成功-----seimin');
1012
+      //     _this.getState(2);
1013
+      //     $.toaster({
1014
+      //       priority: 'info',
1015
+      //       title: '操作',
1016
+      //       message: '示忙成功'
1017
+      //     });
1018
+      //   } else {
1019
+      //     console.log('强制示忙失败-----seimin');
1020
+      //     $.toaster({
1021
+      //       priority: 'info',
1022
+      //       title: '操作',
1023
+      //       message: '示忙失败'
1024
+      //     });
1025
+      //   }
1026
+      // }
1027
+      // //强制示闲回调函数
1028
+      // TLWSA.onWca = onwca;
1029
+      // function onwca(err) {
1030
+      //   console.log(err)
1031
+      //   err = Number(err);
1032
+      //   if (!err) {
1033
+      //     console.log('强制示闲成功-----seimin');
1034
+      //     _this.getState(1);
1035
+      //     $.toaster({
1036
+      //       priority: 'info',
1037
+      //       title: '操作',
1038
+      //       message: '示闲成功'
1039
+      //     });
1040
+      //   } else {
1041
+      //     console.log('强制示闲失败-----seimin');
1042
+      //     $.toaster({
1043
+      //       priority: 'info',
1044
+      //       title: '操作',
1045
+      //       message: '示闲失败'
1046
+      //     });
1047
+      //   }
1048
+      // }
1049
+      //与服务器网络连接中断回调函数
1050
+      let timer = null;
1051
+      TLWSA.onClosed = () => {
1052
+        _this.getState(0);
1053
+        console.log('与服务器网络连接中断-----seimin');
1054
+        _this.msg.info('与服务器网络连接中断,2分钟后重连')
1055
+        console.log('2分钟后自动重连-----seimin')
1056
+        clearTimeout(timer);
1057
+        timer = setTimeout(function () {
1058
+          //连接
1059
+          tlwsa.tlaOpen(_this.incomingService.getSocketUrl());
1060
+        }, 120000)
1061
+      }
1062
+      //签入回调函数
1063
+      TLWSA.onLoginreturn = function (err) {
1064
+        err = Number(err);
1065
+        if (!err) {
1066
+          console.log('签入成功-----seimin');
1067
+          _this.msg.success('签入成功')
1068
+          setTimeout(function () {
1069
+            console.log(_this.incomingService.getPhoneNumber(), 1111)
1070
+            var phoneNumber = _this.incomingService.getPhoneNumber();
1071
+            console.log('开始绑定分机【' + phoneNumber + '】-----seimin');
1072
+            tlwsa.tlaSetphonenumber(phoneNumber);
1073
+          }, 0)
1074
+        } else if (err == 9011) {
1075
+          console.log('签入失败,该分机已登录-----seimin');
1076
+          _this.msg.error('签入失败,该分机已登录')
1077
+        } else {
1078
+          console.log('签入失败-----seimin');
1079
+          _this.msg.error('签入失败')
1080
+        }
1081
+      }
1082
+      // 强制签出回调函数
1083
+      TLWSA.onKillreturn = function (err) {
1084
+        err = Number(err);
1085
+        if (!err) {
1086
+          console.log('强制签出成功-----seimin');
1087
+          _this.getState(0);
1088
+          // $.toaster({
1089
+          //   priority: 'info',
1090
+          //   title: '操作',
1091
+          //   message: '强制签出成功'
1092
+          // });
1093
+        } else {
1094
+          console.log('强制签出失败,该分机不是签入状态-----seimin');
1095
+          // $.toaster({
1096
+          //   priority: 'info',
1097
+          //   title: '操作',
1098
+          //   message: '强制签出失败'
1099
+          // });
1100
+        }
1101
+        //如果设置过话机
1102
+        if (_this.incomingService.getPhoneNumberPre()) {
1103
+          // 签入并绑定分机
1104
+          tlwsa.tlaLogin(_this.incomingService.getPhoneNumberPre(), 1, -1);
1105
+        }
1106
+      }
1107
+      // 签出回调函数
1108
+      TLWSA.onLogoffreturn = function (err) {
1109
+        err = Number(err);
1110
+        if (!err) {
1111
+          console.log('签出成功-----seimin');
1112
+          _this.getState(0);
1113
+          _this.msg.success('签出成功')
1114
+          _this.incomingService.removePhoneNumberPre();
1115
+          _this.incomingService.removePhoneNumber();
1116
+        } else {
1117
+          console.log('签出失败-----seimin');
1118
+          _this.msg.error('签出失败')
1119
+        }
1120
+      }
1121
+      //示忙回调函数
1122
+      TLWSA.onAcwreturn = function (err) {
1123
+        err = Number(err);
1124
+        if (!err) {
1125
+          console.log('示忙成功-----seimin');
1126
+          if (location.href.includes('app/incident/editor') || location.href.includes('app/incident/chart')) {
1127
+            _this.isShixian = false;
1128
+          } else {
1129
+            _this.isShixian = true;
1130
+          }
1131
+          _this.getState(2);
1132
+          _this.preState = 2;
1133
+          _this.msg.success('示忙成功')
1134
+        } else {
1135
+          console.log('示忙失败-----seimin');
1136
+          // $.toaster({
1137
+          //   priority: 'info',
1138
+          //   title: '操作',
1139
+          //   message: '示忙失败'
1140
+          // });
1141
+        }
1142
+      }
1143
+      //示闲回调函数
1144
+      TLWSA.onWcareturn = function (err) {
1145
+        err = Number(err);
1146
+        if (!err) {
1147
+          console.log('示闲成功-----seimin');
1148
+          _this.getState(1);
1149
+          _this.preState = 1;
1150
+          _this.msg.success('示闲成功')
1151
+        } else {
1152
+          console.log('示闲失败-----seimin');
1153
+          _this.msg.error('示闲失败')
1154
+        }
1155
+      }
1156
+      //呼叫坐席回调函数
1157
+      TLWSA.onCallreturn = function (err) {
1158
+        err = Number(err);
1159
+        if (!err) {
1160
+          console.log('呼叫成功,请摘机-----seimin');
1161
+          _this.getState(6);
1162
+          _this.msg.success('呼叫成功,请摘机')
1163
+        } else {
1164
+          console.log('呼叫失败-----seimin');
1165
+          _this.msg.error('呼叫失败')
1166
+        }
1167
+      }
1168
+      //呼叫坐席被接听回调函数
1169
+      TLWSA.onCallresult = function (jso) {
1170
+        console.log(jso);
1171
+        var err = Number(jso.err);
1172
+        if (!err) {
1173
+          console.log('呼叫被接听成功-----seimin');
1174
+          _this.getState(5);
1175
+          _this.msg.success('呼叫被接听成功')
1176
+        } else {
1177
+          console.log('呼叫被接听失败-----seimin');
1178
+          _this.qShimang(1);
1179
+          _this.msg.error('呼叫被接听失败')
1180
+        }
1181
+      }
1182
+      //挂断回调函数
1183
+      TLWSA.onCallend = function (jso) {
1184
+        console.log(jso);//lmm
1185
+        if (jso) {
1186
+          console.log('挂断成功-----seimin');
1187
+          console.log('最近一次话机状态', _this.preState);
1188
+          _this.qShimang(_this.preState);
1189
+          _this.msg.success('挂断成功')
1190
+        } else {
1191
+          console.log('挂断失败-----seimin');
1192
+          _this.msg.error('挂断失败')
1193
+        }
1194
+      }
1195
+      //呼入回调函数
1196
+      TLWSA.onCallin = function (jso) {
1197
+        console.log(jso);
1198
+        _this.callNumber = _this.incidentModel.incomingPhone = jso.caller;//来电的电话
1199
+        _this.incidentModel.callID = jso.crs;//来电的话机id
1200
+        if (jso) {
1201
+          console.log('呼入坐席成功,请摘机-----seimin');
1202
+          _this.getState(3);
1203
+          _this.msg.success('呼入坐席成功,请摘机')
1204
+          console.log('来电了!电话号码是【' + _this.incidentModel.incomingPhone + '】');
1205
+        } else {
1206
+          console.log('呼入坐席失败-----seimin');
1207
+          _this.msg.error('呼入坐席失败')
1208
+        }
1209
+      }
1210
+      // 测试代码start
1211
+      // searchBxDept();
1212
+      // 测试代码end
1213
+      // 查报修科室
1214
+      // function searchBxDept() {
1215
+      //   var postData = { "idx": 0, "sum": 10, "department": { phone: _this.callNumber = _this.incidentModel.incomingPhone } };//hjzxPhone
1216
+      //   api_user_data.fetchDataList('department', postData).then(function (result) {
1217
+      //     if (result.status == 200) {
1218
+      //       console.log(result.list);
1219
+      //       var requesters = result.list;
1220
+
1221
+
1222
+      //       if (requesters.length === 0) {
1223
+      //         //未匹配到报修科室
1224
+      //         $rootScope.newOrder({
1225
+      //           incident: {
1226
+      //             sockid: _this.incidentModel.callID,
1227
+      //             incomingPhone: _this.callNumber = _this.incidentModel.incomingPhone,
1228
+      //             source: { id: 1547, name: '电话' }
1229
+      //           },
1230
+      //         }, 'incomingCall')
1231
+      //       } else if (requesters.length === 1) {
1232
+      //         //匹配到一个报修科室
1233
+      //         $rootScope.newOrder({
1234
+      //           incident: {
1235
+      //             department: requesters[0],
1236
+      //             phone: requesters[0].phone,
1237
+      //             sockid: _this.incidentModel.callID,
1238
+      //             incomingPhone: _this.callNumber = _this.incidentModel.incomingPhone,
1239
+      //             source: { id: 1547, name: '电话' }
1240
+      //           },
1241
+      //         }, 'incomingCall')
1242
+      //       } else {
1243
+      //         //匹配到多个报修科室
1244
+      //         $modal.open({
1245
+      //           templateUrl: 'assets/views/incident/tpl/tel.html',
1246
+      //           controller: function ($scope, $modalInstance, $timeout, SweetAlert) {
1247
+      //             $scope.list = requesters;
1248
+      //             $scope.selected = {
1249
+      //               selectedItem: 0
1250
+      //             };
1251
+      //             $scope.cancel = function () {
1252
+      //               $modalInstance.dismiss('cancel');
1253
+      //             };
1254
+      //             $scope.changeBxr = function (id) {
1255
+      //               $scope.selected.selectedItem = id;
1256
+      //             }
1257
+      //             $scope.save = function () {
1258
+      //               var item = $scope.list.find(v => v.id == $scope.selected.selectedItem);
1259
+      //               if (item) {
1260
+      //                 $scope.cancel();
1261
+      //                 $rootScope.newOrder({
1262
+      //                   incident: {
1263
+      //                     department: item,
1264
+      //                     phone: item.phone,
1265
+      //                     sockid: _this.incidentModel.callID,
1266
+      //                     incomingPhone: _this.callNumber = _this.incidentModel.incomingPhone,
1267
+      //                     source: { id: 1547, name: '电话' }
1268
+      //                   },
1269
+      //                 }, 'incomingCall')
1270
+      //               } else {
1271
+      //                 SweetAlert.swal({
1272
+      //                   title: "请选择报修科室!",
1273
+      //                   type: "error"
1274
+      //                 })
1275
+      //               }
1276
+      //             }
1277
+      //           }
1278
+      //         });
1279
+      //       }
1280
+      //     }
1281
+      //   })
1282
+      // }
1283
+
1284
+      //呼入摘机应答回调函数
1285
+      TLWSA.onAnswer = function (err) {
1286
+        err = Number(err);
1287
+        if (!err) {
1288
+          console.log('呼入摘机应答成功-----seimin');
1289
+          _this.getState(5);
1290
+          _this.msg.success('呼入摘机应答成功')
1291
+
1292
+          // 查报修科室
1293
+          _this.searchBxDept();
1294
+        } else {
1295
+          console.log('呼入摘机应答失败-----seimin');
1296
+          _this.msg.error('呼入摘机应答失败')
1297
+        }
1298
+      }
1299
+      //呼入未摘机应答回调函数
1300
+      TLWSA.onMisscall = function (err) {
1301
+        err = Number(err);
1302
+        if (!err) {
1303
+          console.log('呼入未摘机应答成功-----seimin');
1304
+          _this.getState(1);
1305
+          _this.msg.success('呼入未摘机应答成功')
1306
+        } else {
1307
+          console.log('呼入未摘机应答失败-----seimin');
1308
+          _this.msg.error('呼入未摘机应答失败')
1309
+        }
1310
+      }
1311
+      //转接开始回调函数
1312
+      //调用转移方法之后,返回该事件 如果错误码为0,仅仅表示开始转移,不代表转移目标已经接听或已经拒绝
1313
+      TLWSA.onTransferreturn = function (err) {
1314
+        err = Number(err);
1315
+        if (!err) {
1316
+          console.log('转接坐席开始成功-----seimin');
1317
+          _this.getState(7);
1318
+          _this.msg.success('转接坐席开始成功')
1319
+        } else {
1320
+          console.log('转接坐席开始失败-----seimin');
1321
+          _this.msg.error('转接坐席开始失败')
1322
+        }
1323
+      }
1324
+      //转接结果回调函数
1325
+      TLWSA.onTransferresult = function (err) {
1326
+        err = Number(err);
1327
+        if (!err) {
1328
+          console.log('转接坐席结果成功-----seimin');
1329
+          _this.getState(1);
1330
+          _this.msg.success('转接坐席结果成功')
1331
+        } else {
1332
+          console.log('转接坐席结果失败-----seimin');
1333
+          _this.msg.error('转接坐席结果失败')
1334
+        }
1335
+      }
1336
+      // 呼叫中心----end
1337
+    }
1019 1338
   }
1020
-  //确定绑定
1021
-  // bindingOk() {
1022
-  //   if (this.phoneNumListSelected.length > 0) {
1023
-  //     this.incomingService.closeWs(true);
1024
-  //     this.getWebsocketPhone();
1025
-  //   } else {
1026
-  //     this.incomingService.removePhoneNumber();
1027
-  //     this.binding = 3;
1028
-  //     this.phoneNumListBind = [];
1029
-  //     this.phoneNumList.forEach((item) => {
1030
-  //       item.checked = false;
1031
-  //     });
1032
-  //     this.incomingService.closeWs(true);
1033
-  //   }
1339
+
1340
+  // 呼叫中心---start
1341
+  searchBxDept(){
1342
+    let dataObj = {
1343
+      idx: 0,
1344
+      sum: 10,
1345
+      department: {
1346
+        searchType: 2,
1347
+        phone: this.incidentModel.incomingPhone,
1348
+      },
1349
+    };
1350
+    this.mainService
1351
+      .getFetchDataList("data", "department", dataObj)
1352
+      .subscribe((result) => {
1353
+        if (result.status == 200) {
1354
+          console.log(result);
1355
+          if (result.list.length > 0) {
1356
+            //绑定了科室
1357
+            if (!this.newOrderShow && !this.newOrderShowOpen) {
1358
+              this.applyDeptMiddle = result.list[0];
1359
+              this.showNewOrder("yes", this.incidentModel.incomingPhone, true);
1360
+            }
1361
+          } else {
1362
+            //没绑定科室
1363
+            console.log(this.newOrderShow);
1364
+            if (!this.newOrderShow && !this.newOrderShowOpen) {
1365
+              this.applyDept = null;
1366
+              this.showNewOrder("no", this.incidentModel.incomingPhone, true);
1367
+            }
1368
+          }
1369
+        }
1370
+      });
1371
+  }
1372
+  // 强制示忙
1373
+  qShimang(state) {
1374
+    if (location.href.includes('app/incident/editor') || location.href.includes('app/incident/chart')) {
1375
+      //进入页面,强制示忙
1376
+      // tlwsa.tlaForceacw(this.user.user.id);
1377
+      setTimeout(() => {
1378
+        tlwsa.tlaAcw();
1379
+      }, 0)
1380
+    } else {
1381
+      this.getState(state);
1382
+    }
1383
+  }
1384
+  // 获取状态
1385
+  getState(state) {
1386
+    switch (state) {
1387
+      case 0:
1388
+        this.jry_state = 'weiqianru';
1389
+        break;
1390
+      case 1:
1391
+        this.jry_state = 'shixian';
1392
+        break;
1393
+      case 2:
1394
+        this.jry_state = 'shimang';
1395
+        break;
1396
+      case 3:
1397
+        this.jry_state = 'laidian';
1398
+        break;
1399
+      case 5:
1400
+        this.jry_state = 'tonghuazhong';
1401
+        break;
1402
+      case 6:
1403
+        this.jry_state = 'zhengzaiwaihu';
1404
+        break;
1405
+      case 7:
1406
+        this.jry_state = 'zhengzaizhuanyi';
1407
+        break;
1408
+    }
1409
+  }
1410
+  // 签入
1411
+  jry_qianru = function () {
1412
+    if (!this.incomingService.getPhoneNumber()) {
1413
+      this.msg.warning('绑定分机不能为空')
1414
+      return;
1415
+    }
1416
+    // 签入并绑定分机
1417
+    // this.incomingService.getPhoneNumber() 分机号
1418
+    // this.user.user.id  坐席号(用户id)
1419
+    tlwsa.tlaLogin(this.user.user.id, 1, -1);
1420
+  }
1421
+  // 示闲
1422
+  jry_shixian = function () {
1423
+    tlwsa.tlaWca();
1424
+  }
1425
+  // 示忙
1426
+  jry_shimang = function () {
1427
+    tlwsa.tlaAcw();
1428
+  }
1429
+  // 签出
1430
+  jry_qianchu = function () {
1431
+    tlwsa.tlaLogoff();
1432
+  }
1433
+  // 呼叫坐席
1434
+  // tlaCallagc = function () {
1435
+  //   tlwsa.tlaCallagc(this.jry_extnNumberObj.tel1)
1034 1436
   // }
1035
-  // 选择分机
1036
-  // changePhones(value) {
1037
-  //   this.phoneNumListSelected = value;
1437
+  // 呼叫外线
1438
+  tlaCallout = function () {
1439
+    // 选择目的号码
1440
+    var reg1 = /^[0][1-9]{2,3}-[0-9]{5,10}$/;
1441
+    var reg2 = /^(0|9|90|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/;
1442
+    if (!reg1.test(this.jry_extnNumberObj.tel1) && !reg2.test(this.jry_extnNumberObj.tel1)) {
1443
+      this.msg.warning('请输入正确的手机号或座机号')
1444
+      return;
1445
+    }
1446
+    // tlwsa.tlaCallout(this.jry_extnNumberObj.tel1,this.incomingService.getPhoneNumber(),0)
1447
+    tlwsa.tlaCallout(this.jry_extnNumberObj.tel1, '3558177', 1);//襄阳主叫号码写死
1448
+  }
1449
+  // // 转移坐席
1450
+  // tlaTransfertoagc = function () {
1451
+  //   tlwsa.tlaTransfertoagc(this.jry_extnNumberObj.tel2)
1038 1452
   // }
1453
+  // 转移外线
1454
+  tlaTransferout = function () {
1455
+    // 选择转接号码
1456
+    var reg1 = /^[0][1-9]{2,3}-[0-9]{5,10}$/;
1457
+    var reg2 = /^(0|9|90|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/;
1458
+    if (!reg1.test(this.jry_extnNumberObj.tel2) && !reg2.test(this.jry_extnNumberObj.tel2)) {
1459
+      this.msg.warning('请输入正确的手机号或座机号')
1460
+      return;
1461
+    }
1462
+    tlwsa.tlaTransferout(this.jry_extnNumberObj.tel2, '3558177', 1);//襄阳主叫号码写死
1463
+  }
1464
+  // 呼叫中心---end
1039 1465
 
1040 1466
   onChange(value: number): void {
1041 1467
     console.log(`onChange: ${value}`);
@@ -1683,6 +2109,7 @@ export class FuwutaiComponent implements OnInit {
1683 2109
     localStorage.removeItem("user");
1684 2110
     localStorage.removeItem("menu");
1685 2111
     this.incomingService.removePhoneNumber();
2112
+    this.incomingService.removePhoneNumberPre();
1686 2113
     localStorage.removeItem("index");
1687 2114
     // 假退出
1688 2115
     this.mainService.logOut().subscribe((data) => {
@@ -1697,6 +2124,7 @@ export class FuwutaiComponent implements OnInit {
1697 2124
         localStorage.removeItem("user");
1698 2125
         localStorage.removeItem("menu");
1699 2126
         this.incomingService.removePhoneNumber();
2127
+        this.incomingService.removePhoneNumberPre();
1700 2128
         localStorage.removeItem("index");
1701 2129
       }
1702 2130
     });

+ 0 - 1
src/assets/js/http.ts

@@ -5,7 +5,6 @@ const port: string = location.port; //端口
5 5
 const protocolName: string = document.location.protocol; //http协议
6 6
 const wsName: string = protocolName === "http:" ? "ws" : "wss"; //ws协议
7 7
 const baseUrl: baseUrlType = {
8
-  wsName,
9 8
   domain: `${protocolName}//${domainName}:${port}`, //chrome下载地址
10 9
   host: `${protocolName}//${domainName}:${port}/service`, //接口地址
11 10
   specimenViewHost: `${protocolName}//${domainName}:${port}/specimenView`, //业务视图地址

File diff suppressed because it is too large
+ 1473 - 0
src/assets/libs/TLWebSocketAgent.js


+ 418 - 0
src/assets/libs/ola_api.js

@@ -0,0 +1,418 @@
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
+//应答回调
100
+// function onopenreturn(err)
101
+// {
102
+// 	err = Number(err);
103
+// 	if(!err){
104
+// 		console.log('呼叫中心连接成功-----seimin');
105
+// 		//如果设置过话机
106
+// 		if(localStorage.getItem('phoneNumber')){
107
+// 			// 登录并设置号码
108
+// 			phoneNumber = localStorage.getItem('phoneNumber');
109
+// 			tlwsa.tlaLogin(phoneNumber,1,-1);
110
+// 		}
111
+// 	}else{
112
+// 		console.log('呼叫中心连接失败-----seimin');
113
+// 	}
114
+// 	// console.log('应答:连接服务器结果 '+err);
115
+// }
116
+function onopenslaveserverreturn(err)
117
+{
118
+	console.log('应答:连接备用服务器结果 '+err);
119
+}
120
+
121
+// function onloginreturn(err) //登录结果
122
+// {
123
+// 	err = Number(err);
124
+// 	if(!err){
125
+// 		console.log('登录成功-----seimin');
126
+// 		setTimeout(function(){
127
+// 			console.log('开始设置号码【'+phoneNumber+'】-----seimin');
128
+// 			tlwsa.tlaSetphonenumber(phoneNumber);
129
+// 		},0)
130
+// 	}else{
131
+// 		console.log('登录失败-----seimin');
132
+// 	}
133
+// 	console.log('应答:登录请求结果 '+err);
134
+// }
135
+function onmutereturn(err)
136
+{
137
+	console.log('应答:静音请求结果 '+err);
138
+}
139
+function onunmutereturn(err)
140
+{
141
+	console.log('应答:取消静音请求结果 '+err);
142
+}
143
+// function onsetphonenumberreturn(err)
144
+// {
145
+// 	err = Number(err);
146
+// 	if(!err){
147
+// 		console.log('设置号码成功-----seimin');
148
+// 	}else{
149
+// 		console.log('设置号码失败-----seimin');
150
+// 	}
151
+// 	console.log('应答:报告坐席电话号码请求结果 '+err);
152
+// }
153
+// function onlogoffreturn(err) //注销请求结果
154
+// {
155
+// 	console.log('应答:注销请求结果 '+err);
156
+// }
157
+
158
+// function onacwreturn(err)
159
+// {
160
+// 	console.log('应答:离席请求结果 '+err);
161
+// }
162
+// function onwcareturn(err)
163
+// {
164
+// 	console.log('应答:复席请求结果 '+err);
165
+// }
166
+// function oncallreturn(err)
167
+// {
168
+// 	console.log('应答:呼叫请求结果 '+err);
169
+// }
170
+function oncancelcallreturn(err) {
171
+    console.log('应答:停止呼叫请求结果 ' + err);
172
+}
173
+// function ontransferreturn(err) {
174
+//     console.log('应答:转移请求结果 ' + err);
175
+// }
176
+function oncanceltransferreturn(err) {
177
+    console.log('应答:停止转移请求结果 ' + err);
178
+}
179
+function onblindtransferreturn(err) {
180
+    console.log('应答:盲转请求结果 ' + err);
181
+}
182
+function ontransfertoivrreturn(err) {
183
+    console.log('应答:转ivr请求结果 ' + err);
184
+}
185
+function ontransfertoivrandwaitreturn(err) {
186
+    console.log('应答:转ivr并等待请求结果 ' + err);
187
+}
188
+function onstartlistenreturn(err) {
189
+    console.log('应答:监听请求结果 ' + err);
190
+}
191
+function onstoplistenreturn(err) {
192
+    console.log('应答:停止监听请求结果 ' + err);
193
+}
194
+// function onkillreturn(err) {
195
+//     console.log('应答:强制处理请求结果 ' + err);
196
+// }
197
+function onforceonhookreturn(err) {
198
+    console.log('应答:强拆坐席请求结果 ' + err);
199
+}
200
+function onintrudereturn(err) {
201
+    console.log('应答:强插请求结果 ' + err);
202
+}
203
+function ongetcallreturn(err,caller,callee,data,crs) {
204
+    console.log('应答:代接请求结果 ' + err+' '+caller);
205
+}
206
+function onanswercallreturn(err) {
207
+    console.log('应答:应答请求结果 ' + err);
208
+}
209
+function ononhookreturn(err) {
210
+    console.log('应答:挂机请求结果 ' + err);
211
+}
212
+function onholdcallreturn(err) {
213
+    console.log('应答:保持请求结果 ' + err);
214
+}
215
+function onswapcallreturn(err) {
216
+    console.log('应答:切换呼叫请求结果 ' + err);
217
+}
218
+function onactivatecallreturn(err) {
219
+    console.log('应答:激活呼叫请求结果 ' + err);
220
+}
221
+function onunholdcallreturn(err) {
222
+    console.log('应答:取回保持呼叫请求结果 ' + err);
223
+}
224
+function onloginotheragentreturn(err) {
225
+    console.log('应答:登录其他坐席请求结果 ' + err);
226
+}
227
+function onsendmessagetoagentreturn(err) {
228
+    console.log('应答:发送消息请求结果 ' + err);
229
+}
230
+function onanswerqueuereturn(err) {
231
+    console.log('应答:应答队列中的外线请求结果 ' + err);
232
+}
233
+// function onsubscribestateinforeturn(err){
234
+// 	console.log('应答:订阅状态变化消息请求结果 ' + err);
235
+// }
236
+function onconsulttransferreturn(err){
237
+	console.log('应答:咨询转移请求结果 '+err);
238
+}
239
+
240
+function oncompleteconsulttransferreturn(err){
241
+	console.log('应答:完成咨询转移请求结果 '+err);
242
+}
243
+function ongetnodestatereturn(jso)
244
+{
245
+	console.log('node state 结果 '+JSON.stringify(jso));
246
+}
247
+function ontransfernodereturn(jso)
248
+{
249
+	console.log('transfer node 结果 '+JSON.stringify(jso))
250
+}
251
+function onconferencestartreturn(jso)
252
+{
253
+	console.log('启动会议 结果 '+jso.err+' 会议ID='+jso.conferenceid);
254
+	if(jso.err == 0)
255
+		conferenceid.value=jso.conferenceid;
256
+}
257
+function onconferenceappendmemberreturn(jso)
258
+{
259
+	console.log('添加会议成员 结果 '+JSON.stringify(jso))
260
+}
261
+function onconferencequeryreturn(jso)
262
+{
263
+	console.log('会议状态查询 结果 '+JSON.stringify(jso))
264
+}
265
+function onconferencedismissreturn(jso)
266
+{
267
+	console.log('解散会议 结果 '+JSON.stringify(jso))
268
+}
269
+function onconferencekickoutreturn(jso)
270
+{
271
+	console.log('踢出成员 结果 '+JSON.stringify(jso))
272
+}
273
+function onconferencechangememberstatereturn(jso)
274
+{
275
+	console.log('改变成员状态 结果 '+jso.err)
276
+}
277
+//主动事件回调
278
+// function oncallin(jso) //呼入通知
279
+// {
280
+// 	console.log('事件:呼入通知,相关数据:  '+JSON.stringify(jso));
281
+// }
282
+// function oncallend(jso) //呼叫结束通知
283
+// {
284
+// 	console.log('事件:通话结束' + JSON.stringify(jso));
285
+// }
286
+// function onacw()
287
+// {
288
+// 	console.log('事件:你已经进入离席状态');
289
+// }
290
+// function onwca()
291
+// {
292
+// 	console.log('事件:你已经进入就绪状态');
293
+// }
294
+function onlogoff() //被动注销事件(网络中断 / 被踢)
295
+{
296
+    console.log('事件:您已经被注销');
297
+}
298
+// function oncallresult(err)
299
+// {
300
+// 	console.log('事件:呼叫结果 '+JSON.stringify(err));
301
+// }
302
+// function ontransferresult(err) {
303
+//     console.log('事件:转移结果 ' + JSON.stringify(err));
304
+// }
305
+function onconsulttransfercalleeanswer(crs){
306
+	console.log('事件:咨询转移被叫应答 crs=' + crs);
307
+}
308
+function onblindtransferresult(err) {
309
+    console.log('事件:盲转结果 ' + JSON.stringify(err));
310
+}
311
+// function onanswer(err) {
312
+//     console.log('事件:应答'+err);
313
+// }
314
+// function onclosed(err) {
315
+//     console.log('事件:与服务器的网络连接中断');
316
+// }
317
+function onslaveserverclosed(err)
318
+{
319
+	console.log('事件:与备用服务器的网络连接中断');
320
+}
321
+function onholdcallreleased(err) {
322
+    console.log('事件:被保持的对方已挂机');
323
+}
324
+function onkeepcallreleased(err) {
325
+    console.log('事件:转回ivr并等待的外线已挂机');
326
+}
327
+function oncalleealerting(err) {
328
+    console.log('事件:呼叫的外线已经开始振铃');
329
+}
330
+function onqueue(crs,caller,callee,data)
331
+{
332
+    console.log('事件:外线进入队列,crs,caller,callee,data= '+crs+' '+caller+' '+callee+' '+data)
333
+}
334
+// function onstatechange()
335
+// {
336
+// 	console.log('事件:状态变化----------------------------------------------------');
337
+// 	queryAgentState();
338
+// }
339
+function onmystatechange(jso)
340
+{
341
+	console.log('事件:状态变化----------------------------------------------------');
342
+	console.log(JSON.stringify(jso));
343
+}
344
+function onquitqueue(crs)
345
+{
346
+    console.log('事件:外线退出队列,crs= '+crs)
347
+}
348
+function onrecvmsg(msg, from) {
349
+    console.log('事件:收到来自'+ from+'的消息:' + msg);
350
+}
351
+function onhookstate(jso) {
352
+    console.log('事件:坐席叉簧状态'+JSON.stringify(jso));
353
+}
354
+function onhardwarefail(err) {
355
+    console.log('事件:keygoe交换机硬件故障');
356
+}
357
+// function onmisscall(err) {
358
+//     console.log('事件:呼损');
359
+// }
360
+//新状态 1-呼叫失败  2-呼叫应答进入会议 3-会议中挂机退出会议
361
+function onconferencememberstate(jso)
362
+{
363
+	console.log('会议成员状态发生变化 ' + JSON.stringify(jso));
364
+}
365
+function onslaveserverfail(jso)
366
+{
367
+	console.log('注意:备用服务器已失联');
368
+}
369
+function onswitchtoslaveserver(jso)
370
+{
371
+	console.log('注意:主服务器故障,已经切换到备用服务器');
372
+}
373
+//事件回调函数结束
374
+
375
+function queryAgentState()
376
+{
377
+	console.log('排队外线数量 '+tlwsa.tlaGetacdlength());
378
+
379
+	console.log('外线总数量 '+tlwsa.tlaGettrknumber());
380
+
381
+	var agcount=tlwsa.tlaGetagentcount();
382
+	console.log('登录坐席数量 '+agcount);
383
+	for(var ind=0;ind<agcount;ind++)
384
+	{
385
+		console.log('agnet No. ' + ind + ' workid is '+tlwsa.tlaGetagentwid(ind) + ' state is ' + tlwsa.tlaGetagentstate(ind) + '  '+getStateInfo(tlwsa.tlaGetagentstate(ind) ) )
386
+	}
387
+}
388
+
389
+function getLicenseInfo()
390
+{
391
+	ajo=tlwsa.tlaGetlicenseinfo();
392
+	console.log('授权有效期 '+ajo.validdate+' 授权线数 '+ajo.lines+' 卡号 '+ajo.cardno);
393
+
394
+}
395
+function getStateInfo(state)
396
+{
397
+	switch(state)
398
+	{
399
+		case '0':
400
+		return '未登录';
401
+		case '1':
402
+		return '空闲';
403
+		case '2':
404
+		return '离席';
405
+		case '3':
406
+		return '正在振铃';
407
+		case '4':
408
+		return '播报工号';
409
+		case '5':
410
+		return '通话中';
411
+		case '6':
412
+		return '正在外呼';
413
+		case '7':
414
+		return '正在转移';
415
+		case '8':
416
+		return '正在监听';
417
+	}
418
+}