|
|
@@ -32,7 +32,7 @@ const XMLStandard = (function () {
|
|
|
0: '1800', //其他未定义的大项费用
|
|
|
};
|
|
|
//文件类型
|
|
|
- const FILE_KIND = {
|
|
|
+ const FILE_KIND_TEXT = {
|
|
|
'1': '投标',
|
|
|
'2': '招标',
|
|
|
'3': '控制价'
|
|
|
@@ -141,17 +141,15 @@ const XMLStandard = (function () {
|
|
|
_util = _base.UTIL,
|
|
|
_cache = _base.CACHE;
|
|
|
|
|
|
- return function (userID, granularity, exportKind) {
|
|
|
+ /*
|
|
|
+ * 提取数据入口
|
|
|
+ * @param {String}userID 用户ID
|
|
|
+ * {Number}exportKind 导出类型(投标1、招标2、控制价3
|
|
|
+ * {Object}projectData 项目数据(项目自身的数据、建设、单项、单位的数据(projects表的数据),不包含详细的清单定额等数据)
|
|
|
+ * @return {Array} [{data: Object, exportKind: Number, fileName: String}]
|
|
|
+ * */
|
|
|
+ async function entry(userID, exportKind, projectData) {
|
|
|
let _failList = _cache.getItem('failList');
|
|
|
- //默认导出建设项目
|
|
|
- if (!granularity || ![1, 2, 3].includes(granularity)) {
|
|
|
- granularity = _config.GRANULARITY.PROJECT;
|
|
|
- }
|
|
|
- //默认导出投标文件
|
|
|
- if (!exportKind || ![1, 2, 3].includes(exportKind)) {
|
|
|
- exportKind = _config.EXPORT_KIND.Tender;
|
|
|
- }
|
|
|
- this.originalDatas = []; //转换后的数据(xml化前的数据结构)
|
|
|
|
|
|
//建设项目定义
|
|
|
//source:来源数据
|
|
|
@@ -948,49 +946,40 @@ const XMLStandard = (function () {
|
|
|
let curProjectEle = null, //建设项目节点
|
|
|
curTenderEle = null; //单位工程节点
|
|
|
|
|
|
- //获取需要导出的项目数据
|
|
|
+ // 获取需要导出的项目数据
|
|
|
//@param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,去找其建设项目下所有数据)
|
|
|
//@return {Object}(eleObj)
|
|
|
- async function loadProject(tenderID) {
|
|
|
- //拉取标段数据:建设项目、单项工程、单位工程数据
|
|
|
- let projectsData = await _util.getProjectByGranularity(granularity, tenderID, userID);
|
|
|
- if (!projectsData) {
|
|
|
- throw '获取项目数据错误';
|
|
|
- }
|
|
|
- //单项工程、单位工程按照树结构数据进行排序
|
|
|
- projectsData.children = _util.sortByNext(projectsData.children);
|
|
|
- for (let engData of projectsData.children) {
|
|
|
- engData.children = _util.sortByNext(engData.children);
|
|
|
- }
|
|
|
+ async function loadProject(projectData) {
|
|
|
+ console.log(projectData);
|
|
|
//标段
|
|
|
let project = new Project({
|
|
|
- basicInformation: projectsData.property.basicInformation,
|
|
|
- name: projectsData.name,
|
|
|
- fileKind: FILE_KIND[exportKind],
|
|
|
- taxType: projectsData.property.taxType ? _config.TAX_TYPE[projectsData.property.taxType] : ''
|
|
|
+ basicInformation: projectData.property.basicInformation,
|
|
|
+ name: projectData.name,
|
|
|
+ fileKind: FILE_KIND_TEXT[exportKind],
|
|
|
+ taxType: projectData.property.taxType ? _config.TAX_TYPE[projectData.property.taxType] : ''
|
|
|
});
|
|
|
curProjectEle = project;
|
|
|
//项目信息
|
|
|
- let projectInfo = new ProjectInfo({basicInformation: projectsData.property.basicInformation});
|
|
|
+ let projectInfo = new ProjectInfo({basicInformation: projectData.property.basicInformation});
|
|
|
project.children.push(projectInfo);
|
|
|
//招标信息
|
|
|
- let biddingInfo = new BiddingInfo({basicInformation: projectsData.property.basicInformation, summaryInfo: projectsData.summaryInfo[projectsData.ID]});
|
|
|
+ let biddingInfo = new BiddingInfo({basicInformation: projectData.property.basicInformation, summaryInfo: projectData.summaryInfo[projectData.ID]});
|
|
|
projectInfo.children.push(biddingInfo);
|
|
|
//投标信息 导出类型为投标时,才导出
|
|
|
if (exportKind === _config.EXPORT_KIND.Tender) {
|
|
|
- let bidInfo = new BidInfo({basicInformation: projectsData.property.basicInformation, summaryInfo: projectsData.summaryInfo[projectsData.ID]});
|
|
|
+ let bidInfo = new BidInfo({basicInformation: projectData.property.basicInformation, summaryInfo: projectData.summaryInfo[projectData.ID]});
|
|
|
projectInfo.children.push(bidInfo);
|
|
|
}
|
|
|
//编制说明
|
|
|
- let compilationIll = new CompilationIllustration({compilationIllustration: projectsData.property.compilationIllustration});
|
|
|
+ let compilationIll = new CompilationIllustration({compilationIllustration: projectData.property.compilationIllustration});
|
|
|
project.children.push(compilationIll);
|
|
|
//系统信息
|
|
|
let generatedTime = moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss'),
|
|
|
- sysInfoSource = {softInfo: projectsData.softInfo, generatedTime},
|
|
|
+ sysInfoSource = {softInfo: projectData.softInfo, generatedTime},
|
|
|
sysInfo = new SystemInfo(sysInfoSource);
|
|
|
project.children.push(sysInfo);
|
|
|
//费用构成
|
|
|
- let feeForm = new FeeFrom(projectsData.summaryInfo[projectsData.ID]);
|
|
|
+ let feeForm = new FeeFrom(projectData.summaryInfo[projectData.ID]);
|
|
|
project.children.push(feeForm);
|
|
|
//主要清单汇总 主要清单明细在loadTender中设置
|
|
|
let mainBillsSummaryEle = new MainBillsSummary();
|
|
|
@@ -999,13 +988,17 @@ const XMLStandard = (function () {
|
|
|
let appraisalSummary = new AppraisalSummary();
|
|
|
project.children.unshift(appraisalSummary);
|
|
|
//单项工程
|
|
|
- for (let eng of projectsData.children) {
|
|
|
- let engElement = await loadEngineering(projectsData.summaryInfo, eng);
|
|
|
+ for (let eng of projectData.children) {
|
|
|
+ let engElement = await loadEngineering(projectData.summaryInfo, eng);
|
|
|
project.children.push(engElement);
|
|
|
}
|
|
|
//主要清单汇总、评审材料汇总 排在后面
|
|
|
project.children = [...project.children.slice(2), mainBillsSummaryEle, appraisalSummary];
|
|
|
- return project;
|
|
|
+ return [{
|
|
|
+ data: project,
|
|
|
+ exportKind: exportKind,
|
|
|
+ fileName: `重庆标准交换数据(${FILE_KIND_TEXT[exportKind]}).QTF`
|
|
|
+ }];
|
|
|
}
|
|
|
//单位工程内的人材机ID: 用于代码映射关系 //单位工程级别,C+数组下标 <==> gljID
|
|
|
let tenderGljs = [];
|
|
|
@@ -1048,10 +1041,10 @@ const XMLStandard = (function () {
|
|
|
return engineering;
|
|
|
}
|
|
|
/*
|
|
|
- * 加载单位工程数据
|
|
|
- * @param {Object}summaryInfo(项目汇总信息映射) {Object}tenderData(单位工程数据)
|
|
|
- * @return {Object}
|
|
|
- * */
|
|
|
+ * 加载单位工程数据
|
|
|
+ * @param {Object}summaryInfo(项目汇总信息映射) {Object}tenderData(单位工程数据)
|
|
|
+ * @return {Object}
|
|
|
+ * */
|
|
|
async function loadTender(summaryInfo, tenderData) {
|
|
|
//获取单位工程详细数据
|
|
|
let tenderDetail = await _util.getTenderDetail(tenderData.ID, userID);
|
|
|
@@ -1171,10 +1164,10 @@ const XMLStandard = (function () {
|
|
|
return tender;
|
|
|
}
|
|
|
/*
|
|
|
- * 加载计算程序费用行
|
|
|
- * @param {Object}detail(单位工程的详细数据,清单定额等等)
|
|
|
- * @return {Object}
|
|
|
- * */
|
|
|
+ * 加载计算程序费用行
|
|
|
+ * @param {Object}detail(单位工程的详细数据,清单定额等等)
|
|
|
+ * @return {Object}
|
|
|
+ * */
|
|
|
function loadDXFY(detail) {
|
|
|
//单位工程费汇总
|
|
|
let tenderFeeSummary = new TenderFeeSummary();
|
|
|
@@ -1202,9 +1195,9 @@ const XMLStandard = (function () {
|
|
|
return tenderFeeSummary;
|
|
|
}
|
|
|
/*
|
|
|
- * 加载清单项目
|
|
|
- * @param {Object}node(清单树节点) {Object}detail
|
|
|
- * */
|
|
|
+ * 加载清单项目
|
|
|
+ * @param {Object}node(清单树节点) {Object}detail
|
|
|
+ * */
|
|
|
function loadBills(node, detail) {// allRation, allRationGlj, decimal,
|
|
|
let allRation = detail.Ration.datas,
|
|
|
allRationGlj = detail.ration_glj.datas,
|
|
|
@@ -1269,8 +1262,8 @@ const XMLStandard = (function () {
|
|
|
let source = {name: '', value: ''};
|
|
|
let execRst = reg.exec(f);
|
|
|
if (execRst) {
|
|
|
- source.name = execRst[1].replace(/^\d+\.{1}/, '').trim(); //去除开头(1.)序号,首位空格
|
|
|
- source.value = execRst[2].trim();
|
|
|
+ source.name = execRst[1].replace(/^\d+\.{1}/, '').trim(); //去除开头(1.)序号,首位空格
|
|
|
+ source.value = execRst[2].trim();
|
|
|
}
|
|
|
let featureEle = new Feature(source);
|
|
|
//let featureEle = new Feature({name: f.trim(), value: ''});
|
|
|
@@ -1395,10 +1388,10 @@ const XMLStandard = (function () {
|
|
|
return bills;
|
|
|
}
|
|
|
/*
|
|
|
- * 加载分部分项清单
|
|
|
- * @param {Object}detail
|
|
|
- * @return {Object || NULL}
|
|
|
- * */
|
|
|
+ * 加载分部分项清单
|
|
|
+ * @param {Object}detail
|
|
|
+ * @return {Object || NULL}
|
|
|
+ * */
|
|
|
function loadFBFX(detail) {
|
|
|
let fbfxBills = new FBFXBills();
|
|
|
let subEngNode = detail.Bills.tree.roots.find((node) => node.getFlag() === fixedFlag.SUB_ENGINERRING);
|
|
|
@@ -1443,10 +1436,10 @@ const XMLStandard = (function () {
|
|
|
return fbfxBills;
|
|
|
}
|
|
|
/*
|
|
|
- * 加载措施项目清单
|
|
|
- * @param {Object}detail
|
|
|
- * @return {Object}
|
|
|
- * */
|
|
|
+ * 加载措施项目清单
|
|
|
+ * @param {Object}detail
|
|
|
+ * @return {Object}
|
|
|
+ * */
|
|
|
function loadCSXM(detail) {
|
|
|
let measureNode = detail.Bills.tree.roots.find((node) => node.getFlag() === fixedFlag.MEASURE);
|
|
|
if (!measureNode) {
|
|
|
@@ -1539,10 +1532,10 @@ const XMLStandard = (function () {
|
|
|
}
|
|
|
}
|
|
|
/*
|
|
|
- * 加载其他项目清单,要出现此节点,需要遵循标准条件(至少含有一条相关明细)
|
|
|
- * @param {Object}detail
|
|
|
- * @return {Object || Null}
|
|
|
- * */
|
|
|
+ * 加载其他项目清单,要出现此节点,需要遵循标准条件(至少含有一条相关明细)
|
|
|
+ * @param {Object}detail
|
|
|
+ * @return {Object || Null}
|
|
|
+ * */
|
|
|
function loadOtherBills(detail) {
|
|
|
//其他项目清单元素
|
|
|
let otherEle = new OtherBills();
|
|
|
@@ -1563,7 +1556,7 @@ const XMLStandard = (function () {
|
|
|
//添加计日工元素
|
|
|
let dayWorkNode = detail.Bills.tree.items.find(node => node.getFlag() === fixedFlag.DAYWORK);
|
|
|
let dayWorkEle = new DayWork({fees: dayWorkNode.data.fees});
|
|
|
- if (dayWorkNode && dayWorkNode.children.length > 0) {
|
|
|
+ if (dayWorkNode && dayWorkNode.children.length > 0) {
|
|
|
//要显示计日工元素,人工、材料、施工机械,最少有一条含有子项(计日工项目)
|
|
|
let filterNodes = dayWorkNode.children.filter(node => [fixedFlag.LABOUR, fixedFlag.MATERIAL, fixedFlag.MACHINE].includes(node.getFlag()));
|
|
|
for (let fNode of filterNodes) {
|
|
|
@@ -1786,10 +1779,10 @@ const XMLStandard = (function () {
|
|
|
|
|
|
}
|
|
|
/*
|
|
|
- * 加载规费和税金清单,固定显示:规费、规费子项、税金、增值税、附加税、环境保护税这几个清单
|
|
|
- * @param {Object}detail
|
|
|
- * @return {Object}
|
|
|
- * */
|
|
|
+ * 加载规费和税金清单,固定显示:规费、规费子项、税金、增值税、附加税、环境保护税这几个清单
|
|
|
+ * @param {Object}detail
|
|
|
+ * @return {Object}
|
|
|
+ * */
|
|
|
function loadChargeTax(detail) {
|
|
|
let chargeTaxEle = new ChargeTaxBills();
|
|
|
let filterFlags = [
|
|
|
@@ -1832,10 +1825,10 @@ const XMLStandard = (function () {
|
|
|
return chargeTaxEle;
|
|
|
}
|
|
|
/*
|
|
|
- * 加载主要清单明细
|
|
|
- * @param {Obejct}parent(设置到的父项:主要清单汇总元素) {Object}detail
|
|
|
- * @return {void}
|
|
|
- * */
|
|
|
+ * 加载主要清单明细
|
|
|
+ * @param {Obejct}parent(设置到的父项:主要清单汇总元素) {Object}detail
|
|
|
+ * @return {void}
|
|
|
+ * */
|
|
|
function loadMainBillsItems(parent, detail) {
|
|
|
let mainBills = detail.Bills.datas.filter(data => {
|
|
|
let billsNode = detail.Bills.tree.nodes[`${detail.Bills.tree.prefix}${data.ID}`];
|
|
|
@@ -1857,10 +1850,10 @@ const XMLStandard = (function () {
|
|
|
}
|
|
|
}
|
|
|
/*
|
|
|
- * 加载人材机汇总相关:人材机汇总、评标、暂估
|
|
|
- * @param {Object}appraisalSummary(建设项目下的评审材料汇总) {Object}detail
|
|
|
- * @return {Object}
|
|
|
- * */
|
|
|
+ * 加载人材机汇总相关:人材机汇总、评标、暂估
|
|
|
+ * @param {Object}appraisalSummary(建设项目下的评审材料汇总) {Object}detail
|
|
|
+ * @return {Object}
|
|
|
+ * */
|
|
|
function loadGlj(appraisalSummary, detail) {
|
|
|
let gljList = detail.projectGLJ.datas.gljList;
|
|
|
let evalBidSeq = 1, //评标序号
|
|
|
@@ -1966,8 +1959,8 @@ const XMLStandard = (function () {
|
|
|
}
|
|
|
}
|
|
|
/*
|
|
|
- * 加载清单综合单价计算程序
|
|
|
- * */
|
|
|
+ * 加载清单综合单价计算程序
|
|
|
+ * */
|
|
|
function loadCalcProgram(detail) {
|
|
|
let calcProgram = detail.calcProgram;
|
|
|
if (!calcProgram) {
|
|
|
@@ -2008,22 +2001,59 @@ const XMLStandard = (function () {
|
|
|
}
|
|
|
return calcProgramEle.children.length > 0 ? calcProgramEle : null;
|
|
|
}
|
|
|
- /*
|
|
|
- * 转换导出数据
|
|
|
- * @param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,根据导出粒度去找其建设项目下相关数据)
|
|
|
- * @param {Number}curExportKind(导出的文件类型:1-投标 2-招标 3-控制价)
|
|
|
- * @return {void}
|
|
|
- * */
|
|
|
- this.transformData = async function (tenderID, curExportKind) {
|
|
|
- if (curExportKind) {
|
|
|
- exportKind = parseInt(curExportKind);
|
|
|
- }
|
|
|
- let eleData = await loadProject(tenderID);
|
|
|
- if (!eleData) {
|
|
|
- return;
|
|
|
+
|
|
|
+ // 返回提取的数据
|
|
|
+ return await loadProject(projectData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 重置工程编号,因为每一个费用定额,导出的结构都不相同,重置工程编号的逻辑需要各自定义
|
|
|
+ * @param {Array}codes 工程编号
|
|
|
+ * {Array}extractData 提取的数据
|
|
|
+ * @return {void}
|
|
|
+ * */
|
|
|
+ function resetContentCode(codes, extractData) {
|
|
|
+ // 提取到的数据全是以建设项目为根元素的数据,每份数据都要重置编号
|
|
|
+ extractData.forEach(obj => {
|
|
|
+ let idx = 0;
|
|
|
+ // 从建设项目元素中筛选出单项工程元素
|
|
|
+ let engs = _util.getElementFromSrc(obj.data, '单项工程');
|
|
|
+ engs.forEach(eng => {
|
|
|
+ // 从属性中找到编号项
|
|
|
+ let codeItem = eng.attrs.find(attr => attr.name === '编号');
|
|
|
+ codeItem.value = codes[idx++];
|
|
|
+ // 从单项工程元素中筛选出单位工程元素
|
|
|
+ let tenders = _util.getElementFromSrc(eng, '单位工程');
|
|
|
+ tenders.forEach(tender => {
|
|
|
+ let codeItem = tender.attrs.find(attr => attr.name === '编号');
|
|
|
+ codeItem.value = codes[idx++];
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 导出文件的结构逻辑,每个费用定额导出的最终文件结构要求可能不同,需要各自定义
|
|
|
+ * 重庆18费用定额,只有一个文件的时候直接导出qtf文件,文件数大于1时,导出zip压缩包
|
|
|
+ * @param {Array}fileData 文件数据
|
|
|
+ * @return {void}
|
|
|
+ * */
|
|
|
+ async function saveAsFile(fileData) {
|
|
|
+ if (fileData.length === 1) {
|
|
|
+ saveAs(fileData[0].blob, fileData[0].fileName);
|
|
|
+ } else if (fileData.length > 1) { //导出压缩包
|
|
|
+ let zip = new JSZip();
|
|
|
+ for (let file of fileData) {
|
|
|
+ zip.file(file.fileName, file.blob, {binary: true});
|
|
|
}
|
|
|
- console.log(eleData);
|
|
|
- this.originalDatas.push({data: eleData, fileName: `重庆标准交换数据(${FILE_KIND[exportKind]}).QTF`});
|
|
|
- };
|
|
|
+ let zipFile = await zip.generateAsync({type: 'blob'});
|
|
|
+ saveAs(zipFile, '重庆标准交换数据.zip');
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ return {
|
|
|
+ entry,
|
|
|
+ resetContentCode,
|
|
|
+ saveAsFile
|
|
|
+ };
|
|
|
})();
|