var ws, n = 0, timer,hidTel,hidCallID,hidActionID, directType,sendType,mesCont, eorrorConnect,errorState=false, makeCallId = "",lockReconnect = false, obj = {},cls = 0, lasttime = new Date().getTime(), reconnecTion,recon,loginOr=false; //创建scoket连接 function createWebSocket() { try { $("#top-search li i").removeClass("active"); Connect(); } catch(e) { reconnect(); //打印日志 directType="lianjie"; sendType="异常错误"; //JSON.stringify(data) mesCont=e.message; debuggerLog(); } } //连接 function Connect() { ws = new WebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port); 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(); /*2018-05-19zhangshaungnan注释*/ }; //接收到消息的回调方法 ws.onmessage = function(evt) { //如果获取到消息,心跳检测重置 //拿到任何消息都说明当前连接是正常的 heartCheck.reset().start(); var myDate = new Date(); console.log(myDate + " receive " + evt.data); var data = JSON.parse(evt.data)[0]; //打印日志 directType="recive"; sendType=data.Type; //JSON.stringify(data) mesCont=JSON.stringify(data); debuggerLog() 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": //MakeCall MakeCallBack(data); 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 "agentstateagent": // AgentStateAgentBack(data); // break; //坐席状态通知 case "callid": CallIDBack(data); break; //获取callid case "recordpath": RecordPathBack(data); break; //录音返回 } } else { if(rlt == false) { //$(".hwzt").text('操作失败!'); //外呼失败的文字展示 if (data.Type.toLowerCase() == "makecall") { switch (data.ErrorCode) { case 1: $(".hwzt").text(' 挂机,请重试!'); break; case 2: $(".hwzt").text(' FS外呼命令失败,请重试!'); break; case 3: $(".hwzt").text(' 外呼获取座席失败,请重试!'); break; case 4: $(".hwzt").text(' 座席置忙禁止座席外呼,请重试!'); break; case 5: $(".hwzt").text(' 主叫座席分机非空闲或摘机拨号,请重试!'); break; case 6: $(".hwzt").text(' 为外呼设置座席状态失败,请重试!'); break; case 7: $(".hwzt").text(' 被叫座席非空闲,请重试!'); break; case 8: $(".hwzt").text(' 执行分机呼叫失败, 未找到分机通道,请重试!'); break; case 9: $(".hwzt").text(' 执行分机呼叫失败, 无法绑定分机通道,请重试!'); break; case 10: $(".hwzt").text(' 禁止分机自呼,请重试!'); break; case 11: $(".hwzt").text(' 发送分机呼叫Esl命令失败,请重试!'); break; case 12: $(".hwzt").text(' 目标分机非空闲,请重试!'); break; case 13: $(".hwzt").text(' 主控通道非空闲,请重试!'); break; case 14: $(".hwzt").text(' 校验不通过绑定本端逻辑线路失败,请重试!'); break; case 15: $(".hwzt").text(' 校验不通过本端当前线路忙,请重试!'); break; case 16: $(".hwzt").text(' 校验不通过对端线路状态忙,请重试!'); break; case 17: $(".hwzt").text(' 被叫关机,请重试!'); break; case 18: $(".hwzt").text(' 无效号码,请重试!'); break; case 19: $(".hwzt").text(' 无人接听,请重试!'); break; case 20: $(".hwzt").text(' 交换机错误(用户无法接通),请重试!'); break; case 21: $(".hwzt").text(' 话机外呼执行数据交换操作失败未找到分机通道,请重试!'); break; case 22: $(".hwzt").text(' 话机外呼执行数据交换操作失败分机通道未绑定任务,请重试!'); break; case 23: $(".hwzt").text(' 执行设备外呼任务失败无法获取对应线路,请重试!'); break; } } if(data.Type=='AcdConnectNotify'){ $("#top-search li i").removeClass("active"); $(".hwzt").text('Acd未连接'); } } else { $(".hwzt").text(rlt); //layer.confirm(rlt, { // btn: ['确定'] //}); } } } }; //连接关闭的回调方法 ws.onclose = function(evt) { // 打印日志 directType="recive"; sendType="close"; //JSON.stringify(data) mesCont=JSON.stringify(evt); debuggerLog(); if(cls == 0) { cls = 1; $(".hwzt").text('连接关闭!'); $("#top-search li i").removeClass("active"); reconnect(); } }; //连接发生错误的回调方法 ws.onerror = function(evt) { // 打印日志 directType="recive"; sendType="连接错误 "; //JSON.stringify(data) mesCont=JSON.stringify(evt); debuggerLog(); //产生异常 $(".hwzt").text('连接出现异常!'); console.log(ws); if(ws == null || ws.readyState != ws.OPEN) { console.log(new Date() + "开始重连"); reconnect(); } }; } //重连 function reconnect() { if(lockReconnect) return; lockReconnect = true; //没连接上会一直重连,设置延迟避免请求过多 setTimeout(function() { // 打印日志 directType="send"; sendType="重连中 "; //JSON.stringify(data) mesCont="重连中"; debuggerLog(); console.log(new Date() + " " + "重连中……"); createWebSocket("ws://" + huayi.config.socket_ip + ":" + huayi.config.socket_port); lockReconnect = false; }, 2000); } function debuggerLog(){ $.post(huayi.config.callcenter_url + 'Log/CallOpt', { direct: directType, type: sendType, cont: mesCont, "token": $.cookie("token") }, function(result) { result = $.parseJSON(result); if(result.state.toLowerCase() == "warning") { //layer.msg("创建工单成功"); } }) } //异常重连 function errorFun(){ clearInterval(timer); var errorNum=0 timer = setInterval(function() { errorNum++; if (errorNum>2) { $(".hwzt").text('连接异常!'); }else{ $("#top-search li i").removeClass("active"); $(".Login").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".fwzt").removeClass("bl").addClass("br"); $(".hwzt").text(''); } reconnect(); $(".hwzt").text('连接异常!'); }, 15000); } noLine(); clearInterval(recon); recon = setInterval(function () { if(loginOr){ noLine(); setTimeout(function () { lineState(); }, 2000); } }, 1000*10); function lineState(){ if (reconnecTion) { reconnecTion=false; }else{ directType="send"; sendType="断网 "; //JSON.stringify(data) mesCont="断网"; debuggerLog(); } } function noLine(){ $.ajax({ type: "get", url: huayi.config.callcenter_url + 'UserAccount/GetNowUser', async: true, dataType: 'json', data: { "token": $.cookie("token") }, success: function(data) { reconnecTion = data.data.user.F_UserCode; } }); } //发送 function Send() { if(ws.readyState != ws.OPEN) { if(loginOr){ errorState=true; $("#top-search li i").removeClass("active"); $(".Login").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".fwzt").removeClass("bl").addClass("br"); $(".hwzt").text(''); directType="send"; sendType=ws.readyState; //JSON.stringify(data) mesCont="签入时异常了"; debuggerLog(); $(".hwzt").text('连接异常!'); reconnect(); }else{ errorState=false; $("#top-search li i").removeClass("active"); $(".Login").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".fwzt").removeClass("bl").addClass("br"); $(".hwzt").text(''); directType="send"; sendType=ws.readyState; //JSON.stringify(data) mesCont="异常了"; debuggerLog(); $(".hwzt").text('连接异常!'); reconnect(); } } if(ws.readyState == ws.OPEN) { if (obj.Type) { directType="send"; sendType=obj.Type; mesCont=JSON.stringify(obj); debuggerLog() }else{ directType="send"; sendType="建立连接"; mesCont=JSON.stringify(obj); debuggerLog() } 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导致重连两次 //同步签出状态 $("#top-search li i").removeClass("active"); $(".Login").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".fwzt").removeClass("bl").addClass("br"); $(".hwzt").text(''); //打印日志 directType="heart"; sendType="心跳"; //JSON.stringify(data) mesCont="未收到"; debuggerLog(); if(cls == 0) { cls = 1; reconnect(); } }, 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) { if(data.CallID!=0){ 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; hidActionID=data.ActionID; }else{ var timestamp = Date.parse(new Date()); 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=timestamp; } } //*************************************************** 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(); // window.frames['iframe'+ hidCallID +''].$(".td-call").hide(); // } if(window.frames['iframe'+ hidCallID +'']){ window.frames['iframe'+ hidCallID +''].$(".td-call").hide(); } if ($("#isml").val() === "1") { $(".SayBusy").removeClass("active"); $(".SayFree").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".hwzt").text('置忙'); } } //线路状态通知 function LineStateAgentBack(data) { var objiframe = $("iframe:visible") //0分机不可用,1空闲,2摘机等待拨号,3正在拨号,4呼出振铃,5来电振铃,6通话中,7播放忙音中,8移除IP分机,9通话保持中 if(data.State == '0') { $(".hwzt").text('分机不可用'); //左下角状态显示 //$(".fwzt").removeClass("br").removeClass("bl"); $(".fwzt").removeClass("bl").addClass("br");//20180509 by fanlongfei 增加话机状态灯 $(".zxzt").removeClass("bl").addClass("br");//20180509 by fanlongfei 增加坐席状态灯 } if(data.State == '1') { // var isml=0; if($("#isml").val()==1){ // isml=1; $(".hwzt").text('置忙'); //左下角状态显示 $(".zxzt").removeClass("bl").addClass("br"); } else{ $(".hwzt").text('空闲'); //左下角状态显示 $(".zxzt").removeClass("br").addClass("bl"); } $(".fwzt").removeClass("br").addClass("bl"); // $(".zxzt").removeClass("br").addClass("bl");//20180509 by fanlongfei 增加坐席状态灯 if(window.frames['iframe'+ hidCallID +'']){ window.frames['iframe'+ hidCallID +''].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"); if($("#isml").val()==0){ $(".SayBusy").addClass("active"); } else{ $(".SayFree").addClass("active"); } $(".MakeCall").addClass("active"); if(window.frames['iframe'+ hidCallID +'']){ window.frames['iframe'+ hidCallID +''].$(".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"); $(".fwzt").removeClass("br").addClass("bl");//20180509 by fanlongfei 增加话机状态灯 $(".zxzt").removeClass("bl").addClass("br");//20180509 by fanlongfei 增加坐席状态灯 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"); $(".zxzt").removeClass("bl").addClass("br");//20180509 by fanlongfei 增加坐席状态灯 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") {} }) } $("#top-search li i").removeClass("active"); $(".DropCall").addClass("active"); $(".Hold").addClass("active"); $(".Transfer").addClass("active"); $(".Meeting").addClass("active"); if(data.CallDirection=="in"){ // window.frames['iframe'+ hidCallID +''].window.onload = function(){ // var callingFun = window.frames['iframe'+ hidCallID +''].window.calling; // callingFun(); // } // if (objiframe.attr("data-id") == './callScreen/callScreen.html?tel=' + hidTel + '&CallID=' + hidCallID + '') { setTimeout (window.frames['iframe'+ hidCallID +''].calling(),500);/*2018-05-19 zhangshuangnan 修改 ps: 因软电话设置为 自动应答 通话时间不计时问题*/ // } } } 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(data) { var makeCallPhone = $.cookie("makeCallPhone"); $("#top-search li i").removeClass("active"); $(".DropCall").addClass("active"); //外呼弹屏 if(data.CallID!=0){ var p = '外呼弹屏' + makeCallPhone + ' '; $(".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=makeCallPhone; hidCallID=makeCallId; hidActionID=data.ActionID; }else{ var timestamp = Date.parse(new Date()); var p = '外呼弹屏' + makeCallPhone + ' '; $(".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=makeCallPhone; hidCallID=timestamp; } window.frames['iframe'+ hidCallID +''].window.onload = function(){ var callingFun = window.frames['iframe'+ hidCallID +''].window.calling; callingFun(); } // setTimeout (window.frames['iframe'+ hidCallID +''].calling(),500); // window.frames[obj.attr("name")].calling(); } //置忙置闲 function SetState(obj) { if(obj.State == '5') { $(".SayBusy").removeClass("active"); $(".SayFree").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".hwzt").text('置忙'); $("#isml").val(1) } if(obj.State == '2') { $(".SayBusy").addClass("active"); $(".SayFree").removeClass("active"); $(".zxzt").removeClass("br").addClass("bl"); $(".hwzt").text('空闲'); $("#isml").val(0) } } //置忙 function SayBusyBack() { $(".SayBusy").removeClass("active"); $(".SayFree").addClass("active"); $("#isml").val(1) } //坐席班长置闲 function SayFreeBack() { $(".SayBusy").addClass("active"); $(".SayFree").removeClass("active"); $(".zxzt").removeClass("br").addClass("bl"); // 2018/05/09 by fanlongfei 增加坐席状态指示 $(".hwzt").text('空闲');// 2018/05/09 by fanlongfei 增加坐席状态指示 $("#isml").val(0) } //多方通话 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() { $('#content-main .J_iframeNew').each(function(i,n){ if($(this).attr('data-id') == "./TelCall/SeatMonitor.html"){ window.frames[$(this).attr("name")].Start(); } })/*2018-05-24 zhangshuangnan 修改 解决通话中时 坐席监控状态不改变的问题*/ } //取消监测 function SubScribeCancelBack() { // var obj = $("iframe:visible") // if(obj.attr("data-id") == "./TelCall/SeatMonitor.html") { // window.frames[obj.attr("name")].(); // } $('#content-main .J_iframeNew').each(function(i,n){ if($(this).attr('data-id') == "./TelCall/SeatMonitor.html"){ window.frames[$(this).attr("name")].Stop(); } })/*2018-05-24 zhangshuangnan 修改 解决通话中时 坐席监控状态不改变的问题*/ } //班长监测返回状态 //坐席状态 function AgentStateBack(data) { $('#content-main .J_iframeNew').each(function(i,n){ if($(this).attr('data-id') == "./TelCall/SeatMonitor.html"){ window.frames[$(this).attr("name")].UpdateAgentState(data.AgentID, data.State); } })/*2018-05-24 zhangshuangnan 修改 解决通话中时 坐席监控状态不改变的问题*/ } //线路状态 function LineStateBack(data) { $('#content-main .J_iframeNew').each(function(i,n){ if($(this).attr('data-id') == "./TelCall/SeatMonitor.html"){ window.frames[$(this).attr("name")].UpdateLineState(data.AgentID, data.State); } })/*2018-05-24 zhangshuangnan 修改 解决通话中时 坐席监控状态不改变的问题*/ } //录音返回 function RecordPathBack(data) { $(".hidCallID").val(data.CallID); //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") { // } // }) //} // 外呼返回CallId makeCallId = data.CallID; 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; }