var ws, n = 0, timer,hidTel,hidCallID; var lockReconnect = false; //避免重复连接 var obj = {}; var cls = 0; var lasttime = new Date().getTime(); //创建scoket连接 function createWebSocket() { try { $("#top-search li i").removeClass("active"); ws = new WebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port); Connect(); } catch(e) { reconnect(); } } //连接 function Connect() { try { ws.onopen = function() { console.log(new Date() + " " + "建立连接"); //心跳检测重置 heartCheck.reset().start(); cls = 0; $(".Login").addClass("active"); //自动签入 //lasttime = new Date().getTime(); //obj.Type = "Login"; //obj.AgentType = "0"; Send(); }; //接收到消息的回调方法 ws.onmessage = function(evt) { //如果获取到消息,心跳检测重置 //拿到任何消息都说明当前连接是正常的 heartCheck.reset().start(); var myDate = new Date(); console.log(myDate + " receive " + evt.data); var data = JSON.parse(evt.data)[0]; if(data) { var rlt = data.Result; if(rlt == true) { var type = data.Type; switch(type.toLowerCase()) { //case "heart": HeartBack(); break;//心跳 case "login": LoginBack(); break; //签入 case "logout": LogoutBack(); break; //签出 case "dropcall": DropCallBack(); break; //挂断 case "makecall": MakeCallBack(); break; //外呼 case "setstate": SetState(data); break; //置忙置闲 //case "saybusy": SayBusyBack(data); break; //case "sayfree": SayFreeBack(data); break; case "meeting": MeetingBack(); break; //多方通话 case "transfer": TransferBack(); break; //转移 case "hold": HoldBack(); break; //保持 case "retrieve": RetrieveBack(); break; //接回 case "incoming": IncomingBack(data); break; //来电 case "subscribe": SubScribeBack(); break; //监测 case "subscribecancel": SubScribeCancelBack(); break; //停止监测 case "agentstate": AgentStateBack(data); break; //坐席状态 case "linestate": LineStateBack(data); break; //线路状态 case "motorsetstate": SayFreeBack(); break; //班长置闲 case "linestateagent": LineStateAgentBack(data); break; //线路状态通知 case "callid": CallIDBack(data); break; //获取callid case "recordpath": RecordPathBack(data); break; //录音返回 } } else { if(rlt == false) { //layer.confirm('操作失败!', { // btn: ['确定'] //}); $(".hwzt").text('操作失败!'); } else { $(".hwzt").text(rlt); //layer.confirm(rlt, { // btn: ['确定'] //}); } } } }; //连接关闭的回调方法 ws.onclose = function(evt) { if(cls == 0) { cls = 1; //console.log("连接关闭!"); //layer.confirm('连接关闭!', { // btn: ['确定'] //}); $(".hwzt").text('连接关闭!'); $("#top-search li i").removeClass("active"); reconnect(); } }; //连接发生错误的回调方法 ws.onerror = function(evt) { //产生异常 $(".hwzt").text('连接出现异常!'); console.log(ws); if(ws == null || ws.readyState != ws.OPEN) { console.log(new Date() + "开始重连"); reconnect(); } }; } catch(ex) { $(".hwzt").text('连接关闭 try-catch!'); $("#top-search li i").removeClass("active"); reconnect(); } } //重连 function reconnect() { if(lockReconnect) return; lockReconnect = true; //没连接上会一直重连,设置延迟避免请求过多 setTimeout(function() { console.log(new Date() + " " + "重连中……"); createWebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port); lockReconnect = false; }, 2000); } //发送 function Send() { if(ws.readyState != ws.OPEN) { reconnect(); } if(ws.readyState == ws.OPEN) { console.log(new Date() + " send " + JSON.stringify(obj)); ws.send(JSON.stringify(obj)); } } //心跳检测 var heartCheck = { timeout: 25000, //25秒 timeoutObj: null, serverTimeoutObj: null, reset: function() { clearTimeout(this.timeoutObj); clearTimeout(this.serverTimeoutObj); return this; }, start: function() { var self = this; this.timeoutObj = setTimeout(function() { //这里发送一个心跳,后端收到后,返回一个心跳消息, //onmessage拿到返回的心跳就说明连接正常 obj.Type = "Heart"; Send(); self.serverTimeoutObj = setTimeout(function() { //如果超过一定时间还没重置,说明后端主动断开了 ws.close(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次 }, self.timeout) }, this.timeout) } } //签入 function LoginBack() { $("#top-search li i").removeClass("active"); $(".Logout").addClass("active"); $(".SayBusy").addClass("active"); $(".MakeCall").addClass("active"); $(".zxzt").removeClass("br").addClass("bl"); $(".fwzt").removeClass("br").addClass("bl"); $(".hwzt").text(''); } //签出 function LogoutBack() { $("#top-search li i").removeClass("active"); $(".Login").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".fwzt").removeClass("bl").addClass("br"); $(".hwzt").text(''); } //来电 function IncomingBack(data) { var p = '来电弹屏' + data.Number + ' '; $(".J_menuTab").removeClass("active"); var nif = ''; $(".J_mainContent").find("iframe.J_iframe").hide().parents(".J_mainContent").append(nif); $(".J_menuTabs .page-tabs-content").append(p); hidTel=data.Number; hidCallID=data.CallID; } //*************************************************** function CallIDBack(data) { //$(".hidCallID").val(data.CurrID); } //挂断 function DropCallBack() { $("#top-search li i").removeClass("active"); $(".Logout").addClass("active"); $(".SayBusy").addClass("active"); $(".MakeCall").addClass("active"); var obj = $("iframe:visible") if (obj.attr("data-id") == './callScreen/callScreen.html?tel=' + hidTel + '&CallID=' + hidCallID + '') { window.frames[obj.attr("name")].$(".td-call").hide(); } } //线路状态通知 function LineStateAgentBack(data) { var obj = $("iframe:visible") //0分机不可用,1空闲,2摘机等待拨号,3正在拨号,4呼出振铃,5来电振铃,6通话中,7播放忙音中,8移除IP分机,9通话保持中 if(data.State == '0') { $(".hwzt").text('分机不可用'); //左下角状态显示 $(".fwzt").removeClass("br").removeClass("bl"); } if(data.State == '1') { $(".hwzt").text('空闲'); //左下角状态显示 $(".fwzt").removeClass("br").addClass("bl"); // clearInterval(timer); if (obj.attr("data-id") == './callScreen/callScreen.html?tel=' + hidTel + '&CallID=' + hidCallID + '') { window.frames[obj.attr("name")].clearInter(); } if (hidTel && hidCallID) { $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateGJ', { callid: hidTel, "token": $.cookie("token") }, function (result) { result = JSON.parse(result); if (result.state.toLowerCase() == "success") { } }) } $("#top-search li i").removeClass("active"); $(".Logout").addClass("active"); $(".SayBusy").addClass("active"); $(".MakeCall").addClass("active"); if (obj.attr("data-id") == './callScreen/callScreen.html?tel=' + hidTel + '&CallID=' + hidCallID + '') { window.frames[obj.attr("name")].$(".td-call").hide(); } } if(data.State == '2') { $(".hwzt").text('摘机等待拨号'); //左下角状态显示 } if(data.State == '3') { $(".hwzt").text('正在拨号'); //左下角状态显示 } if(data.State == '4') { $(".hwzt").text('呼出振铃'); //左下角状态显示 } if(data.State == '5') { $(".hwzt").text('来电振铃'); //左下角状态显示 $(".fwzt").removeClass("bl").addClass("br"); if (hidTel && hidCallID) { $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateZL', { callid: hidCallID, "token": $.cookie("token") }, function (result) { result = JSON.parse(result); if (result.state.toLowerCase() == "success") { } }) } } if(data.State == '6') { $(".hwzt").text('通话中'); //左下角状态显示 $(".fwzt").removeClass("bl").addClass("br"); if(hidTel && hidCallID) { $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateZJ', { callid: hidCallID, "token": $.cookie("token") }, function(result) { result = JSON.parse(result); if(result.state.toLowerCase() == "success") {} }) } // $(".td-call").show(); // n = 0; $("#top-search li i").removeClass("active"); $(".DropCall").addClass("active"); $(".Hold").addClass("active"); $(".Transfer").addClass("active"); $(".Meeting").addClass("active"); if (obj.attr("data-id") == './callScreen/callScreen.html?tel=' + hidTel + '&CallID=' + hidCallID + '') { window.frames[obj.attr("name")].calling(); } } if(data.State == '7') { $(".hwzt").text('播放忙音中'); //左下角状态显示 } if(data.State == '8') { $(".hwzt").text('移除IP分机'); //左下角状态显示 } if(data.State == '9') { $(".hwzt").text('通话保持中'); //左下角状态显示 } } function toDub(i) { return i < 10 ? "0" + i : "" + i; } //外呼 function MakeCallBack() { $("#top-search li i").removeClass("active"); $(".DropCall").addClass("active"); } //置忙置闲 function SetState(obj) { if(obj.State == '5') { $(".SayBusy").removeClass("active"); $(".SayFree").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".hwzt").text('置忙'); } if(obj.State == '2') { $(".SayBusy").addClass("active"); $(".SayFree").removeClass("active"); $(".zxzt").removeClass("br").addClass("bl"); $(".hwzt").text('空闲'); } } //置忙 function SayBusyBack() { $(".SayBusy").removeClass("active"); $(".SayFree").addClass("active"); } //置闲 function SayFreeBack() { $(".SayBusy").addClass("active"); $(".SayFree").removeClass("active"); } //多方通话 function MeetingBack() { } //转移 function TransferBack() { $("#top-search li i").removeClass("active"); $(".Logout").addClass("active"); $(".SayBusy").addClass("active"); $(".MakeCall").addClass("active"); } //保持 function HoldBack() { $(".Hold").removeClass("active"); $(".Retrieve").addClass("active"); } //接回 function RetrieveBack() { $(".Hold").addClass("active"); $(".Retrieve").removeClass("active"); } //监测 function SubScribeBack() { var obj = $("iframe:visible") if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") { window.frames[obj.attr("name")].Start(); } } //取消监测 function SubScribeCancelBack() { var obj = $("iframe:visible") if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") { window.frames[obj.attr("name")].Stop(); } } //班长监测返回状态 //坐席状态 function AgentStateBack(data) { var obj = $("iframe:visible") if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") { window.frames[obj.attr("name")].UpdateAgentState(data.AgentID, data.State); } } //线路状态 function LineStateBack(data) { var obj = $("iframe:visible") if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") { window.frames[obj.attr("name")].UpdateLineState(data.AgentID, data.State); } } //录音返回 function RecordPathBack(data) { //if ($(".hidTel").val() && $(".hidCallID").val()) { // $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateLY', { callid: $(".hidCallID").val(),path:data.RecPath, "token": $.cookie("token") }, function (result) { // result = JSON.parse(result); // if (result.state.toLowerCase() == "success") { // } // }) //} if(hidTel) { $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateLY', { callid: data.CallID, path: data.RecPath, "token": $.cookie("token") }, function(result) { result = JSON.parse(result); if(result.state.toLowerCase() == "success") {} }) } } //获取当前的日期时间 格式“yyyy-MM-dd HH:mm:ss” function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var seperator2 = ":"; var month = date.getMonth() + 1; var strDate = date.getDate(); if(month >= 1 && month <= 9) { month = "0" + month; } if(strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + date.getHours() + seperator2 + date.getMinutes() + seperator2 + date.getSeconds(); return currentdate; }