瀏覽代碼

feat:安徽马鞍山等导入接口,提取导入数据

vian 5 年之前
父節點
當前提交
18b5b2f040

+ 1 - 1
modules/pm/controllers/pm_controller.js

@@ -931,7 +931,7 @@ module.exports = {
     getImportTemplateData: async function (req, res) {
         try {
             const data = JSON.parse(req.body.data);
-            const templateData = await pm_facade.getImportTemplateData(req.session.sessionCompilation._id, data.valuationID, data.feeRateStandard);
+            const templateData = await pm_facade.getImportTemplateData(req.session.sessionCompilation._id, data.valuationID, data.projectCount);
             callback(req, res, 0, 'success', templateData);
         } catch (err) {
             callback(req, res, 1, err, null);

+ 3 - 9
modules/pm/facade/pm_facade.js

@@ -2322,7 +2322,7 @@ async function getBasicInfo(compilationID, fileKind = null) {
 }
 
 // 获取导入接口功能的模板数据,用于将导入数据与模板数据进行合并生成新的项目
-async function getImportTemplateData(compilationID, valuationID, feeRateStandard) {
+async function getImportTemplateData(compilationID, valuationID, projectCount) {
     const engineeringLib = await engineeringModel.findOne({ feeName: '公路工程', valuationID }).lean();
     if (!engineeringLib) {
         return null;
@@ -2332,17 +2332,11 @@ async function getImportTemplateData(compilationID, valuationID, feeRateStandard
     const featureLib = await featureLibModel.findOne({ ID: featureLibID }).lean();
     const billsTemplateLibID = engineeringLib.tax_group[0].template_lib.id;
     const billsTemplate = await stdBillsTemplateModel.find({ libID: billsTemplateLibID }).lean();
-    let feeRateTemplate;
-    if (feeRateStandard) {
-        feeRateTemplate = await stdFeeRateModel.findOne({ libName: feeRateStandard }).lean();
-    } else {
-        const feeRateLibID = engineeringLib.tax_group[0].fee_lib.id;
-        feeRateTemplate = await stdFeeRateModel.findOne({ ID: feeRateLibID }).lean();
-    }
+    const projectCounter = await counter.counterDAO.getIDAfterCountSync(counter.moduleName.project, projectCount);
     return {
         basicInfo: infoLib && infoLib.info || [],
         feature: featureLib && featureLib.feature || [],
         bills: billsTemplate,
-        feeRate: feeRateTemplate && feeRateTemplate.rates || []
+        projectBeginID: projectCounter.sequence_value - projectCount + 1,
     };
 }

+ 23 - 0
web/building_saas/pm/js/pm_newMain.js

@@ -1657,6 +1657,29 @@ const projTreeObj = {
         updateData["self"] ={ParentID:parent.id(),NextSiblingID:next?next.id():-1};
         return updateData;
     },
+    // 创建建设项目的时候,根据选中位置获取所要创建建设项目的父ID、上兄弟节点ID、后兄弟节点ID
+    getRelProjectID: function (selected) {
+        let parent, pre, next;
+        if (!selected || selected.data.projType === projectType.project) {
+            parent = selected ? selected.parent : projTreeObj.tree._root;
+            pre = selected;
+            next = selected ? selected.nextSibling : projTreeObj.tree.firstNode();
+        } else if (selected.data.projType === projectType.folder) {
+            parent = selected;
+            pre = selected.lastChild()
+            next = null;
+        } else if (selected.data.projType === projectType.tender) {
+            const selectedProj = selected.parent;
+            parent = selectedProj ? selectedProj.parent : projTreeObj.tree._root;
+            pre = selectedProj;
+            next = selectedProj ? selectedProj.nextSibling : projTreeObj.tree.firstNode();
+        }
+        return {
+            parentProjectID: parent && parent.data ? parent.data.ID : -1,
+            preProjectID: pre && pre.data ? pre.data.ID : -1,
+            nextProjectID: next && next.data ? next.data.ID : -1
+        };
+    },
     getUploadToken:async function () {
         let result =await ajaxGet("/pm/api/getUploadToken");
         $("#confirm-import").show();

+ 1 - 7
web/building_saas/standard_interface/config.js

@@ -17,7 +17,7 @@ const INTERFACE_CONFIG = (() => {
   return {
     '安徽@马鞍山': {
       scriptName: 'anhui_maanshan.js',
-      feeRateStandard: '安徽估概预算-皖交建管函[2019]210号',
+      //feeRateStandard: '安徽估概预算-皖交建管函[2019]210号', 不需要导入费率了
       fileSuffix: {
         [BID_INVITATION]: '.MASGLZB',
         [BID_SUBMISSION]: '.MASGLTB',
@@ -26,7 +26,6 @@ const INTERFACE_CONFIG = (() => {
     },
     '安徽@淮北': {
       scriptName: 'anhui_maanshan.js',
-      feeRateStandard: '安徽估概预算-皖交建管函[2019]210号',
       fileSuffix: {
         [BID_INVITATION]: '.HBGLZB',
         [BID_SUBMISSION]: '.HBGLTB',
@@ -35,7 +34,6 @@ const INTERFACE_CONFIG = (() => {
     },
     '安徽@铜陵': {
       scriptName: 'anhui_maanshan.js',
-      feeRateStandard: '安徽估概预算-皖交建管函[2019]210号',
       fileSuffix: {
         [BID_INVITATION]: '.TLGLZB',
         [BID_SUBMISSION]: '.TLGLTB',
@@ -44,7 +42,6 @@ const INTERFACE_CONFIG = (() => {
     },
     '安徽@芜湖': {
       scriptName: 'anhui_maanshan.js',
-      feeRateStandard: '安徽估概预算-皖交建管函[2019]210号',
       fileSuffix: {
         [BID_INVITATION]: '.WHGLZB',
         [BID_SUBMISSION]: '.WHGLTB',
@@ -53,7 +50,6 @@ const INTERFACE_CONFIG = (() => {
     },
     '安徽@黄山': {
       scriptName: 'anhui_maanshan.js',
-      feeRateStandard: '安徽估概预算-皖交建管函[2019]210号',
       fileSuffix: {
         [BID_INVITATION]: '.HSGLZB',
         [BID_SUBMISSION]: '.HSGLTB',
@@ -62,7 +58,6 @@ const INTERFACE_CONFIG = (() => {
     },
     '安徽@宣城': {
       scriptName: 'anhui_maanshan.js',
-      feeRateStandard: '安徽估概预算-皖交建管函[2019]210号',
       fileSuffix: {
         [BID_INVITATION]: '.XCGLZB',
         [BID_SUBMISSION]: '.XCGLTB',
@@ -71,7 +66,6 @@ const INTERFACE_CONFIG = (() => {
     },
     '安徽@池州': {
       scriptName: 'anhui_chizhou.js',
-      feeRateStandard: '安徽估概预算-皖交建管函[2019]210号',
       fileSuffix: {
         [BID_INVITATION]: '.CZGLZB',
         [BID_SUBMISSION]: '.CZLTB',

+ 8 - 7
web/building_saas/standard_interface/export/anhui_maanshan.js

@@ -241,10 +241,10 @@ INTERFACE_EXPORT = (() => {
         '钢材及钢结构(桥梁)': 12,
         '钢材及钢结构(除桥以外不计夜)': 13,
         '费率为0': 17,
-        '路面(不计雨)': 4,
-        '构造物Ⅰ(不计雨)': 16,
-        '构造物Ⅲ(除桥以外)': 8,
-        '钢材及钢结构(除桥以外)': 13,
+        '路面(不计雨)': 18,
+        '构造物Ⅰ(不计雨)': 19,
+        '构造物Ⅲ(除桥以外)': 7,
+        '钢材及钢结构(除桥以外)': 20,
         '设备': 15,
         '量价': 14,
       };
@@ -297,16 +297,17 @@ INTERFACE_EXPORT = (() => {
       [fixedFlag.TOTAL_COST]: '6',
     };
     // 清单标题 造价书的第一层数据。
-    function QdBt(node) {
+    function QdBt(node, allNodes) {
       const row = node.row();
       const fee = isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderTotalFee')
+      const calcBase = node.data.calcBase ? cbParser.toFExpr(node.data.calcBase, allNodes) : '';
       const attrs = [
         { name: 'Xh', value: row, type: TYPE.INT }, // 序号
         { name: 'Bm', value: node.data.code }, // 编码
         { name: 'Name', value: node.data.name }, // 名称
         { name: 'Je', value: fee, type: TYPE.DECIMAL }, // 金额
         { name: 'Code', value: `F${row}` }, // 行引用
-        { name: 'Jsgs', value: node.data.calcBase }, // 计算基数
+        { name: 'Jsgs', value: calcBase }, // 计算基数
         { name: 'Lb', value: BillsTitleType[node.getFlag()], type: TYPE.INT }, // 类别
         { name: 'Bz', value: node.data.remark }, // 备注
       ];
@@ -630,7 +631,7 @@ INTERFACE_EXPORT = (() => {
       const qdxm = new QdXm();
       mainTree.roots.forEach(node => {
         const flag = node.getFlag();
-        const qdbt = new QdBt(node);
+        const qdbt = new QdBt(node, mainTree.items);
         if (flag === fixedFlag.ONE_SEVEN_BILLS) { // 100章到700章清单需要输出详细数据
           qdbt.children.push(...setupSubBills(node.children));
         } else if (flag === fixedFlag.DAYWORK_LABOR) {

+ 64 - 27
web/building_saas/standard_interface/import/anhui_maanshan.js

@@ -14,13 +14,14 @@ INTERFACE_IMPORT = (() => {
    * 
    * @param {String} areaKey - 地区标识,如:'安徽@马鞍山',有些地区的接口只是取值上有不同,共有一个接口脚本, 需要通过地区标识确定一些特殊处理
    * @param {Object} xmlObj - xml经过x2js转换后的xml对象
-   * @param {Object} template - 单位工程的一些模板数据,例如清单模板、标准费率数据等。
    */
-  async function entry(areaKey, xmlObj, template) {
+  async function entry(areaKey, xmlObj) {
     const {
       UTIL: {
         getValue,
         arrayValue,
+        getBool,
+        extractItemsRecur,
       }
     } = INTERFACE_EXPORT_BASE;
 
@@ -57,14 +58,14 @@ INTERFACE_IMPORT = (() => {
     }
 
     // 提取工程特征信息,xml中提取出来的工程特征,最终会与模板工程特征进行合并处理。(接口内不需要处理合并)
-    function setupFeature(projectSrc, tenderSrc) {
+    function setupFeature(midSrc, tenderSrc) {
       const feature = [
-        { key: 'singleProjNo', value: getValue(projectSrc, ['Dxgcxx', '_Dxgcbh']) },
-        { key: 'singleProjName', value: getValue(projectSrc, ['Dxgcxx', '_Dxgcmc']) },
+        { key: 'singleProjNo', value: getValue(midSrc, ['_Dxgcbh']) }, // 单项工程编号
+        { key: 'singleProjName', value: getValue(midSrc, ['_Dxgcmc']) }, // 单项工程名称
         { key: 'unitProjNo', value: getValue(tenderSrc, ['_Dwgcbh']) },
       ];
       // 工程所在地在费率项中
-      const feeRateItems = array(tenderSrc, ['Qfxx', 'JjFlx', 'JjFlxMx']);
+      const feeRateItems = arrayValue(tenderSrc, ['Qfxx', 'JjFlx', 'JjFlxMx']);
       const locationItem = feeRateItems.find(item => getValue(item, ['_Mc']) === '工程所在地');
       if (locationItem) {
         feature.push(locationItem);
@@ -100,25 +101,25 @@ INTERFACE_IMPORT = (() => {
     // 费率工程类型映射表, “接口中可有效识别的工程类型值,此接口是Qflb”与“袁建中对应费率标准的工程类型名称”映射
     const feeRateParentTypeMap = {
       1: '土方',
-      3: '石方',
       2: '运输',
+      3: '石方',
       4: '路面',
-      11: '隧道',
+      4: '路面(不计雨)',
       5: '构造物Ⅰ',
-      16: '构造物Ⅰ(不计冬)',
       6: '构造物Ⅱ',
-      9: '构造物Ⅲ(桥梁)',
+      8: '构造物Ⅲ(除桥以外)',
       8: '构造物Ⅲ(除桥以外不计雨夜)',
+      9: '构造物Ⅲ(桥梁)',
       10: '技术复杂大桥',
+      11: '隧道',
       12: '钢材及钢结构(桥梁)',
-      13: '钢材及钢结构(除桥以外不计夜)',
-      17: '费率为0',
-      4: '路面(不计雨)',
-      16: '构造物Ⅰ(不计雨)',
-      8: '构造物Ⅲ(除桥以外)',
       13: '钢材及钢结构(除桥以外)',
-      15: '设备',
+      13: '钢材及钢结构(除桥以外不计夜)',
       14: '量价',
+      15: '设备',
+      16: '构造物Ⅰ(不计冬)',
+      16: '构造物Ⅰ(不计雨)',
+      17: '费率为0',
     };
 
     const feeRateParamMap = {
@@ -141,12 +142,14 @@ INTERFACE_IMPORT = (() => {
       ylbx: '医疗保险(%)',
       gsbx: '工伤保险(%)',
       zfgj: '住房公积金(%)',
+      lr: '利润(%)',
+      sj: '税金(%)',
     };
 
     // 提取费率数据(费率值、费率参数),最终会与标准费率数据进行合并。(接口内不需要处理合并)
     function setupFeeRate(feeRateSrc) {
       // 提取费率值数据
-      const valuaItems = arrayValue(feeRateSrc, ['JjFlb', 'JjFlbMx'])
+      const valueItems = arrayValue(feeRateSrc, ['JjFlb', 'JjFlbMx'])
         .map(item => ({
           parentType: feeRateParentTypeMap[getValue(item, ['_Qflb'])] || '',
           type: feeRateValueMap[getValue(item, ['_Bm'])] || '',
@@ -155,27 +158,61 @@ INTERFACE_IMPORT = (() => {
       // 提取费率参数数据
       const paramItems = arrayValue(feeRateSrc, ['JjFlx', '_JjFlxMx'])
         .map(item => ({
-          
+          type: feeRateParamMap[getValue(item, ['_Bm'])] || '',
+          value: getValue(item, ['_ShuZhi'])
         }));
-      return {
+      return { valueItems, paramItems };
+    }
 
-      };
+    // 提取清单数据
+    function setupBills(billsSrc) {
+      const qdbt = 'QdBt';
+      const qdmx = 'QdMx';
+      const jrg = 'Jrg';
+      const jrgbt = 'JrgBt';
+      const fields = [[qdbt], [qdmx], [jrg, jrgbt]];
+      return extractItemsRecur(billsSrc, fields, (src, curField) => {
+        let item = {
+          name: getValue(src, ['_Name']),
+          remark: getValue(src, ['_Bz']),
+        }
+        if (curField === qdbt) {
+          item.code = getValue(src, ['_Bm']);
+          item.rowCode = getValue(src, ['_Code']); // 注意:行号标记,用于后续(通用处理)清单基数进行转换(行引用转换为ID引用) 
+          item.calcBase = getValue(src, ['_Jsgs']);
+        } else if (curField === qdmx) {
+          item.code = getValue(src, ['_Qdbm']);
+          item.unit = getValue(src, ['_Dw']);
+          item.quantity = getValue(src, ['_Sl']);
+          item.calcBase = getValue(src, ['_Jsgs']);
+          item.specialProvisional = getBool(src, ['_Iszg']) ? '专业工程' : ''; // 是否暂定
+          item.unitPriceAnalysis = +getBool(src, ['_Djfx']); // 单价分析
+        }
+        return item;
+      });
     }
 
     // 提取单位工程数据
-    function setupTender(projectSrc, tenderSrc) {
-      const feeRateSrc = getValue(tenderSrc, ['Qfxx']);
+    function setupTender(midSrc, tenderSrc) {
+      //const feeRateSrc = getValue(tenderSrc, ['Qfxx']);
+      const billsSrc = getValue(tenderSrc, ['QdXm']);
       return {
         name: getValue(tenderSrc, ['_Dwgcmc']),
-        feature: setupFeature(projectSrc, tenderSrc),
-        feeRate: setupFeeRate(feeRateSrc),
-      }
+        feature: setupFeature(midSrc, tenderSrc),
+        //feeRate: setupFeeRate(feeRateSrc),
+        bills: setupBills(billsSrc)
+      };
     }
 
     // 从xml对象提取需要的数据
     function setupProject(projectSrc) {
-      const tenders = arrayValue(projectSrc, ['Dxgcxx', 'Dwgcxx'])
-        .map(tenderSrc => setupTender(projectSrc, tenderSrc))
+      const tenders = [];
+      arrayValue(projectSrc, ['Dxgcxx'])
+        .forEach(midSrc => {
+          arrayValue(midSrc, ['Dwgcxx'])
+            .forEach(tenderSrc => tenders.push(setupTender(midSrc, tenderSrc)))
+        });
+
       return {
         name: getValue(projectSrc, ['_Xmmc']),
         info: setupInformation(projectSrc),

+ 147 - 38
web/building_saas/standard_interface/import/base.js

@@ -1,3 +1,4 @@
+
 /*
  * @Descripttion: 导入通用代码
  * @Author: vian
@@ -156,31 +157,7 @@ const INTERFACE_EXPORT_BASE = (() => {
     return rst;
   }
 
-  /*
-   * 递归获取相关数据,eg:获取组织措施清单下的所有子清单,该子清单们可能由分类及公式措施项各种组合组成。(参考调用处)
-   * @param {Object}src(数据源) {Array}fields(二维数组,数组里的成员由需要取的字段组成)
-   *         eg: ['组织措施分类'], ['公式计算措施项'],该层数据可能由组织措施分类 或 公式计算措施项组成 (同层不可同时存在)
-   *        {Function} 获得源数据后,需要提取的数据方法
-   * @return {Array}
-   * */
-  function getItemsRecur(src, fields, extractFuc) {
-    let itemsSrc = [];
-    let curField = [''];
-    for (const field of fields) {
-      itemsSrc = arrayValue(src, field);
-      if (itemsSrc.length) {
-        curField = field;
-        break;
-      }
-    }
-    return itemsSrc.map(itemSrc => {
-      const obj = extractFuc(itemSrc, curField);
-      obj.items = getItemsRecur(itemSrc, fields, extractFuc);
-      return obj;
-    });
-  }
-
-  // 递归获取相关数据,与上方的方法不同的点在:同层可能出现不同节点,上方方法暂时不取消(防止bug)
+  // 递归获取相关数据,(同层可以出现不同节点)
   // fields内字段的顺序即决定了提取数据类型的顺序,如fields = [['gruop'], ['item']],则提取的数据同层中group数据在item数据之前
   function extractItemsRecur(src, fields, extractFuc) {
     const rst = [];
@@ -188,8 +165,8 @@ const INTERFACE_EXPORT_BASE = (() => {
       const itemsSrc = arrayValue(src, field);
       if (itemsSrc.length) {
         const items = itemsSrc.map(itemSrc => {
-          const obj = extractFuc(itemSrc, field);
-          obj.items = extractItemsRecur(itemSrc, fields, extractFuc);
+          const obj = extractFuc(itemSrc, field[0]);
+          obj.children = extractItemsRecur(itemSrc, fields, extractFuc);
           return obj;
         });
         rst.push(...items);
@@ -210,14 +187,152 @@ const INTERFACE_EXPORT_BASE = (() => {
     mergeDataRecur,
     getFlag,
     getBool,
-    getItemsRecur,
     extractItemsRecur,
   });
 
+  /**
+   * 合并基本信息或工程特征
+   * @param {Array} source - 提取的数据
+   * @param {Array} target - 模板数据
+   * @return {Array}
+   */
+  function mergeInfo(source, target) {
+    source.forEach(item => mergeChild(item, target));
+    return target;
+
+    function mergeChild(item, target) {
+      for (const child of target) {
+        if (child.key === item.key) {
+          child.value = item.value;
+          return true;
+        }
+        if (child.items && child.items.length) {
+          const rst = mergeChild(item, child.items);
+          if (rst) {
+            return true;
+          }
+        }
+      }
+      return false;
+    }
+  }
+
+  // 处理清单
+  function handleBills(tenderBills, tenderID, billsTemplate) {
+    // 给清单设置ID、projectID
+    const rowCodeData = []; // 行号数据,用于转换行引用
+    const toBeTransformBills = []; // 待转换的清单
+    function setBills(bills) {
+      bills.forEach(child => {
+        child.ID = uuid.v1();
+        child.projectID = tenderID;
+        if (child.rowCode) {
+          rowCodeData.push({ reg: new RegExp(`\\b${child.rowCode}\\b`, 'g'), ID: child.ID });
+        }
+        if (child.calcBase) {
+          toBeTransformBills.push(child);
+        }
+        if (child.children && child.children.length) {
+          setBills(child.children);
+        }
+      });
+    }
+    setBills(tenderBills);
+    // 转换计算基数,将行引用转换为ID引用
+    toBeTransformBills.forEach(bills => {
+      rowCodeData.forEach(({ reg, ID }) => {
+        bills.calcBase = bills.calcBase.replace(reg, `@${ID}`);
+      });
+    });
+    // 将提取的清单数据合并进清单模板数据
+  }
+
+  // 处理单位工程数据
+  function handleTenderData(tenders, templateData) {
+    tenders.forEach((tender, index) => {
+      tender.compilation = compilationData._id;
+      tender.userID = userID;
+      tender.ID = templateData.projectBeginID + index + 1;
+      tender.ParentID = templateData.projectBeginID;
+      tender.NextSiblingID = index === tenders.length - 1 ? -1 : templateData.projectBeginID + index + 2;
+      tender.projType = projectType.tender;
+      const featureTarget = _.cloneDeep(templateData.feature); // 必须拷贝出一份新数据,否则会被下一个单位工程覆盖
+      const rationValuationData = JSON.parse(rationValuation)[0];
+      const engineeringList = rationValuationData.engineering_list;
+      const engineeringLib = engineeringList.find(item => item.lib.visible);
+      if (!engineeringLib) {
+        throw '不存在可用工程专业。';
+      }
+      const taxData = engineeringLib.lib.tax_group[0];
+      tender.property = {
+        rootProjectID: tender.ParentID,
+        region: '全省',
+        engineering_id: engineeringLib.engineering_id,
+        engineeringName: engineeringLib.lib.name,
+        feeStandardName: engineeringLib.lib.feeName,
+        engineering: engineeringLib.engineering,
+        isInstall: engineeringLib.lib.isInstall,
+        projectEngineering: engineeringLib.lib.projectEngineering,
+        valuation: rationValuationData.id,
+        valuationName: rationValuationData.name,
+        valuationType: commonConstants.ValuationType.BOQ, // 必为工程量清单
+        boqType: commonConstants.BOQType.BID_SUBMISSION, // 导入后必为投标
+        taxType: taxData.taxType,
+        projectFeature: mergeInfo(tender.feature, featureTarget),
+        featureLibID: engineeringLib.lib.feature_lib[0] && engineeringLib.lib.feature_lib[0].id || '',
+        calcProgram: { name: taxData.program_lib.name, id: taxData.program_lib.id },
+        colLibID: taxData.col_lib.id,
+        templateLibID: taxData.template_lib.id,
+        unitPriceFile: { name: tender.name, id: '' }, // 新建单价文件
+        feeFile: { name: tender.name, id: `newFeeRate@@${taxData.fee_lib.id}` } // 新建费率文件
+      };
+      delete tender.feature;
+      handleBills(tender.bills, tender.ID, templateData.bills);
+    });
+  }
+
+  /**
+   * 将接口中提取出来数据转换成可入库的有效数据
+   * 因为无法保证这一套逻辑能不能兼容以后的所有接口,因此提取数据与标准数据模板的合并放在前端进行。
+   * 当统一逻辑无法满足某一接口时,接口可以根据标准模板数据自行进行相关处理。
+   * @param {Object} importData - 各接口从xml提取出来的数据
+   * @return {Promise<Object>}
+   */
+  async function handleImportData(importData) {
+    const valuationID = compilationData.ration_valuation[0].id;
+    if (!Array.isArray(importData.tenders) && !importData.tenders.length) {
+      throw '导入的文件中不存在有效的标段数据。';
+    }
+    const projectCount = 1 + importData.tenders.length;
+    const templateData = await ajaxPost('/pm/api/getImportTemplateData', { user_id: userID, valuationID, projectCount });
+    if (!templateData) {
+      throw '无法获取有效模板数据。';
+    }
+    console.log(templateData);
+    // 处理建设项目数据
+    importData.compilation = compilationData._id;
+    importData.userID = userID;
+    importData.ID = templateData.projectBeginID;
+    const { parentProjectID, preProjectID, nextProjectID } = projTreeObj.getRelProjectID(projTreeObj.tree.selected);
+    importData.ParentID = parentProjectID;
+    importData.preID = preProjectID;
+    importData.NextSiblingID = nextProjectID;
+    importData.projType = projectType.project;
+    importData.proprty = {
+      valuationType: commonConstants.ValuationType.BOQ, // 必为工程量清单
+      boqType: commonConstants.BOQType.BID_SUBMISSION, // 导入后必为投标
+      basicInformation: mergeInfo(importData.info, templateData.basicInfo) // 将提取的基本信息数据与标准基本信息数据进行合并(目前只赋值,没有匹配到的不追加)
+    };
+    delete importData.info;
+    // 处理单位工程数据
+    handleTenderData(importData.tenders, templateData);
+
+    console.log(importData);
+  }
 
   /*
   * 读取文件转换为utf-8编码的字符串
-  * @param {Blob}file
+  * @param {Blob} file
   * @return {Promise}
   * */
   function readAsTextSync(file) {
@@ -238,17 +353,10 @@ const INTERFACE_EXPORT_BASE = (() => {
    * @param {Function} entryFunc - 各导入接口提取导入数据方法
    * @param {File} file - 导入的文件
    * @param {String} areaKey - 地区标识,如:'安徽@马鞍山'
-   * @param {String} feeRateStandard - 导入接口地区对应的费率标准名称
    * @param {Boolean} escape - 是否需要避免xml中的实体字符转换
    * @return {Promise<Object>}
    */
-  async function extractImportData(entryFunc, file, areaKey, feeRateStandard, escape = false) {
-    const valuationID = compilationData.ration_valuation[0].id;
-    const templateData = await ajaxPost('/pm/api/getImportTemplateData', { user_id: userID, valuationID, feeRateStandard });
-    if (!templateData) {
-      throw '无法获取有效模板数据。';
-    }
-    console.log(templateData);
+  async function extractImportData(entryFunc, file, areaKey, escape = false) {
     // 将二进制文件转换成字符串
     let xmlStr = await readAsTextSync(file);
     if (escape) {
@@ -263,7 +371,8 @@ const INTERFACE_EXPORT_BASE = (() => {
     if (!xmlObj) {
       throw '无有效数据。';
     }
-    return await entryFunc(areaKey, xmlObj, templateData);
+    const importData = await entryFunc(areaKey, xmlObj);
+    await handleImportData(importData);
   }
 
   return {

+ 2 - 2
web/building_saas/standard_interface/import/view.js

@@ -47,8 +47,7 @@ const IMPORT_VIEW = (() => {
         $.bootstrapLoading.progressStart('导入文件', true);
         $("#progress_modal_body").text('正在导入接口文件,请稍候……');
         await STD_INTERFACE.loadScriptByArea(areaKey, STD_INTERFACE.ScriptType.IMPORT);
-        const feeRateStandard = INTERFACE_CONFIG[areaKey].feeRateStandard;
-        const importData = await INTERFACE_EXPORT_BASE.extractImportData(INTERFACE_IMPORT.entry, file, areaKey, feeRateStandard);
+        const importData = await INTERFACE_EXPORT_BASE.extractImportData(INTERFACE_IMPORT.entry, file, areaKey);
         // 转换成File实例
         /* const blob = new Blob([JSON.stringify(importData)], { type: 'text/plain;charset=utf-8' });
         const key = `${uuid.v1()}.json`;
@@ -60,6 +59,7 @@ const IMPORT_VIEW = (() => {
         await ajaxPost('/pm/import/importInterface', { key });
         await importProcessChecking(key, null, (projectData) => handleProjectAfterChecking(projectData)); */
       } catch (err) {
+        console.log(err);
         alert(err);
       } finally {
         setTimeout(() => $.bootstrapLoading.progressEnd(), 500);