index.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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方法返回的结果必须为[{ data, exportKind,(导出类型,招、投标、控制价) fileName(文件名) }]
  10. * 其中data为xml的object形式:
  11. * xml:
  12. * <JingJiBiao Xmbh="001">
  13. * <ZhaoBiaoXx Zbr="vian">
  14. * </ZhaoBiaoXx>
  15. * </JingJiBiao>
  16. * entry方法返回的数据结构:
  17. * {
  18. * name: 'JingJiBiao',
  19. * attrs: [{ name: 'xmbh', value: '001' }],
  20. * children: [
  21. * {
  22. * name: 'ZhaoBiaoXx',
  23. * attrs: [{ name: 'Zbr', value: 'vian' }],
  24. * children: []
  25. * }
  26. * ]
  27. * }
  28. */
  29. let INTERFACE_EXPORT = {};
  30. // 用于导入的挂载变量
  31. let INTERFACE_IMPORT = {};
  32. const STD_INTERFACE = (() => {
  33. "use strict";
  34. // 根据地区配置,初始化地区选项
  35. function initInterfaceAreas($parentAreas, $subAreas) {
  36. const connectedAreas = Object.keys(INTERFACE_CONFIG);
  37. const parentMap = {};
  38. connectedAreas.forEach((connectedArea) => {
  39. const areas = connectedArea.split("@");
  40. if (
  41. (COMPILATION_NAME === "安徽养护(2018)" && areas[0] !== "安徽") ||
  42. (COMPILATION_NAME === "广东公路造价(2018)" && areas[0] !== "广东") ||
  43. (COMPILATION_NAME === "浙江养护(2005)" && areas[0] !== "浙江") ||
  44. (COMPILATION_NAME === "广西养护(2020)" && areas[0] !== "广西")
  45. ) {
  46. return;
  47. }
  48. if (COMPILATION_NAME.includes("山东养护(2016/2024)")) {
  49. if (areas[0].includes("山东"))
  50. (parentMap[areas[0]] || (parentMap[areas[0]] = [])).push(areas[1]);
  51. } else {
  52. (parentMap[areas[0]] || (parentMap[areas[0]] = [])).push(areas[1]);
  53. }
  54. });
  55. const parentAreasHtml = Object.keys(parentMap).reduce(
  56. (acc, area) => (acc += `<option value="${area}">${area}</option>`),
  57. ""
  58. );
  59. $parentAreas.html(parentAreasHtml);
  60. const subAreasHtml = parentMap[Object.keys(parentMap)[0]].reduce(
  61. (acc, area) => (acc += `<option value="${area}">${area}</option>`),
  62. ""
  63. );
  64. $subAreas.html(subAreasHtml);
  65. // 父级地区变更,子地区选项更新
  66. $parentAreas.change(function () {
  67. if (typeof EXPORT_VIEW !== "undefined") {
  68. EXPORT_VIEW.resetState(); // 清空导出接口缓存
  69. }
  70. const curArea = $(this).val();
  71. const subAreasHtml = parentMap[curArea].reduce(
  72. (acc, area) => (acc += `<option value="${area}">${area}</option>`),
  73. ""
  74. );
  75. $subAreas.html(subAreasHtml);
  76. });
  77. $subAreas.change(function () {
  78. if (typeof EXPORT_VIEW !== "undefined") {
  79. EXPORT_VIEW.resetState(); // 清空导出接口缓存
  80. }
  81. });
  82. }
  83. /**
  84. * 动态加载script
  85. * 由于后续的接口可能会非常多,一次性加载所有的接口文件完全没必要,而且不可控,很容易导致初次加载速度变慢。
  86. * 在选定相关地区后,再根据地区对应的script路径,动态加载script
  87. * 不需要缓存,缓存可能会影响正常操作的性能。而且导入导出时动态获取接口文件的需要的时间,客户是不可感知的。
  88. * @param {String} path - 需要加载的scipt路径
  89. * @return {Promise}
  90. */
  91. function loadScript(path) {
  92. return new Promise((resolve, reject) => {
  93. const scriptID = "interface-script";
  94. const body = document.getElementsByTagName("body")[0];
  95. // 移除原来的
  96. const orgScript = document.getElementById(scriptID);
  97. if (orgScript) {
  98. body.removeChild(orgScript);
  99. }
  100. // 增加新的
  101. const script = document.createElement("script");
  102. script.src = path;
  103. script.type = "text/javascript";
  104. script.id = scriptID;
  105. body.appendChild(script);
  106. script.onload = script.onreadystatechange = function () {
  107. // ie、ff触发事件不同,都写上
  108. if (
  109. !this.readyState ||
  110. this.readyState === "loaded" ||
  111. this.readyState === "complete"
  112. ) {
  113. script.onload = script.onreadystatechange = null;
  114. resolve();
  115. }
  116. };
  117. script.onerror = function () {
  118. reject("script加载失败。");
  119. };
  120. });
  121. }
  122. const ScriptType = {
  123. EXPORT: "export",
  124. IMPORT: "import",
  125. };
  126. let curArea = "";
  127. /**
  128. * 根据地区和脚本类型加载脚本
  129. * @param {String} area - 地区选项 eg: '安徽省@马鞍山'
  130. * @param {Number} scriptType - 脚本类型
  131. * @return {Void}
  132. */
  133. async function loadScriptByArea(area, scriptType) {
  134. if (area === curArea) {
  135. return;
  136. }
  137. const configItem = INTERFACE_CONFIG[area];
  138. if (!configItem) {
  139. throw new Error(`[${area}]不存在有效配置。`);
  140. }
  141. const scriptName = configItem.scriptName;
  142. if (!scriptName) {
  143. throw new Error(`[${area}]不存在有效脚本。`);
  144. }
  145. const fullPath = `/web/building_saas/standard_interface/${scriptType}/${scriptName}`;
  146. await loadScript(fullPath);
  147. curArea = area;
  148. }
  149. return {
  150. initInterfaceAreas,
  151. ScriptType,
  152. loadScriptByArea,
  153. };
  154. })();