exportSEIInterface.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. /**
  2. * Created by zhang on 2019/5/20.
  3. */
  4. let exportUtil = {
  5. setEngineerPriceIndex:function (tender,projectData) {
  6. return gljUtil.getEngineerCostData(tender.property,projectData.bills,fixedFlag,scMathUtil);
  7. },
  8. getTotalFee:function (b) {
  9. return gljUtil.getTotalFee(b,scMathUtil);
  10. },
  11. getFlag: function (name,totalCost,engineerCost,buildingArea) {
  12. return gljUtil.getEngineerFlag(name,totalCost,engineerCost,buildingArea);
  13. },
  14. getBuildArea:function (features) {
  15. return gljUtil.getBuildArea(features)
  16. },
  17. calcUnitB:function (total,building,scMathUtil,coe,decimal = 3) {
  18. return gljUtil.calcUnitB(total,building,scMathUtil,coe,decimal)
  19. },
  20. calUnitWidthCoe:function (total,noNeedCoe) {
  21. return gljUtil.calUnitWidthCoe(total,noNeedCoe,projectObj.project.property.engineerFeatures,_,scMathUtil);
  22. },
  23. getIndexBills:function (bills) {
  24. return gljUtil.getIndexBills(bills,fixedFlag,_,scMathUtil);
  25. }
  26. };
  27. async function exportSEI(projectID) {
  28. let tenderProjects = [];
  29. let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
  30. let pr = new SCComponent.InitProgressBar();
  31. pr.start('导出数据接口', '正在导出文件,请稍候……');
  32. console.log(result);
  33. let project = getProject(result);
  34. await prepareTenderDatas(tenderProjects,project);
  35. toXml(project);
  36. pr.end();
  37. function getProject(orignal) {//取建设项目信息
  38. let basicInformation = getBaseInfo(orignal);
  39. let project = {
  40. name: "建设项目",
  41. attrs: [
  42. {name: "项目名称", value: orignal.name},
  43. {name:"建设单位",value:getItemValueBykey(basicInformation.items,"constructionUnit")},
  44. {name:"施工单位",value:getItemValueBykey(basicInformation.items,"buildingUnit")},
  45. {name: "标准名称", value: "重庆市建设工程造价指标采集标准(清单计价)"},
  46. {name: "标准版本号", value: "1.1"}
  47. ],
  48. basicInformation:basicInformation,
  49. children:[]
  50. };
  51. initAtts(project.attrs);
  52. for(let c of orignal.children){
  53. project.children.push(getEngineering(c));
  54. }
  55. return project;
  56. }
  57. function getEngineering(source){
  58. let engineer = {
  59. name:"单项工程",
  60. attrs:[
  61. {name: "名称", value: source.name}
  62. ],
  63. children:[]
  64. };
  65. for(let c of source.children){
  66. let tenderProject = getTender(c);
  67. engineer.children.push(tenderProject);
  68. tenderProjects.push(tenderProject);
  69. }
  70. return engineer
  71. };
  72. function getTender(source) {
  73. let tender = {
  74. ID:source.ID,
  75. name:"单位工程",
  76. attrs:[
  77. {name: "名称", value: source.name}
  78. ],
  79. children:[],
  80. valuationType:source.property.valuationType,
  81. taxType:source.property.taxType,
  82. property:source.property
  83. };
  84. return tender;
  85. }
  86. async function prepareTenderDatas(tenders,project) {
  87. for(let t of tenders){
  88. await setTenderData(t,project);
  89. await setTimeoutSync(null,500);
  90. }
  91. }
  92. async function setTenderData(tender,project) {
  93. let projectData = await ajaxPost("/project/loadSEIProjectData",{projectID:tender.ID});
  94. tender.children.push(setEngineerInfo(tender));//设置工程信息
  95. tender.children.push(setEngineerFeature(tender));//设置工程特征
  96. tender.children.push(setEngineerIndex(tender,projectData));
  97. tender.children.push(await setGLJSummy(tender,projectData));
  98. //
  99. }
  100. function setEngineerIndex(tender,projectData) {//设置工程指标
  101. let index = {
  102. name:"工程指标",
  103. attrs:[],
  104. children:[],
  105. };
  106. let indexName = tender.property.indexName?tender.property.indexName:"建筑工程";
  107. index.children.push(exportUtil.setEngineerPriceIndex(tender,projectData));
  108. index.children.push(setEngineerEcoIndex(tender,projectData,indexName));
  109. index.children.push(setMainMaterialIndex(tender,projectData,indexName));
  110. index.children.push(setQuantityIndex(tender,projectData,indexName));
  111. return index;
  112. function setMainMaterialIndex(tender,projectData,indexName){
  113. let mainIndex = {
  114. name:`${indexName}工料指标`,
  115. attrs:[],
  116. children:[]
  117. };
  118. if(projectData) gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
  119. let materials = indexObj.getMainMaterialDatas(tender.property.materials,projectData.projectGLJs,tender.property.calcOptions,tender.property.decimal,false,_,scMathUtil);
  120. for(let m of materials){
  121. mainIndex.children.push(getMaterial(m))
  122. }
  123. let index = {
  124. name:"主要工料价格及消耗量指标",
  125. attrs:[],
  126. children:[mainIndex]
  127. };
  128. return index;
  129. function getMaterial(m) {
  130. let material = {
  131. name:m.name,
  132. attrs:[
  133. {name:"综合单价",value:scMathUtil.roundToString(m.unitPrice,2)},
  134. {name:"数量",value:scMathUtil.roundToString(m.quantity,2)},
  135. {name:"单方指标",value:scMathUtil.roundToString(m.unitIndex,3)},
  136. {name:"单位",value:m.unit}
  137. ]
  138. };
  139. return material;
  140. }
  141. }
  142. function setQuantityIndex(tender,projectData,indexName) {
  143. let quantityIndex = {
  144. name:`${indexName}量指标`,
  145. attrs:[],
  146. children:[]
  147. };
  148. let quantities = indexObj.getQuantityDatas(tender.property.mainQuantities,projectData.bills);
  149. for(let q of quantities){
  150. quantityIndex.children.push(getQuantity(q));
  151. }
  152. let index = {
  153. name:`主要工程量指标`,
  154. attrs:[],
  155. children:[quantityIndex]
  156. };
  157. return index;
  158. function getQuantity(q) {
  159. let quantity = {
  160. name:q.name,
  161. attrs:[
  162. {name:"工程量指标",value:scMathUtil.roundToString(q.quantity,3)},
  163. {name:"单位",value:q.unit}
  164. ]
  165. };
  166. return quantity;
  167. }
  168. }
  169. function setEngineerEcoIndex(tender,projectData,indexName) {
  170. let ecoIndex = {
  171. name:`${indexName}经济指标`,
  172. attrs:[],
  173. children:[]
  174. };
  175. let economicDatas = indexObj.getEconomicDatas(tender.property.economics,projectData.bills);
  176. for(let e of economicDatas){
  177. ecoIndex.children.push(getEco(e))
  178. }
  179. let index = {
  180. name:`工程经济指标`,
  181. attrs:[],
  182. children:[ecoIndex]
  183. };
  184. return index;
  185. function getEco(e) {
  186. let eco = {
  187. name:e.name,
  188. attrs:[
  189. {name:"综合合价",value:scMathUtil.roundToString(e.cost,2)},
  190. {name:"单方指标",value:scMathUtil.roundToString(e.unitCost,2)},
  191. {name:"占造价比例",value:scMathUtil.roundToString(e.per,2)}
  192. ]
  193. };
  194. return eco;
  195. }
  196. }
  197. }
  198. async function setGLJSummy(tender,projectData) {
  199. let gljs = {
  200. name:"人材机汇总",
  201. attrs:[],
  202. children:[]
  203. };
  204. setGLJDetail(projectData,tender.property,gljs);
  205. return gljs;
  206. }
  207. function setGLJDetail(projectData,property,gljs) {
  208. if(projectData){
  209. gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
  210. }
  211. for(let g of projectData.projectGLJs.gljList) {
  212. if (!g.quantity || g.quantity == "") continue;
  213. g.marketPrice = gljUtil.getMarketPrice(g,projectData.projectGLJs,property.calcOptions,property.decimal,false,_,scMathUtil);
  214. gljs.children.push(setEachGLJ(g));
  215. }
  216. }
  217. function setEachGLJ(source){
  218. let g = {
  219. name:"人材机",
  220. attrs:[
  221. {name: "代码", value: source.code},
  222. {name: "名称", value: source.name},
  223. {name: "规格型号", value: source.specs},
  224. {name: "单位", value: source.unit},
  225. {name: "市场单价", value: source.marketPrice},
  226. {name: "数量", value: source.quantity},
  227. {name: "类型", value: source.type},
  228. {name: "产地", value: source.originPlace},
  229. {name: "厂家", value: source.vender},
  230. {name: "备注", value: source.remark}
  231. ]
  232. };
  233. return g;
  234. }
  235. function setEngineerInfo(tender) {//设置工程信息
  236. let infos = tender.property.engineerInfos?tender.property.engineerInfos:[];
  237. let info = {
  238. name:"工程信息",
  239. attrs:[
  240. {name:"造价编制单位",value:getItemValueByDispName(infos,"造价编制单位")},
  241. {name:"造价审核单位",value:getItemValueByDispName(infos,"造价审核单位")},
  242. {name:"项目负责人",value:getItemValueByDispName(infos,"项目负责人")},
  243. {name:"施工单位编制人员",value:getItemValueByDispName(infos,"施工单位编制人员")},
  244. {name:"编制人员",value:getItemValueByDispName(infos,"编制人员")},
  245. {name:"审核人员",value:getItemValueByDispName(infos,"审核人员")},
  246. {name:"开工日期",value:getItemValueByDispName(infos,"开工日期")},
  247. {name:"竣工日期",value:getItemValueByDispName(infos,"竣工日期")},
  248. {name:"工程地点",value:getItemValueByDispName(infos,"工程地点")},
  249. {name:"工程类型",value:getItemValueByDispName(infos,"工程类型")},
  250. {name:"合同价类型",value:getItemValueByDispName(infos,"合同价类型")},
  251. {name:"造价类型",value:getItemValueByDispName(infos,"造价类型")},
  252. {name:"计价方式及依据",value:getItemValueByDispName(infos,"计价方式及依据")},
  253. {name:"工程类别",value:getItemValueByDispName(infos,"工程类别")},
  254. {name:"编制日期",value:getItemValueByDispName(infos,"编制日期")},
  255. {name:"审查日期",value:getItemValueByDispName(infos,"审查日期")}
  256. ]
  257. };
  258. initAtts(info.attrs);
  259. return info;
  260. }
  261. function setEngineerFeature(tender) {
  262. let fea = {
  263. name:"工程特征",
  264. attrs:[],
  265. children:[]
  266. };
  267. fea.children.push(setIndexName(tender));
  268. return fea;
  269. function setIndexName(tender) {
  270. let indexName = {
  271. name:tender.property.indexName?tender.property.indexName:"建筑工程",
  272. attrs:[],
  273. children:[]
  274. };
  275. setFeatures(tender,indexName.children);
  276. return indexName
  277. }
  278. function setFeatures(tender,arr) {
  279. let features = tender.property.engineerFeatures?tender.property.engineerFeatures:[];
  280. if(features.length == 0) return;
  281. let parentMap = _.groupBy(features,"ParentID");
  282. let rootNodes = parentMap["-1"]?parentMap["-1"]:parentMap[null];
  283. for(let r of rootNodes){
  284. arr.push(getFeatrue(r,parentMap))
  285. }
  286. }
  287. function getFeatrue(node,parentMap){
  288. if(parentMap[node.ID]){//如果有子节点,那么它就是一个节点
  289. let name = node.exportName?node.exportName:node.name;
  290. let tem = {
  291. name:name.replace("*",""),
  292. attrs:[],
  293. children:[]
  294. };
  295. for(let s of parentMap[node.ID]){
  296. let f = getFeatrue(s,parentMap);
  297. f.children?tem.children.push(f):tem.attrs.push(f);//如果有children这个属性,则返回的是一个节点,如果没有,则返回的是一个属性
  298. }
  299. return tem;
  300. }else {//如果没有子节点,那么它就是父节点的一个属性
  301. if(node.isDetail == true){//如果是明细节点,则造一个明细节点
  302. return {name:"明细",attrs:[{name:"名称",value:node.value}],children:[]};
  303. }
  304. return {name:node.name.replace("*",""),value:node.value};
  305. }
  306. }
  307. }
  308. function getBaseInfo(project){
  309. let basicInformation = {items:[]};
  310. let tem = null;
  311. if(project.property&&project.property.basicInformation) tem =_.find(project.property.basicInformation,{"key":"basicInfo"});
  312. if(tem) basicInformation = tem;
  313. return basicInformation;
  314. }
  315. function getItemValueBykey(items,key) {
  316. let item = _.find(items,{"key":key});
  317. if(item) return item.value;
  318. return ""
  319. }
  320. function getItemValueByDispName(items,dispName) {
  321. let item = _.find(items,{"dispName":dispName});
  322. if(item) return item.value;
  323. return ""
  324. }
  325. function initAtts(arrs) {
  326. _.remove(arrs,function (item) {
  327. return item.required == false && _.isEmpty(item.value)
  328. })
  329. }
  330. //开始标签
  331. function startTag(ele) {
  332. let rst = `<${ele.name}`;
  333. for (let attr of ele.attrs) {
  334. rst += ` ${attr.name}="${ attr.value!=undefined&&attr.value!= null?attr.value:""}"`;
  335. }
  336. rst += ele.children&&ele.children.length > 0 ? '>' : '/>';
  337. return rst;
  338. }
  339. //结束标签
  340. function endTag(ele) {
  341. return `</${ele.name}>`;
  342. }
  343. //拼接成xml字符串
  344. function toXMLStr(eles) {
  345. let rst = '';
  346. for (let ele of eles) {
  347. rst += startTag(ele);
  348. if (ele.children&& ele.children.length > 0) {
  349. rst += toXMLStr(ele.children);
  350. rst += endTag(ele);
  351. }
  352. }
  353. return rst;
  354. }
  355. //格式化xml字符串
  356. function formatXml(text) {
  357. //去掉多余的空格
  358. text = '\n' + text.replace(/>\s*?</g, ">\n<");
  359. //调整格式
  360. let rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
  361. let nodeStack = [];
  362. let output = text.replace(rgx, function($0, all, name, isBegin, isCloseFull1, isCloseFull2, isFull1, isFull2){
  363. let isClosed = (isCloseFull1 === '/') || (isCloseFull2 === '/' ) || (isFull1 === '/') || (isFull2 === '/');
  364. let prefix = '';
  365. if (isBegin === '!') {
  366. prefix = getPrefix(nodeStack.length);
  367. } else {
  368. if (isBegin !== '/') {
  369. prefix = getPrefix(nodeStack.length);
  370. if (!isClosed) {
  371. nodeStack.push(name);
  372. }
  373. } else {
  374. nodeStack.pop();
  375. prefix = getPrefix(nodeStack.length);
  376. }
  377. }
  378. let ret = '\n' + prefix + all;
  379. return ret;
  380. });
  381. let outputText = output.substring(1);
  382. return outputText;
  383. function getPrefix(prefixIndex) {
  384. let span = ' ';
  385. let output = [];
  386. for (let i = 0 ; i < prefixIndex; ++i) {
  387. output.push(span);
  388. }
  389. return output.join('');
  390. }
  391. }
  392. /*
  393. * 导出数据
  394. * @param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,根据导出粒度去找其建设项目下相关数据)
  395. * @return {void}
  396. * */
  397. function toXml(eleData) {
  398. //转换成xml字符串
  399. let xmlStr = toXMLStr([eleData]);
  400. //加上xml声明
  401. xmlStr = `<?xml version="1.0" encoding="utf-8"?>${xmlStr}`;
  402. //格式化
  403. xmlStr = formatXml(xmlStr);
  404. let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
  405. saveAs(blob, '经济指标.ZBF');
  406. }
  407. }
  408. $(function () {
  409. $("#SEIMenu").click(async function () {
  410. await exportSEI(projectObj.project.property.rootProjectID);
  411. $("#exportMenu").removeClass("show");
  412. })
  413. });