publicMethods.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  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({
  247. type: 'service',
  248. content: obj,
  249. time: this.customFormatDateTime(e.time_line, '', 3)
  250. })
  251. } else {
  252. chatData.push({type: 'user', content: obj, time: this.customFormatDateTime(e.time_line, '', 3)})
  253. }
  254. })
  255. redata.user_info.data = chatData;
  256. dataList = chatData;
  257. } else {
  258. redata.user_info.data = [];
  259. }
  260. } else {
  261. redata.user_info.data = sessionInfo.data
  262. }
  263. // console.log(name);
  264. //回调
  265. callback1 && callback1(redata, sessionList, offlineList, sessionType, dataIndex, dataList, name);
  266. },
  267. /*****************用户会话离线及相关数据*********************/
  268. /**
  269. * @param {object} redata 接收消息源
  270. * @param {Array} sessionList 访客会话列表
  271. * @param {Array} offlineList 访客离线列表
  272. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  273. * @param {int} dataIndex 定位当前会话,默认是0
  274. * @param {string} user_name 当前会话访客名
  275. * @param {Array} dataList 当前会话信息列表
  276. * @param {*} callback 回调函数
  277. */
  278. userOffline([redata, sessionList, offlineList, sessionType, dataIndex, user_name, dataList], callback) {
  279. let userInfo = [];
  280. for (let i = 0; i < sessionList.length; i++) {
  281. //匹配会话中离线用户
  282. if (sessionList[i].id == redata.id) {
  283. //把数据添加到离线列表
  284. offlineList.push(sessionList[i]);
  285. //用户选中状态会话中处理
  286. if (sessionType == 1) {
  287. //判断会话中列表长度
  288. if (sessionList.length > 1) {
  289. //判断是否离线用户是当前选中状态
  290. if (dataIndex == i) {
  291. dataIndex = 0;
  292. user_name = sessionList[0].name;
  293. dataList = sessionList[0].data;
  294. userInfo = sessionList;
  295. }
  296. //删除会话列表离线用户
  297. sessionList.splice(i, 1);
  298. } else {
  299. sessionType = 2;
  300. dataIndex = 0;
  301. user_name = offlineList[0].name;
  302. dataList = offlineList[0].data;
  303. userInfo = offlineList;
  304. sessionList.splice(i, 1);
  305. }
  306. }
  307. callback && callback(sessionList, offlineList, sessionType, dataIndex, user_name, dataList, userInfo);
  308. break;
  309. }
  310. }
  311. },
  312. /**************删除会话中离线用户及相关数据**************/
  313. /**
  314. * @param {object} redata 接收消息源
  315. * @param {Array} sessionList 访客会话列表
  316. * @param {Array} offlineList 访客离线列表
  317. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  318. * @param {int} dataIndex 定位当前会话,默认是0
  319. * @param {string} user_name 当前会话访客名
  320. * @param {Array} dataList 当前会话信息列表
  321. * @param {*} callback 回调函数
  322. */
  323. sessionEnd([redata, sessionList, offlineList, sessionType, dataIndex, user_name, dataList], callback) {
  324. let isTrue = true;
  325. let userInfo = [];
  326. // console.log('哈哈',sessionList);
  327. //会话中列表匹配
  328. if (sessionList.length > 0) {
  329. for (let i = 0; i < sessionList.length; i++) {
  330. //检测会话列表中是否有结束的会话对象
  331. if (sessionList[i].id == redata.id) {
  332. //删除会话列表中结束的会话对象用户信息
  333. sessionList.splice(i, 1);
  334. // this.$store.dispatch("SET_SESSION",sessionList);
  335. if (sessionType == 1) {
  336. if (sessionList.length > 1) {
  337. //处理会话显现状态
  338. if (dataIndex == i) {
  339. user_name = sessionList[0].name;
  340. dataList = sessionList[0].data;
  341. userInfo = sessionList;
  342. }
  343. } else {
  344. if (offlineList.length > 0) {
  345. sessionType = 2;
  346. dataIndex = 0;
  347. userInfo = offlineList;
  348. } else {
  349. user_name = '';
  350. dataList = [];
  351. userInfo = '';
  352. }
  353. }
  354. }
  355. isTrue = false;
  356. break;
  357. }
  358. }
  359. }
  360. //离线列表查询
  361. if (isTrue) {
  362. for (let i = 0; i < offlineList.length; i++) {
  363. //判断离线列表是否结束会话
  364. if (offlineList[i].id == redata.id) {
  365. //删除离线列表中结束会话的用户信息
  366. offlineList.splice(i, 1);
  367. // this.$store.dispatch("SET_OFFLINE",offlineList);
  368. if (sessionType == 2) {
  369. if (dataIndex == i) {
  370. if (offlineList.length > 1) {
  371. if (sessionList.length > 0) {
  372. dataList = sessionList[0].data;
  373. user_name = sessionList[0].name;
  374. userInfo = sessionList;
  375. } else {
  376. dataList = offlineList[0].data;
  377. user_name = offlineList[0].name;
  378. userInfo = offlineList;
  379. }
  380. } else {
  381. if (sessionList.length > 0) {
  382. dataList = sessionList[0].data;
  383. user_name = sessionList[0].name;
  384. userInfo = sessionList;
  385. } else {
  386. dataList = [];
  387. user_name = '';
  388. userInfo = '';
  389. }
  390. }
  391. }
  392. }
  393. break;
  394. }
  395. }
  396. }
  397. console.log('测试掉线', sessionList);
  398. //回调
  399. callback && callback(sessionList, offlineList, sessionType, dataIndex, user_name, dataList, userInfo);
  400. },
  401. /*****************接收用户会话消息***************/
  402. /**
  403. *
  404. * @param {*} redata 数据源
  405. * @param {*} sessionList 会话列表
  406. * @param {*} frce 表情数据源
  407. * @param {*} callback 回调
  408. */
  409. receivesMessage(redata, sessionList, frce, callback) {
  410. let dataIndex = 0;
  411. if(sessionList.length<1){
  412. return -2001;
  413. }
  414. //匹配是那个用户回的消息
  415. for (let i = 0; i < sessionList.length; i++) {
  416. if (sessionList[i].id == redata.id) {
  417. dataIndex = i;
  418. break;
  419. }
  420. }
  421. //获取当前回复消息对象
  422. let chatList = sessionList[dataIndex]
  423. redata.type = 'user';
  424. redata.content = JSON.parse(redata.content);
  425. //这个地方转
  426. redata.content.text = this.turnFace(redata.content.text, frce);
  427. //将消息添加对应的会话列表中
  428. chatList.data.push(redata);
  429. callback && callback(redata, chatList, dataIndex);
  430. },
  431. /******************文字信息转表情******************/
  432. /**
  433. * @param {*} data
  434. * @param {*} frce
  435. */
  436. turnFace(data, frce) {
  437. let str = data.match(/\#\[.*?\]\//g);
  438. let arr = Array.from(new Set(str));
  439. arr.forEach(e => {
  440. let imgsrc = '';
  441. for (let i = 0; i < frce.length; i++) {
  442. let expText = e.slice(1, e.length - 1);
  443. if (expText == frce[i]) {
  444. imgsrc = '<img class="hover" src="' + require(`@/assets/img/${i}.gif`) + '"/>'
  445. break;
  446. }
  447. }
  448. data = data.replace(new RegExp(`\\#\\[${e.substring(2, e.length - 2)}\\]\\/`, 'g'), imgsrc);
  449. })
  450. return data;
  451. },
  452. getQueryString(name) {
  453. var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
  454. var r = window.location.search.substr(1).match(reg);
  455. if (r != null) {
  456. return unescape(r[2]);
  457. }
  458. return null;
  459. }
  460. }