| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486 |
- import frceArr from './frce';
- export default {
- //获取图片
- imgPreview(file, callback) {
- let self = this;
- let name = file.name.split('.')[0]
- //判断支不支持FileReader
- if (!file || !window.FileReader) return;
- if (/^image/.test(file.type)) {
- //创建一个reader
- let reader = new FileReader();
- //将图片转成base64格式
- reader.readAsDataURL(file);
- //读取成功后的回调
- reader.onloadend = function () {
- let result = this.result;
- let img = new Image();
- let formData = new FormData();
- img.src = result;
- img.onload = function () {
- let data = self.compress(img);
- let blob = self.dataURItoBlob(data);
- formData.append("file", blob, name + '.jpeg');
- //图片预览,配置文件,formData数据;
- callback && callback(data, formData);
- };
- };
- }
- },
- // 压缩图片
- compress(img) {
- let canvas = document.createElement("canvas");
- let ctx = canvas.getContext("2d");
- // let initSize = img.src.length;
- let width = img.width;
- let height = img.height;
- canvas.width = width;
- canvas.height = height;
- // 铺底色
- ctx.fillStyle = "#fff";
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.drawImage(img, 0, 0, width, height);
- //进行压缩
- let ndata = canvas.toDataURL("image/jpeg", 0.4);
- // console.log("*******压缩后的图片大小*******");
- // console.log(ndata)
- return ndata;
- },
- // base64转成bolb对象
- dataURItoBlob(base64Data) {
- var byteString;
- if (base64Data.split(",")[0].indexOf("base64") >= 0)
- byteString = atob(base64Data.split(",")[1]);
- else byteString = unescape(base64Data.split(",")[1]);
- var mimeString = base64Data
- .split(",")[0]
- .split(":")[1]
- .split(";")[0];
- var ia = new Uint8Array(byteString.length);
- for (var i = 0; i < byteString.length; i++) {
- ia[i] = byteString.charCodeAt(i);
- }
- return new Blob([ia], {type: mimeString});
- },
- //
- setApiToken(name, controller, time, modules) {
- let str = name + 'customer-service' + controller + time + modules
- return str.toLocaleLowerCase()
- },
- /**
- * 时间戳转日期自定义时间格式
- * timeStamp:时间戳
- * custom:转换日期时定义年月日用是什么符号隔开
- * isDtae:0=月份、1=日期、3=时间
- */
- customFormatDateTime(timeStamp, custom, isDtae) {
- var date = new Date();
- date.setTime(timeStamp * 1000);
- var y = date.getFullYear();
- var m = date.getMonth() + 1;
- m = m < 10 ? ('0' + m) : m;
- var d = date.getDate();
- d = d < 10 ? ('0' + d) : d;
- var h = date.getHours();
- h = h < 10 ? ('0' + h) : h;
- var minute = date.getMinutes();
- var second = date.getSeconds();
- minute = minute < 10 ? ('0' + minute) : minute;
- second = second < 10 ? ('0' + second) : second;
- if (isDtae == 0) {
- return y + custom + m //+'student';
- } else if (isDtae == 1) {
- return y + custom + m + custom + d;
- } else if (isDtae == 3) {
- return h + ':' + minute //+ ':' + second;
- } else {
- return y + '-' + m + '-' + d + ' ' + h + ':' + minute //+ ':' + second;
- }
- },
- /*****************提示关键字及记录次数******************/
- /**
- *
- * @param {*} data
- * @param {*} sensitive
- * @param {*}
- */
- shieldingKeyword(data, sensitive) {
- //将敏感词组用|转换字符串
- let snstive = sensitive.join('|');
- let num = 0, text = '';
- //匹配出会话中的敏感词
- data.replace(eval('/' + snstive + '/g'), (res) => {
- text += ',' + res;
- num++;
- })
- return {
- text,
- num
- }
- },
- /*****************用户屏蔽关键字******************/
- /**
- *
- * @param {*} data
- * @param {*} sensitive
- * @param {*}
- */
- userShieldingKeyword(data, sensitive) {
- //将敏感词组用|转换字符串
- let snstive = sensitive.join('|');
- let num = 0, text = '';
- //匹配出会话中的敏感词
- return data.replace(eval('/' + snstive + '/g'), (res) => {
- var str = '';
- for (var i = 0; i < res.length; i++) {
- str += '*';
- }
- return str;
- })
- },
- /******************访客接入*********************/
- /**
- *
- * @param {object} redata 接收消息源
- * @param {Array} offlineList 访客离线列表
- * @param {Array} sessionList 访客会话列表
- * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
- * @param {int} dataIndex 定位当前会话,默认是0
- * @param {Array} dataList 当前会话信息列表
- * @param {string} user_name 当前会话访客名
- * @param {function} callback 访客匹配离线列表处理后链接回调方法
- * @param {function} callback1 访客正常链接回调方法
- */
- visitorsConnect([redata, offlineList, sessionList, sessionType, dataIndex, dataList, user_name], callback, callback1) {
- // console.log('将会话工单写入访客信息',redata);
- // console.log('访客信息评价',evaluate);
- if (redata.evaluate_id > 0) {
- redata.user_info.isEva = 10;
- }
- //将会话工单写入访客信息
- redata.user_info.conversationId = redata.conversationId;
- //默认离线列表没有访客信息
- let isTrue = true;
- let name = '';
- let sessionInfo = '';
- //匹配是否是离线用户上线
- if (offlineList.length > 0) {
- for (let i = 0; i < offlineList.length; i++) {
- //匹配离线列表是否有这个用户
- if (offlineList[i].id == redata.user_info.id) {
- //查询离线列表是否有此用户会话工单未结束
- if (offlineList[i].conversationId == redata.conversationId) {
- // console.log(sessionType,offlineList);
- //工单号未结束的数据获取历史聊天消息和对象名字
- if (sessionType == 2 && i == dataIndex) {//客服选中离线重新链接访客
- dataList = [];
- dataList = offlineList[i].data;
- name = offlineList[i].nick_name ? offlineList[i].nick_name : offlineList[i].name;
- sessionType = 1;
- dataIndex = sessionList.length == 0 ? 0 : sessionList.length - 1;
- } else if (sessionType == 2 && i < dataIndex) {//客服选中离线列表重新链接访客后面的访客
- if (i > 0) {
- dataList = offlineList[i].data;
- name = offlineList[i].nick_name ? offlineList[i].nick_name : offlineList[i].name;
- }
- } else {
- name = redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name;
- }
- //将掉线前聊天消息写入到用户对象里面
- redata.user_info.data = offlineList[i].data;
- } else {
- //工单号已结束数据处理
- if (dataIndex == 0 && sessionList.length == 0) {
- name = redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name;
- dataList = [];
- }
- redata.user_info.data = [];
- }
- //获取离线列表数据
- sessionInfo = offlineList[i]
- //将离线状态用户删除
- offlineList.splice(i, 1);
- isTrue = false;
- //回调
- callback && callback(offlineList);
- break;
- }
- }
- }
- //新访客链接
- if (isTrue) {
- if (sessionList.length == 0) {
- //判断是否选离线用户列表
- if (offlineList.length > 0 && sessionType == 2) {
- //不做处理
- } else {
- dataIndex = 0;
- sessionType = 1;
- // console.log(redata.user_info.nick_name,redata.user_info.name);
- name = redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name;
- dataList = [];
- }
- } else {
- for (let i = 0; i < sessionList.length; i++) {
- //匹配离线列表是否有这个用户
- if (sessionList[i].id == redata.user_info.id) {
- sessionList.splice(i, 1);
- break;
- }
- }
- //判断接入用户是否有昵称展示
- redata.user_info.name = redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name;
- }
- //历史会话消息
- if (redata.history.length > 0) {
- let chatData = [];
- redata.history.forEach(e => {
- let content = JSON.parse(e.content);
- let obj = {
- text: this.turnFace(content.text, frceArr.frce),
- img: content.img,
- type: false,
- };
- if (e.from_id.startsWith("KF")) {
- //this.turnFace(redata.content.text,frceArr.frce);
- chatData.push({
- type: 'service',
- content: obj,
- time: this.customFormatDateTime(e.time_line, '', 3)
- })
- } else {
- chatData.push({type: 'user', content: obj, time: this.customFormatDateTime(e.time_line, '', 3)})
- }
- })
- redata.user_info.data = chatData;
- dataList = chatData;
- } else {
- redata.user_info.data = [];
- }
- } else {
- redata.user_info.data = sessionInfo.data
- }
- // console.log(name);
- //回调
- callback1 && callback1(redata, sessionList, offlineList, sessionType, dataIndex, dataList, name);
- },
- /*****************用户会话离线及相关数据*********************/
- /**
- * @param {object} redata 接收消息源
- * @param {Array} sessionList 访客会话列表
- * @param {Array} offlineList 访客离线列表
- * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
- * @param {int} dataIndex 定位当前会话,默认是0
- * @param {string} user_name 当前会话访客名
- * @param {Array} dataList 当前会话信息列表
- * @param {*} callback 回调函数
- */
- userOffline([redata, sessionList, offlineList, sessionType, dataIndex, user_name, dataList], callback) {
- let userInfo = [];
- for (let i = 0; i < sessionList.length; i++) {
- //匹配会话中离线用户
- if (sessionList[i].id == redata.id) {
- //把数据添加到离线列表
- offlineList.push(sessionList[i]);
- //用户选中状态会话中处理
- if (sessionType == 1) {
- //判断会话中列表长度
- if (sessionList.length > 1) {
- //判断是否离线用户是当前选中状态
- if (dataIndex == i) {
- dataIndex = 0;
- user_name = sessionList[0].name;
- dataList = sessionList[0].data;
- userInfo = sessionList;
- }
- //删除会话列表离线用户
- sessionList.splice(i, 1);
- } else {
- sessionType = 2;
- dataIndex = 0;
- user_name = offlineList[0].name;
- dataList = offlineList[0].data;
- userInfo = offlineList;
- sessionList.splice(i, 1);
- }
- }
- callback && callback(sessionList, offlineList, sessionType, dataIndex, user_name, dataList, userInfo);
- break;
- }
- }
- },
- /**************删除会话中离线用户及相关数据**************/
- /**
- * @param {object} redata 接收消息源
- * @param {Array} sessionList 访客会话列表
- * @param {Array} offlineList 访客离线列表
- * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
- * @param {int} dataIndex 定位当前会话,默认是0
- * @param {string} user_name 当前会话访客名
- * @param {Array} dataList 当前会话信息列表
- * @param {*} callback 回调函数
- */
- sessionEnd([redata, sessionList, offlineList, sessionType, dataIndex, user_name, dataList], callback) {
- let isTrue = true;
- let userInfo = [];
- // console.log('哈哈',sessionList);
- //会话中列表匹配
- if (sessionList.length > 0) {
- for (let i = 0; i < sessionList.length; i++) {
- //检测会话列表中是否有结束的会话对象
- if (sessionList[i].id == redata.id) {
- //删除会话列表中结束的会话对象用户信息
- sessionList.splice(i, 1);
- // this.$store.dispatch("SET_SESSION",sessionList);
- if (sessionType == 1) {
- if (sessionList.length > 1) {
- //处理会话显现状态
- if (dataIndex == i) {
- user_name = sessionList[0].name;
- dataList = sessionList[0].data;
- userInfo = sessionList;
- }
- } else {
- if (offlineList.length > 0) {
- sessionType = 2;
- dataIndex = 0;
- userInfo = offlineList;
- } else {
- user_name = '';
- dataList = [];
- userInfo = '';
- }
- }
- }
- isTrue = false;
- break;
- }
- }
- }
- //离线列表查询
- if (isTrue) {
- for (let i = 0; i < offlineList.length; i++) {
- //判断离线列表是否结束会话
- if (offlineList[i].id == redata.id) {
- //删除离线列表中结束会话的用户信息
- offlineList.splice(i, 1);
- // this.$store.dispatch("SET_OFFLINE",offlineList);
- if (sessionType == 2) {
- if (dataIndex == i) {
- if (offlineList.length > 1) {
- if (sessionList.length > 0) {
- dataList = sessionList[0].data;
- user_name = sessionList[0].name;
- userInfo = sessionList;
- } else {
- dataList = offlineList[0].data;
- user_name = offlineList[0].name;
- userInfo = offlineList;
- }
- } else {
- if (sessionList.length > 0) {
- dataList = sessionList[0].data;
- user_name = sessionList[0].name;
- userInfo = sessionList;
- } else {
- dataList = [];
- user_name = '';
- userInfo = '';
- }
- }
- }
- }
- break;
- }
- }
- }
- console.log('测试掉线', sessionList);
- //回调
- callback && callback(sessionList, offlineList, sessionType, dataIndex, user_name, dataList, userInfo);
- },
- /*****************接收用户会话消息***************/
- /**
- *
- * @param {*} redata 数据源
- * @param {*} sessionList 会话列表
- * @param {*} frce 表情数据源
- * @param {*} callback 回调
- */
- receivesMessage(redata, sessionList, frce, callback) {
- let dataIndex = 0;
- if(sessionList.length<1){
- return -2001;
- }
- //匹配是那个用户回的消息
- for (let i = 0; i < sessionList.length; i++) {
- if (sessionList[i].id == redata.id) {
- dataIndex = i;
- break;
- }
- }
- //获取当前回复消息对象
- let chatList = sessionList[dataIndex]
- redata.type = 'user';
- redata.content = JSON.parse(redata.content);
- //这个地方转
- redata.content.text = this.turnFace(redata.content.text, frce);
- //将消息添加对应的会话列表中
- chatList.data.push(redata);
- callback && callback(redata, chatList, dataIndex);
- },
- /******************文字信息转表情******************/
- /**
- * @param {*} data
- * @param {*} frce
- */
- turnFace(data, frce) {
- let str = data.match(/\#\[.*?\]\//g);
- let arr = Array.from(new Set(str));
- arr.forEach(e => {
- let imgsrc = '';
- for (let i = 0; i < frce.length; i++) {
- let expText = e.slice(1, e.length - 1);
- if (expText == frce[i]) {
- imgsrc = '<img class="hover" src="' + require(`@/assets/img/${i}.gif`) + '"/>'
- break;
- }
- }
- data = data.replace(new RegExp(`\\#\\[${e.substring(2, e.length - 2)}\\]\\/`, 'g'), imgsrc);
- })
- return data;
- },
- getQueryString(name) {
- var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
- var r = window.location.search.substr(1).match(reg);
- if (r != null) {
- return unescape(r[2]);
- }
- return null;
- }
- }
|