/**
* 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 };