|
|
@@ -243,9 +243,10 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
* @param {Array} source - 从xml提取出来的清单
|
|
|
* @param {Array} target - 清单模板数据
|
|
|
* @param {Object} parent - 匹配到模板清单的父清单
|
|
|
+ * @param {Boolean} onlyImportMatchBills - 是否只导入文件中的清单,未匹配的模板清单不生成
|
|
|
* @return {void}
|
|
|
*/
|
|
|
- function mergeBills(source, target, parent) {
|
|
|
+ function mergeBills(source, target, parent, matchedFlags) {
|
|
|
source.forEach((bills, index) => {
|
|
|
// 为了大项费用排序
|
|
|
if (!parent) {
|
|
|
@@ -281,15 +282,15 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
}
|
|
|
}
|
|
|
if (matched) {
|
|
|
+ matchedFlags.push(getFlag(matched));
|
|
|
assignAttr(matched, bills);
|
|
|
if (bills.children && bills.children.length) {
|
|
|
- mergeBills(bills.children, matched.children, matched);
|
|
|
+ mergeBills(bills.children, matched.children, matched, matchedFlags);
|
|
|
}
|
|
|
} else {
|
|
|
target.push(bills);
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -297,12 +298,33 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
* @param {Array} tenderBills - 从xml提取出来的清单
|
|
|
* @param {Array} billsTarget - 拷贝一份的模板清单,用于合并提取清单
|
|
|
* @param {Number} tenderID - 单位工程ID
|
|
|
+ * @param {Boolean} onlyImportMatchBills - 是否只导入文件中的清单,未匹配的模板清单不生成
|
|
|
* @return {Array}
|
|
|
*/
|
|
|
- function handleBills(tenderBills, billsTarget, tenderID) {
|
|
|
+ function handleBills(tenderBills, billsTarget, tenderID, onlyImportMatchBills) {
|
|
|
const rst = [];
|
|
|
// 将提取的清单数据合并进清单模板数据
|
|
|
- mergeBills(tenderBills, billsTarget, null);
|
|
|
+ const matchedFlags = [];
|
|
|
+ mergeBills(tenderBills, billsTarget, null, matchedFlags);
|
|
|
+
|
|
|
+ // 如果只导入文件中有的清单,除100-700/900章清单、报价清单外,其他未匹配到的固定清单模板,均不导入
|
|
|
+ function removeNotMatchFlagBills(bills) {
|
|
|
+ const rst = [];
|
|
|
+ bills.forEach(item => {
|
|
|
+ const flag = getFlag(item);
|
|
|
+ if (!flag || [fixedFlag.ONE_SEVEN_BILLS, fixedFlag.TOTAL_COST].includes(flag) || matchedFlags.includes(flag)) {
|
|
|
+ rst.push(item);
|
|
|
+ }
|
|
|
+ if (flag && ![fixedFlag.ONE_SEVEN_BILLS, fixedFlag.TOTAL_COST].includes(flag) && item.children && item.children.length) {
|
|
|
+ item.children = removeNotMatchFlagBills(item.children);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return rst;
|
|
|
+ }
|
|
|
+ if (onlyImportMatchBills) {
|
|
|
+ billsTarget = removeNotMatchFlagBills(billsTarget)
|
|
|
+ }
|
|
|
+
|
|
|
// 大项费用按照清单标题排序
|
|
|
billsTarget.sort((a, b) => a.seq - b.seq);
|
|
|
// 给清单设置数据
|
|
|
@@ -399,7 +421,7 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
}
|
|
|
|
|
|
// 处理单位工程数据
|
|
|
- function handleTenderData(tenders, templateData, rationValuationData, engineeringLib) {
|
|
|
+ function handleTenderData(tenders, templateData, rationValuationData, engineeringLib, areaKey, onlyImportMatchBills) {
|
|
|
tenders.forEach((tender, index) => {
|
|
|
tender.compilation = compilationData._id;
|
|
|
tender.userID = userID;
|
|
|
@@ -422,6 +444,7 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
featureSource.push({ key: 'engineering', value: engineeringLib.lib.name });
|
|
|
}
|
|
|
tender.property = {
|
|
|
+ areaKey,
|
|
|
rootProjectID: tender.ParentID,
|
|
|
region: '全省',
|
|
|
engineering_id: engineeringLib.engineering_id,
|
|
|
@@ -445,7 +468,7 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
};
|
|
|
delete tender.feature;
|
|
|
const tenderDataBills = getTemplateBillsTarget(templateData.bills);
|
|
|
- tender.bills = handleBills(tender.bills, tenderDataBills, tender.ID,); // 必须要拷贝一份,否则多单位工程情况下,前单位工程的清单数据会被后单位工程的覆盖
|
|
|
+ tender.bills = handleBills(tender.bills, tenderDataBills, tender.ID, onlyImportMatchBills); // 必须要拷贝一份,否则多单位工程情况下,前单位工程的清单数据会被后单位工程的覆盖
|
|
|
// 给暂估材料和评标材料设置项目数据
|
|
|
const setGLJRefFunc = glj => {
|
|
|
glj.ID = uuid.v1();
|
|
|
@@ -465,9 +488,11 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
* 因为无法保证这一套逻辑能不能兼容以后的所有接口,因此提取数据与标准数据模板的合并放在前端进行。
|
|
|
* 当统一逻辑无法满足某一接口时,接口可以根据标准模板数据自行进行相关处理。
|
|
|
* @param {Object} importData - 各接口从xml提取出来的数据
|
|
|
+ * @param {String} areaKey - 接口地区
|
|
|
+ * @param {Boolean} onlyImportMatchBills - 是否只导入文件中的清单,未匹配的模板清单不生成
|
|
|
* @return {Promise<Object>}
|
|
|
*/
|
|
|
- async function handleImportData(importData) {
|
|
|
+ async function handleImportData(importData, areaKey, onlyImportMatchBills) {
|
|
|
const valuationID = compilationData.ration_valuation[0].id;
|
|
|
if (!Array.isArray(importData.tenders) && !importData.tenders.length) {
|
|
|
throw '导入的文件中不存在有效的标段数据。';
|
|
|
@@ -514,7 +539,7 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
};
|
|
|
delete importData.info;
|
|
|
// 处理单位工程数据
|
|
|
- handleTenderData(importData.tenders, templateData, rationValuationData, engineeringLib);
|
|
|
+ handleTenderData(importData.tenders, templateData, rationValuationData, engineeringLib, areaKey, onlyImportMatchBills);
|
|
|
console.log(importData);
|
|
|
}
|
|
|
|
|
|
@@ -542,9 +567,10 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
* @param {File} file - 导入的文件
|
|
|
* @param {String} areaKey - 地区标识,如:'安徽@马鞍山'
|
|
|
* @param {Boolean} escape - 是否需要避免xml中的实体字符转换
|
|
|
+ * @param {Boolean} onlyImportMatchBills - 是否只导入文件中的清单,未匹配的模板清单不生成
|
|
|
* @return {Promise<Object>}
|
|
|
*/
|
|
|
- async function extractImportData(entryFunc, file, areaKey, escape = false) {
|
|
|
+ async function extractImportData(entryFunc, file, areaKey, escape = false, onlyImportMatchBills = false) {
|
|
|
// 将二进制文件转换成字符串
|
|
|
let xmlStr = await readAsTextSync(file);
|
|
|
if (escape) {
|
|
|
@@ -560,7 +586,8 @@ const INTERFACE_EXPORT_BASE = (() => {
|
|
|
throw '无有效数据。';
|
|
|
}
|
|
|
const importData = await entryFunc(areaKey, xmlObj);
|
|
|
- await handleImportData(importData);
|
|
|
+ console.log(areaKey);
|
|
|
+ await handleImportData(importData, areaKey, onlyImportMatchBills);
|
|
|
return importData;
|
|
|
}
|
|
|
|