exportSEIInterface.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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. await 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. property:source.property
  57. };
  58. return tender;
  59. }
  60. async function prepareTenderDatas(tenders,project) {
  61. for(let t of tenders){
  62. await setTenderData(t,project);
  63. }
  64. }
  65. async function setTenderData(tender,project) {
  66. let projectData = await ajaxPost("/project/loadSEIProjectData",{projectID:tender.ID});
  67. tender.children.push(setEngineerInfo(tender,project));//设置工程信息
  68. tender.children.push(setEngineerIndex(tender,projectData));
  69. tender.children.push(await setGLJSummy(tender,projectData));
  70. //
  71. }
  72. function setEngineerIndex(tender,projectData) {//设置工程指标
  73. let index = {
  74. name:"工程指标",
  75. attrs:[],
  76. children:[],
  77. };
  78. index.children.push(setEngineerPriceIndex(tender,projectData));
  79. return index;
  80. }
  81. function setEngineerPriceIndex(tender,projectData) {
  82. let priceIndex = {
  83. name:"工程造价指标",
  84. attrs:[],
  85. children:[],
  86. };
  87. let fixMap = {};
  88. let buildingArea = tender.property.projectFeature?getItemValueBykey(tender.property.projectFeature,"buildingArea"):1;//建筑面积
  89. buildingArea = buildingArea && buildingArea !=""? parseFloat(buildingArea):1;
  90. for(let b of projectData.bills){
  91. if(b.flags && b.flags.length > 0){
  92. let f = _.find(b.flags,{"fieldName":"fixed"})
  93. if(f) fixMap[f.flag] = getTotalFee(b);
  94. }
  95. }
  96. //计算其他组织措施费 = 施工组织措施项目下的子项,除了 安全文明施工费、建设工程竣工档案编制费以外的项
  97. let CONSTRUCTION_ORGANIZATION = fixMap[fixedFlag.CONSTRUCTION_ORGANIZATION]?fixMap[fixedFlag.CONSTRUCTION_ORGANIZATION]:0;
  98. let SAFETY_CONSTRUCTION = fixMap[fixedFlag.SAFETY_CONSTRUCTION]?fixMap[fixedFlag.SAFETY_CONSTRUCTION]:0;
  99. let PROJECT_COMPLETE_ARCH_FEE = fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE]? fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE]:0;
  100. let other_org_fee = CONSTRUCTION_ORGANIZATION - SAFETY_CONSTRUCTION - PROJECT_COMPLETE_ARCH_FEE;
  101. other_org_fee = other_org_fee >0 ?other_org_fee:0;
  102. let engineerCost = fixMap[fixedFlag.ENGINEERINGCOST]?fixMap[fixedFlag.ENGINEERINGCOST]:1;
  103. priceIndex.children.push(getFlag("分部分项工程费",fixMap[fixedFlag.SUB_ENGINERRING],engineerCost,buildingArea));
  104. priceIndex.children.push(getFlag("技术措施费",fixMap[fixedFlag.CONSTRUCTION_TECH],engineerCost,buildingArea));
  105. priceIndex.children.push(getFlag("安全文明施工费",fixMap[fixedFlag.SAFETY_CONSTRUCTION],engineerCost,buildingArea));
  106. priceIndex.children.push(getFlag("建设工程竣工档案编制费",fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE],engineerCost,buildingArea));
  107. priceIndex.children.push(getFlag("其他组织措施费",other_org_fee,engineerCost,buildingArea));
  108. priceIndex.children.push(getFlag("暂列金额",fixMap[fixedFlag.PROVISIONAL],engineerCost,buildingArea));
  109. priceIndex.children.push(getFlag("专业工程暂估价",fixMap[fixedFlag.ENGINEERING_ESITIMATE],engineerCost,buildingArea));
  110. priceIndex.children.push(getFlag("计日工",fixMap[fixedFlag.DAYWORK],engineerCost,buildingArea));
  111. priceIndex.children.push(getFlag("总承包服务费",fixMap[fixedFlag.TURN_KEY_CONTRACT],engineerCost,buildingArea));
  112. priceIndex.children.push(getFlag("索赔与现场签证",fixMap[fixedFlag.CLAIM_VISA],engineerCost,buildingArea));
  113. priceIndex.children.push(getFlag("规费",fixMap[fixedFlag.CHARGE],engineerCost,buildingArea));
  114. priceIndex.children.push(getFlag("税金",fixMap[fixedFlag.TAX],engineerCost,buildingArea));
  115. priceIndex.children.push(getFlag("工程造价",fixMap[fixedFlag.ENGINEERINGCOST],engineerCost,buildingArea));
  116. return priceIndex;
  117. }
  118. function getTotalFee(b) {
  119. let total = 0;
  120. if(b.fees && b.fees.length > 0){
  121. let common = _.find(b.fees,{"fieldName":"common"});
  122. if(common) total = scMathUtil.roundForObj(common.totalFee,getDecimal("bills.totalPrice"))
  123. }
  124. return total;
  125. }
  126. function getFlag(name,totalCost,engineerCost,buildingArea) {
  127. totalCost = totalCost?totalCost:0;
  128. let flag = {
  129. name:name,
  130. attrs:[
  131. {name: "金额", value: scMathUtil.roundToString(totalCost,3)},
  132. {name: "单方造价", value: scMathUtil.roundToString(totalCost/buildingArea,3)},
  133. {name: "占造价比例", value: scMathUtil.roundToString(totalCost/engineerCost * 100,3)},
  134. ],
  135. };
  136. return flag;
  137. }
  138. async function setGLJSummy(tender,projectData) {
  139. let gljs = {
  140. name:"人材机汇总",
  141. attrs:[],
  142. children:[]
  143. };
  144. setGLJDetail(projectData,tender.property,gljs);
  145. return gljs;
  146. }
  147. function setGLJDetail(projectData,property,gljs) {
  148. if(projectData){
  149. gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
  150. }
  151. for(let g of projectData.projectGLJs.gljList) {
  152. if (!g.quantity || g.quantity == "") continue;
  153. g.marketPrice = gljUtil.getMarketPrice(g,projectData.projectGLJs,property.calcOptions,property.decimal,false,_,scMathUtil);
  154. gljs.children.push(setEachGLJ(g));
  155. }
  156. }
  157. function setEachGLJ(source){
  158. let g = {
  159. name:"人材机",
  160. attrs:[
  161. {name: "代码", value: source.code},
  162. {name: "名称", value: source.name},
  163. {name: "规格型号", value: source.specs},
  164. {name: "单位", value: source.unit},
  165. {name: "市场单价", value: source.marketPrice},
  166. {name: "数量", value: source.quantity},
  167. {name: "类型", value: source.type},
  168. {name: "产地", value: source.originPlace},
  169. {name: "厂家", value: source.vender},
  170. {name: "备注", value: source.remark}
  171. ]
  172. };
  173. return g;
  174. }
  175. function setEngineerInfo(tender,project) {//设置工程信息
  176. let baseInfo = project.basicInformation;
  177. let calcType ={"bill":"工程量清单计价","ration":"定额计价"};
  178. let info = {
  179. name:"工程信息",
  180. attrs:[
  181. {name:"造价编制单位",value:getItemValueBykey(baseInfo.items,"establishmentUnit")},
  182. {name:"造价审核单位",value:getItemValueBykey(baseInfo.items,"auditUnit")},
  183. {name:"项目负责人",value:""},
  184. {name:"施工单位编制人员",value:""},
  185. {name:"编制人员",value:""},
  186. {name:"审核人员",value:""},
  187. {name:"开工日期",value:""},
  188. {name:"竣工日期",value:""},
  189. {name:"工程地点",value:""},
  190. {name:"工程类型",value:""},
  191. {name:"合同价类型",value:""},
  192. {name:"造价类型",value:""},
  193. {name:"计价方式及依据",value:calcType[tender.valuationType]},
  194. {name:"工程类别",value:""},
  195. {name:"编制日期",value:""},
  196. {name:"审查日期",value:""}
  197. ]
  198. };
  199. initAtts(info.attrs);
  200. return info;
  201. }
  202. //造价编制单位="" 造价审核单位="" 项目负责人="" 施工单位编制人员="" 编制人员="" 审核人员="" 开工日期="" 竣工日期="" 工程地点="" 工程类型="" 合同价类型="" 造价类型="" 计价方式及依据="" 工程类别="" 编制日期="" 计税方法="一般计税"
  203. function getBaseInfo(project){
  204. let basicInformation = {items:[]};
  205. let tem = null;
  206. if(project.property&&project.property.basicInformation) tem =_.find(project.property.basicInformation,{"key":"basicInfo"});
  207. if(tem) basicInformation = tem;
  208. return basicInformation;
  209. }
  210. function getItemValueBykey(items,key) {
  211. let item = _.find(items,{"key":key});
  212. if(item) return item.value;
  213. return ""
  214. }
  215. function initAtts(arrs) {
  216. _.remove(arrs,function (item) {
  217. return item.required == false && _.isEmpty(item.value)
  218. })
  219. }
  220. //开始标签
  221. function startTag(ele) {
  222. let rst = `<${ele.name}`;
  223. for (let attr of ele.attrs) {
  224. rst += ` ${attr.name}="${ attr.value!=undefined&&attr.value!= null?attr.value:""}"`;
  225. }
  226. rst += ele.children&&ele.children.length > 0 ? '>' : '/>';
  227. return rst;
  228. }
  229. //结束标签
  230. function endTag(ele) {
  231. return `</${ele.name}>`;
  232. }
  233. //拼接成xml字符串
  234. function toXMLStr(eles) {
  235. let rst = '';
  236. for (let ele of eles) {
  237. rst += startTag(ele);
  238. if (ele.children&& ele.children.length > 0) {
  239. rst += toXMLStr(ele.children);
  240. rst += endTag(ele);
  241. }
  242. }
  243. return rst;
  244. }
  245. //格式化xml字符串
  246. function formatXml(text) {
  247. //去掉多余的空格
  248. text = '\n' + text.replace(/>\s*?</g, ">\n<");
  249. //调整格式
  250. let rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
  251. let nodeStack = [];
  252. let output = text.replace(rgx, function($0, all, name, isBegin, isCloseFull1, isCloseFull2, isFull1, isFull2){
  253. let isClosed = (isCloseFull1 === '/') || (isCloseFull2 === '/' ) || (isFull1 === '/') || (isFull2 === '/');
  254. let prefix = '';
  255. if (isBegin === '!') {
  256. prefix = getPrefix(nodeStack.length);
  257. } else {
  258. if (isBegin !== '/') {
  259. prefix = getPrefix(nodeStack.length);
  260. if (!isClosed) {
  261. nodeStack.push(name);
  262. }
  263. } else {
  264. nodeStack.pop();
  265. prefix = getPrefix(nodeStack.length);
  266. }
  267. }
  268. let ret = '\n' + prefix + all;
  269. return ret;
  270. });
  271. let outputText = output.substring(1);
  272. return outputText;
  273. function getPrefix(prefixIndex) {
  274. let span = ' ';
  275. let output = [];
  276. for (let i = 0 ; i < prefixIndex; ++i) {
  277. output.push(span);
  278. }
  279. return output.join('');
  280. }
  281. }
  282. /*
  283. * 导出数据
  284. * @param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,根据导出粒度去找其建设项目下相关数据)
  285. * @return {void}
  286. * */
  287. function toXml(eleData) {
  288. //转换成xml字符串
  289. let xmlStr = toXMLStr([eleData]);
  290. //加上xml声明
  291. xmlStr = `<?xml version="1.0" encoding="utf-8"?>${xmlStr}`;
  292. //格式化
  293. xmlStr = formatXml(xmlStr);
  294. let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
  295. saveAs(blob, '经济指标.ZBF');
  296. }
  297. }