import { useAppStore } from '@/store/app.js' import wx from "weixin-js-sdk"; import CryptoJS from 'crypto-js' import { showToast, showLoadingToast, closeToast } from 'vant' import { fetchPost } from "@/utils/https" // 惰性获取 Pinia store(替代原 Vuex 的 import store from "@/store") const appStore = () => useAppStore() export default { //侦听事件 on: function (ele, ev, handler) { if (ele.addEventListener) { ele.addEventListener(ev, handler, false) } else { ele.attachEvent('on' + ev, function () { fn.call(handler); }) } }, //取消事件 off: function (ele, ev, handler) { if (ele.removeEventListener) { ele.removeEventListener(ev, handler, false) } else { ele.detachEvent('on' + ev, function () { fn.call(handler); }) } }, //添加class addClass: function (ele, cls) { var oClass = ele.className.split(' '); if (!ele.className) { ele.className = cls; return; } for (var i = 0; i < oClass.length; i++) { if (oClass[i] === cls) { return; } } ele.className += " " + cls; }, //移除class removeClass: function (obj, sClass) { var aClass = obj.className.split(' '); if (!obj.className) return; for (var i = 0; i < aClass.length; i++) { if (aClass[i] === sClass) { aClass.splice(i, 1); obj.className = aClass.join(' '); break; } } }, //类名包含 hasClass: function (elem, className) { if (elem.classList) { return elem.classList.contains(className); } else { return new RegExp('(^| )' + className + '( |$)', 'gi').test(elem.className); } }, //处理a标签href为空情况下刷新页面问题 aHrefJump(className) { if (className) { let tagA = Array.from(className); tagA.forEach(e => { if (!e.getAttribute('href')) { e.setAttribute('href', 'javascript:;'); } }); } }, getPerformanceTiming() { var performance = window.performance; if (!performance) { // 当前浏览器不支持 console.log('你的浏览器不支持 performance 接口'); return; } // var t = performance.timing; // var times = {}; // //【重要】页面加载完成的时间 // //【原因】这几乎代表了用户等待页面可用的时间 // times.loadPage = t.loadEventEnd - t.navigationStart; // //【重要】解析 DOM 树结构的时间 // //【原因】反省下你的 DOM 树嵌套是不是太多了! // times.domReady = t.domComplete - t.responseEnd; // //【重要】重定向的时间 // //【原因】拒绝重定向!比如,http://example.com/ 就不该写成 http://example.com // times.redirect = t.redirectEnd - t.redirectStart; // //【重要】DNS 查询时间 // //【原因】DNS 预加载做了么?页面内是不是使用了太多不同的域名导致域名查询的时间太长? // // 可使用 HTML5 Prefetch 预查询 DNS ,见:[HTML5 prefetch](http://segmentfault.com/a/1190000000633364) // times.lookupDomain = t.domainLookupEnd - t.domainLookupStart; // //【重要】读取页面第一个字节的时间 // //【原因】这可以理解为用户拿到你的资源占用的时间,加异地机房了么,加CDN 处理了么?加带宽了么?加 CPU 运算速度了么? // // TTFB 即 Time To First Byte 的意思 // // 维基百科:https://en.wikipedia.org/wiki/Time_To_First_Byte // times.ttfb = t.responseStart - t.navigationStart; // //【重要】内容加载完成的时间 // //【原因】页面内容经过 gzip 压缩了么,静态资源 css/js 等压缩了么? // times.request = t.responseEnd - t.requestStart; // //【重要】执行 onload 回调函数的时间 // //【原因】是否太多不必要的操作都放到 onload 回调函数里执行了,考虑过延迟加载、按需加载的策略么? // times.loadEvent = t.loadEventEnd - t.loadEventStart; // // DNS 缓存时间 // times.appcache = t.domainLookupStart - t.fetchStart; // // 卸载页面的时间 // times.unloadEvent = t.unloadEventEnd - t.unloadEventStart; // // TCP 建立连接完成握手的时间 // times.connect = t.connectEnd - t.connectStart; var times = {}; var timing = performance.timing; var start = timing.navigationStart; times.dnsTime = timing.domainLookupEnd - timing.domainLookupStart; times.tcpTime = timing.connectEnd - timing.connectStart; times.firstPaintTime = timing.responseStart - start; times.domRenderTime = Math.abs(timing.domContentLoadedEventEnd - start); times.loadTime = Math.abs(timing.loadEventEnd - start); console.log('DNS解析时间:', times.dnsTime) console.log('TCP建立时间:', times.tcpTime) console.log('首屏时间:', times.firstPaintTime / 1000 + 's') console.log('dom渲染完成时间:', times.domRenderTime / 1000 + 's') console.log('页面onload时间:', times.loadTime / 1000 + 's') return times; }, formatTimer() { let date = new Date(); let y = date.getFullYear(); let MM = date.getMonth() + 1; MM = MM < 10 ? "0" + MM : MM; let d = date.getDate(); d = d < 10 ? "0" + d : d; let h = date.getHours(); h = h < 10 ? "0" + h : h; let m = date.getMinutes(); m = m < 10 ? "0" + m : m; let s = date.getSeconds(); s = s < 10 ? "0" + s : s; let S = date.getMilliseconds(); S = S < 10 ? "0" + S : S; console.log("页面加载时间:", y + "-" + MM + "-" + d + " " + h + ":" + m + ":" + s); return y + "-" + MM + "-" + d + " " + h + ":" + m + ":" + s; }, //获取样式 getStyle: function (dom, attr) { return dom.currentStyle ? dom.currentStyle[attr] : getComputedStyle(dom, false)[attr]; }, //获取url参数 getUrlKey: function (name) { return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ""])[1].replace(/\+/g, '%20')) || ""; }, //可见窗口大小 view: function () { return { w: document.documentElement.clientWidth, h: document.documentElement.clientHeight }; }, // 时间格式化 time_formatter(time) { let year = time.getFullYear() let month = time.getMonth() + 1 let date = time.getDate() let hour = time.getHours() let minute = time.getMinutes() let second = time.getSeconds() month = month < 10 ? `0${month}` : month date = date < 10 ? `0${date}` : date hour = hour < 10 ? `0${hour}` : hour minute = minute < 10 ? `0${minute}` : minute second = second < 10 ? `0${second}` : second return `${year}-${month}-${date} ${hour}:${minute}:${second}` }, //计算base64图片的大小 countBase64Size: function (base64) { let str = base64.split(",")[1]; let equalIndex = str.indexOf('='); if (str.indexOf('=') > 0) { str = str.substring(0, equalIndex); } let strLength = str.length; let fileLength = parseInt(strLength - (strLength / 8) * 2); return fileLength; }, //判断是不是微信浏览器 isWeiXin() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { return true; } else { return false; } }, //判断是不是小程序 isMiniProgram() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/miniProgram/i) == "miniprogram") { return true; } else { return false; } }, // VIN码验证 validate_vin(vin) { if (vin.length > 0 && vin.length != 17) { return false; } let vinVal = vin.toUpperCase(); let charToNum = { A: 1, B: 2, C: 3, D: 4, E: 5, F: 6, G: 7, H: 8, J: 1, K: 2, L: 3, M: 4, N: 5, P: 7, R: 9, S: 2, T: 3, U: 4, V: 5, W: 6, X: 7, Y: 8, Z: 9 }; let obj = 0; let arr = new Array(); for (let i = 0; i < vinVal.length; i++) { let temp = vinVal.charAt(i); if (charToNum[temp]) { arr[i] = charToNum[temp]; } else { arr[i] = Number(temp); } if (i == 8) { arr[i] = vinVal.charAt(i); } } let a1 = 8; for (let i = 0; i < 7; i++) { obj += Number(arr[i]) * a1; a1--; } obj += Number(arr[7]) * 10; let a2 = 9; for (let i = 9; i < 17; i++) { obj += Number(arr[i]) * a2; a2--; } let result = Number(obj) % 11; if (parseInt(result) === 10) { result = "X"; } if (result == arr[8]) { //成功 return true; } else { //失败 return false; } }, // 去除base64前缀 delete_prefix_Base64(base64) { return base64.replace('data:image/jgp', 'data:image/jpeg').replace( /data:image\/jpeg;base64,/gi, "" ) }, // 获取url的参数 getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)") var r = window.location.search.substr(1).match(reg) if (r != null) return unescape(r[2]) return null }, /** * [获取URL中的参数名及参数值的集合] * 示例URL:http://htmlJsTest/getrequest.html?uid=admin&rid=1&fid=2&name=小明 * @param {[string]} urlStr [当该参数不为空的时候,则解析该url中的参数集合] * @return {[string]} [参数集合] */ getUrlParams(urlStr) { urlStr = urlStr || window.location.href; //获取url中"?"符后的字串 if (typeof urlStr == "undefined") { var url = decodeURIComponent(location.search); //获取url中"?"符后的字符串 } else { var url = "?" + urlStr.split("?")[1]; } var theRequest = new Object(); if (url.indexOf("?") != -1) { var str = url.substr(1); var strs = str.split("&"); for (var i = 0; i < strs.length; i++) { theRequest[strs[i].split("=")[0]] = decodeURIComponent(strs[i].split("=")[1]); if (decodeURIComponent(strs[i].split("=")[1]) == '' || decodeURIComponent(strs[i].split("=")[1]) == null || decodeURIComponent(strs[i].split("=")[1]) == 'null' || decodeURIComponent(strs[i].split("=")[1]) == undefined || !decodeURIComponent(strs[i].split("=")[1])) { theRequest[strs[i].split("=")[0]] = ''; } } } return theRequest; }, /** * 增加Cookie * @param name * @param value * @param hours * @return */ writeCookie(name, value, hours) { var expire = ""; if (hours != null) { expire = new Date((new Date()).getTime() + hours * 3600000); expire = "; expires=" + expire.toGMTString(); } document.cookie = name + "=" + encodeURI(value) + expire; }, /** * 读取Cookie * @param name * @return */ readCookie(name) { var cookieValue = ""; var search = name + "="; if (document.cookie.length > 0) { var offset = document.cookie.indexOf(search); if (offset != -1) { offset += search.length; var end = document.cookie.indexOf(";", offset); if (end == -1) { end = document.cookie.length; } cookieValue = decodeURI(document.cookie.substring(offset, end)); } } return cookieValue; }, setTitle(title) { // document.title = title; var mobile = navigator.userAgent.toLowerCase(); if (/iphone|ipad|ipod/.test(mobile)) { var iframe = document.createElement('iframe') iframe.style.display = 'none' // iframe.setAttribute('src', '') var iframeCallback = function () { setTimeout(function () { iframe.removeEventListener('load', iframeCallback); document.body.removeChild(iframe); }, 0) } iframe.addEventListener('load', iframeCallback); document.body.appendChild(iframe) } }, isPc() { var ua = navigator.userAgent.toLowerCase(); var mobile = /mobile/gi.test(ua); if (!mobile) { console.log('当前为PC') return true; } else { console.log('当前不是PC') return false; } }, //判断是安卓或ios isAndroid() { var userNav = navigator.userAgent; var isAndroid = userNav.toLowerCase().indexOf('android') > -1 || userNav.toLowerCase().indexOf('adr') > -1; //android终端 var isiOS = !!userNav.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 var isAndroidIOS = ''; if (isAndroid) { isAndroidIOS = 'isAndroid'; } else if (isiOS) { isAndroidIOS = 'isiOS'; } return isAndroidIOS; }, //判断系统类型:安卓、iOS、鸿蒙 getSystemType() { var userAgent = navigator.userAgent.toLowerCase(); var systemType = 'unknown'; // 判断鸿蒙系统(HarmonyOS) // 鸿蒙系统的userAgent中可能包含 'harmonyos' 或 'ohos' if (userAgent.indexOf('harmonyos') > -1 || userAgent.indexOf('HarmonyOS') || userAgent.indexOf('ohos') > -1) { systemType = 'harmonyos'; } // 判断iOS系统 else if (userAgent.indexOf('iphone') > -1 || userAgent.indexOf('ipad') > -1 || userAgent.indexOf('ipod') > -1 || !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)) { systemType = 'ios'; } // 判断安卓系统 else if (userAgent.indexOf('android') > -1 || userAgent.indexOf('adr') > -1) { systemType = 'android'; } return systemType; }, onBridgeReady() { try { if (this.isWeiXin()) { WeixinJSBridge.call('hideOptionMenu'); } } catch (error) { console.log(error.message) } }, /** * 是否禁用右上角 */ disabledOptionMenu() { var that = this; if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', that.onBridgeReady(), false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', that.onBridgeReady()); document.attachEvent('onWeixinJSBridgeReady', that.onBridgeReady()); } } else { that.onBridgeReady(); } }, /** * 隐藏微信网页底部的导航栏 */ disabledToolbar(disable = true) { if (typeof WeixinJSBridge == "undefined") { document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { // 通过下面这个API隐藏底部导航栏 WeixinJSBridge.call(disable ? 'hideToolbar' : 'showToolbar'); }); } }, closeWindow() { var userAgent = navigator.userAgent; if (appStore().notitle === '1') { return } try { if (this.isMiniProgram()) { wx.miniProgram.navigateBack({ delta: 1 }); } else if (this.isWeiXin()) { // 微信中关闭 setTimeout(function () { // alert("关闭页面"); //必须有弹窗,否则可能无法关闭 //这个可以关闭安卓系统的手机 document.addEventListener('WeixinJSBridgeReady', function () { WeixinJSBridge.call('closeWindow'); }, false); //这个可以关闭ios系统的手机 WeixinJSBridge.call('closeWindow'); }, 300) } else { // 浦发银行返回按钮跳转到基座 if (appStore().source === '95410000') { window.location.href = `https://${location.origin.includes("-dev") || location.origin.includes("-sit") || location.origin.includes("-uat") || location.origin.includes("-pt") ? 'life-open-sit' : 'life-open'}.trace.com.cn/web-guard-h5/`; return } if (window.wxx && typeof (window.wxx.back) == 'function') { window.wxx.back(); } else if (userAgent.indexOf("Firefox") != -1 || userAgent.indexOf("Chrome") != -1) { window.open('', '_self', ''); open(location, '_self').close(); window.location.href = "about:blank"; window.close(); } else if (userAgent.indexOf('Android') > -1 || userAgent.indexOf('Linux') > -1) { window.opener = null; window.open('about:blank', '_self', '').close(); } else { window.opener = null; window.open("", "_self"); window.close(); } } } catch (error) { // console.log("关闭页面closeWindow", error.message) } }, //判断网络状态 onLine(callback) { var curWwwPath = window.document.location.href; var pathName = window.document.location.pathname; var pos = curWwwPath.indexOf(pathName); var host = window.location.host; var protocol = window.location.protocol; var localhostPaht = curWwwPath.substring(0, pos); var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1); var isWs = protocol == 'https:' ? 'wss' : 'ws'; var img = new Image(); if (localhostPaht.indexOf("localhost") >= 0) { img.src = `https://ssp-dev.trace.com.cn${projectName}/favicon.ico?v=${Date.now()}`; } else { img.src = `${localhostPaht}${projectName}/favicon.ico?v=${Date.now()}`; } // console.log("判断有没有网络==", img.src); img.onload = function () { if (callback) callback(true) }; img.onerror = function () { if (callback) callback(false) }; }, appendUrl(params, flag) { var urlPar = ''; Object.getOwnPropertyNames(params).forEach((item, index) => { if (index === 0 && !flag) { urlPar += `?${item}=${params[item]}`; } else { urlPar += `&${item}=${params[item]}` } }); // console.log(urlPar) return urlPar; }, openWxPage(url, params) { let flag = url.indexOf("?") != -1 ? true : false let urlPar = ''; if (url) { if (params) { Object.getOwnPropertyNames(params).forEach((item, index) => { if (index === 0 && !flag) { urlPar += `?${item}=${params[item]}`; } else { urlPar += `&${item}=${params[item]}` } }); } console.log(url + urlPar) setTimeout(() => { closeToast(); window.location.href = url + urlPar ; }, 200); } else { console.log('跳转链接不存在!') } }, // 给付系统跳转链接, 从后台获取,外联库也会走这里 openSpecPage(params) { if(params.generateType == 0){ //官微跳转 window.location.href = params.url; }else if(params.generateType == 3){ // 查门店不调用前置接口 const userInfo = appStore().userInfo let cmdUrl =`${params.url}&idnum=1&openId=${userInfo.sourceUserId}&entryOpenid=${userInfo.entryOpenid}` fetchPost("semantic/getYdbqTicket", { url: cmdUrl , generateType:params.generateType ,userId:appStore().userId,isCmd:"1"}).then(ticketRes => { console.log(ticketRes) if (ticketRes.code === 0) { //data空表示开关关闭 if (ticketRes.data === "" || ticketRes.data === null || ticketRes.data === undefined) { window.location.href = params.url; } else { const ticketUrl = params.url + `&accessTicket=${ticketRes.data}` console.log("ticketUrl===",ticketUrl) window.location.href = ticketUrl; } } else { showToast("网络异常,请重试") } }) }else if(params.generateType == 4){ // 1v1专属服务 const userInfo = appStore().userInfo fetchPost("thirdPartyAuth/getExclusiveServicesToken").then(res=>{ if(res.code===0){ if(res.data){ let vUrl=`${params.url}&sour=yykf&omoSource=${userInfo.source}&omoSourceName=${encodeURIComponent(userInfo.sourceName)}&token=${res.data}` window.location.href =vUrl } }else{ showToast("网络异常,请重试") } }) }else if(params.generateType == 5){ // 一站式复效 let yParams=params.url.split('&') fetchPost("semantic/getYzsUrl",{userId:appStore().userId,bqType:yParams[0],urlType:yParams[1]}).then(res=>{ if(res.code===0){ if(res.data){ window.location.href =res.data } }else{ showToast("网络异常,请重试") } }) }else if(params.generateType == 6){ //官微小程序 const url = params.url wx.miniProgram.navigateTo({ url }); }else{ fetchPost("semantic/generateUrl", params) .then(res => { if (res.code && res.code != 0) { showToast(res.msg); return; } //置换密匙 const newUrl = res.data; fetchPost("semantic/getYdbqTicket", { url: newUrl , generateType:params.generateType ,userId:appStore().userId}).then(ticketRes => { if (ticketRes.code === 0) { //data空表示开关关闭 if (ticketRes.data === "" || ticketRes.data === null || ticketRes.data === undefined) { window.location.href = params.url; } else { const ticketUrl = params.url + `&accessTicket=${ticketRes.data}` console.log(ticketUrl) window.location.href = ticketUrl; } } else { showToast("网络异常,请重试") } }) }) .catch(err => { console.error(err) }); } }, //在app内打开h5(带参数) AppOpenH5(url, params) { let flag = url.indexOf("?") != -1 ? true : false let urlPar = ''; if (url) { if (params) { Object.getOwnPropertyNames(params).forEach((item, index) => { if (index === 0 && !flag) { urlPar += `?${item}=${params[item]}`; } else { urlPar += `&${item}=${params[item]}` } }); } // console.log(url + urlPar) showLoadingToast('跳转中...'); setTimeout(() => { closeToast(); this.AppRedirect(url + urlPar); }, 200); } else { console.log('跳转链接不存在!') } }, //app 壳的方法 跳转购买产品 跳转享服务 官网 AppToOutModules(params) { params = params || ''; //寿险: //跳转购产品: // { // "from": "yykfTosxapp", // yykfTosxapp — 从洋洋客服进入到寿险APP流程 // "toPage": "BuyProduct", // BuyProduct — 跳转到购产品页面 // "extParams": { // }, // 扩展参数 // } //跳转享服务: // { // "from": "yykfTosxapp", // yykfTosxapp — 从洋洋客服进入到寿险APP流程 // "toPage": "ServicesPage", // ServicesPage — 跳转到享服务页面 // "extParams": { }, // 扩展参数 // } //官网: // { // "appId":"com.trace.app.rnbxx" // "appType":"reactnative" // "url":"/pages/screen/main/Initialize.js" // "params": // { // "source":"sapp" // } // } try { if (!window.wxx && appStore().source != '95290000') {//如果不是app渠道 showToast('当前为跳转APP功能按钮,请在APP中点击。'); // window.location.href = params.url; } else { window.wxx.toOutModules(params); } // console.log('调用app方法toOutModules==', params) } catch (error) { // console.log(error.message) } }, //app 壳的方法 打开外部链接 url:跳转的url地址 AppToHttpHtml(url) { url = url || ''; try { if (!window.wxx && appStore().source != '95290000') { window.location.href = url; } else { window.wxx.toHttpHtml(url); } // console.log('调用app方法toHttpHtml==', url) } catch (error) { // console.log(error.message) } }, //app 壳的方法 内部打开链接方法 (url:跳转的url地址 titleName:title名字) AppRedirect(url, titleName) { url = url || ''; titleName = titleName || '洋洋客服'; try { if (!window.wxx && appStore().source != '95290000') { window.location.href = url; } else { window.wxx.redirect(url, titleName); } } catch (error) { // console.log(error.message) } }, //app 壳的方法 copy (msg:复制内容) AppCopy(msg) { msg = msg || ''; try { if (!window.wxx && appStore().source != '95290000') { showToast('请在App里使用'); } else { window.wxx.copyBoard(msg); // if (this.isAndroid() == 'isiOS') { // window.wxx.copyBoard(msg); // } else if (this.isAndroid() == 'isAndroid') { // window.wxx.copy(msg); // } } } catch (error) { // console.log(error.message) } }, //退出页面 AppBack() { try { if (!window.wxx && appStore().source != '95290000') { this.closeWindow(); } else { window.wxx.back(); } } catch (error) { // console.log(error.message) } }, AppReloadHtml() { try { if (!window.wxx && appStore().source != '95290000') { window.location.reload(); } else { window.wxx.reloadHtml(); } } catch (error) { // console.log(error.message) } }, // 替换url中的参数 changeURLArg(url, arg, arg_val) { var pattern = arg + '=([^&]*)'; var replaceText = arg + '=' + arg_val; if (url.match(pattern)) { var tmp = '/(' + arg + '=)([^&]*)/gi'; tmp = url.replace(eval(tmp), replaceText); return tmp; } else { if (url.match('[\?]')) { return url + '&' + replaceText; } else { return url + '?' + replaceText; } } }, async useSdk(item) { // 洋洋客服人工满意度评价推送优化(坐席接通后,顾客不说话不触发满意度) if(!appStore().isHumanChat){ return } //开关关闭不调用 if(!appStore().mydFlag){ return } //满意度黑名单用户 if (appStore().reviewRestricted) { console.log('满意度黑名单用户'); return } console.log('结束会话的item====',item); //新老满意度判断 if (appStore().integratedUser) { // 触发自定义人工满意度评价弹窗 console.log('触发自定义人工满意度评价弹窗'); const hxSessionId = item.hxSessionId appStore().setHxSessionId(hxSessionId); appStore().setShowHumanAppraise(true); } else { if (!appStore().sdkLoaded) { console.log('sdk未加载'); return } const fn = window.Evaluate?.default; const businessNo = item.hxSessionId || item.sessionId || appStore().sessionId if (typeof fn !== 'undefined' && fn?.Entrance) { let obj = { isDialog: "1", businessNo: businessNo, sceneNo: '80e6959f3dd111ef93216805caef3a29', systemNo: 'FWZC', userType: 'C', // oprNo: localStorage.userId, oprNo: appStore().userId, oprIdType: 'z', terminal: 'MOBILE', target: 'myd', ENV: location.host.includes('-sit') ? 'SIT' : 'PRO', nextUrl: '', nextUrlParams: {} } console.log('useSdk',obj); try { const result = await fn.Entrance(obj); console.log('useSdk--result',result); if (result.type == '00') { showToast('您已完成本次满意度调查,谢谢您的参与!') } } catch (error) { console.error('Error calling SDK method', error); } } else { console.error('SDK function or method not available'); } } }, async useTechSdk() { if (!appStore().sdkLoaded) { setTimeout(() => { showToast('满意度调查加载失败,请重试'); }, 500); return } const fn = window.Evaluate?.default; const businessNo = appStore().sessionId const userInfo = appStore().userInfo const oprIdType = 'z'; const oprNo = userInfo.sourceUserId if (typeof fn !== 'undefined' && fn?.Entrance) { let obj = { isDialog: "1", businessNo: businessNo, sceneNo: 'e386b9895eca11ef9912946daedd8bf0', systemNo: 'FWZC', userType: 'C', oprNo, oprIdType, terminal: 'MOBILE', target: 'myd', ENV: location.host.includes('-sit') ? 'SIT' : 'PRO', nextUrl: '', nextUrlParams: {} } console.log(obj); try { const result = await fn.Entrance(obj); if (result.type == '00') { showToast('您已完成本次满意度调查,谢谢您的参与!') } } catch (error) { console.error('Error calling SDK method', error); } } else { console.error('SDK function or method not available'); } }, // 打开小程序 launchVideoServiceMiniProgram(params, callback) { try { if (appStore().source === '95290000') { // 超级APP环境,使用SuperAPPUtils打开小程序 if (window.SuperAPPUtils && typeof window.SuperAPPUtils.launchWXMiniProgram === 'function') { window.SuperAPPUtils.launchWXMiniProgram(params, callback); } else { console.log('SuperAPPUtils not available'); if (callback) callback({ status: 9999, statusMsg: "SuperAPPUtils not available" }); } } else { console.log('Video service mini program only available in SuperAPP'); if (callback) callback({ status: 9999, statusMsg: "Not in SuperAPP" }); } } catch (error) { console.log('launchVideoServiceMiniProgram error:', error.message); if (callback) callback({ status: 9999, statusMsg: error.message }); } }, // 归一化与降级解析特殊标签消息 normalizeMessage: function (item) { if (!item || typeof item !== 'object') return item; let msgText = item.msgText || ''; // 保单时效性类型的答案,直接返回 if(!!item.cmd && (item.cmd == 'yhzzsx' || item.cmd == 'fhzzsx' || item.cmd == 'scjzzsx' || item.cmd == 'wnzhzzsx' || item.cmd == 'tbzzsx' || item.cmd == 'dkzzsx' || item.cmd == 'lpzzsx' || item.cmd == 'grtbbd' || item.cmd == 'tttbbd' || item.cmd == 'YYWDBD' || item.cmd == 'YYWDDA' || item.cmd == 'GMMDBDCX' || item.cmd == '$gmmdbdcx-da' || item.cmd == 'RGAN' || item.cmd == 'XQJFZZSXBD' || item.cmd == '$xqjfzzsx-da' || item.cmd == '$zzsx-da')){ return item; } // 1. 模块推送 [scene] if (msgText.toLowerCase().includes('[scene]')) { let match = msgText.match(/\[scene\]([\s\S]*?)\[\/scene\]/i); if (match && match[1]) { try { let parsed = JSON.parse(match[1]); item.sceneData = item.sceneData ? Object.assign({}, parsed, item.sceneData) : parsed; } catch (e) { console.warn("Parse [scene] failed:", e); } } item.reqAndResType = '21'; if (!item.msgType) item.msgType = '01'; } // 2. 卡片/表单推送 [cardpush] 或 [card_push] if (msgText.toLowerCase().includes('[cardpush]') || msgText.toLowerCase().includes('[card_push]')) { let match = msgText.match(/\[(?:cardpush|card_push)\]([\s\S]*?)\[\/(?:cardpush|card_push)\]/i); if (match && match[1]) { try { let parsed = JSON.parse(match[1]); item.cardPushDto = item.cardPushDto ? Object.assign({}, parsed, item.cardPushDto) : parsed; } catch (e) { console.warn("Parse [cardpush] failed:", e); } } item.reqAndResType = '22'; if (!item.msgType) item.msgType = '01'; } // 3. 转产险 [transfer] 或 [sxzcx] if (msgText.toLowerCase().includes('[transfer]') || msgText.toLowerCase().includes('[sxzcx]')) { let match = msgText.match(/\[(?:transfer|sxzcx)\]([\s\S]*?)\[\/(?:transfer|sxzcx)\]/i); if (match && match[1]) { try { let parsed = JSON.parse(match[1]); item.transferDto = item.transferDto ? Object.assign({}, parsed, item.transferDto) : parsed; } catch (e) { console.warn("Parse [transfer] failed:", e); } } item.reqAndResType = '23'; if (!item.msgType) item.msgType = '01'; } // 4. 引用消息 [quoted] 或 [quote] if (typeof item.quoteData === 'string') { try { item.quoteData = JSON.parse(item.quoteData); } catch (e) { console.warn("Parse string quoteData failed:", e); } } else if (!item.quoteData && (msgText.toLowerCase().includes('[quoted]') || msgText.toLowerCase().includes('[quote]'))) { let match = msgText.match(/\[(?:quoted|quote)\]([\s\S]*?)\[\/(?:quoted|quote)\]/i); if (match && match[1]) { try { item.quoteData = JSON.parse(match[1]); } catch (e) { item.quoteData = { quoteMsg: match[1], quoteType: '1' }; } } } return item; } }