index.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. * @Descripttion: 招投标数据接口
  3. * @Author: vian
  4. * @Date: 2020-08-17 15:07:31
  5. */
  6. /**
  7. * 用于导出的挂载变量,各地区对外接口需要作覆盖它。
  8. * 注意:导出脚本必须有一个“entry”方法挂载在“INTERFACE_EXPORT”对象上。 eg: INTERFACE_EXPORT = { entry: () => void }
  9. * entry方法返回的结果必须为xml的object形式:
  10. * xml:
  11. * <JingJiBiao Xmbh="001">
  12. * <ZhaoBiaoXx Zbr="vian">
  13. * </ZhaoBiaoXx>
  14. * </JingJiBiao>
  15. * entry方法返回的数据结构:
  16. * {
  17. * name: 'JingJiBiao',
  18. * attrs: [{ name: 'xmbh', value: '001' }],
  19. * children: [
  20. * {
  21. * name: 'ZhaoBiaoXx',
  22. * attrs: [{ name: 'Zbr', value: 'vian' }],
  23. * children: []
  24. * }
  25. * ]
  26. * }
  27. */
  28. let INTERFACE_EXPORT = {};
  29. // 用于导入的挂载变量
  30. let INTERFACE_IMPORT = {};
  31. const STD_INTERFACE = (() => {
  32. 'use strict';
  33. // 地区配置,key为地区,value为该地区接口的js文件名。
  34. // 注意:相同地区的导入导出接口js文件名称应相同。eg: 安徽马鞍山导出:在export目录下:anhui_maanshan.js; 在import目录下:anhui_maanshan.js;
  35. const config = {
  36. '安徽@马鞍山': 'anhui_maanshan.js',
  37. };
  38. // 根据地区配置,初始化地区选项
  39. function initExportAreas($parentAreas, $subAreas) {
  40. const connectedAreas = Object.keys(config);
  41. const parentMap = {};
  42. connectedAreas.forEach(connectedArea => {
  43. const areas = connectedArea.split('@');
  44. (parentMap[areas[0]] || (parentMap[areas[0]] = [])).push(areas[1]);
  45. });
  46. const parentAreasHtml = Object
  47. .keys(parentMap)
  48. .reduce((acc, area) => acc += `<option value="${area}">${area}</option>`, '');
  49. $parentAreas.html(parentAreasHtml);
  50. const subAreasHtml = parentMap[Object.keys(parentMap)[0]].reduce((acc, area) => acc += `<option value="${area}">${area}</option>`, '');
  51. $subAreas.html(subAreasHtml);
  52. // 父级地区变更,子地区选项更新
  53. $parentAreas.change(function () {
  54. const curArea = $(this).val();
  55. const subAreasHtml = parentMap[curArea].reduce((acc, area) => acc += `<option value="${area}">${area}</option>`, '');
  56. $subAreas.html(subAreasHtml);
  57. });
  58. }
  59. /**
  60. * 动态加载script
  61. * 由于后续的接口可能会非常多,一次性加载所有的接口文件完全没必要,而且不可控,很容易导致初次加载速度变慢。
  62. * 在选定相关地区后,再根据地区对应的script路径,动态加载script
  63. * 不需要缓存,缓存可能会影响正常操作的性能。而且导入导出时动态获取接口文件的需要的时间,客户是不可感知的。
  64. * @param {String} path - 需要加载的scipt路径
  65. * @return {Promise}
  66. */
  67. function loadScript(path) {
  68. return new Promise((resolve, reject) => {
  69. const scriptID = 'interface-script';
  70. const body = document.getElementsByTagName('body')[0];
  71. // 移除原来的
  72. const orgScript = document.getElementById(scriptID);
  73. if (orgScript) {
  74. body.removeChild(orgScript);
  75. }
  76. // 增加新的
  77. const script = document.createElement('script');
  78. script.src = path;
  79. script.type = 'text/javascript';
  80. script.id = scriptID;
  81. body.appendChild(script);
  82. script.onload = script.onreadystatechange = function () { // ie、ff触发事件不同,都写上
  83. if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
  84. script.onload = script.onreadystatechange = null;
  85. resolve();
  86. }
  87. };
  88. script.onerror = function () {
  89. reject('script加载失败。');
  90. };
  91. });
  92. }
  93. const ScriptType = {
  94. EXPORT: 'export',
  95. IMPORT: 'import',
  96. };
  97. let curArea = '';
  98. /**
  99. * 根据地区和脚本类型加载脚本
  100. * @param {String} area - 地区选项 eg: '安徽省@马鞍山'
  101. * @param {Number} scriptType - 脚本类型
  102. * @return {Void}
  103. */
  104. async function loadScriptByArea(area, scriptType) {
  105. if (area === curArea) {
  106. return;
  107. }
  108. curArea = area;
  109. const path = config[area];
  110. if (!path) {
  111. throw new Error(`[${area}]不存在有效script配置。`);
  112. }
  113. const fullPath = `/web/building_saas/standard_interface/${scriptType}/${path}`;
  114. await loadScript(fullPath);
  115. }
  116. return {
  117. initExportAreas,
  118. ScriptType,
  119. loadScriptByArea,
  120. };
  121. })();