/**
* Created by zhang on 2019/5/20.
*/
let exportUtil = {
setEngineerPriceIndex:function (tender,projectData) {
return gljUtil.getEngineerCostData(tender.property,projectData.bills,fixedFlag,scMathUtil);
},
getTotalFee:function (b) {
return gljUtil.getTotalFee(b,scMathUtil);
},
getFlag: function (name,totalCost,engineerCost,buildingArea) {
return gljUtil.getEngineerFlag(name,totalCost,engineerCost,buildingArea);
},
getBuildArea:function (features) {
return gljUtil.getBuildArea(features)
},
calcUnitB:function (total,building,scMathUtil,coe,decimal = 3) {
return gljUtil.calcUnitB(total,building,scMathUtil,coe,decimal)
},
calUnitWidthCoe:function (total,noNeedCoe) {
return gljUtil.calUnitWidthCoe(total,noNeedCoe,projectObj.project.property.engineerFeatures,_,scMathUtil);
},
getIndexBills:function (bills) {
return gljUtil.getIndexBills(bills,fixedFlag,_,scMathUtil);
}
};
async function exportSEI(projectID) {
let tenderProjects = [];
let errorMap = {};
let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
let pr = new SCComponent.InitProgressBar();
pr.start('导出数据接口', '正在导出文件,请稍候……');
let project = getProject(result);
await prepareTenderDatas(tenderProjects,project);
if(!_.isEmpty(errorMap)){
showError(errorMap);
return pr.end();
}
toXml(project);
pr.end();
function showError(errorMap) {
let infoList = [];
for(let name in errorMap){
infoList.push(`单位工程“${name}”下:`);
for(let err of errorMap[name]){
infoList.push(err);
}
}
if(infoList.length > 20){
$('#hintBox_caption').addClass('export-check');
}
let msg = infoList.join(`
`);
alert(msg);
}
function getProject(orignal) {//取建设项目信息
let basicInformation = getBaseInfo(orignal);
let textTpye = orignal.property.taxType == 1 ?"一般计税":"简易计税";
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"},
{name: "计税模式", value: textTpye}
],
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,
property:source.property,
projectName:source.name
};
return tender;
}
async function prepareTenderDatas(tenders,project) {
for(let t of tenders){
await setTenderData(t,project);
await setTimeoutSync(null,500);
}
}
async function setTenderData(tender,project) {
let projectData = await ajaxPost("/project/loadSEIProjectData",{projectID:tender.ID});
tender.children.push(setEngineerInfo(tender));//设置工程信息
tender.children.push(setEngineerFeature(tender));//设置工程特征
tender.children.push(setEngineerIndex(tender,projectData));
tender.children.push(await setGLJSummy(tender,projectData));
//
}
function setEngineerIndex(tender,projectData) {//设置工程指标
let index = {
name:"工程指标",
attrs:[],
children:[],
};
let indexName = tender.property.indexName?tender.property.indexName:"建筑工程";
index.children.push(exportUtil.setEngineerPriceIndex(tender,projectData));
index.children.push(setEngineerEcoIndex(tender,projectData,indexName));
index.children.push(setMainMaterialIndex(tender,projectData,indexName));
index.children.push(setQuantityIndex(tender,projectData,indexName));
return index;
function setMainMaterialIndex(tender,projectData,indexName){
let mainIndex = {
name:`${indexName}工料指标`,
attrs:[],
children:[]
};
if(projectData) gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
let materials = indexObj.getMainMaterialDatas(tender.property,tender.property.materials,projectData.projectGLJs,tender.property.calcOptions,tender.property.decimal,false,_,scMathUtil);
for(let m of materials){
if(m.name == "其他材料") continue;//2020-01-08 其他材料 不输出字段(不管是否有值)。
mainIndex.children.push(getMaterial(m))
}
let index = {
name:"主要工料价格及消耗量指标",
attrs:[],
children:[mainIndex]
};
return index;
function getMaterial(m) {
let mname = m.exportName?m.exportName:m.name;
let material = {
name:mname,
attrs:[
{name:"综合单价",value:scMathUtil.roundToString(m.unitPrice,2)},
{name:"数量",value:scMathUtil.roundToString(m.quantity,2)},
{name:"单方指标",value:scMathUtil.roundToString(m.unitIndex,3)},
{name:"单位",value:m.unit}
]
};
return material;
}
}
function setQuantityIndex(tender,projectData,indexName) {
let quantityIndex = {
name:`${indexName}量指标`,
attrs:[],
children:[]
};
let quantities = indexObj.getQuantityDatas(tender.property.mainQuantities,projectData.bills);
for(let q of quantities){
quantityIndex.children.push(getQuantity(q));
}
let index = {
name:`主要工程量指标`,
attrs:[],
children:[quantityIndex]
};
return index;
function getQuantity(q) {
let qname = q.exportName?q.exportName:q.name;
let quantity = {
name:qname,
attrs:[
{name:"工程量指标",value:scMathUtil.roundToString(q.quantity,3)},
{name:"单位",value:q.quantityIndexUnit}
]
};
return quantity;
}
}
function setEngineerEcoIndex(tender,projectData,indexName) {
let ecoIndex = {
name:`${indexName}经济指标`,
attrs:[],
children:[]
};
let economicDatas = indexObj.getEconomicDatas(tender.property.economics,projectData.bills);
for(let e of economicDatas){
ecoIndex.children.push(getEco(e))
}
let index = {
name:`工程经济指标`,
attrs:[],
children:[ecoIndex]
};
return index;
function getEco(e) {
let ename = e.exportName?e.exportName:e.name;
let eco = {
name:ename,
attrs:[
{name:"综合合价",value:scMathUtil.roundToString(e.cost,2)},
{name:"单方指标",value:scMathUtil.roundToString(e.unitCost,2)},
{name:"占造价比例",value:scMathUtil.roundToString(e.per,2)}
]
};
return eco;
}
}
}
async function setGLJSummy(tender,projectData) {
let gljs = {
name:"人材机汇总",
attrs:[],
children:[]
};
setGLJDetail(projectData,tender.property,gljs);
return gljs;
}
function setGLJDetail(projectData,property,gljs) {
if(projectData){
gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil,true);
}
for(let g of projectData.projectGLJs.gljList) {
if (!g.quantity || g.quantity == "") continue;
let tenderCoe = gljUtil.getTenderPriceCoe(g,property);
g.marketPrice = gljUtil.getMarketPrice(g,projectData.projectGLJs,property.calcOptions,property.decimal,false,_,scMathUtil,tenderCoe);
gljs.children.push(setEachGLJ(g));
}
}
function setEachGLJ(source){
let g = {
name:"人材机",
attrs:[
{name: "代码", value: source.code},
{name: "名称", value: source.name},
{name: "规格型号", value: source.specs},
{name: "单位", value: source.unit},
{name: "市场单价", value: source.marketPrice},
{name: "数量", value: source.quantity},
{name: "类型", value: source.type},
{name: "产地", value: source.originPlace},
{name: "厂家", value: source.vender},
{name: "备注", value: source.remark}
]
};
handleXMLEntity(g.attrs);
return g;
}
// 对每个元素的所有属性值进行特殊字符处理
function handleXMLEntity(attrs) {
let _xmlEntity = {
'&': '&',
'\n': '
',
'"': '"',
'\'': ''',
'<': '<',
'>': '>'
};
for (let attr of attrs) {
if (!attr.value) {
continue;
}
for (let [key, value] of Object.entries(_xmlEntity)) {
attr.value = attr.value+"";
attr.value = attr.value.replace(new RegExp(key, 'g'), value);
}
}
}
function setEngineerInfo(tender) {//设置工程信息
let infos = tender.property.engineerInfos?tender.property.engineerInfos:[];
let errors = infoRequireChecking(infos);
if(errors.length > 0) errorMap[tender.projectName] = errors;
let info = {
name:"工程信息",
attrs:[
{name:"造价编制单位",value:getItemValueByDispName(infos,"造价编制单位")},
{name:"造价审核单位",value:getItemValueByDispName(infos,"造价审核单位")},
{name:"项目负责人",value:getItemValueByDispName(infos,"项目负责人")},
{name:"施工单位编制人员",value:getItemValueByDispName(infos,"施工单位编制人员")},
{name:"编制人员",value:getItemValueByDispName(infos,"编制人员")},
{name:"审核人员",value:getItemValueByDispName(infos,"审核人员")},
{name:"开工日期",value:getItemValueByDispName(infos,"开工日期")},
{name:"竣工日期",value:getItemValueByDispName(infos,"竣工日期")},
{name:"工程地点",value:getItemValueByDispName(infos,"工程地点")},
{name:"工程类型",value:getItemValueByDispName(infos,"工程类型")},
{name:"合同价类型",value:getItemValueByDispName(infos,"合同价类型")},
{name:"造价类型",value:getItemValueByDispName(infos,"造价类型")},
{name:"计价方式及依据",value:getItemValueByDispName(infos,"计价方式及依据")},
{name:"工程类别",value:getItemValueByDispName(infos,"工程类别")},
{name:"编制日期",value:getItemValueByDispName(infos,"编制日期")},
{name:"审查日期",value:getItemValueByDispName(infos,"审查日期"),required:false}
]
};
initAtts(info.attrs);
return info;
}
function setEngineerFeature(tender) {
let fea = {
name:"工程特征",
attrs:[],
children:[]
};
fea.children.push(setIndexName(tender));
return fea;
function setIndexName(tender) {
let indexName = {
name:tender.property.indexName?tender.property.indexName:"建筑工程",
attrs:[],
children:[]
};
setFeatures(tender,indexName.children);
return indexName
}
function setFeatures(tender,arr) {
let features = tender.property.engineerFeatures?tender.property.engineerFeatures:[];
if(features.length == 0) return;
let parentMap = _.groupBy(features,"ParentID");
let rootNodes = parentMap["-1"]?parentMap["-1"]:parentMap[null];
for(let r of rootNodes){
arr.push(getFeatrue(r,parentMap))
}
}
function getFeatrue(node,parentMap){
let name = node.exportName?node.exportName:node.name;
if(parentMap[node.ID]){//如果有子节点,那么它就是一个节点
let tem = {
name:name.replace("*",""),
attrs:[],
children:[]
};
for(let s of parentMap[node.ID]){
let f = getFeatrue(s,parentMap);
f.children?tem.children.push(f):tem.attrs.push(f);//如果有children这个属性,则返回的是一个节点,如果没有,则返回的是一个属性
}
return tem;
}else {//如果没有子节点,那么它就是父节点的一个属性
if(node.isDetail == true){//如果是明细节点,则造一个明细节点
return {name:"明细",attrs:[{name:"名称",value:getValue(node)}],children:[]};
}
return {name:name.replace("*",""),value:getValue(node)};
}
}
function getValue(node) {
let value = node.value;
if(node.required == true || node.cellType == "number"){//必填项的值为空时导出0
if(value == undefined || value == null || value == "") value = "0";
}
return value;
}
}
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 infoRequireChecking(items) {
let error = [];
for(let i of items){
if(i.required == true && _.isEmpty(i.value)) error.push(`工程信息 - ${i.dispName}不能为空。`);
}
return error;
}
function getItemValueBykey(items,key) {
let item = _.find(items,{"key":key});
if(item) return item.value;
return ""
}
function getItemValueByDispName(items,dispName) {
let item = _.find(items,{"dispName":dispName});
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!=undefined&&attr.value!= null?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*?\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 = `${xmlStr}`;
//格式化
xmlStr = formatXml(xmlStr);
let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
saveAs(blob, '经济指标.ZBF');
}
}
$(function () {
$("#SEIMenu").click(async function () {
await exportSEI(projectObj.project.property.rootProjectID);
$("#exportMenu").removeClass("show");
})
});