|
|
@@ -0,0 +1,226 @@
|
|
|
+/**
|
|
|
+ * Created by zhang on 2019/5/20.
|
|
|
+ */
|
|
|
+async function exportSEI(projectID) {
|
|
|
+
|
|
|
+ let tenderProjects = [];
|
|
|
+
|
|
|
+ let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
|
|
|
+ console.log(result);
|
|
|
+ let project = getProject(result);
|
|
|
+
|
|
|
+ prepareTenderDatas(tenderProjects,project);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ toXml(project);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ function getProject(orignal) {//取建设项目信息
|
|
|
+ let basicInformation = getBaseInfo(orignal);
|
|
|
+ let project = {
|
|
|
+ name: "建设项目",
|
|
|
+ attrs: [
|
|
|
+ {name: "项目名称", value: orignal.name},
|
|
|
+ {name:"建设单位",value:getItemValueBykey(basicInformation.items,"constructionUnit")},
|
|
|
+ {name:"施工单位",value:getItemValueBykey(basicInformation.items,"buildingUnit")},
|
|
|
+ {name: "标准名称", value: "重庆市建设工程造价指标采集标准(清单计价)"},
|
|
|
+ {name: "标准版本号", value: "1.1"}
|
|
|
+ ],
|
|
|
+ basicInformation:basicInformation,
|
|
|
+ children:[]
|
|
|
+ };
|
|
|
+ initAtts(project.attrs);
|
|
|
+ for(let c of orignal.children){
|
|
|
+ project.children.push(getEngineering(c));
|
|
|
+ }
|
|
|
+ return project;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getEngineering(source){
|
|
|
+ let engineer = {
|
|
|
+ name:"单项工程",
|
|
|
+ attrs:[
|
|
|
+ {name: "名称", value: source.name}
|
|
|
+ ],
|
|
|
+ children:[]
|
|
|
+ };
|
|
|
+
|
|
|
+ for(let c of source.children){
|
|
|
+ let tenderProject = getTender(c);
|
|
|
+ engineer.children.push(tenderProject);
|
|
|
+ tenderProjects.push(tenderProject);
|
|
|
+ }
|
|
|
+ return engineer
|
|
|
+ };
|
|
|
+
|
|
|
+ function getTender(source) {
|
|
|
+ let tender = {
|
|
|
+ ID:source.ID,
|
|
|
+ name:"单位工程",
|
|
|
+ attrs:[
|
|
|
+ {name: "名称", value: source.name}
|
|
|
+ ],
|
|
|
+ children:[],
|
|
|
+ valuationType:source.property.valuationType,
|
|
|
+ taxType:source.property.taxType
|
|
|
+ };
|
|
|
+ return tender;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ function prepareTenderDatas(tenders,project) {
|
|
|
+ for(let t of tenders){
|
|
|
+ setTenderData(t,project);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ function setTenderData(tender,project) {
|
|
|
+
|
|
|
+ tender.children.push(setEngineerInfo(tender,project));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function setEngineerInfo(tender,project) {
|
|
|
+ let baseInfo = project.basicInformation;
|
|
|
+ let calcType ={"bill":"工程量清单计价","ration":"定额计价"};
|
|
|
+ let info = {
|
|
|
+ name:"工程信息",
|
|
|
+ attrs:[
|
|
|
+ {name:"造价编制单位",value:getItemValueBykey(baseInfo.items,"establishmentUnit")},
|
|
|
+ {name:"造价审核单位",value:getItemValueBykey(baseInfo.items,"auditUnit")},
|
|
|
+ {name:"项目负责人",value:""},
|
|
|
+ {name:"施工单位编制人员",value:""},
|
|
|
+ {name:"编制人员",value:""},
|
|
|
+ {name:"审核人员",value:""},
|
|
|
+ {name:"开工日期",value:""},
|
|
|
+ {name:"竣工日期",value:""},
|
|
|
+ {name:"工程地点",value:""},
|
|
|
+ {name:"工程类型",value:""},
|
|
|
+ {name:"合同价类型",value:""},
|
|
|
+ {name:"造价类型",value:""},
|
|
|
+ {name:"计价方式及依据",value:calcType[tender.valuationType]},
|
|
|
+ {name:"工程类别",value:""},
|
|
|
+ {name:"编制日期",value:""},
|
|
|
+ {name:"审查日期",value:""}
|
|
|
+
|
|
|
+ ]
|
|
|
+ };
|
|
|
+ initAtts(info.attrs);
|
|
|
+ return info;
|
|
|
+ }
|
|
|
+//造价编制单位="" 造价审核单位="" 项目负责人="" 施工单位编制人员="" 编制人员="" 审核人员="" 开工日期="" 竣工日期="" 工程地点="" 工程类型="" 合同价类型="" 造价类型="" 计价方式及依据="" 工程类别="" 编制日期="" 计税方法="一般计税"
|
|
|
+
|
|
|
+ function getBaseInfo(project){
|
|
|
+ let basicInformation = {items:[]};
|
|
|
+ let tem = null;
|
|
|
+ if(project.property&&project.property.basicInformation) tem =_.find(project.property.basicInformation,{"key":"basicInfo"});
|
|
|
+ if(tem) basicInformation = tem;
|
|
|
+ return basicInformation;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ function getItemValueBykey(items,key) {
|
|
|
+ let item = _.find(items,{"key":key});
|
|
|
+ if(item) return item.value;
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+
|
|
|
+ function initAtts(arrs) {
|
|
|
+ _.remove(arrs,function (item) {
|
|
|
+ return item.required == false && _.isEmpty(item.value)
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ //开始标签
|
|
|
+ function startTag(ele) {
|
|
|
+ let rst = `<${ele.name}`;
|
|
|
+ for (let attr of ele.attrs) {
|
|
|
+ rst += ` ${attr.name}="${attr.value}"`;
|
|
|
+ }
|
|
|
+ rst += ele.children&&ele.children.length > 0 ? '>' : '/>';
|
|
|
+ return rst;
|
|
|
+ }
|
|
|
+ //结束标签
|
|
|
+ function endTag(ele) {
|
|
|
+ return `</${ele.name}>`;
|
|
|
+ }
|
|
|
+ //拼接成xml字符串
|
|
|
+ function toXMLStr(eles) {
|
|
|
+ let rst = '';
|
|
|
+ for (let ele of eles) {
|
|
|
+ rst += startTag(ele);
|
|
|
+ if (ele.children&& ele.children.length > 0) {
|
|
|
+ rst += toXMLStr(ele.children);
|
|
|
+ rst += endTag(ele);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return rst;
|
|
|
+ }
|
|
|
+ //格式化xml字符串
|
|
|
+ function formatXml(text) {
|
|
|
+ //去掉多余的空格
|
|
|
+ text = '\n' + text.replace(/>\s*?</g, ">\n<");
|
|
|
+ //调整格式
|
|
|
+ let rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
|
|
|
+ let nodeStack = [];
|
|
|
+ let output = text.replace(rgx, function($0, all, name, isBegin, isCloseFull1, isCloseFull2, isFull1, isFull2){
|
|
|
+ let isClosed = (isCloseFull1 === '/') || (isCloseFull2 === '/' ) || (isFull1 === '/') || (isFull2 === '/');
|
|
|
+ let prefix = '';
|
|
|
+ if (isBegin === '!') {
|
|
|
+ prefix = getPrefix(nodeStack.length);
|
|
|
+ } else {
|
|
|
+ if (isBegin !== '/') {
|
|
|
+ prefix = getPrefix(nodeStack.length);
|
|
|
+ if (!isClosed) {
|
|
|
+ nodeStack.push(name);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ nodeStack.pop();
|
|
|
+ prefix = getPrefix(nodeStack.length);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let ret = '\n' + prefix + all;
|
|
|
+ return ret;
|
|
|
+ });
|
|
|
+ let outputText = output.substring(1);
|
|
|
+ return outputText;
|
|
|
+ function getPrefix(prefixIndex) {
|
|
|
+ let span = ' ';
|
|
|
+ let output = [];
|
|
|
+ for (let i = 0 ; i < prefixIndex; ++i) {
|
|
|
+ output.push(span);
|
|
|
+ }
|
|
|
+ return output.join('');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ * 导出数据
|
|
|
+ * @param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,根据导出粒度去找其建设项目下相关数据)
|
|
|
+ * @return {void}
|
|
|
+ * */
|
|
|
+ function toXml(eleData) {
|
|
|
+ //转换成xml字符串
|
|
|
+ let xmlStr = toXMLStr([eleData]);
|
|
|
+ //加上xml声明
|
|
|
+ xmlStr = `<?xml version="1.0" encoding="utf-8"?>${xmlStr}`;
|
|
|
+ //格式化
|
|
|
+ xmlStr = formatXml(xmlStr);
|
|
|
+ let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
|
|
|
+ saveAs(blob, '经济指标.ZBF');
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|