| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- * @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:
- * <JingJiBiao Xmbh="001">
- * <ZhaoBiaoXx Zbr="vian">
- * </ZhaoBiaoXx>
- * </JingJiBiao>
- * 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("@");
- if (
- (COMPILATION_NAME === "安徽养护(2018)" && areas[0] !== "安徽") ||
- (COMPILATION_NAME === "广东公路造价(2018)" && areas[0] !== "广东") ||
- (COMPILATION_NAME === "浙江养护(2005)" && areas[0] !== "浙江") ||
- (COMPILATION_NAME === "广西养护(2020)" && areas[0] !== "广西")
- ) {
- return;
- }
- if (COMPILATION_NAME.includes("山东养护(2016/2024)")) {
- if (areas[0].includes("山东"))
- (parentMap[areas[0]] || (parentMap[areas[0]] = [])).push(areas[1]);
- } else {
- (parentMap[areas[0]] || (parentMap[areas[0]] = [])).push(areas[1]);
- }
- });
- const parentAreasHtml = Object.keys(parentMap).reduce(
- (acc, area) => (acc += `<option value="${area}">${area}</option>`),
- ""
- );
- $parentAreas.html(parentAreasHtml);
- const subAreasHtml = parentMap[Object.keys(parentMap)[0]].reduce(
- (acc, area) => (acc += `<option value="${area}">${area}</option>`),
- ""
- );
- $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 += `<option value="${area}">${area}</option>`),
- ""
- );
- $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,
- };
- })();
|