/** * Created by henian.xu on 2019/8/26. * */ import { Notification } from 'element-ui'; import { GlobalVar } from 'vmf'; let LODOP: any = null; let CreatedOKLodop7766: any = null; let CLodopIsLocal: any = null; const cdnUrl = GlobalVar.appConfig!.LODOP_CDN_URL || '//cdn.hotont.com/lodop/6.226_Clodop3.092'; const win: any = window; const _resolve: Function[] = []; const _reject: Function[] = []; let loading = false; let timerId: any = 0; const tipsHtmlMap = { strHtmInstall: `打印控件未安装!点击这里执行安装,安装后请刷新页面或重新进入。`, strHtmUpdate: `打印控件需要升级!点击这里执行升级,升级后请重新进入。`, strHtm64_Install: `打印控件未安装!点击这里执行安装,安装后请刷新页面或重新进入。`, strHtm64_Update: `打印控件需要升级!点击这里执行升级,升级后请重新进入。`, strHtmFireFox: '(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)', strHtmChrome: '(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)', strCLodopInstall_1: `Web打印服务CLodop未安装启动,点击这里下载执行安装`, strCLodopInstall_2: '(若此前已安装过,可点这里直接再次启动', strCLodopInstall_3: '成功后请刷新本页面。', strCLodopUpdate: `Web打印服务CLodop需升级!点击这里执行升级,升级后请刷新页面。`, }; //= ===判断是否需要 Web打印服务CLodop:=== //= ==(不支持插件的浏览器版本需要用它)=== function needCLodop() { try { const ua = navigator.userAgent; if (ua.match(/Windows\sPhone/i)) return true; if (ua.match(/iPhone|iPod|iPad/i)) return true; if (ua.match(/Android/i)) return true; if (ua.match(/Edge\D?\d+/i)) return true; const verTrident = ua.match(/Trident\D?\d+/i); const verIE = ua.match(/MSIE\D?\d+/i); let verOPR = ua.match(/OPR\D?\d+/i); let verFF = ua.match(/Firefox\D?\d+/i); const x64 = ua.match(/x64/i); if (!verTrident && !verIE && x64) return true; if (verFF) { verFF = verFF[0].match(/\d+/); if (+verFF![0] >= 41 || x64) return true; } else if (verOPR) { verOPR = verOPR[0].match(/\d+/); if (+verOPR![0] >= 32) return true; } else if (!verTrident && !verIE) { let verChrome = ua.match(/Chrome\D?\d+/i); if (verChrome) { verChrome = verChrome[0].match(/\d+/); if (+verChrome![0] >= 41) return true; } } return false; } catch (err) { return true; } } function check() { console.log('check LodopScript', win.getCLodop); if (!win.getCLodop) return; _resolve.forEach(resolve => resolve()); clearInterval(timerId); _resolve.length = 0; timerId = 0; loading = false; } function loadLodopScript(delay = 500) { return new Promise((resolve, reject) => { if (win.getCLodop || !needCLodop()) { resolve(); return; } _resolve.push(resolve); _reject.push(reject); if (loading) return; loading = true; const src1 = 'http://localhost:8000/CLodopfuncs.js?priority=1'; const src2 = 'http://localhost:18000/CLodopfuncs.js?priority=0'; const head = document.head || document.getElementsByTagName('head')[0] || document.documentElement; let oscript = document.createElement('script'); oscript.src = src1; head.insertBefore(oscript, head.firstChild); oscript = document.createElement('script'); oscript.src = src2; oscript.onerror = e => { Notification.error({ title: 'Lodop 打印控件', dangerouslyUseHTMLString: true, message: `${tipsHtmlMap.strCLodopInstall_1}${CLodopIsLocal ? tipsHtmlMap.strCLodopInstall_2 : ''}${ tipsHtmlMap.strCLodopInstall_3 }`, }); clearInterval(timerId); _reject.forEach(fn => fn()); console.log(e); }; head.insertBefore(oscript, head.firstChild); CLodopIsLocal = !!(src1 + src2).match(/\/\/localho|\/\/127.0.0./i); timerId = setInterval(check, delay); }); } function getLodop(oOBJECT?: any, oEMBED?: any) { // eslint-disable-next-line no-shadow let LODOP = null; // const { tipsHtmlMap, CreatedOKLodop7766, CLodopIsLocal } = this; try { const ua = navigator.userAgent; const isIE = !!ua.match(/MSIE/i) || !!ua.match(/Trident/i); if (needCLodop()) { try { LODOP = win.getCLodop(); } catch (err) { // noop } if (!LODOP && document.readyState !== 'complete') { // alert('网页还没下载完毕,请稍等一下再操作.'); Notification.error({ title: 'Lodop 打印控件', dangerouslyUseHTMLString: true, message: '网页还没下载完毕,请稍等一下再操作.', }); return LODOP; } if (!LODOP) { Notification.error({ title: 'Lodop 打印控件', dangerouslyUseHTMLString: true, message: `${tipsHtmlMap.strCLodopInstall_1}${CLodopIsLocal ? tipsHtmlMap.strCLodopInstall_2 : ''}${ tipsHtmlMap.strCLodopInstall_3 }`, }); return LODOP; } if (win.CLODOP.CVERSION < '3.0.7.5') { Notification.error({ title: 'Lodop 打印控件', dangerouslyUseHTMLString: true, message: tipsHtmlMap.strCLodopUpdate, }); } if (oEMBED && oEMBED.parentNode) oEMBED.parentNode.removeChild(oEMBED); if (oOBJECT && oOBJECT.parentNode) oOBJECT.parentNode.removeChild(oOBJECT); } else { //= ====如果页面有Lodop就直接使用,没有则新建:========== if (oOBJECT || oEMBED) { LODOP = isIE ? oOBJECT : oEMBED; } else if (!CreatedOKLodop7766) { LODOP = document.createElement('object'); LODOP.setAttribute('width', '0'); LODOP.setAttribute('height', '0'); LODOP.setAttribute('style', 'position:absolute;left:0px;top:-100px;width:0px;height:0px;'); if (isIE) LODOP.setAttribute('classid', 'clsid:2105C259-1E0C-4534-8141-A753534CB4CA'); else LODOP.setAttribute('type', 'application/x-print-lodop'); document.documentElement.appendChild(LODOP); CreatedOKLodop7766 = LODOP; } else { LODOP = CreatedOKLodop7766; } //= ====Lodop插件未安装时提示下载地址:========== const is64IE = isIE && !!ua.match(/x64/i); if (!LODOP || !LODOP.VERSION) { let tipsHtml = is64IE ? tipsHtmlMap.strHtm64_Install : tipsHtmlMap.strHtmInstall; if (ua.indexOf('Chrome') > 0) tipsHtml += tipsHtmlMap.strHtmChrome; if (ua.indexOf('Firefox') > 0) tipsHtml += tipsHtmlMap.strHtmFireFox; Notification.error({ title: 'Lodop 打印控件', dangerouslyUseHTMLString: true, message: tipsHtml, }); return LODOP; } if (LODOP.VERSION < '6.2.2.6') { Notification.error({ title: 'Lodop 打印控件', dangerouslyUseHTMLString: true, message: is64IE ? tipsHtmlMap.strHtm64_Update : tipsHtmlMap.strHtmUpdate, }); return LODOP; } } //= ==如下空白位置适合调用统一功能(如注册语句、语言选择等):== if (GlobalVar.appConfig!.LODOP_LICENSES) { const { company, licenses } = GlobalVar.appConfig!.LODOP_LICENSES; if (licenses) LODOP.SET_LICENSES(company || '', licenses || '', '', ''); } //= ====================================================== return LODOP; } catch (err) { console.error(new Error(`getLodop出错:${err}`)); return LODOP; } } async function init(code: any) { await loadLodopScript(); return new Promise((resolve, reject) => { if (!LODOP) { LODOP = getLodop(); if (!LODOP) { reject(new Error('打印控件初始失败')); return; } } if (!code) { reject(new Error('打印脚本不能为空')); return; } try { // eslint-disable-next-line no-eval eval(`(function (LODOP){${code}})(LODOP)`); const CLODOP = LODOP.CVERSION ? win.CLODOP : undefined; if (CLODOP) CLODOP.On_Return = null; resolve({ LODOP, CLODOP }); } catch (e) { console.error('打印脚本错误!'); console.error(e.toString()); reject(e); } }); } export default { init };