| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- 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;
- //匹配是那个用户回的消息
- 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;
- },
- }
|