/* * @Descripttion: 招投标数据接口 * @Author: vian * @Date: 2020-08-17 15:07:31 */ /** * 用于导出的挂载变量,各地区对外接口需要作覆盖它。 * 注意:导出脚本必须有一个“entry”方法挂载在“INTERFACE_EXPORT”对象上。 eg: INTERFACE_EXPORT = { entry: () => void } * entry方法返回的结果必须为[{ data, exportKind,(导出类型,招、投标、控制价) fileName(文件名) }] * 其中data为xml的object形式: * xml: * * * * * entry方法返回的数据结构: * { * name: 'JingJiBiao', * attrs: [{ name: 'xmbh', value: '001' }], * children: [ * { * name: 'ZhaoBiaoXx', * attrs: [{ name: 'Zbr', value: 'vian' }], * children: [] * } * ] * } */ let INTERFACE_EXPORT = {}; // 用于导入的挂载变量 let INTERFACE_IMPORT = {}; const STD_INTERFACE = (() => { 'use strict'; // 根据地区配置,初始化地区选项 function initInterfaceAreas($parentAreas, $subAreas) { const connectedAreas = Object.keys(INTERFACE_CONFIG); const parentMap = {}; connectedAreas.forEach(connectedArea => { const areas = connectedArea.split('@'); (parentMap[areas[0]] || (parentMap[areas[0]] = [])).push(areas[1]); }); const parentAreasHtml = Object .keys(parentMap) .reduce((acc, area) => acc += ``, ''); $parentAreas.html(parentAreasHtml); const subAreasHtml = parentMap[Object.keys(parentMap)[0]].reduce((acc, area) => acc += ``, ''); $subAreas.html(subAreasHtml); // 父级地区变更,子地区选项更新 $parentAreas.change(function () { if (typeof EXPORT_VIEW !== 'undefined') { EXPORT_VIEW.resetState(); // 清空导出接口缓存 } const curArea = $(this).val(); const subAreasHtml = parentMap[curArea].reduce((acc, area) => acc += ``, ''); $subAreas.html(subAreasHtml); }); $subAreas.change(function () { if (typeof EXPORT_VIEW !== 'undefined') { EXPORT_VIEW.resetState(); // 清空导出接口缓存 } }) } /** * 动态加载script * 由于后续的接口可能会非常多,一次性加载所有的接口文件完全没必要,而且不可控,很容易导致初次加载速度变慢。 * 在选定相关地区后,再根据地区对应的script路径,动态加载script * 不需要缓存,缓存可能会影响正常操作的性能。而且导入导出时动态获取接口文件的需要的时间,客户是不可感知的。 * @param {String} path - 需要加载的scipt路径 * @return {Promise} */ function loadScript(path) { return new Promise((resolve, reject) => { const scriptID = 'interface-script'; const body = document.getElementsByTagName('body')[0]; // 移除原来的 const orgScript = document.getElementById(scriptID); if (orgScript) { body.removeChild(orgScript); } // 增加新的 const script = document.createElement('script'); script.src = path; script.type = 'text/javascript'; script.id = scriptID; body.appendChild(script); script.onload = script.onreadystatechange = function () { // ie、ff触发事件不同,都写上 if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') { script.onload = script.onreadystatechange = null; resolve(); } }; script.onerror = function () { reject('script加载失败。'); }; }); } const ScriptType = { EXPORT: 'export', IMPORT: 'import', }; let curArea = ''; /** * 根据地区和脚本类型加载脚本 * @param {String} area - 地区选项 eg: '安徽省@马鞍山' * @param {Number} scriptType - 脚本类型 * @return {Void} */ async function loadScriptByArea(area, scriptType) { if (area === curArea) { return; } const configItem = INTERFACE_CONFIG[area]; if (!configItem) { throw new Error(`[${area}]不存在有效配置。`); } const scriptName = configItem.scriptName; if (!scriptName) { throw new Error(`[${area}]不存在有效脚本。`); } const fullPath = `/web/building_saas/standard_interface/${scriptType}/${scriptName}`; await loadScript(fullPath); curArea = area; } return { initInterfaceAreas, ScriptType, loadScriptByArea, }; })();