var ws, n = 0, seatComming, timer, hidTel, hidCallID, hidActionID, directType, sendType, mesCont, eorrorConnect, errorState = false, makeCallId = "", lockReconnect = false, obj = {}, cls = 0, ivrState, clsCookie, LoginState, lasttime = new Date().getTime(), reconnecTion, recon, loginOr = false, GetState; //创建scoket连接 function createWebSocket () { try { $("#top-search li i").removeClass("active"); //Connect(); } catch (e) { reconnect(); } } function closeSocket (e) { if (event.clientX > document.body.clientWidth && event.clientY < 0 || event.altKey) { } else { //ws.close(); if (helper.cookies.get('callState') != "1") { ws.close(); } //helper.cookies.set('clsCookie', 1); } } if (helper.cookies.get('callState') == "5" || helper.cookies.get('callState') == "2") { Connect() } function Connect () { //+ huayi.config.socket_ip + ":" + huayi.config.socket_port 121.196.219.217:8081 ws = new WebSocket("ws://10.200.46.27:8081"); //ws = new WebSocket("ws://192.168.8.7:8081"); //ws = new WebSocket("ws://121.196.219.217:8081"); //ws = new WebSocket("ws://" + ytsoft.config.socket_ip + ":" + ytsoft.config.socket_port); ws.onopen = function () { console.log(new Date() + " " + "建立连接"); helper.cookies.set('clsCookie', 1); cls = 0; var usercode = document.getElementById("txtLabourwork").value; var extnumber = document.getElementById("txtPhoneNum").value; if (helper.cookies.get('callState') == "1" || helper.cookies.get('callState') == null) { $(".popRemind").hide(); obj = {}; obj.Type = "Login"; obj.AgentID = usercode; obj.AgentExten = extnumber; obj.AgentGroup = "12"; obj.AgentType = "0"; Send(); //setTimeout("SetLogin(helper.cookies.get('callState'))", 1000); } else { setTimeout("SetLogin(helper.cookies.get('callState'))", 1000); } }; //接收到消息的回调方法 ws.onmessage = function (evt) { //如果获取到消息,心跳检测重置 //拿到任何消息都说明当前连接是正常的 //heartCheck.reset().start(); heartCheck.reset().reset 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 "login": button_QRCall(); break; //签入 case "logout": LogoutBack(); break; //签出 case "dropcall": DropCallBack(); //button_ReleaseAnswer(); break; //挂断 case "makecall": //MakeCall //外呼先示忙 makecallBack(); break; //外呼 case "setstate": SetState(data); break; //置忙置闲 case "meeting": //OpenWindowShow1('telmanage/calloutopt.aspx?otype=3', '多方通话', 800, 500); break; //多方通话 case "transfer": transferBack(); break; //转移 case "hold": //button_KeepCall(); //保持方法 break; //保持 case "retrieve": //button_GetKeepCall(); break; //接回 case "incoming": Form_callCommingCaller(data); break; //来电 case "subscribe": //SubScribeBack(); break; //监测 case "subscribecancel": //SubScribeCancelBack(); break; //停止监测 case "agentstate": AgentStateBack(data); break; //坐席状态 case "linestate": LineStateBack(data); break; //线路状态 case "motorsetstate": //SayFreeBack(); case "agentstateagent": agentstateagent(data); break; //班长置闲 case "linestateagent": LineStateAgentBack(data); break; //线路状态通知 case "callid": //CallIDBack(data); break; //获取callid case "listen": listenBack(); break; //获取callid case "insert": insertBack(data); break; //获取callid case "recordpath": //RecordPathBack(data); break; //录音返回 } } else { var type = data.Type; if (type.toLowerCase() == "waitcount") { WaitCountBack(data); } if (rlt == false) { //$(".hwzt").text('操作失败!'); //外呼失败的文字展示 if (data.Type.toLowerCase() == "makecall") { switch (data.ErrorCode) { case 1: layer.msg('挂机,请重试'); break; case 2: layer.msg('FS外呼命令失败,请重试!'); break; case 3: layer.msg('外呼获取座席失败,请重试!'); break; case 4: layer.msg('座席置忙禁止座席外呼,请重试!'); break; case 5: layer.msg('主叫座席分机非空闲或摘机拨号,请重试!'); break; case 6: layer.msg('为外呼设置座席状态失败,请重试!'); break; case 7: layer.msg('被叫座席非空闲,请重试!'); break; case 8: layer.msg('执行分机呼叫失败, 未找到分机通道,请重试!'); break; case 9: layer.msg('执行分机呼叫失败, 无法绑定分机通道,请重试!'); break; case 10: layer.msg('禁止分机自呼,请重试!'); break; case 11: layer.msg('发送分机呼叫Esl命令失败,请重试!'); break; case 12: layer.msg('目标分机非空闲,请重试!'); break; case 13: layer.msg('主控通道非空闲,请重试!'); break; case 14: layer.msg('校验不通过绑定本端逻辑线路失败,请重试!'); break; case 15: layer.msg('校验不通过本端当前线路忙,请重试!'); break; case 16: layer.msg('校验不通过对端线路状态忙,请重试!'); break; case 17: layer.msg('被叫关机,请重试!'); break; case 18: layer.msg('无效号码,请重试!'); break; case 19: layer.msg('无人接听,请重试!'); break; case 20: layer.msg('交换机错误(用户无法接通),请重试!'); break; case 21: layer.msg('话机外呼执行数据交换操作失败未找到分机通道,请重试!'); break; case 22: layer.msg('话机外呼执行数据交换操作失败分机通道未绑定任务,请重试!'); break; case 23: layer.msg('执行设备外呼任务失败无法获取对应线路,请重试!'); break; } } if (data.Type == 'AcdConnectNotify') { $("#top-search li i").removeClass("active"); layer.msg('Acd未连接'); } } else { //layer.msg(rlt); } } } }; //连接关闭的回调方法 ws.onclose = function (evt) { if (cls == 0) { cls = 1; layer.msg('连接关闭!'); $("#top-search li i").removeClass("active"); if (helper.cookies.get('clsCookie')) { if (helper.cookies.get('callState') != "1") { Connect() } } else { reconnect(); } } console.log("111") }; //连接发生错误的回调方法 ws.onerror = function (evt) { //产生异常 //layer.msg('连接出现异常!'); 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://121.196.219.217:8081"); lockReconnect = false; }, 2000); } //发送 function Send () { if (ws.readyState != ws.OPEN) { if (loginOr) { errorState = true; layer.msg('连接异常!'); reconnect(); } else { errorState = false; layer.msg('连接异常!'); 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导致重连两次 //同步签出状态 $("#top-search li i").removeClass("active"); $(".Login").addClass("active"); $(".zxzt").removeClass("bl").addClass("br"); $(".fwzt").removeClass("bl").addClass("br"); $(".hwzt").text(''); if (cls == 0) { cls = 1; reconnect(); } }, self.timeout) }, this.timeout) } } //默认记忆上次是否签入,是否置忙置闲 0表示已签入 空闲,1表示签入置忙,2表示签出 function SetLogin (state) { if (state == 1) { return; } var usercode = document.getElementById("txtLabourwork").value; var extnumber = document.getElementById("txtPhoneNum").value; obj = {}; obj.Type = "Login"; obj.AgentID = usercode; obj.AgentExten = extnumber; obj.AgentGroup = "12"; obj.AgentType = "0"; Send(); if (state == 5) { setTimeout('SayBusy()', 1000); } } //置忙 function SayBusy () { obj.Type = "SayBusy"; Send(); } //签入 function button_QRCall () { $(".fa-phone").addClass("selectClass"); $(".fa-phone").removeClass("defaultClass"); $(".fa-pause").addClass("selectClass"); $(".fa-pause").removeClass("defaultClass"); $('#imgServerState').attr('src', '/Content/images/server1.png'); $('#imgAgentState').attr('src', '/Content/images/zx1.png'); $('#imgServerState').attr('alt', '签入'); layer.msg('签入成功'); helper.cookies.set('callState', 2); try { var result = OCX_AgentLogOut(); } catch (e) { document.getElementById("spanServerRes").innerHTML = e.message; } //AgentQR(); } //签出 function LogoutBack () { $(".fa-phone").removeClass("selectClass"); $(".fa-phone").addClass("defaultClass"); $(".fa-play").removeClass("selectClass"); $(".fa-play").addClass("defaultClass"); $(".fa-pause").removeClass("selectClass"); $(".fa-pause").addClass("defaultClass"); $('#imgServerState').attr('src', '/Content/images/server0.png'); $('#imgAgentState').attr('src', '/Content/images/zx2.png'); $('#imgServerState').attr('alt', '未签入'); layer.msg('签出成功'); helper.cookies.set('callState', 1); ws.close(); } // 监听 function listenBack () { seatComming = false layer.msg('监听成功'); } function insertBack () { seatComming = false layer.msg('强插成功'); } //排队数量 function WaitCountBack (data) { console.log(data.WaitCount) document.getElementById("spanqueuingnum").innerHTML = data.WaitCount; } function makecallBack () { layer.msg('外呼成功'); $(".fa-play").removeClass("selectClass"); $(".fa-play").addClass("defaultClass"); $(".fa-pause").removeClass("selectClass"); $(".fa-pause").addClass("defaultClass"); } //来电弹屏事件 function Form_callCommingCaller (data) { if (seatComming) { return } becallout = false; becallcome = true; callerNum = data.Number; $(".fa-play").removeClass("selectClass"); $(".fa-play").addClass("defaultClass"); $(".fa-pause").removeClass("selectClass"); $(".fa-pause").addClass("defaultClass"); document.getElementById("forZYnumber").value = callerNum; document.getElementById("callnum").value = callerNum; var timeno = new Date().getTime(); //document.getElementById("mainframe").src = "/CallRecord/CallScreen/?workOrderNum=10929"; //try { var userid = document.getElementById("txtAgentId").value; var usercode = document.getElementById("txtLabourwork").value; var username = document.getElementById("txtAgentName").value; var extnumber = document.getElementById("txtPhoneNum").value; //获取呼叫编号 var callid = data.CallID; CBnumber = data.CallID document.getElementById("CallHjbh").value = CBnumber; helper.cookies.set('CallID', CBnumber); username = encodeURI(username); var opturl = "/OCXOpt/OCXOptCallAjax/?optaction=zhenlingEvent&timeno=" + timeno + "&callid=" + CBnumber + "&userid=" + userid + "&usercode=" + usercode + "&username=" + username + "&extnumber=" + extnumber + "&callerNum=" + callerNum; console.log("/OCXOpt/OCXOptCallAjax/?optaction=zhenlingEvent&timeno=" + timeno + "&callid=" + CBnumber + "&userid=" + userid + "&usercode=" + usercode + "&username=" + username + "&extnumber=" + extnumber + "&callerNum=" + callerNum) $.ajax({ url: "/OCXOpt/writelog", type: "post", async: false,//同步请求 dataType: "json", cache: false, data: { message: opturl }, success: function (res) { } }); $.ajax({ type: 'get', url: opturl, dataType: 'html', async: false, cache: false, success: function (res) { if (res != "error") { $(".callScreen").show() $("#workOrderNum").val(res) lineState(); resOrder() //document.getElementById("mainframe").src = "/CallRecord/CallScreen/?workOrderNum=" + res; //layer.open({ //type: 2, // anim: 4, //scrollbar: false, //content: '/CallRecord/CallScreen/?workOrderNum=' + res, //area: ['100%', '100%'], // id: 'WorkOrderAllListReport', //title: '来电弹屏' //}); }else{ //document.getElementById("mainframe").src = "/CallRecord/CallScreen/?workOrderNum=111"; //layer.open({ // type: 2, // anim: 4, //scrollbar: false, //content: '/CallRecord/CallScreen/?workOrderNum=111', //area: ['100%', '100%'], //id: 'WorkOrderAllListReport', // title: '来电弹屏' // }); } } });//更新摘机事件 //} catch (e) { //alert(e.Message); //} //f_addTab('callin_' + CBnumber + callerNum, callerNum + '来电', '../telmanage/callinoptbbzx.aspx?callid=' + CBnumber + "&phone=" + callerNum + "&timeno=" + timeno); } //*************************************************** function CallIDBack (data) { //$(".hidCallID").val(data.CurrID); } //挂断 function DropCallBack () { //if(ivrState){ return }; helper.cookies.set('initDrop', 0); layer.msg('挂断成功'); var usercode = document.getElementById("txtLabourwork").value; var extnumber = document.getElementById("txtPhoneNum").value; obj = {}; obj.Type = "SayBusy"; obj.AgentID = usercode; obj.AgentExten = extnumber; obj.AgentGroup = "12"; obj.AgentType = "0"; Send(); } function transferBack(){ layer.msg('转接成功'); } //线路状态通知 function LineStateAgentBack (data) { var objiframe = $("iframe:visible") //0分机不可用,1空闲,2摘机等待拨号,3正在拨号,4呼出振铃,5来电振铃,6通话中,7播放忙音中,8移除IP分机,9通话保持中 if (data.State == '0') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '1') { $('#imgAgentState').attr('src', '/Content/images/zx1.png'); helper.cookies.set('callState', 2); } if (data.State == '2') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '3') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '4') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '5') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '6') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '7') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '8') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } if (data.State == '9') { $('#imgAgentState').attr('src', '/Content/images/zx4.png'); } } function toDub (i) { return i < 10 ? "0" + i : "" + i; } //外呼 function MakeCallBack (data) { var makeCallPhone = $.cookie("makeCallPhone"); } //置忙置闲 function SetState (obj) { if (obj.State == '5') { $(".fa-pause").addClass("defaultClass"); $(".fa-pause").removeClass("selectClass"); $(".fa-play").addClass("selectClass"); $(".fa-play").removeClass("defaultClass"); $('#imgAgentState').attr('src', '/Content/images/zx3.png'); //$.cookie("callState", obj.State, {expires: 7}); helper.cookies.set('callState', obj.State); //$('#imgAgentState').attr('src', '/Content/images/zx2.png'); } if (obj.State == '2') { $(".fa-pause").addClass("selectClass"); $(".fa-pause").removeClass("defaultClass"); $(".fa-play").addClass("defaultClass"); $(".fa-play").removeClass("selectClass"); $('#imgAgentState').attr('src', '/Content/images/zx1.png'); //$.cookie("callState", obj.State, {expires: 7}); helper.cookies.set('callState', obj.State); } } function agentstateagent (data) { if (data.AgentState == '5') { $(".fa-pause").addClass("defaultClass"); $(".fa-pause").removeClass("selectClass"); $(".fa-play").addClass("selectClass"); $(".fa-play").removeClass("defaultClass"); $('#imgAgentState').attr('src', '/Content/images/zx3.png'); //$.cookie("callState", obj.State, {expires: 7}); helper.cookies.set('callState', obj.State); //$('#imgAgentState').attr('src', '/Content/images/zx2.png'); } if (data.AgentState == '2') { $(".fa-pause").addClass("selectClass"); $(".fa-pause").removeClass("defaultClass"); $(".fa-play").addClass("defaultClass"); $(".fa-play").removeClass("selectClass"); $('#imgAgentState').attr('src', '/Content/images/zx1.png'); //$.cookie("callState", obj.State, {expires: 7}); helper.cookies.set('callState', obj.State); } if (data.AgentState == '7'&& LogoutState) { $(".popRemind").show(); $(".fa-phone").removeClass("selectClass"); $(".fa-phone").addClass("defaultClass"); $(".fa-play").removeClass("selectClass"); $(".fa-play").addClass("defaultClass"); $(".fa-pause").removeClass("selectClass"); $(".fa-pause").addClass("defaultClass"); $('#imgServerState').attr('src', '/Content/images/server0.png'); $('#imgAgentState').attr('src', '/Content/images/zx2.png'); $('#imgServerState').attr('alt', '未签入'); helper.cookies.set('callState', 1); ws.close(); } } //多方通话 function MeetingBack () { } //转移 function TransferBack () { } //保持 function HoldBack () { } //接回 function RetrieveBack () { } //监测 function SubScribeBack () { navBar } //取消监测 function SubScribeCancelBack () { } //班长监测返回状态 //坐席状态 function AgentStateBack (data) { //console.log("监控") console.log(data.AgentID + "&&agentstate" + data.State) //0离线, 1登陆中, 2空闲, 3通话中 4话后处理 5小休 6被请求 7 注销 //$('#navBar ul li').find("dd.layui-this").children("a").attr("data-url") GetState(data.AgentID, data.State) //var seatMonit =$('#navBar ul li').find("dd.layui-this").children("a") if (data.State == '0') { GetState = "0" } //0离线 if (data.State == '1') { GetState = "99" } //1登陆中 if (data.State == '2') { GetState = "2" } //2空闲 if (data.State == '3') { GetState = "3" } //3通话中 if (data.State == '4') { GetState = "5" } //4话后处理 if (data.State == '5') { GetState = "4" } //5小休 if (data.State == '6') { GetState = "9" } //6被请求 if (data.State == '7') { GetState = "0" } //7 注销 //window.frames[obj.attr("name")].UpdateAgentState(data.AgentID, data.State); console.log(window.frames[1].GetState) if (window.frames[1].GetState) { window.frames[1].GetState(data.AgentID, GetState) } } //线路状态 function LineStateBack (data) { console.log(data.AgentID + "&&linestate" + data.State) //0分机不可用,1空闲,2摘记等待拨号,3正在拨号,4呼出振铃,5来电振铃,6通话中 //7播放忙音中,8通话保持中,9话机移除,10保持/空闲,11保持/摘机等待拨号 //12保持/正在拨号,13保持/呼出振铃,14保持/通话中 if (data.State == '0') { GetState = "99" } //0分机不可用 if (data.State == '1') { if (GetState == "4") { GetState == "4" } else { GetState = "2" } } //1空闲 if (data.State == '2') { GetState = "99" } //2摘记等待拨号 if (data.State == '3') { GetState = "9" } //3正在拨号 if (data.State == '4') { GetState = "9" } //4呼出振铃 if (data.State == '5') { GetState = "9" } //5来电振铃 if (data.State == '6') { GetState = "3" } //6通话中 if (data.State == '7') { GetState = "99" } //7播放忙音中 if (data.State == '8') { GetState = "99" } //8通话保持中 if (data.State == '9') { GetState = "99" } //9话机移除 if (data.State == '10') { GetState = "99" } //10保持/空闲 if (data.State == '11') { GetState = "99" } //11保持/摘机等待拨号 if (data.State == '12') { GetState = "99" } //12保持/正在拨号 if (data.State == '13') { GetState = "99" } //13保持/呼出振铃 if (data.State == '14') { GetState = "99" } //14保持/通话中 if (window.frames["mainframe"].GetState) { window.frames["mainframe"].GetState(data.AgentID, GetState) } } //录音返回 function RecordPathBack (data) { } //获取当前的日期时间 格式“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; }