exportSEIInterface.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /**
  2. * Created by zhang on 2019/5/20.
  3. */
  4. async function exportSEI(projectID) {
  5. let tenderProjects = [];
  6. let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
  7. console.log(result);
  8. let project = getProject(result);
  9. prepareTenderDatas(tenderProjects,project);
  10. toXml(project);
  11. function getProject(orignal) {//取建设项目信息
  12. let basicInformation = getBaseInfo(orignal);
  13. let project = {
  14. name: "建设项目",
  15. attrs: [
  16. {name: "项目名称", value: orignal.name},
  17. {name:"建设单位",value:getItemValueBykey(basicInformation.items,"constructionUnit")},
  18. {name:"施工单位",value:getItemValueBykey(basicInformation.items,"buildingUnit")},
  19. {name: "标准名称", value: "重庆市建设工程造价指标采集标准(清单计价)"},
  20. {name: "标准版本号", value: "1.1"}
  21. ],
  22. basicInformation:basicInformation,
  23. children:[]
  24. };
  25. initAtts(project.attrs);
  26. for(let c of orignal.children){
  27. project.children.push(getEngineering(c));
  28. }
  29. return project;
  30. }
  31. function getEngineering(source){
  32. let engineer = {
  33. name:"单项工程",
  34. attrs:[
  35. {name: "名称", value: source.name}
  36. ],
  37. children:[]
  38. };
  39. for(let c of source.children){
  40. let tenderProject = getTender(c);
  41. engineer.children.push(tenderProject);
  42. tenderProjects.push(tenderProject);
  43. }
  44. return engineer
  45. };
  46. function getTender(source) {
  47. let tender = {
  48. ID:source.ID,
  49. name:"单位工程",
  50. attrs:[
  51. {name: "名称", value: source.name}
  52. ],
  53. children:[],
  54. valuationType:source.property.valuationType,
  55. taxType:source.property.taxType
  56. };
  57. return tender;
  58. }
  59. function prepareTenderDatas(tenders,project) {
  60. for(let t of tenders){
  61. setTenderData(t,project);
  62. }
  63. }
  64. function setTenderData(tender,project) {
  65. tender.children.push(setEngineerInfo(tender,project));
  66. }
  67. function setEngineerInfo(tender,project) {
  68. let baseInfo = project.basicInformation;
  69. let calcType ={"bill":"工程量清单计价","ration":"定额计价"};
  70. let info = {
  71. name:"工程信息",
  72. attrs:[
  73. {name:"造价编制单位",value:getItemValueBykey(baseInfo.items,"establishmentUnit")},
  74. {name:"造价审核单位",value:getItemValueBykey(baseInfo.items,"auditUnit")},
  75. {name:"项目负责人",value:""},
  76. {name:"施工单位编制人员",value:""},
  77. {name:"编制人员",value:""},
  78. {name:"审核人员",value:""},
  79. {name:"开工日期",value:""},
  80. {name:"竣工日期",value:""},
  81. {name:"工程地点",value:""},
  82. {name:"工程类型",value:""},
  83. {name:"合同价类型",value:""},
  84. {name:"造价类型",value:""},
  85. {name:"计价方式及依据",value:calcType[tender.valuationType]},
  86. {name:"工程类别",value:""},
  87. {name:"编制日期",value:""},
  88. {name:"审查日期",value:""}
  89. ]
  90. };
  91. initAtts(info.attrs);
  92. return info;
  93. }
  94. //造价编制单位="" 造价审核单位="" 项目负责人="" 施工单位编制人员="" 编制人员="" 审核人员="" 开工日期="" 竣工日期="" 工程地点="" 工程类型="" 合同价类型="" 造价类型="" 计价方式及依据="" 工程类别="" 编制日期="" 计税方法="一般计税"
  95. function getBaseInfo(project){
  96. let basicInformation = {items:[]};
  97. let tem = null;
  98. if(project.property&&project.property.basicInformation) tem =_.find(project.property.basicInformation,{"key":"basicInfo"});
  99. if(tem) basicInformation = tem;
  100. return basicInformation;
  101. }
  102. function getItemValueBykey(items,key) {
  103. let item = _.find(items,{"key":key});
  104. if(item) return item.value;
  105. return ""
  106. }
  107. function initAtts(arrs) {
  108. _.remove(arrs,function (item) {
  109. return item.required == false && _.isEmpty(item.value)
  110. })
  111. }
  112. //开始标签
  113. function startTag(ele) {
  114. let rst = `<${ele.name}`;
  115. for (let attr of ele.attrs) {
  116. rst += ` ${attr.name}="${attr.value}"`;
  117. }
  118. rst += ele.children&&ele.children.length > 0 ? '>' : '/>';
  119. return rst;
  120. }
  121. //结束标签
  122. function endTag(ele) {
  123. return `</${ele.name}>`;
  124. }
  125. //拼接成xml字符串
  126. function toXMLStr(eles) {
  127. let rst = '';
  128. for (let ele of eles) {
  129. rst += startTag(ele);
  130. if (ele.children&& ele.children.length > 0) {
  131. rst += toXMLStr(ele.children);
  132. rst += endTag(ele);
  133. }
  134. }
  135. return rst;
  136. }
  137. //格式化xml字符串
  138. function formatXml(text) {
  139. //去掉多余的空格
  140. text = '\n' + text.replace(/>\s*?</g, ">\n<");
  141. //调整格式
  142. let rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
  143. let nodeStack = [];
  144. let output = text.replace(rgx, function($0, all, name, isBegin, isCloseFull1, isCloseFull2, isFull1, isFull2){
  145. let isClosed = (isCloseFull1 === '/') || (isCloseFull2 === '/' ) || (isFull1 === '/') || (isFull2 === '/');
  146. let prefix = '';
  147. if (isBegin === '!') {
  148. prefix = getPrefix(nodeStack.length);
  149. } else {
  150. if (isBegin !== '/') {
  151. prefix = getPrefix(nodeStack.length);
  152. if (!isClosed) {
  153. nodeStack.push(name);
  154. }
  155. } else {
  156. nodeStack.pop();
  157. prefix = getPrefix(nodeStack.length);
  158. }
  159. }
  160. let ret = '\n' + prefix + all;
  161. return ret;
  162. });
  163. let outputText = output.substring(1);
  164. return outputText;
  165. function getPrefix(prefixIndex) {
  166. let span = ' ';
  167. let output = [];
  168. for (let i = 0 ; i < prefixIndex; ++i) {
  169. output.push(span);
  170. }
  171. return output.join('');
  172. }
  173. }
  174. /*
  175. * 导出数据
  176. * @param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,根据导出粒度去找其建设项目下相关数据)
  177. * @return {void}
  178. * */
  179. function toXml(eleData) {
  180. //转换成xml字符串
  181. let xmlStr = toXMLStr([eleData]);
  182. //加上xml声明
  183. xmlStr = `<?xml version="1.0" encoding="utf-8"?>${xmlStr}`;
  184. //格式化
  185. xmlStr = formatXml(xmlStr);
  186. let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
  187. saveAs(blob, '经济指标.ZBF');
  188. }
  189. }