| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- 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 = '<a href="javascript:;" class="active J_menuTab" data-id="' + openUrl + '?tel=' + data.Number + '&CallID=' + data.CallID + '">' + openTxt + data.Number + ' <i class="glyphicon glyphicon-remove-sign"></i></a>';
- $(".J_menuTab").removeClass("active");
- var nif = '<iframe class="J_iframe J_iframeNew" name="iframe' + data.CallID + '" width="100%" height="100%" src="' + openUrl + '?Number=' + data.Number + '&CallID=' + data.CallID + '" frameborder="0" data-id="' + openUrl + '?tel=' + data.Number + '&CallID=' + data.CallID + '" seamless></iframe>';
- $(".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;
- }
|