var ws, hidTel, hidCallID; var cls = 0; var lockReconnect = false; //避免重复连接 var scoketDatas = {}; //发送和接收的scoket数据 //var lasttime = new Date().getTime(); //创建scoket连接 function createWebSocket() { try { $("#top-search li i").removeClass("active"); Connect(); } catch(e) { reconnect(); } } //连接 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(); //scoketDatas.Type = "Login"; //scoketDatas.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; console.log("================" + type + "====================="); switch(type.toLowerCase()) { case "login": LoginBack(); break; //签入 case "logout": LogoutBack(); break; //签出 case "dropcall": DropCallBack(); break; //挂断 case "makecall": MakeCallBack(); break; //外呼 case "setstate": SetState(data); break; //置忙置闲 case "meeting": MeetingBack(); break; //多方通话 case "transfer": TransferBack(); break; //转移 case "consult": ConsultBack(); break; //协商呼叫 case "hold": HoldBack(); break; //保持 case "retrieve": RetrieveBack(); break; //接回 case "incoming": IncomingBack(data); break; //来电 case "linestateagent": LineStateAgentBack(data); break; //线路状态通知 case "recordpath": RecordPathBack(data); break; //录音返回 case "listen": layer.msg('监听操作成功!'); break; case "forceagentstate": updateSeatMonitorlists(); //更新坐席监控内坐席的状态 layer.msg('置闲操作成功!'); break; case "replace": updateSeatMonitorlists(); //更新坐席监控内坐席的状态 layer.msg('代接操作成功!'); break; case "insert": updateSeatMonitorlists(); //更新坐席监控内坐席的状态 layer.msg('强插操作成功!'); break; case "intercept": updateSeatMonitorlists(); //更新坐席监控内坐席的状态 layer.msg('拦截操作成功!'); break; case "cut": updateSeatMonitorlists(); //更新坐席监控内坐席的状态 layer.msg('强拆操作成功!'); break; } } else { if(rlt === false) { var errCode = data.Error % 10000; var errTips = getErrTips(errCode); //获取错误信息 if(errTips){ layer.msg(errTips + '!'); }else{ layer.msg('失败'); } $(".hwzt").text(errTips + '!'); } else { $(".hwzt").text(rlt); } } } }; //连接关闭的回调方法 ws.onclose = function(evt) { if(cls == 0) { cls = 1; $(".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(); } } } //重连 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) { var myDate = new Date(); console.log(new Date() + " send " + JSON.stringify(scoketDatas)); ws.send(JSON.stringify(scoketDatas)); } } //心跳检测 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拿到返回的心跳就说明连接正常 scoketDatas.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('空闲'); //弹出 相关计划任务 // btn_joinTask().then(function(){ // //签入成功后 显示右上角 当前参与任务信息 // $('#task_real_info').show(); // //绑定切换按钮 // $(document).off('click', '#btn_switching', switchingTask); // $(document).on('click', '#btn_switching', switchingTask); // //获取当前任务信息 // getTaskRealInfo(); // if(taskRealInfoTimer) { // clearInterval(taskRealInfoTimer); //停止刷新数据 // } // isTaskTimerOn = true; // //每间隔 huayi.config.taskRealInfoTime 刷新数据 // refreshTaskRealInfo(huayi.config.taskRealInfoTime); // }); } //签出 function LogoutBack() { layer.msg('签出成功!'); $("#top-search li i").removeClass("active"); $(".Login").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".fwzt").removeClass("bl").addClass("br"); $(".hwzt").text(''); isTaskTimerOn = false; //停止刷新数据 clearInterval(taskRealInfoTimer); //签出成功后 隐藏右上角 当前参与任务信息 $('#task_real_info').hide(); //取消绑定切换按钮 $(document).off('click', '#btn_switching', switchingTask); } //来电 function IncomingBack(data) { //组id和group一致是正常弹屏;不一致是预测外呼弹屏; var openUrl = ''; var openTxt = ''; // if(data.TaskIcon === window.localStorage.getItem("group")) { openUrl = './callScreen/callScreen.html'; openTxt = '来电弹屏'; // } else { // openUrl = './autoCallScreen/autoCallScreen.html'; // openTxt = '自动外呼弹屏'; // } var p = '' + openTxt + 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 DropCallBack() { $("#top-search li i").removeClass("active"); $(".Logout").addClass("active"); $(".SayBusy").addClass("active"); $(".MakeCall").addClass("active"); } //线路状态通知 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("bl").addClass("br"); //话机状态灯 $(".zxzt").removeClass("bl").addClass("br"); //坐席状态灯 } if(data.State == '1') { if($("#isml").val() == 1) { $(".hwzt").text('置忙'); //左下角状态显示 $(".zxzt").removeClass("bl").addClass("br"); } else { $(".hwzt").text('空闲'); //左下角状态显示 $(".zxzt").removeClass("br").addClass("bl"); } $(".fwzt").removeClass("br").addClass("bl"); if(window.frames['iframe' + hidCallID + '']) { window.frames['iframe' + hidCallID + ''].clearInter(); } $("#top-search li i").removeClass("active"); $(".Logout").addClass("active"); if($("#isml").val() == 0) { $(".SayBusy").addClass("active"); } else { $(".SayFree").addClass("active"); } $(".MakeCall").addClass("active"); } 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("br").addClass("bl"); //话机状态灯 $(".zxzt").removeClass("bl").addClass("br"); //坐席状态灯 } if(data.State == '6') { // debugger $(".hwzt").text('通话中'); //左下角状态显示 $(".fwzt").removeClass("bl").addClass("br"); $(".zxzt").removeClass("bl").addClass("br"); $("#top-search li i").removeClass("active"); $(".DropCall").addClass("active"); $(".Hold").addClass("active"); $(".Transfer").addClass("active"); $(".Consult").addClass("active"); $(".Meeting").addClass("active"); if(window.frames['iframe' + hidCallID + '']) { // setTimeout(window.frames['iframe' + hidCallID + ''].calling(), 500); /*因软电话设置为 自动应答 通话时间不计时问题*/ window.frames['iframe' + hidCallID + ''].calling(); /*因软电话设置为 自动应答 通话时间不计时问题*/ } } if(data.State == '7') { $(".hwzt").text('播放忙音中'); //左下角状态显示 } if(data.State == '8') { $(".hwzt").text('移除IP分机'); //左下角状态显示 } if(data.State == '9') { $(".hwzt").text('通话保持中'); //左下角状态显示 } } //外呼 function MakeCallBack() { $("#top-search li i").removeClass("active"); $(".DropCall").addClass("active"); //20180920新增 $(".Meeting").addClass("active"); $(".Transfer").addClass("active"); $(".Consult").addClass("active"); $(".Hold").addClass("active"); } /** * 置忙置闲 * sayOption (点击置忙置闲后的返回值) * */ function SetState(sayOption) { if(sayOption.State == '5') { $(".SayBusy").removeClass("active"); $(".SayFree").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".hwzt").text('置忙'); $("#isml").val(1); } if(sayOption.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"); // 坐席状态指示 $(".hwzt").text('空闲'); // 坐席状态指示 $("#isml").val(0) } //多方通话 function MeetingBack() { } //转移 function TransferBack() { $("#top-search li i").removeClass("active"); $(".Logout").addClass("active"); $(".SayBusy").addClass("active"); $(".MakeCall").addClass("active"); } //协商呼叫 function ConsultBack() { // console.log('.....协商呼叫成功!....'); layer.confirm('请您确认转移或者挂机?', { icon: 3, btn: ['转移', '挂机'], //按钮 }, function(index, layero) { // console.log('转移'); scoketDatas = { "Type": "ConfirmTransfer", "AgentID": window.localStorage.getItem('userCode'), "AgentExten": window.localStorage.getItem("extno"), "EndParmer": "1" //1.转移 3.将对方挂断 }; Send(); layer.close(index); }, function(index) { // console.log('挂机'); scoketDatas = { "Type": "ConfirmTransfer", "AgentID": window.localStorage.getItem('userCode'), "AgentExten": window.localStorage.getItem("extno"), "EndParmer": "3" //1.转移 3.将对方挂断 }; Send(); }); } //保持 function HoldBack() { $(".Hold").removeClass("active"); $(".Retrieve").addClass("active"); } //接回 function RetrieveBack() { $(".Hold").addClass("active"); $(".Retrieve").removeClass("active"); } //录音返回 function RecordPathBack(data) { // $(".hidCallID").val(data.CallID); // if(hidTel) { // $.post(huayi.config.callcenter_url + 'CallInScreen/UpdateLY', { // callid: data.CallID, // path: data.RecPath, // }, function(result) { // result = JSON.parse(result); // if(result.state.toLowerCase() == "success") {} // }) // } } //更新坐席监控内坐席的状态 function updateSeatMonitorlists() { top.$("iframe:visible")[0].contentWindow.getSeatsRealStates(); } //获取 错误信息 //errCode 错误代码 function getErrTips(errCode) { var errTips = ''; switch(errCode) { case 9011: errTips = '分机号不存在'; break; case 9012: errTips = '分机号已绑定'; break; case 9013: errTips = '坐席已登陆'; break; case 9058: errTips = '授权验证失败'; break; case 10: errTips = '没有找到线路'; break; case 11: errTips = '线路忙'; break; case 12: errTips = '线路非空闲'; break; case 13: errTips = '线路非振铃'; break; case 14: errTips = '非通话'; break; case 15: errTips = '线路空闲'; break; case 16: errTips = '线路已邦定任务'; break; case 50: errTips = '对端线路空'; break; case 51: errTips = '对端线路忙'; break; case 52: errTips = '非分机'; break; case 20: errTips = '没找到座席'; break; case 21: errTips = '坐席绑定异常'; break; case 22: errTips = '坐席非空闲'; break; case 30: errTips = '被监控中'; break; case 31: errTips = '错误指令'; break; case 100: errTips = '线路关联任务失败'; break; case 101: errTips = '执行操作失败'; break; case 102: errTips = '呼叫取消'; break; case 103: errTips = '挂机失败'; break; case 104: errTips = '禁止自呼'; break; case 110: errTips = '不是保持状态'; break; case 111: errTips = '不在放音'; break; case 250: errTips = '正常挂机'; break; case 251: errTips = '用户忙'; break; case 252: errTips = '未接听'; break; case 253: errTips = '没响应'; break; case 254: errTips = '拒接'; break; case 255: errTips = '未没注册'; break; case 259: errTips = '未知'; break; default: errTips = errCode; break; } return errTips; }