publicMethods.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. import frceArr from './frce';
  2. export default {
  3. //获取图片
  4. imgPreview(file, callback) {
  5. let self = this;
  6. let name = file.name.split('.')[0]
  7. //判断支不支持FileReader
  8. if (!file || !window.FileReader) return;
  9. if (/^image/.test(file.type)) {
  10. //创建一个reader
  11. let reader = new FileReader();
  12. //将图片转成base64格式
  13. reader.readAsDataURL(file);
  14. //读取成功后的回调
  15. reader.onloadend = function() {
  16. let result = this.result;
  17. let img = new Image();
  18. let formData = new FormData();
  19. img.src = result;
  20. img.onload = function() {
  21. let data = self.compress(img);
  22. let blob = self.dataURItoBlob(data);
  23. formData.append("file", blob,name+'.jpeg');
  24. //图片预览,配置文件,formData数据;
  25. callback && callback(data,formData);
  26. };
  27. };
  28. }
  29. },
  30. // 压缩图片
  31. compress(img) {
  32. let canvas = document.createElement("canvas");
  33. let ctx = canvas.getContext("2d");
  34. // let initSize = img.src.length;
  35. let width = img.width;
  36. let height = img.height;
  37. canvas.width = width;
  38. canvas.height = height;
  39. // 铺底色
  40. ctx.fillStyle = "#fff";
  41. ctx.fillRect(0, 0, canvas.width, canvas.height);
  42. ctx.drawImage(img, 0, 0, width, height);
  43. //进行压缩
  44. let ndata = canvas.toDataURL("image/jpeg", 0.4);
  45. // console.log("*******压缩后的图片大小*******");
  46. // console.log(ndata)
  47. return ndata;
  48. },
  49. // base64转成bolb对象
  50. dataURItoBlob(base64Data) {
  51. var byteString;
  52. if (base64Data.split(",")[0].indexOf("base64") >= 0)
  53. byteString = atob(base64Data.split(",")[1]);
  54. else byteString = unescape(base64Data.split(",")[1]);
  55. var mimeString = base64Data
  56. .split(",")[0]
  57. .split(":")[1]
  58. .split(";")[0];
  59. var ia = new Uint8Array(byteString.length);
  60. for (var i = 0; i < byteString.length; i++) {
  61. ia[i] = byteString.charCodeAt(i);
  62. }
  63. return new Blob([ia], { type: mimeString});
  64. },
  65. //
  66. setApiToken(name, controller, time, modules) {
  67. let str = name + 'customer-service' + controller + time + modules
  68. return str.toLocaleLowerCase()
  69. },
  70. /**
  71. * 时间戳转日期自定义时间格式
  72. * timeStamp:时间戳
  73. * custom:转换日期时定义年月日用是什么符号隔开
  74. * isDtae:0=月份、1=日期、3=时间
  75. */
  76. customFormatDateTime(timeStamp,custom,isDtae) {
  77. var date = new Date();
  78. date.setTime(timeStamp * 1000);
  79. var y = date.getFullYear();
  80. var m = date.getMonth() + 1;
  81. m = m < 10 ? ('0' + m) : m;
  82. var d = date.getDate();
  83. d = d < 10 ? ('0' + d) : d;
  84. var h = date.getHours();
  85. h = h < 10 ? ('0' + h) : h;
  86. var minute = date.getMinutes();
  87. var second = date.getSeconds();
  88. minute = minute < 10 ? ('0' + minute) : minute;
  89. second = second < 10 ? ('0' + second) : second;
  90. if (isDtae == 0){
  91. return y + custom + m //+'student';
  92. }else if (isDtae ==1){
  93. return y + custom + m + custom + d;
  94. }else if(isDtae == 3){
  95. return h + ':' + minute //+ ':' + second;
  96. }else{
  97. return y + '-' + m + '-' + d + ' ' + h + ':' + minute //+ ':' + second;
  98. }
  99. },
  100. /*****************提示关键字及记录次数******************/
  101. /**
  102. *
  103. * @param {*} data
  104. * @param {*} sensitive
  105. * @param {*}
  106. */
  107. shieldingKeyword(data,sensitive) {
  108. //将敏感词组用|转换字符串
  109. let snstive = sensitive.join('|');
  110. let num = 0,text='';
  111. //匹配出会话中的敏感词
  112. data.replace(eval('/' + snstive + '/g'), (res) => {
  113. text +=','+res;
  114. num ++;
  115. })
  116. return {
  117. text,
  118. num
  119. }
  120. },
  121. /*****************用户屏蔽关键字******************/
  122. /**
  123. *
  124. * @param {*} data
  125. * @param {*} sensitive
  126. * @param {*}
  127. */
  128. userShieldingKeyword(data,sensitive) {
  129. //将敏感词组用|转换字符串
  130. let snstive = sensitive.join('|');
  131. let num = 0,text='';
  132. //匹配出会话中的敏感词
  133. return data.replace(eval('/' + snstive + '/g'), (res) => {
  134. var str = '';
  135. for (var i = 0; i < res.length; i++) {
  136. str += '*';
  137. }
  138. return str;
  139. })
  140. },
  141. /******************访客接入*********************/
  142. /**
  143. *
  144. * @param {object} redata 接收消息源
  145. * @param {Array} offlineList 访客离线列表
  146. * @param {Array} sessionList 访客会话列表
  147. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  148. * @param {int} dataIndex 定位当前会话,默认是0
  149. * @param {Array} dataList 当前会话信息列表
  150. * @param {string} user_name 当前会话访客名
  151. * @param {function} callback 访客匹配离线列表处理后链接回调方法
  152. * @param {function} callback1 访客正常链接回调方法
  153. */
  154. visitorsConnect([redata,offlineList,sessionList,sessionType,dataIndex,dataList,user_name],callback,callback1){
  155. // console.log('将会话工单写入访客信息',redata);
  156. // console.log('访客信息评价',evaluate);
  157. if(redata.evaluate_id > 0){
  158. redata.user_info.isEva = 10;
  159. }
  160. //将会话工单写入访客信息
  161. redata.user_info.conversationId = redata.conversationId;
  162. //默认离线列表没有访客信息
  163. let isTrue = true;
  164. let name ='';
  165. let sessionInfo = '';
  166. //匹配是否是离线用户上线
  167. if(offlineList.length > 0){
  168. for(let i = 0; i < offlineList.length; i++){
  169. //匹配离线列表是否有这个用户
  170. if(offlineList[i].id == redata.user_info.id ){
  171. //查询离线列表是否有此用户会话工单未结束
  172. if(offlineList[i].conversationId == redata.conversationId){
  173. // console.log(sessionType,offlineList);
  174. //工单号未结束的数据获取历史聊天消息和对象名字
  175. if(sessionType == 2 && i == dataIndex){//客服选中离线重新链接访客
  176. dataList = [];
  177. dataList = offlineList[i].data;
  178. name = offlineList[i].nick_name ? offlineList[i].nick_name : offlineList[i].name;
  179. sessionType = 1;
  180. dataIndex = sessionList.length == 0 ? 0 : sessionList.length-1;
  181. }else if(sessionType == 2 && i < dataIndex){//客服选中离线列表重新链接访客后面的访客
  182. if(i > 0){
  183. dataList = offlineList[i].data;
  184. name = offlineList[i].nick_name ? offlineList[i].nick_name : offlineList[i].name;
  185. }
  186. }else {
  187. name = redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name;
  188. }
  189. //将掉线前聊天消息写入到用户对象里面
  190. redata.user_info.data = offlineList[i].data;
  191. }else{
  192. //工单号已结束数据处理
  193. if(dataIndex == 0 && sessionList.length == 0){
  194. name =redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name;
  195. dataList = [];
  196. }
  197. redata.user_info.data = [];
  198. }
  199. //获取离线列表数据
  200. sessionInfo = offlineList[i]
  201. //将离线状态用户删除
  202. offlineList.splice(i,1);
  203. isTrue = false;
  204. //回调
  205. callback && callback(offlineList);
  206. break;
  207. }
  208. }
  209. }
  210. //新访客链接
  211. if(isTrue){
  212. if(sessionList.length == 0){
  213. //判断是否选离线用户列表
  214. if(offlineList.length > 0 && sessionType ==2){
  215. //不做处理
  216. }else{
  217. dataIndex = 0;
  218. sessionType = 1;
  219. // console.log(redata.user_info.nick_name,redata.user_info.name);
  220. name = redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name ;
  221. dataList = [];
  222. }
  223. }else{
  224. for(let i = 0; i < sessionList.length; i++){
  225. //匹配离线列表是否有这个用户
  226. if(sessionList[i].id == redata.user_info.id ){
  227. sessionList.splice(i,1);
  228. break;
  229. }
  230. }
  231. //判断接入用户是否有昵称展示
  232. redata.user_info.name = redata.user_info.nick_name ? redata.user_info.nick_name : redata.user_info.name ;
  233. }
  234. //历史会话消息
  235. if(redata.history.length > 0){
  236. let chatData= [];
  237. redata.history.forEach(e=>{
  238. let content = JSON.parse(e.content);
  239. let obj = {
  240. text:this.turnFace(content.text,frceArr.frce) ,
  241. img: content.img,
  242. type: false,
  243. };
  244. if( e.from_id.startsWith("KF")){
  245. //this.turnFace(redata.content.text,frceArr.frce);
  246. chatData.push({type: 'service', content: obj, time:this.customFormatDateTime(e.time_line,'',3)})
  247. }else{
  248. chatData.push({type: 'user', content: obj, time:this.customFormatDateTime(e.time_line,'',3)})
  249. }
  250. })
  251. redata.user_info.data = chatData;
  252. dataList = chatData;
  253. }else{
  254. redata.user_info.data = [];
  255. }
  256. }else{
  257. redata.user_info.data = sessionInfo.data
  258. }
  259. // console.log(name);
  260. //回调
  261. callback1 && callback1(redata,sessionList,offlineList,sessionType,dataIndex,dataList,name);
  262. },
  263. /*****************用户会话离线及相关数据*********************/
  264. /**
  265. * @param {object} redata 接收消息源
  266. * @param {Array} sessionList 访客会话列表
  267. * @param {Array} offlineList 访客离线列表
  268. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  269. * @param {int} dataIndex 定位当前会话,默认是0
  270. * @param {string} user_name 当前会话访客名
  271. * @param {Array} dataList 当前会话信息列表
  272. * @param {*} callback 回调函数
  273. */
  274. userOffline([redata,sessionList,offlineList,sessionType,dataIndex,user_name,dataList],callback){
  275. let userInfo = [];
  276. for(let i = 0 ; i < sessionList.length; i++){
  277. //匹配会话中离线用户
  278. if(sessionList[i].id == redata.id ){
  279. //把数据添加到离线列表
  280. offlineList.push(sessionList[i]);
  281. //用户选中状态会话中处理
  282. if(sessionType == 1){
  283. //判断会话中列表长度
  284. if(sessionList.length > 1){
  285. //判断是否离线用户是当前选中状态
  286. if( dataIndex == i){
  287. dataIndex = 0;
  288. user_name = sessionList[0].name;
  289. dataList = sessionList[0].data;
  290. userInfo = sessionList;
  291. }
  292. //删除会话列表离线用户
  293. sessionList.splice(i,1);
  294. }else{
  295. sessionType = 2;
  296. dataIndex = 0;
  297. user_name =offlineList[0].name;
  298. dataList = offlineList[0].data;
  299. userInfo = offlineList ;
  300. sessionList.splice(i,1);
  301. }
  302. }
  303. callback && callback(sessionList,offlineList,sessionType,dataIndex,user_name,dataList,userInfo);
  304. break;
  305. }
  306. }
  307. },
  308. /**************删除会话中离线用户及相关数据**************/
  309. /**
  310. * @param {object} redata 接收消息源
  311. * @param {Array} sessionList 访客会话列表
  312. * @param {Array} offlineList 访客离线列表
  313. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  314. * @param {int} dataIndex 定位当前会话,默认是0
  315. * @param {string} user_name 当前会话访客名
  316. * @param {Array} dataList 当前会话信息列表
  317. * @param {*} callback 回调函数
  318. */
  319. sessionEnd([redata,sessionList,offlineList,sessionType,dataIndex,user_name,dataList],callback){
  320. let isTrue = true;
  321. let userInfo = [];
  322. // console.log('哈哈',sessionList);
  323. //会话中列表匹配
  324. if(sessionList.length > 0){
  325. for(let i = 0 ; i < sessionList.length; i++){
  326. //检测会话列表中是否有结束的会话对象
  327. if(sessionList[i].id == redata.id){
  328. //删除会话列表中结束的会话对象用户信息
  329. sessionList.splice(i,1);
  330. // this.$store.dispatch("SET_SESSION",sessionList);
  331. if(sessionType == 1){
  332. if(sessionList.length >1){
  333. //处理会话显现状态
  334. if(dataIndex == i){
  335. user_name = sessionList[0].name;
  336. dataList = sessionList[0].data;
  337. userInfo = sessionList;
  338. }
  339. }else{
  340. if(offlineList.length > 0 ){
  341. sessionType = 2;
  342. dataIndex = 0;
  343. userInfo = offlineList;
  344. }else{
  345. user_name = '';
  346. dataList = [];
  347. userInfo = '';
  348. }
  349. }
  350. }
  351. isTrue = false;
  352. break;
  353. }
  354. }
  355. }
  356. //离线列表查询
  357. if(isTrue){
  358. for(let i = 0 ; i < offlineList.length; i++){
  359. //判断离线列表是否结束会话
  360. if(offlineList[i].id == redata.id){
  361. //删除离线列表中结束会话的用户信息
  362. offlineList.splice(i,1);
  363. // this.$store.dispatch("SET_OFFLINE",offlineList);
  364. if(sessionType == 2){
  365. if(dataIndex == i){
  366. if(offlineList.length > 1){
  367. if(sessionList.length >0){
  368. dataList = sessionList[0].data;
  369. user_name = sessionList[0].name;
  370. userInfo = sessionList;
  371. }else{
  372. dataList = offlineList[0].data;
  373. user_name = offlineList[0].name;
  374. userInfo = offlineList;
  375. }
  376. }else{
  377. if(sessionList.length >0){
  378. dataList = sessionList[0].data;
  379. user_name = sessionList[0].name;
  380. userInfo = sessionList;
  381. }else{
  382. dataList = [];
  383. user_name = '';
  384. userInfo = '';
  385. }
  386. }
  387. }
  388. }
  389. break;
  390. }
  391. }
  392. }
  393. console.log('测试掉线',sessionList);
  394. //回调
  395. callback && callback(sessionList,offlineList,sessionType,dataIndex,user_name,dataList,userInfo);
  396. },
  397. /*****************接收用户会话消息***************/
  398. /**
  399. *
  400. * @param {*} redata 数据源
  401. * @param {*} sessionList 会话列表
  402. * @param {*} frce 表情数据源
  403. * @param {*} callback 回调
  404. */
  405. receivesMessage(redata,sessionList,frce,callback){
  406. let dataIndex = 0;
  407. //匹配是那个用户回的消息
  408. for(let i = 0 ; i < sessionList.length ; i++){
  409. if(sessionList[i].id == redata.id ){
  410. dataIndex = i;
  411. break;
  412. }
  413. }
  414. //获取当前回复消息对象
  415. let chatList = sessionList[dataIndex]
  416. redata.type = 'user';
  417. redata.content = JSON.parse(redata.content);
  418. //这个地方转
  419. redata.content.text = this.turnFace(redata.content.text,frce);
  420. //将消息添加对应的会话列表中
  421. chatList.data.push(redata);
  422. callback && callback(redata,chatList,dataIndex);
  423. },
  424. /******************文字信息转表情******************/
  425. /**
  426. * @param {*} data
  427. * @param {*} frce
  428. */
  429. turnFace(data,frce){
  430. let str = data.match(/\#\[.*?\]\//g);
  431. let arr =Array.from(new Set(str));
  432. arr.forEach(e=>{
  433. let imgsrc = '';
  434. for(let i = 0 ; i < frce.length ; i++){
  435. let expText = e.slice(1,e.length-1);
  436. if(expText == frce[i]){
  437. imgsrc = '<img class="hover" src="'+require(`@/assets/img/${i}.gif`)+'"/>'
  438. break;
  439. }
  440. }
  441. data = data.replace(new RegExp(`\\#\\[${e.substring(2,e.length-2)}\\]\\/`,'g'),imgsrc);
  442. })
  443. return data;
  444. },
  445. }