kefu/public/static/service/js/bak_mylink.js

2040 lines
75 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var uinfo = {
id: 'KF' + uid,
username: uname,
avatar: avatar,
group: group
};
var wsUrl = socket_server;
var ws;//websocket实例
var lockReconnect = false;//避免重复连接
// 确定用户收到消息
var user_receive_msg = false;
// 当前对话用户的信息
var user_info_tmp = {};
// 是否占线
var repetition_line = false;
// // 1console.log("service/mylink");
// var id_payment = (new Date()).valueOf();
// 返回结果如果为true的话那么就创建新链接反之不创建
checkSocketLogin(uid, token, wsUrl);
var check_line = false;
setTimeout(function () {
check_line = sessionStorage.getItem('kf_check_line_' + uid);
// console.log(check_line);
if (check_line) {
sessionStorage.removeItem('kf_check_line_' + uid);
createWebSocket(wsUrl);
}
}, 500);
// 创建一个Socket实例
function createWebSocket(url) {
try {
ws = new WebSocket(url);
eventHandle();
} catch (e) {
reconnect(url);
}
}
function eventHandle() {
ws.onclose = function () {
userStatus(2);
setTimeout(function () {
reconnect(wsUrl);
}, 2000);
};
ws.onerror = function () {
layer.alert('连接失败,正在尝试重连...', { icon: 2, title: '错误提示' });
userStatus(2);
reconnect(wsUrl);
};
ws.onopen = function () {
layui.use(['layer'], function () {
var layer = layui.layer;
layer.ready(function () {
userStatus(1);
//layer.msg('链接成功', { time: 1000 });
});
});
// 登录
var login_data = '{"path":"api\/init","param":{"type":"kf","group_id" : ' + uinfo.group + '},"access_token" : "' + token + '"}';
// console.log(login_data);
ws.send(login_data);
//心跳检测重置
heartCheck.reset().start();
};
ws.onmessage = function (res) {
var data = eval("(" + res.data + ")");
// console.log(data);
user_receive_msg = false;
switch (data['message_type']) {
// 服务端ping客户端
case 'ping':
ws.send('{"type":"ping"}');
break;
// 添加用户
case 'connect':
var timerId = sessionStorage.getItem('timerid_' + uinfo.id + '_' + data.data.user_info.id)
// 1console.log(timerId)
if (timerId !== null) {
clearTimeout(timerId)
sessionStorage.removeItem('timerid_' + uinfo.id + '_' + data.data.user_info.id)
onlineOrOffIdent(data.data.user_info.id, 1);
} else {
// 1console.log(data.data.user_info.id);
onlineOrOffIdent(data.data.user_info.id, 1);
addUser(data.data.user_info, data.data.qrcode);
// 离线用户切换为在线用户
var checkuser = 'f-' + data.data.user_info.id;
$("#offline_user_list li").each(function () {
if ($(this).attr('id') == checkuser) {
delOffUser(data.data.user_info);
}
});
// 如果 在线用户tab为折叠状态则tab上显示新消息提醒
showTabNotice('on');
}
break;
// 移除访客到主面板
case 'delUser':
var timerId = setTimeout(function () {
delUser(data.data);
$("#on_span").attr('class', 'fold');
sessionStorage.removeItem('timerid_' + uinfo.id + '_' + data.data.id)
// }, 1000);
}, 3 * 60 * 1000);
sessionStorage.setItem('timerid_' + uinfo.id + '_' + data.data.id, timerId)
systemHint(data.data.userinfo.uid, `系统提示: ${data.data.userinfo.name} 已离线!`);
onlineOrOffIdent(data.data.userinfo.uid, 2);
// layer.msg('用户:' + data.data.userinfo.name + '已离线!');
break;
// 监测聊天数据
case 'text':
var chekc_msg = checkMsgIsRepeat(user_info_tmp.u_id, data.data.msg_id);
if (chekc_msg) return;
showUserMessage(data.data, data.data.content);
break;
case 'img':
// 1console.log("收到用户消息");
var chekc_msg = checkMsgIsRepeat(user_info_tmp.u_id, data.data.msg_id);
if (chekc_msg) return;
showUserMessage(data.data, data.data.content);
break;
// 处理转接结果通知
case 'changeGroupResult':
var chekc_msg = checkMsgIsRepeat(user_info_tmp.u_id, data.data.msg_id);
if (chekc_msg) return;
// 转接成功
if (data.data.status) {
// 将该会员从我的会话中移除
var id = $("#active-user").attr('data-id');
delUser({ id: id });
}
// 提示结果信息
layer.msg(data.data.content);
break;
// 提示信息
case 'alert':
var chekc_msg = checkMsgIsRepeat(user_info_tmp.u_id, data.data.msg_id);
if (chekc_msg) return;
layer.msg(data.data.content);
break;
// 确定用户收到发送的消息
case 'received':
// user_receive_msg = true;
// 消息状态
sessionStorage.setItem('send_time_receive_msg_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + data.data.msg_id, true);
// 清除定时器
var send_time = sessionStorage.getItem('send_time_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + data.data.msg_id);
// // 1console.log(send_time);
clearTimeout(send_time);
// 移除重发消息次数
reSendMsgNum(data.data.msg_id, 'del');
// 1console.log("对方已成功接收到客服发送的信息");
// 1console.log(data);
break;
// 自动回复
case 'auto_reply':
var chekc_msg = checkMsgIsRepeat(user_info_tmp.u_id, data.data.msg_id);
if (chekc_msg) return;
id_payment = (new Date()).valueOf();
// sendMessage(data.data.content)
var msg = data.data.content;
var msg_id = uuid();
if (data.data.payment != "" && data.data.payment != null) {
sessionStorage.setItem("data", JSON.stringify(data.data));
var payment = data.data.payment;
switch (payment) {
case 'wexin':
var msg = "img[" + "/static/service/images/payment/ic_bg_payment1.png" + "]"
break;
case 'alipay':
var msg = "img[" + "/static/service/images/payment/ic_bg_payment.png" + "]"
break;
case 'huabei':
var msg = "img[" + "/static/service/images/payment/ic_bg_payment34.png" + "]"
break;
case 'credit':
var msg = "img[" + "/static/service/images/payment/ic_bg_payment6.png" + "]"
break;
case 'bank':
var msg = "img[" + "/static/service/images/payment/ic_bg_payment2.png" + "]"
break;
default:
break;
}
}
var word = msgFactory(msg, 'mine', uinfo, payment, msg_id);
// var uid = $("#active-user").attr('data-id');
// var uname = $("#active-user").attr('data-name');
var uid = data.data.data.to_id;
var uname = data.data.data.to_name;
//微信缓存
if (data.data.payment != "" && data.data.payment != null && data.data.payment == 'wexin') {
sessionStorage.setItem("payment_wexin", JSON.stringify(data.data));
}
//支付宝缓存
if (data.data.payment != "" && data.data.payment != null && data.data.payment == 'alipay') {
sessionStorage.setItem("payment_alipay", JSON.stringify(data.data));
}
//花呗缓存
if (data.data.payment != "" && data.data.payment != null && data.data.payment == 'huabei') {
sessionStorage.setItem("payment_huabei", JSON.stringify(data.data));
}
//信用卡缓存
if (data.data.payment != "" && data.data.payment != null && data.data.payment == 'credit') {
sessionStorage.setItem("payment_credit", JSON.stringify(data.data));
}
//银行卡缓存
if (data.data.payment != "" && data.data.payment != null && data.data.payment == 'bank') {
sessionStorage.setItem("payment_bank", JSON.stringify(data.data));
}
if (data.data.payment != '' && data.data.payment != null) {
var payment_type = data.data.payment
if (payment_type == 'wexin') {
var wexin = sessionStorage.payment_wexin;
var wexin = JSON.parse(wexin).payment;
$("#" + id_payment).attr("payment", wexin)
} else if (payment_type == 'alipay') {
var alipay = sessionStorage.payment_alipay;
var alipay = JSON.parse(alipay).payment;
$("#" + id_payment).attr("payment", alipay)
} else if (payment_type == 'huabei') {
var huabei = sessionStorage.payment_huabei;
var huabei = JSON.parse(huabei).payment;
$("#" + id_payment).attr("payment", huabei)
} else if (payment_type == 'credit') {
var credit = sessionStorage.payment_credit;
var credit = JSON.parse(credit).payment;
$("#" + id_payment).attr("payment", credit)
} else if (payment_type == 'bank') {
var bank = sessionStorage.payment_bank;
var bank = JSON.parse(bank).payment;
$("#" + id_payment).attr("payment", bank)
}
}
ws.send(JSON.stringify({
path: 'api\/chat',
param: {
type: 'kf', payment: data.data.payment, data: data.data.data, to_id: uid, to_name: uname, content: data.data.content, from_name: uinfo.username,
from_id: uinfo.id, from_avatar: uinfo.avatar, msg_id: msg_id,
},
access_token: token
}));
$("#u-" + uid).append(word);
$(".msg-area").val('');
// var uid = $("#active-user").attr('data-id');
// var uname = $("#active-user").attr('data-name');
// var time = getTime();
var time = data.data.time;
var key = uinfo.id + '-' + uid;
if (typeof (Storage) !== "undefined") {
var localMsg = msgQueueCheck(getCache(key));
if (localMsg == null || localMsg.length == 0) {
localMsg = [];
}
localMsg.push({ type: 'mine', from_id: uinfo.id, from_name: uinfo.username, time_line: time, to_name: uname, to_id: uid, img_id: id_payment, payment: data.data.payment, data: data.data.data, content: data.data.content, from_avatar: uinfo.avatar, msg: msg, msg_id: msg_id });
cacheChat({ key: key, data: localMsg });
}
clickpayment();
// 滚动条自动定位到最底端
wordBottom();
checkUserReceiveMsg(`${msg_id}`, 2);
break;
case 'repetition_line':
repetition_line = true;
// layer.msg('账号重复登录链接已断开');
layer.alert('该账号已在别处登录, 请重新登录!', { title: false, closeBtn: 0 }, function () {
userStatus(2);
window.parent.location.href = '/service/login/loginout';
});
break;
}
//如果获取到消息,心跳检测重置
//拿到任何消息都说明当前连接是正常的
heartCheck.reset().start();
}
}
/**
* 过滤消息队列
* @param {*} msg_list 消息列表
* @param {*} length 长度
*/
function msgQueueCheck(msg_list, length = 50) {
if (typeof msg_list == "undefined" || msg_list == null || msg_list == "") return msg_list;
if (msg_list.length < length) return msg_list;
// $new_list = msg_list.slice(msg_list.length - length, length);
$new_list = msg_list.slice(msg_list.length - length);
return $new_list;
}
/**
* 客服状态
*/
function userStatus(type = 1) {
var color = type == 1 ? '#5dea85' : '#f73939';
setTimeout(function () {
parent.$('#user_status').css('cssText', `background-color: ${color} !important`);
}, 1000);
}
/**
* 系统提示
* @param {*} uid 用户id
* @param {*} content 提示内容
* @date 20190413
*/
function systemHint(uid, content) {
var msg_box = $('#u-' + uid);
if (!msg_box) return false;
var hint_html = `<li class="mylink-chat-mine" style="
width: 100%;
height: 30px;
line-height: 30px;
text-align: center;
">
<span style="
margin: 0 auto;
background: #828282;
padding: 5px 8px;
border-radius: 30px;
color: #fff;
font-size: 12px;
">${content}</span>
</li>`;
msg_box.append(hint_html);
wordBottom();
}
/**
* 用户上线或者下线提示标识
* @param {*} uid 用户id
* @param {*} type 提示类型: 1: 上线, 2: 下线
*/
function onlineOrOffIdent(uid, type) {
var user_dom = $('#f-' + uid);
user_dom.find('.ident').remove();
switch (type) {
case 1:
user_dom.append(`<span class="layui-badge-dot layui-bg-green ident" style="
float: right;
right: 5px;
bottom: -35px;
background: #5dea85 !important;
"></span>`);
break;
case 2:
user_dom.append(`<span class="layui-badge-dot layui-bg-green ident" style="
float: right;
right: 5px;
bottom: -35px;
background: #f73939 !important;
"></span>`);
break;
}
}
function reconnect(url) {
if (lockReconnect || repetition_line == true) return;
lockReconnect = true;
//没连接上会一直重连,设置延迟避免请求过多
setTimeout(function () {
createWebSocket(url);
lockReconnect = false;
}, 2000);
}
function clickpayment() {
// // 1console.log(6754213423);
// payShowLayer();
// $(".layui-mylink-photos").on('click', function () {
// $(".layui-mylink-photos").on('click', function () {
// });
}
/**
* 支付显示
* @param {*} _this 当前点击对象
*/
function payShowLayer(_this) {
sessionStorage.getItem("payment");
//支付宝
var alipay_data = sessionStorage.payment_alipay;
// 1console.log(this);
if (alipay_data) {
var src = JSON.parse(alipay_data).content
var length = src.length
var img_alipay = src.substring(4, length - 1)
var alipay = JSON.parse(alipay_data).payment
var name = JSON.parse(alipay_data).data.name
var account_num = JSON.parse(alipay_data).data.account_num
} else {
var alipay = ''
}
//微信
var wexin = sessionStorage.payment_wexin;
if (wexin) {
var src = JSON.parse(wexin).content
var length = src.length
var img_wexin = src.substring(4, length - 1)
var wexin = JSON.parse(wexin).payment
} else {
var wexin = ''
}
//花呗
var huabei = sessionStorage.payment_huabei;
if (huabei) {
var src = JSON.parse(huabei).content
var length = src.length
var img_huabei = src.substring(4, length - 1)
var huabei = JSON.parse(huabei).payment
} else {
var huabei = ''
}
//信用卡
var credit = sessionStorage.payment_credit;
if (credit) {
var src = JSON.parse(credit).content
var length = src.length
var img_credit = src.substring(4, length - 1)
var credit = JSON.parse(credit).payment
} else {
var credit = ''
}
//银行卡
var bank_data = sessionStorage.payment_bank;
if (bank_data) {
var bank = JSON.parse(bank_data).payment
var name = JSON.parse(bank_data).data.name
var account_num = JSON.parse(bank_data).data.account_num
var branch_bank = JSON.parse(bank_data).data.branch_bank
var open_bank = JSON.parse(bank_data).data.open_bank
} else {
var bank = ''
}
var data = sessionStorage.data;
if (data) {
var src = JSON.parse(data).content
var length = src.length
var img = src.substring(4, length - 1)
} else {
var src = ''
}
if ($(_this).attr('payment') == '' && $(_this).attr('payment') == 'undefined') {
// // showBigPic();
} else {
if (wexin == $(_this).attr('payment')) {
var _html = "";
_html += "<div align='center' style='width:300px;height:300px;background:white;border-radius: 3px;margin-left: 10px;'>"
_html += "<p><img src=" + '/static/service/images/payment/ic_wechat.png' + " class='payment_img'>" + '&nbsp;' + "微信二维码收款</p><hr>"
_html += "<p>保存二维码到相册,微信|扫一扫|付钱</p>"
_html += "<img src='" + img_wexin + "' style='margin:0 auto;width:100px;height:100px; margin-top: 40px;'></div>"
layer.open({
title: false,
content: _html,
btn: false,
skin: "wexin",
isOutAnim: false
});
} else if (alipay == $(_this).attr('payment')) {
var _html = "";
_html += "<div><div align='center' style='width:100%;height:100%;;background:white;border-radius: 3px'>"
_html += "<p><img src=" + '/static/service/images/payment/ic_zfb.png' + " class='payment_img'>" + '&nbsp;' + "支付宝二维码收款</p><hr>"
_html += "<p>保存二维码到相册,支付宝|扫一扫|付钱</p>"
_html += "<img src='" + img_alipay + "' style='margin:0 auto;width:100px;height:100px;margin-bottom: 10px;'></div>"
_html += "<div align='center' style='width:100%;height:60%;background:white;border-radius: 3px;margin-top: 10px'>"
_html += "<p><img src=" + '/static/service/images/payment/ic_zfb.png' + " class='payment_img'>" + '&nbsp;' + "支付宝账号转账</p><hr>"
_html += "<p>可用支付宝,支付宝[转账]付钱</p>"
_html += "<table border='0' style='width:80%;height:100%;'><tr style='font-size: 13px;color: #5a5a5a;'><td>支付宝账号</td><td style='float: right'>" + name + "</td></tr>"
_html += "<tr style='font-size: 13px;color: #5d5d5d;'><td>支付宝姓名</td><td style='float: right'>" + account_num + "</td></tr></table></div></div>"
layer.open({
title: false,
content: _html,
auto: ['500px', '500px'],
btn: false,
skin: "alipay",
isOutAnim: false
});
} else if (huabei == $(_this).attr('payment')) {
var _html = "";
_html += "<div style='width:100%;height:100%;'><div align='center' style='width:100%;height:40%;;background:white;border-radius: 3px'>"
_html += "<p><img src=" + '/static/service/images/payment/ic_huabei.png' + " class='payment_img'>" + '&nbsp;' + "蚂蚁花呗二维码收款</p><hr>"
_html += "<p>保存二维码到相册,支付宝|扫一扫|付钱</p>"
_html += "<img src='" + img_huabei + "' style='margin:0 auto;width:100px;height:100px;margin-bottom: 10px;'></div>"
_html += "<div style='width:100%;height:40%;background:white;border-radius: 3px;margin-top: 10px;text-align: -webkit-left;'>"
_html += "<p style='text-align: -webkit-center;'><img src=" + '/static/service/images/payment/ic_warn.png' + " class='payment_img'>" + '&nbsp;' + "温馨提示</p><hr>"
_html += "<p class='payment-text' style='color: #5a5a5a;font-size: 13px;'>**花呗充值会收取手续费,详情请咨询专业**</p>"
_html += "<p class='payment-text' style='color: #5a5a5a;font-size: 13px;'>为避免扫码失败使用支付宝扫码之前请关闭wifi用手机流量来扫码支付</p>"
_html += "</div></div>"
layer.open({
title: false,
content: _html,
auto: ['500px', '500px'],
btn: false,
skin: "huabei",
isOutAnim: false
});
} else if (credit == $(_this).attr('payment')) {
var _html = "";
_html += "<div style='width:100%;height:100%;'><div align='center' style='width:100%;height:40%;;background:white;border-radius: 3px'>"
_html += "<p><img src=" + '/static/service/images/payment/ic_visa.png' + " class='payment_img'>" + '&nbsp;' + "信用卡二维码收款</p><hr>"
_html += "<p>保存二维码到相册,支付宝|扫一扫|付钱</p>"
_html += "<img src='" + img_credit + "' style='margin:0 auto;width:100px;height:100px;margin-bottom: 10px;'></div>"
_html += "<div style='width:100%;height:40%;background:white;border-radius: 3px;margin-top: 10px;text-align: -webkit-left;'>"
_html += "<p style='text-align: -webkit-center;'><img class='payment_img' src=" + '/static/service/images/payment/ic_warn.png' + ">" + '&nbsp;' + "温馨提示</p><hr>"
_html += "<p class='payment-text'>**信用卡充值会收取手续费,详情请咨询专业**</p>"
_html += "<p class='payment-text'>同时支持支付宝与微信扫码</p>"
_html += "<p class='payment-text'>为避免扫码失败使用支付宝扫码之前请关闭wifi用手机流量来扫码支付</p>"
_html += "<p class='payment-text'>若进行大额支付,使用微信扫码会比支付宝成功率高哦~</p>"
_html += "</div></div>"
layer.open({
title: false,
content: _html,
auto: ['500px', '500px'],
btn: false,
skin: "credit",
isOutAnim: false
});
} else if (bank == $(_this).attr('payment')) {
var _html = "";
_html += "<div style='width:100%;height:100%;'><div align='center' style='width:100%;height:60%;;background:white;border-radius: 3px'>"
_html += "<p><img class='payment_img' src=" + '/static/service/images/payment/ic_bank_card.png' + " >" + '&nbsp;' + "银行卡收款</p><hr>"
_html += "<p>可用支付宝,微信[转账到银行卡]功能付钱</p>"
_html += "<table border='0' style='width:80%;height:100%;'><tr><td>银行卡姓名</td><td style='float: right'>" + name + "</td></tr>"
_html += "<tr><td>银行卡号</td><td style='float: right'>" + account_num + "</td></tr>"
_html += "<tr><td>开户银行</td><td style='float: right'>" + open_bank + "</td></tr>"
_html += "<tr><td>开户支行</td><td style='float: right'>" + branch_bank + "</td></tr></table></div>"
_html += "<div style='width:100%;height:40%;background:white;border-radius: 3px;margin-top: 10px;text-align: -webkit-left;'>"
_html += "<p style='text-align: -webkit-center;'><img class='payment_img' src=" + '/static/service/images/payment/ic_warn.png' + ">" + '&nbsp;' + "温馨提示</p><hr>"
_html += "<p class='payment-text'>**信用卡充值会收取手续费,详情请咨询专业**</p>"
_html += "<p class='payment-text'>同时支持支付宝与微信扫码</p>"
_html += "<p class='payment-text'>为避免扫码失败使用支付宝扫码之前请关闭wifi用手机流量来扫码支付</p>"
_html += "<p class='payment-text'>若进行大额支付,使用微信扫码会比支付宝成功率高哦~</p>"
_html += "</div></div>"
layer.open({
title: false,
content: _html,
auto: ['500px', '500px'],
btn: false,
skin: "credit",
isOutAnim: false
});
}
}
}
//心跳检测
var heartCheck = {
timeout: 30000,//10秒
timeoutObj: null,
serverTimeoutObj: null,
reset: function () {
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function () {
var self = this;
this.timeoutObj = setTimeout(function () {
//这里发送一个心跳,后端收到后,返回一个心跳消息,
//onmessage拿到返回的心跳就说明连接正常
ws.send(JSON.stringify({
path: 'ping',
param: { 'type': 'kf' }
}));
self.serverTimeoutObj = setTimeout(function () {//如果超过一定时间还没重置,说明后端主动断开了
ws.close();//如果onclose会执行reconnect我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
}, self.timeout);
}, this.timeout);
}
};
/**
* 缓存用户数据
* @param data
*/
function cacheUserData(data) {
var uid = data.id;
// 1console.log(uid + '用户数据:');
//存储订单数据
// sessionStorage.setItem("f-"+uid, JSON.stringify(data.data));
}
/**
* 商品与订单模板渲染
* @param id
*/
function order_view(id, type) {
// 1console.log('order_view');
// layui.use('laytpl', function(){
// var laytpl = layui.laytpl;
// var data = sessionStorage.getItem('f-'+id);
// if(!data) return false;
// data = JSON.parse(data);
// //渲染模版
// var getTpl = $('#'+data.type+'_tpl').html();
// laytpl(getTpl).render(data[data.type], function(html){
// if(type == 'del') html = '';
// $('#order_list').html(html);
// });
// };
// });
}
$(function () {
// 获取服务用户列表(在线用户)
$.getJSON('/service/index/getUserList', function (res) {
// 1console.log('----');
// 1console.log(res);
// 1console.log('------');
if (1 == res.code) {
if (res.data.length > 0) {
// 如果有在线用户则展开tab
$("#on_span").attr('class', 'unfold');
// 添加用户
$.each(res.data, function (k, v) {
addUser(v, v.qrcode);
});
var id = $(".layui-unselect").find('li').eq(0).data('id');
var name = $(".layui-unselect").find('li').eq(0).data('name');
var avatar = $(".layui-unselect").find('li').eq(0).data('avatar');
var ip = $(".layui-unselect").find('li').eq(0).data('ip');
// 默认设置第一个用户为当前对话的用户
$("#active-user").attr('data-id', id).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip);
$(".all_user_list").find('li').eq(0).addClass('active').find('span:eq(1)').removeClass('layui-badge').text('');
$("#f-user").val(name);
$("#f-user-id").val(id);
$("#coin_uid").val(id);
$("#f-ip").val(ip);
// 储存用户信息
user_info_tmp = {
u_id: id,
u_name: name,
u_avatar: avatar,
u_ip: ip,
}
$.getJSON('/service/index/getCity', { ip: ip }, function (res) {
$("#f-area").val(res.data);
});
// 拉取和这个人的聊天记录
// 1console.log("拉取这个人的聊天记录");
$("#u-" + id).addClass('show-chat-detail');
getChatLog(id, 1);
// 渲染首个订单模板
order_view(id);
}
}
});
$.getJSON('/service/index/getOfflineUserList', function (res) {
// 1console.log('----');
// 1console.log(res);
// 1console.log('------');
if (res.code == 1) {
if (res.data.length > 0) {
// console.log(res.data);
$.each(res.data, function (k, v) {
// 重置离线状态缓存
sessionStorage.removeItem('timerid_' + uinfo.id + '_' + v.id);
addOffLineUser(v, 1);
});
// 添加提示
// var offline_hint_html = `<p style="font-size: 10px;color: #b1b1b1;padding: 5px 0 5px 10px;">温馨提示: 仅显示最近3天, 更多请到会话记录查询</p>`;
// var offline_html = offline_hint_html + $('#offline_user_list').html();
// $('#offline_user_list').html(offline_html);
/**
* 初始化不需要加载离线用户数据
*/
// var id = $(".layui-unselect").find('li').eq(0).data('id');
// var name = $(".layui-unselect").find('li').eq(0).data('name');
// var avatar = $(".layui-unselect").find('li').eq(0).data('avatar');
// var ip = $(".layui-unselect").find('li').eq(0).data('ip');
// 默认设置第一个用户为当前对话的用户
// $("#active-user").attr('data-id', id).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip);
// $(".all_user_list").find('li').eq(0).addClass('active').find('span:eq(1)').removeClass('layui-badge').text('');
// $("#f-user").val(name);
// $("#f-user-id").val(id);
// $("#f-ip").val(ip);
// $.getJSON('/service/index/getCity', {ip: ip}, function(res){
// $("#f-area").val(res.data);
// });
//
// // 拉取和这个人的聊天记录
// // 1console.log("拉取这个人的聊天记录");
// $("#u-" + id).addClass('show-chat-detail');
// getChatLog(id, 1);
// //渲染首个订单模板
// order_view(id);
}
}
});
// 监听快捷键发送
document.getElementById('msg-area').addEventListener('keydown', function (e) {
// if (e.keyCode != 13) return;
if (event.keyCode == 13) {
e.preventDefault(); // 取消事件的默认动作
sendMessage();
}
});
// 点击表情
var index;
$("#face").click(function (e) {
e.stopPropagation();
layui.use(['layer'], function () {
var layer = layui.layer;
var isShow = $(".layui-mylink-face").css('display');
if ('block' == isShow) {
layer.close(index);
return;
}
var height = $(".chat-box").height() - 110;
layer.ready(function () {
index = layer.open({
type: 1,
offset: [height + 'px', $(".layui-side").width() + 'px'],
shade: false,
title: false,
closeBtn: 0,
area: '395px',
content: showFaces()
});
});
});
});
$(document).click(function (e) {
layui.use(['layer'], function () {
var layer = layui.layer;
if (isShow) {
layer.close(index);
return false;
}
});
});
// 发送消息
$("#send").click(function () {
sendMessage();
});
// hover用户
$(".layui-unselect li").hover(function () {
$(this).find('i').show();
}, function () {
$(this).find('i').hide();
});
// 关闭用户
$('.close').click(function () {
var uid = $(this).parent().data('id');
$(this).parent().remove(); // 清除左侧的用户列表
$('#u-' + uid).remove(); // 清除右侧的聊天详情
});
// 检测滚动,异步加载更多聊天数据
$(".chat-box").scroll(function () {
var top = $(".chat-box").scrollTop();
});
// 会员转接
$("#scroll-link").click(function () {
return false;
var id = $("#active-user").attr('data-id');
var name = $("#active-user").attr('data-name');
var avatar = $("#active-user").attr('data-avatar');
var ip = $("#active-user").attr('data-ip');
if (id == '' || name == '') {
layer.msg("请选择要转接的会员");
}
// 二次确认
var layerIndex = null;
layerIndex = layer.confirm('确定转接', {
title: '转接提示',
closeBtn: 0,
icon: 3,
btn: ['确定', '取消'] // 按钮
}, function () {
layer.close(layerIndex);
layerIndex = layer.open({
title: '',
type: 1,
area: ['30%', '40%'],
content: $("#change-box")
});
// 监听选择
layui.use(['form'], function () {
var form = layui.form;
form.on('select(group)', function (data) {
if (uinfo.group == data.value) {
layer.msg("已经在该分组,不需要转接!");
} else {
layer.close(layerIndex);
var group = data.value; // 分组
// 交换分组
var change_data = '{' +
'"path":"api/changeGroup", ' +
'"param":{"type":"kf", "uer_id":"' + id + '", "user_name" : "' + name + '", "avatar" : "' + avatar + '", "group_id": ' + group + ', "ip" : "' + ip + '"},' +
'"access_token" : "' + token + '"}';
// 1console.log(change_data);
ws.send(change_data);
// layer.msg('转接成功');
}
});
});
}, function () {
});
});
//账号选择
$("#change-account").click(function () {
var id = $("#active-user").attr('data-id');
var name = $("#active-user").attr('data-name');
var avatar = $("#active-user").attr('data-avatar');
var ip = $("#active-user").attr('data-ip');
// if(id == '' || name == ''){
// layer.msg("请选择要转接的会员");
// }
// 二次确认
var layerIndex = null;
// layerIndex = layer.confirm('确定更换支付账号?', {
// title: '转接提示',
// closeBtn: 0,
// icon: 3,
// btn: ['确定', '取消'] // 按钮
// }, function(){
// layer.close(layerIndex);
// layerIndex = layer.open({
// title: '',
// type: 1,
// area: ['30%', '40%'],
// content: $("#account-box")
// });
layer.open({
title: '选择账号',
type: 2,
content: '/service/dialogue/selectAccount',
// content: $("#account-box"),
area: ['600px', '400px']
});
return;
// 监听选择
layui.use(['form'], function () {
var form = layui.form;
form.on('select(type)', function (data) {
$.getJSON('/service/index/changeType', { id: data.value }, function (res) {
var option = '';
option += '<option value="">请选择</option>';
$("#payment").html();
$.each(res.data, function (key, val) {
if (val.id == 0) {
option += '<option value="' + val.id + '" disabled="disabled">没有选项</option>'
$("#payment").html(option)
form.render('select')
} else {
if (val.is_use == 1 && val.status == 1) {
option += '<option value="' + val.id + '" selected="selected">' + val.account_num + '</option>'
} else {
option += '<option value="' + val.id + '">' + val.account_num + '</option>'
}
$("#payment").html(option)
form.render('select')
}
})
$("#payment").get(0).selectIndex = 0
});
})
form.on('submit(changePayment)', function (data) {
$.getJSON('/service/index/changeAccount', { id: data.field.payment, type: data.field.type }, function (res) {
// // 1console.log(res);
if (1 == res.code) {
layer.closeAll();
layer.msg('更换成功,请刷新页面!');
} else if (0 == res.code) {
layer.msg(res.msg);
}
});
// layer.close(layerIndex);
});
});
// }, function(){
// });
});
});
/**
* 支付选择账号
*/
function paySelect() {
// 1console.log(1111);
layer.open({
title: '选择账号',
type: 2,
content: '/service/dialogue/selectAccount',
// content: $("#account-box"),
area: ['600px', '400px'],
// 检测关闭层
cancel: function (index, layero) {
if (select_pay_type) {
// // console.log(select_pay_type);return;
window.location.reload();
}
}
});
}
function send_qrcode() {
var qrcode = $('#payment_img').attr('src');
var payment_type = $('#payment_type').val()
var payment_name = $('#payment_name').val()
var payment_num = $('#payment_num').val()
var payment_bank = $('#payment_bank').val()
var payment_open = $('#payment_open').val()
// // console.log(qrcode);
// if (!payment_type) {
// layer.msg('支付账号不能为空');
// return;
// }
if (qrcode != undefined) {
// if (qrcode != undefined && qrcode) {
// 1console.log('发送的二维码url' + qrcode);
sendMessage('img[' + qrcode + ']');
} else {
var content = "支付方式:" + payment_type + '\n' + "银行卡姓名:" + payment_name + "\n" + "银行卡号:" + payment_num + "\n" + "开户银行:" + payment_bank + "\n" + "开户支行:" + payment_open
// 1console.log('发送的内容:' + content)
sendMessage(content)
}
}
var isShow = false;
layui.use(['element', 'form'], function () {
var element = layui.element;
var form = layui.form;
});
// 图片 文件上传
layui.use(['upload', 'layer'], function () {
var upload = layui.upload;
var layer = layui.layer;
// 执行实例
var uploadInstImg = upload.render({
elem: '#image' // 绑定元素
, accept: 'images'
, exts: 'jpg|jpeg|png|gif'
, url: '/service/upload/uploadImg' // 上传接口
, done: function (res) {
sendMessage('img[' + res.data.src + ']');
// showBigPic();
}
, error: function () {
// 请求异常回调
}
});
var uploadInstFile = upload.render({
elem: '#file' // 绑定元素
, accept: 'file'
, exts: 'zip|rar'
, url: '/service/upload/uploadFile' // 上传接口
, done: function (res) {
sendMessage('file(' + res.data.src + ')[' + res.msg + ']');
}
, error: function () {
// 请求异常回调
}
});
});
// 展示表情数据
function showFaces() {
isShow = true;
var alt = getFacesIcon();
var _html = '<div class="layui-mylink-face"><ul class="layui-clear mylink-face-list">';
layui.each(alt, function (index, item) {
_html += '<li title="' + item + '" onclick="checkFace(this)"><img style="width:20px" src="/static/service/js/layui/images/face/' + index + '.png" /></li>';
});
_html += '</ul></div>';
return _html;
}
// 选择表情
function checkFace(obj) {
var word = $(".msg-area").val() + ' face' + $(obj).attr('title') + ' ';
// 1console.log('word')
// 1console.log(word)
// 1console.log('word')
$(".msg-area").val(word).focus();
}
// 发送消息
function sendMessage(sendMsg) {
var msg = (typeof (sendMsg) == 'undefined') ? $(".msg-area").val() : sendMsg;
var msg_id = uuid();
if ('' == msg) {
layui.use(['layer'], function () {
var layer = layui.layer;
return layer.msg('请输入回复内容', { time: 1000 });
});
return false;
}
if (repetition_line == true || !check_line) {
return layer.msg('当前链接已断线');
}
// 1console.log('msg')
// 1console.log(msg)
// 1console.log('msg')
var word = msgFactory(msg, 'mine', uinfo, null, msg_id);
var uid = $("#active-user").attr('data-id');
var uname = $("#active-user").attr('data-name');
var time = getTime();
// 1console.log('我是消息');
if (!uid) {
layui.use(['layer'], function () {
var layer = layui.layer;
return layer.msg('请先选择要发送的用户', { time: 1000 });
});
return false;
}
ws.send(JSON.stringify({
path: 'api\/chat',
param: {
type: 'kf', to_id: uid, to_name: uname, content: msg, from_name: uinfo.username, msg_id: msg_id,
from_id: uinfo.id, from_avatar: uinfo.avatar
},
access_token: token
}));
//本地缓存
var key = uinfo.id + '-' + uid;
if (typeof (Storage) !== "undefined") {
var localMsg = msgQueueCheck(getCache(key));
if (localMsg == null || localMsg.length == 0) {
localMsg = [];
}
// localMsg = { type: 'mine', from_id: uinfo.id, from_name: uinfo.username, time_line: time, msg_id: msg_id, to_name: uname, to_id: uid, img_id: '', payment: '', content: msg, from_avatar: uinfo.avatar, msg: msg };
localMsg.push({ type: 'mine', from_id: uinfo.id, from_name: uinfo.username, time_line: time, msg_id: msg_id, to_name: uname, to_id: uid, img_id: '', payment: '', content: msg, from_avatar: uinfo.avatar, msg: msg });
cacheChat({ key: key, data: localMsg });
}
// 1console.log("开始添加")
$("#u-" + uid).append(word);
$(".msg-area").val('');
// 滚动条自动定位到最底端
wordBottom();
// 检测是否发送成功
checkUserReceiveMsg(`${msg_id}`);
}
// 缓存聊天记录到本地
function cacheChat(obj) {
if (typeof (Storage) !== "undefined") {
// setTimeout(function () {
// f1的任务代码
localStorage.setItem(obj.key, JSON.stringify(obj.data));
//   }, 100);
}
}
// 从本地缓存中,拿出数据
function getCache(key) {
return JSON.parse(localStorage.getItem(key));
}
// 缓存未读消息数 key: 'unread-' + kf_id + '-' + uid, number : 数量
function cacheUnread(key, number) {
if (typeof (Storage) !== "undefined") {
if (number) {
localStorage.setItem(key, parseInt(number));
} else {
localStorage.removeItem(key); // 传过来的数量为空则删除该缓存
}
}
}
// 从本地获取未读消息数
function getUnread(key) {
var result = localStorage.getItem(key) ? parseInt(localStorage.getItem(key)) : 0;
return result;
}
//获取时间
function getTime() {
var myDate = new Date();
var year = myDate.getFullYear();
var month = myDate.getMonth() + 1;
var date = myDate.getDate();
var hour = myDate.getHours();
var minute = myDate.getMinutes();
var s = myDate.getSeconds();
if (date < 10) date = '0' + date;
if (month < 10) month = '0' + month;
if (hour < 10) hour = '0' + hour;
if (minute < 10) minute = '0' + minute;
if (s < 10) s = '0' + s;
return year + '-' + month + "-" + date + " " + hour + ':' + minute + ':' + s;
}
// 展示用户发送来的消息
function showUserMessage(userInfo, content) {
// 1console.log("成功收到对方消息,开始发送确认收到的回执消息");
var msg_id = uuid();
ws.send(JSON.stringify({
path: 'api\/sendReceiptMsg',
param: { type: 'kf', msg_id: userInfo.msg_id },
access_token: token
}));
//消息提示音
sendWarnAudio('msg');
//添加用户到用户列表
if ($('#f-' + userInfo.id).length == 0) {
addUser(userInfo, userInfo.qrcode);
//存储订单数据
// sessionStorage.setItem("f-"+userInfo.id, JSON.stringify(userInfo.data));
order_view(userInfo.id);
}
// 如果 在线用户tab为折叠状态则tab上显示新消息提醒
showTabNotice('on');
// 未读条数计数
if (!$('#f-' + userInfo.id).hasClass('active')) {
var num = $('#f-' + userInfo.id).find('span:eq(1)').text();
if (num == 'new' || !num) {
num = 1;
} else {
num = parseInt(num) + 1;
}
cacheUnread(makeUnreadKey(uid, userInfo.id), num);
$('#f-' + userInfo.id).find('span:eq(1)').removeClass('layui-badge').addClass('layui-badge').text(num);
}
var word = msgFactory(content, 'user', userInfo, null, userInfo.msg_id);
// setTimeout(function () {
$("#u-" + userInfo.id).append(word);
// 滚动条自动定位到最底端
wordBottom();
// $(document).on("click", ".layui-mylink-photos", function () {
// var value = $(this).attr('payment');
// if (value == 123) {
// // showBigPic();
// } else {
// clickpayment()
// }
// })
// showBigPic();
// }, 200);
// var time = getTime();
var time = userInfo.time;
//本地存储
var key = 'KF' + uid + '-' + userInfo.id
if (typeof (Storage) !== "undefined" && typeof (flag) == "undefined") {
var localMsg = msgQueueCheck(getCache(key));
if (localMsg == null || localMsg.length == 0) {
localMsg = [];
}
localMsg.push({ type: 'user', from_id: userInfo.id, from_name: userInfo.name, time_line: time, to_name: uname, to_id: uid, img_id: '', payment: '', content: content, from_avatar: userInfo.avatar, msg: '' });
// console.log(localMsg);
cacheChat({ key: key, data: localMsg });
}
}
// 消息发送工厂
function msgFactory(content, type, uinfo, payment, msg_id = '') {
if (payment != "" && payment != null) {
var payment = payment
width = '120px'
height = '50px'
} else {
width = '110px'
height = '100px'
}
var id_payment = id_payment
var _html = '';
if ('mine' == type) {
_html += '<li class="mylink-chat-mine" id="' + msg_id + '">';
} else {
_html += '<li id="' + msg_id + '">';
}
_html += '<div class="mylink-chat-user">';
_html += '<img src="' + uinfo.avatar + '">';
if ('mine' == type) {
_html += '<cite><i>' + getDate() + '</i>' + uinfo.username + '</cite>';
} else {
_html += '<cite>' + uinfo.name + '<i>' + getDate() + '</i></cite>';
}
_html += '</div><div class="mylink-chat-text">' + replaceContent(content, id_payment, payment, width, height) + '</div>';
_html += '</li>';
return _html;
}
// 获取日期
function getDate() {
var d = new Date(new Date());
return d.getFullYear() + '-' + digit(d.getMonth() + 1) + '-' + digit(d.getDate())
+ ' ' + digit(d.getHours()) + ':' + digit(d.getMinutes()) + ':' + digit(d.getSeconds());
}
//补齐数位
var digit = function (num) {
return num < 10 ? '0' + (num | 0) : num;
};
// 滚动条自动定位到最底端
function wordBottom() {
var box = $(".chat-box");
box.scrollTop(box[0].scrollHeight);
}
// 切换在线用户
function changeUserTab(obj) {
$("#user_list li").removeClass('active');
$("#offline_user_list li").removeClass('active');
obj.addClass('active').siblings().removeClass('active');
wordBottom();
}
// 添加在线用户到面板
function addUser(data) {
//缓存用户数据
cacheUserData(data);
if (!$('#user_list').find(`#f-${data.id}`).html()) {
var _html = '<li class="layui-nav-item" data-id="' + data.id + '" id="f-' + data.id +
'" data-name="' + data.name + '" data-avatar="' + data.avatar + '" data-ip="' + data.ip + '">';
_html += '<img src="' + data.avatar + '">';
_html += '<span class="user-name" style="width:40%">' + data.name + '</span>';
_html += '<span class="layui-badge" style="margin-left:5px">new</span>';
_html += '<i class="layui-icon close" style="display:none">ဇ</i>';
_html += '</li>';
// 添加左侧列表
$("#user_list").append(_html);
}
// 如果没有选中人,选中第一个
// var hasActive = 0;
// $("#all_user_list li").each(function(){
// if($(this).hasClass('active')){
// hasActive = 1;
// }
// });
if (!document.getElementById(`u-${data.id}`)) {
var _html2 = '';
_html2 += '<ul id="u-' + data.id + '">';
_html2 += '</ul>';
// 添加主聊天面板
$('.chat-box').append(_html2);
}
// if(0 == hasActive){
// $("#all_user_list").find('li').eq(0).addClass('active').find('span:eq(1)').removeClass('layui-badge').text('');
// $("#u-" + data.id).addClass('show-chat-detail');
// var id = $(".layui-unselect").find('li').eq(0).data('id');
// var name = $(".layui-unselect").find('li').eq(0).data('name');
// var ip = $(".layui-unselect").find('li').eq(0).data('ip');
// var avatar = $(".layui-unselect").find('li').eq(0).data('avatar');
// // 设置当前会话用户
// $("#active-user").attr('data-id', id).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip);
// $("#f-user").val(name);
// $("#f-user-id").val(id);
// $("#coin_uid").val(id);
// $("#f-ip").val(ip);
// $.getJSON('/service/index/getCity', {ip: ip}, function(res){
// $("#f-area").val(res.data);
// });
// //第一个用户默认展示
// order_view(data.id);
// }
if ($("#user_list").prop('hidden') == false) {
// getChatLog(data.id, 1);
checkUser();
} else {
checkUser();
}
}
/**
* 拼接本地缓存未读消息key
* @param kfId 客服id
* @param userId 用户id
*/
function makeUnreadKey(kfId, userId) {
return 'unread-' + kfId + '-' + userId;
}
/**
* 显示在线、离线未读提示
* @param type 在线、离线类型
*/
function showTabNotice(type) {
if ($('#' + type + '_span').hasClass('fold')) {
$('#' + type + 'line_user .layui-badge').show();
}
}
/**
* 添加离线用户到面板
* @param data
* @param type 添加类型1 初始加载; 2 在线转离线
*/
function addOffLineUser(data, type) {
// if (type == 2) {
// var calss_c = "layui-nav-item active";
// } else {
// var calss_c = "layui-nav-item";
// }
//缓存用户数据
// 1console.log(111);
cacheUserData(data);
// 1console.log(data);
let unread = type == 1 ? $("#user_list #f-" + data.id).find('span:eq(1)').text() : 0;
let _html = '<li class="layui-nav-item" data-id="' + data.id + '" id="f-' + data.id +
'" data-name="' + data.name + '" data-avatar="' + data.avatar + '" data-ip="' + data.ip + '">';
_html += '<img src="' + data.avatar + '">';
_html += '<span class="user-name">' + data.name + '</span>';
// 初始加载离线用户列表
if (type == 1) {
let old_unread = getUnread(makeUnreadKey(uid, data.id));
// 1console.log(old_unread);
unread = old_unread + parseInt(data.unread);
if (unread) {
cacheUnread(makeUnreadKey(uid, data.id), unread); // 存未读消息
// 如果 离线tab折叠则显示 离线未读提示
showTabNotice('off');
}
}
if (!unread) {
_html += '<span class="" style="margin-left:5px"></span>';
} else {
_html += '<span class="layui-badge" style="margin-left:5px">' + unread + '</span>';
}
_html += '<span class="del_offline" onclick="offline_user_del(' + data.id + ', event)" onmouseover="user_over($(this))" onmouseout="user_out($(this))">x</span>';
// _html += '<i class="layui-icon close" style="display:none">ဇ</i>';
_html += '</li>';
// 1console.log(111);
// 添加左侧列表
$("#offline_user_list").append(_html);
// 如果没有选中人,选中第一个
// var hasActive = 0;
// $("#all_user_list li").each(function(){
// if($(this).hasClass('active')){
// hasActive = 1;
// }
// });
if (!document.getElementById(`u-${data.id}`)) {
let _html2 = '';
_html2 += '<ul id="u-' + data.id + '">';
_html2 += '</ul>';
//添加主聊天面板
$('.chat-box').append(_html2);
}
// if(0 == hasActive){
// $("#all_user_list").find('li').eq(0).addClass('active').find('span:eq(1)').removeClass('layui-badge').text('');
// $("#u-" + data.id).addClass('show-chat-detail');
// var id = $(".layui-unselect").find('li').eq(0).data('id');
// var name = $(".layui-unselect").find('li').eq(0).data('name');
// var ip = $(".layui-unselect").find('li').eq(0).data('ip');
// var avatar = $(".layui-unselect").find('li').eq(0).data('avatar');
// // 设置当前会话用户
// $("#active-user").attr('data-id', id).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip);
// $("#f-user").val(name);
// $("#f-user-id").val(id);
// $("#f-ip").val(ip);
// $.getJSON('/service/index/getCity', {ip: ip}, function(res){
// $("#f-area").val(res.data);
// });
// //第一个用户默认展示
// // order_view(data.id);
// }
if ($("#offline_user_list").prop('hidden') == false) {
// getChatLog(data.id, 1);
checkUser();
} else {
checkUser();
}
}
//删除离线用户
function offline_user_del(userId, e) {
// 阻止点击事件冒泡
window.event ? window.event.cancelBubble = true : e.stopPropagation();
$.getJSON('/service/index/delOfflineUser?user_id=' + userId, function (res) {
if (1 == res.code) {
layer.msg('删除成功');
var key = 'KF' + uid + '-' + userId;
localStorage.removeItem(key);//清除客服对离线用户的本地缓存
sessionStorage.removeItem('timerid_' + uid + '_' + userId)
$("#offline_user_list #f-" + userId).remove(); // 清除左侧的用户列表
$('#u-' + userId).remove(); // 清除右侧的聊天详情
// 清除右侧的访客信息
$('#f-user').val('');
$("#coin_uid").val('');
$('#f-ip').val('');
$('#f-area').val('');
} else {
layer.msg(res.msg);
return;
}
});
}
function user_over(data) {
data.css('background-color', 'red');
}
function user_out(data) {
data.css('background-color', '#aaa');
}
// 操作新连接用户的 dom操作
function checkUser() {
$("#all_user_list").find('li').unbind("click"); // 防止事件叠加
// 切换用户
$(".layui-unselect").find('li').bind('click', function () {
if ($(this).attr('class') == 'layui-nav-item active') {
return;
}
changeUserTab($(this));
// 1console.log($(this).data('name'));
var userId = $(this).data('id');
var avatar = $(this).data('avatar');
var name = $(this).data('name');
var ip = $(this).data('ip');
// 展示相应的对话信息
$('.chat-box ul').each(function () {
if ('u-' + userId == $(this).attr('id')) {
$(this).addClass('show-chat-detail').siblings().removeClass('show-chat-detail');
}
});
// 去除消息提示
$(this).find('span:eq(1)').removeClass('layui-badge').text('');
// 清除本地未读消息缓存 makeUnreadKey(parseInt(uid), userId)
cacheUnread(makeUnreadKey(uid, userId), 0);
// 设置当前会话的用户
$("#active-user").attr('data-id', userId).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip);
// 储存用户信息
user_info_tmp = {
u_id: userId,
u_name: name,
u_avatar: avatar,
u_ip: ip,
}
// 右侧展示详情
$("#f-user").val(name);
$("#f-user-id").val(userId);
$("#coin_uid").val(userId);
$("#f-ip").val(ip);
$.getJSON('/service/index/getCity', { ip: ip }, function (res) {
$("#f-area").val(res.data);
});
//重新渲染商品订单模板
order_view(userId);
// 1console.log("点击更换了");
getChatLog(userId, 1);
wordBottom();
});
}
// 删除离线用户聊天面板(离线转换成在线)
function delOffUser(data) {
// 获取 该用户是否为当前聊天用户
let active = $("#offline_user_list #f-" + data.id).hasClass('active');
$("#offline_user_list #f-" + data.id).remove(); // 清除左侧的用户列表
// $('#u-' + data.id).remove(); // 清除右侧的聊天详情
if ($("#offline_user_list li").length == 0) {
$("#off_span").attr('class', 'fold');
}
// 清除右侧的访客信息
$('#f-user').val('');
$('#f-user-id').val('');
$("#coin_uid").val('');
$('#f-ip').val('');
$('#f-area').val('');
// 如果该用户为当前聊天用户
if (active) {
$("#on_span").attr('class', 'unfold'); // 展开在线用户tab
$("#user_list").prop('hidden', false); // 显示在线用户列表
$("#off_span").attr('class', 'fold'); // 折叠离线用户tab
$("#offline_user_list").prop('hidden', true); // 隐藏离线用户列表
$('#user_list #f-' + data.id).click();
}
}
// 删除在线用户聊天面板
function delUser(data) {
addOffLineUser(data.userinfo, 2);
// 查看在线tab是否折叠如果折叠则查看是否有未读的在线消息有则不消除tab上的消息提醒
if ($('#on_span').hasClass('fold')) {
$('#user_list li').each(function () {
if ($(this).find('span:eq(1)').text()) {
// 1console.log($(this).find('span:eq(1)').text());
// 隐藏消息提示
$('#online_user .layui-badge').hide();
return false;
}
});
}
$("#user_list #f-" + data.id).remove(); // 清除左侧的用户列表
// $('#u-' + data.id).remove(); // 清除右侧的聊天详情
// // 清除右侧的访客信息
$('#f-user').val('');
$('#f-user-id').val('');
$("#coin_uid").val('');
$('#f-ip').val('');
$('#f-area').val('');
layer.msg('用户:' + data.userinfo.name + '已离线!');
//重新渲染商品订单模板
// order_view(data.uid,'del');
}
// 发送快捷语句
function sendWord(obj) {
var msg = $(obj).data('word');
sendMessage(msg);
}
// 获取聊天记录
function getChatLog(uid, page, flag, width, height) {
var chatLog = getCache(uinfo.id + "-" + uid);
if (chatLog == 'undefined' || chatLog == null || chatLog.length < 1) {
chatLog = [];
}
// 1console.log("------------获取本地数据-----------------")
// 1console.log(chatLog)
// 1console.log("------------获取本地数据-----------------")
$.ajax({
url: '/service/index/getOfflineMsg?uid=' + uid + '&page=' + page,
type: "get",
async: false,
dataType: "json",
success: function (res) {
// console.log("------------获取离线数据 start-----------------")
// console.log(res.data)
// console.log("------------获取离线数据 end-----------------")
if (res.data.length == 0) {
return;
}
for (var i = 0; i <= res.data.length - 1; i++) {
if (res.data[i].type != 'user') {
continue;
}
chatLog.push(res.data[i]);
// // 1console.log(res.data);return;
var tkey = uinfo.id + '-' + uid;
if (typeof (Storage) !== "undefined") {
var localMsg = msgQueueCheck(getCache(tkey));
if (localMsg == null || localMsg.length == 0) {
localMsg = [];
}
localMsg.push(res.data[i]);
cacheChat({ key: tkey, data: localMsg });
}
}
// 1console.log("------------获取离线数据-----------------")
}
})
// 1console.log("------------获取所有数据-----------------")
// 1console.log(chatLog)
// 1console.log("------------获取所有数据-----------------")
// if (chatLog == null || chatLog.length == 0) {
// return;
// }
var _html = ''
var len = chatLog.length;
for (var i = 0; i < len; i++) {
var v = chatLog[i];
if (v.payment != null && v.payment != '') {
var content = v.msg
width = '120px'
height = '50px'
} else {
var content = v.content
width = '110px'
height = '100px'
}
if ('mine' == v.type) {
_html += '<li class="mylink-chat-mine">';
} else {
_html += '<li>';
}
_html += '<div class="mylink-chat-user">';
_html += '<img src="' + v.from_avatar + '">';
if ('mine' == v.type) {
_html += '<cite><i>' + v.time_line + '</i>' + v.from_name + '</cite>';
} else {
_html += '<cite>' + v.from_name + '<i>' + v.time_line + '</i></cite>';
}
_html += '</div><div class="mylink-chat-text">' + replaceContent(content, v.img_id, v.payment, width, height) + '</div>';
_html += '</li>';
}
setTimeout(function () {
// 滚动条自动定位到最底端
if (typeof flag == 'undefined') {
$("#u-" + uid).html(_html);
wordBottom();
} else {
$("#u-" + uid).prepend(_html);
}
// console.log(chatLog, flag);
// $(document).on("click", ".layui-mylink-photos", function () {
// var value = $(this).attr('payment');
// if (value == 123) {
// // showBigPic();
// } else {
// clickpayment()
// }
// })
}, 100);
}
// function removeLocalStorage111(uid, page, flag) {
// $.getJSON('/service/index/getChatLog', { uid: uid, page: page }, function (res) {
// if (1 == res.code && res.data.length > 0) {
// if (res.msg == res.total) {
// var _html = '<div class="layui-flow-more">没有更多了</div>';
// } else {
// var _html = '<div class="layui-flow-more"><a href="javascript:;" data-page="' + parseInt(res.msg + 1)
// + '" onclick="getMore(this)"><cite>更多记录</cite></a></div>';
// }
// var len = res.data.length;
// for (var i = 0; i < len; i++) {
// var v = res.data[len - i - 1];
// if ('mine' == v.type) {
// _html += '<li class="mylink-chat-mine">';
// } else {
// _html += '<li>';
// }
// _html += '<div class="mylink-chat-user">';
// _html += '<img src="' + v.from_avatar + '">';
// if ('mine' == v.type) {
// _html += '<cite><i>' + v.time_line + '</i>' + v.from_name + '</cite>';
// } else {
// _html += '<cite>' + v.from_name + '<i>' + v.time_line + '</i></cite>';
// }
// _html += '</div><div class="mylink-chat-text">' + replaceContent(v.content) + '</div>';
// _html += '</li>';
// }
// setTimeout(function () {
// // 滚动条自动定位到最底端
// if (typeof flag == 'undefined') {
// $("#u-" + uid).html(_html);
// wordBottom();
// } else {
// $("#u-" + uid).prepend(_html);
// }
// // showBigPic();
// }, 100);
// }
// });
// }
$(".layui-mylink-photos").on('click', function (obj) {
var value = $(this).attr('payment');
var src = this.src;
if (value == 123) {
layer.photos({
photos: {
data: [{
"alt": "大图模式",
"src": src
}]
}
, shade: 0.5
, closeBtn: 2
, anim: 0
, resize: false
, success: function (layero, index) {
}
});
}
});
// 显示大图
function showBigPic(obj) {
// console.log(obj);
var src = obj.src;
layer.photos({
photos: {
data: [{
"alt": "大图模式",
"src": src
}]
}
, shade: 0.5
, closeBtn: 2
, anim: 0
, resize: false
, success: function (layero, index) {
}
});
}
// 获取更多的的记录
function getMore(obj) {
$(obj).remove();
var page = $(obj).attr('data-page');
var uid = $(".layui-unselect").find('li').eq(0).data('id');
getChatLog(uid, page, 1);
}
// 删除历史聊天记录
function removeLocalStorage(key) {
localStorage.removeItem(key);
}
function sendWarnAudio(type) {
var turnAudio = document.getElementById("myWarnAudio");
if (!turnAudio) {
// 1console.log('初始化');
turnAudio = document.createElement("audio");
document.body.appendChild(turnAudio);
turnAudio.id = "myWarnAudio";
turnAudio.controls = false;
turnAudio.loop = false;
turnAudio.hidden = true;
}
if (type == 'msg') {
turnAudio.src = "/static/common/mp3/msn.mp3";
}
turnAudio.play();
}
/**
* 生成uuid
* @param {*} prefix 前缀
*/
function uuid(prefix = '') {
// 生成随机值
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
var id = prefix + (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
return id;
}
/**
* 检测消息是否发送成功
* @param {*} msg_id 消息id
* @param {*} type 消息类型, 1: 常规消息, 2: 自动回复,支付消息
*/
function checkUserReceiveMsg(msg_id, type = 1) {
// 定时1秒是否有返回成功接收消息
sessionStorage.setItem('send_time_receive_msg_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id, false);
var send_time = setTimeout(function () {
var user_receive_msg = sessionStorage.getItem('send_time_receive_msg_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id);
if (user_receive_msg == true) {
sessionStorage.removeItem('send_time_receive_msg_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id);
return true;
}
// 第一次进行自动重发
var re_send_msg_num = reSendMsgNum(msg_id, 'get');
if (!re_send_msg_num || re_send_msg_num < 1) {
autoReSendMsg(msg_id, type);
return;
}
// 用户没有接收到, 进行提示
sessionStorage.removeItem('send_time_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id);
$('#' + msg_id).find('.mylink-chat-text').append(`<span style="
float: left;
left: -80px;
top: 13px;
color: #828282;
position: absolute;
">发送失败
<i class="layui-icon
" style="
font-size: 18px;
color: #337ab7;
cursor:pointer;
" alt="重新发送" title="重新发送" onclick="reSendMsg('${msg_id}', this, ${type})">&#xe669;</i>
</span>`);
// systemHint(user_info_tmp.u_id, '消息发送失败, 请重新发送!');
// 1console.log('自动发送消息失败, 显示重新发送');
}, 4000);
// 消息入队
sessionStorage.setItem('send_time_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id, send_time);
}
/**
* 重新发送消息
* @param {*} msg_id 消息id
* @param {*} type 消息类型, 1: 常规消息, 2: 自动回复,支付消息
*/
function reSendMsg(msg_id, _this = null, type) {
layer.confirm('确定重新发送吗?', {
title: false,
btn: ['确定', '取消'] //按钮
}, function (ind) {
layer.close(ind);
// 获取本地数据
var key = uinfo.id + '-' + user_info_tmp.u_id;
var msg_list = msgQueueCheck(getCache(key));
if (msg_list == null || msg_list.length == 0) return false;
// 找出发送的数据
var msg_data = null;
msg_list.forEach(vo => {
if (vo.msg_id == msg_id) {
msg_data = vo;
}
});
if (!msg_data) return false;
// socket再次推送并检测是否发送成功
switch (type) {
case 1:
ws.send(JSON.stringify({
path: 'api\/chat',
param: {
type: 'kf', to_id: user_info_tmp.u_id, to_name: user_info_tmp.u_name, content: msg_data.msg, from_name: uinfo.username, msg_id: msg_data.msg_id,
from_id: uinfo.id, from_avatar: uinfo.avatar
},
access_token: token
}));
break;
case 2:
ws.send(JSON.stringify({
path: 'api\/chat',
param: {
type: 'kf', payment: msg_data.payment, data: msg_data.data, to_id: msg_data.to_id, to_name: msg_data.to_name, content: msg_data.content, from_name: msg_data.from_name,
from_id: msg_data.from_id, from_avatar: msg_data.from_avatar, msg_id: msg_data.msg_id,
},
access_token: token
}));
break;
}
if (_this != null) $(_this).parent().remove();
checkUserReceiveMsg(`${msg_id}`, type);
}, function (inds) {
layer.close(inds);
});
}
/**
* 自动重新发送消息
* @param {*} msg_id 消息id
* @param {*} type 消息类型, 1: 常规, 2: 支付
*/
function autoReSendMsg(msg_id, type) {
// 获取本地数据
var key = uinfo.id + '-' + user_info_tmp.u_id;
var msg_list = msgQueueCheck(getCache(key));
if (msg_list == null || msg_list.length == 0) return false;
// 找出发送的数据
var msg_data = null;
msg_list.forEach(vo => {
if (vo.msg_id == msg_id) {
msg_data = vo;
}
});
if (!msg_data) return false;
// socket再次推送并检测是否发送成功
switch (type) {
case 1:
ws.send(JSON.stringify({
path: 'api\/chat',
param: {
type: 'kf', to_id: user_info_tmp.u_id, to_name: user_info_tmp.u_name, content: msg_data.msg, from_name: uinfo.username, msg_id: msg_data.msg_id,
from_id: uinfo.id, from_avatar: uinfo.avatar
},
access_token: token
}));
break;
case 2:
ws.send(JSON.stringify({
path: 'api\/chat',
param: {
type: 'kf', payment: msg_data.payment, data: msg_data.data, to_id: msg_data.to_id, to_name: msg_data.to_name, content: msg_data.content, from_name: msg_data.from_name,
from_id: msg_data.from_id, from_avatar: msg_data.from_avatar, msg_id: msg_data.msg_id,
},
access_token: token
}));
break;
}
// 更新发送次数
reSendMsgNum(msg_id, 'update');
checkUserReceiveMsg(`${msg_id}`, type);
// 1console.log('发送消息失败, 正在自动重新发送');
}
/**
* 重新发送消息次数操作
* @param {*} msg_id 消息id
* @param {*} type 操作类型, get: 获取操作次数, update(更新或新建), del: 删除
*/
function reSendMsgNum(msg_id, type = 'get') {
if (!msg_id) return false;
switch (type) {
case 'get':
return sessionStorage.getItem('re_send_msg_num_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id);
break;
case 'update':
var re_send_msg_num = sessionStorage.getItem('re_send_msg_num_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id);
if (!re_send_msg_num) {
var save = sessionStorage.setItem('re_send_msg_num_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id, 1);
} else {
var save = sessionStorage.setItem('re_send_msg_num_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id, re_send_msg_num + 1);
}
return save;
break;
case 'del':
return sessionStorage.removeItem('re_send_msg_num_' + uinfo.id + '_' + user_info_tmp.u_id + '_' + msg_id);
break;
default:
return false;
break;
}
}
/**
* 检测消息是否重复
* @param {*} uid 用户id
* @param {*} msg_id 消息id
*/
function checkMsgIsRepeat(uid, msg_id) {
if (!uid || !msg_id) return false;
var dom = $('u-' + uid).find('#' + msg_id);
if (!dom || dom.length == 0) return false;
return true;
}