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 = '';
$(".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;
}