/* * @Descripttion: 安徽池州导入接口 * @Author: vian * @Date: 2020-09-21 17:40:45 */ // INTERFACE_EXPORT =,必须这么写,这样才能在导入时动态加载脚本后,覆盖前端代码 INTERFACE_IMPORT = (() => { 'use strict'; /** * * @param {String} areaKey - 地区标识,如:'安徽@马鞍山',有些地区的接口只是取值上有不同,共有一个接口脚本, 需要通过地区标识确定一些特殊处理 * @param {Object} xmlObj - xml经过x2js转换后的xml对象 * @return {Object} - 返回的格式需要统一,具体参考函数内返回的内容。返回的内容会经过一系列的统一处理形成可入库的数据。 */ async function entry(areaKey, xmlObj) { const { UTIL: { getValue, arrayValue, getBool, extractItemsRecur, } } = INTERFACE_EXPORT_BASE; const subArea = areaKey.split('@')[1]; // 提取基本信息,xml中提取出来的基本信息,最终会与模板基本信息进行合并处理。(接口内不需要处理合并) function setupInformation(projectSrc) { const gcxx = getValue(projectSrc, ['工程信息']); const zbxx = getValue(projectSrc, ['招投标信息', '招标信息']); // key:基本信息模板中的key,作为合并时的匹配字段 const info = [ { key: 'projNum', value: getValue(gcxx, ['_项目编号']) }, { key: 'constructingUnits', value: getValue(gcxx, ['_建设单位']) }, { key: 'startChainages', value: getValue(gcxx, ['_起始桩号']) }, { key: 'endChainages', value: getValue(gcxx, ['_终点桩号']) }, { key: 'constructionAddress', value: getValue(gcxx, ['_建设地址']) }, { key: 'projOverview', value: getValue(gcxx, ['_项目概况']) }, { key: 'natureConstruction', value: getValue(gcxx, ['_建设性质']) }, { key: 'roadGrade', value: getValue(gcxx, ['_专业划分']) }, { key: 'roadDistance', value: getValue(gcxx, ['_道路里程']) }, { key: 'designUnit', value: getValue(gcxx, ['_设计单位']) }, { key: 'taxMode', value: getValue(gcxx, ['_计税方式']) }, { key: 'projType', value: getValue(gcxx, ['_文件类型']) }, { key: 'tendereeName', value: getValue(zbxx, ['_招标人']) }, { key: 'tendereeTaxpayerIdentificationNo', value: getValue(zbxx, ['_招标人纳税识别号']) }, { key: 'tenderAuthorizer', value: getValue(zbxx, ['_招标法定代表人或其授权人']) }, { key: 'tenderAuthorizerIDNo', value: getValue(zbxx, ['_招标法人或其授权人身份证号']) }, { key: 'costConsultant', value: getValue(zbxx, ['_造价咨询人']) }, { key: 'costConsultantTaxpayerIdentificationNo', value: getValue(zbxx, ['_造价咨询人纳税识别号']) }, { key: 'consultantAuthorizer', value: getValue(zbxx, ['_造价咨询人法定代表人或其授权人']) }, { key: 'consultantAuthorizerTaxpayerIdentificationNo', value: getValue(zbxx, ['_造价咨询法人或其授权人身份证号']) }, { key: 'compileApprover', value: getValue(zbxx, ['_编制人']) }, { key: 'compileCertNo', value: getValue(zbxx, ['_编制人资格证号']) }, { key: 'compileDate', value: getValue(zbxx, ['_编制日期']) }, { key: 'reviewApprover', value: getValue(zbxx, ['_复核人']) }, { key: 'reviewCertNo', value: getValue(zbxx, ['_复核人资格证号']) }, { key: 'reviewDate', value: getValue(zbxx, ['_复核日期']) }, ]; return info; } // 提取清单数据 function setupBills(rootSrc, oneSevenSrc, dayWorkSrc) { // 章次为空的造价汇总表数据,为大项费用数据 const roots = arrayValue(rootSrc, ['造价汇总明细']) .filter(item => !getValue(item, ['_章次'])) .map(item => ({ name: getValue(item, ['_名称']), remark: getValue(item, ['_备注']) })); let oneSevenBills; let dayWorkBills; roots.forEach(item => { const simpleName = item.name ? item.name.replace(/\s/g, '') : ''; if (/100章至第700章|100章至700章/.test(simpleName)) { oneSevenBills = item; } else if (/计日工合计/.test(simpleName)) { dayWorkBills = item; } }); // 第100-700章的数据 if (oneSevenBills) { oneSevenBills.children = extractItemsRecur(oneSevenSrc, [['工程量清单明细']], (src) => ({ code: getValue(src, ['_子目号']), name: getValue(src, ['_子目名称']), unit: getValue(src, ['_单位']), quantity: getValue(src, ['_数量']), remark: getValue(src, ['_备注']), })); } // 计日工数据 if (dayWorkBills) { const title = '计日工信息标题'; const detail = '计日工信息明细'; dayWorkBills.children = extractItemsRecur(dayWorkSrc, [[title], [detail]], (src, curField) => { const name = getValue(src, ['_名称']); const simpleName = name ? name.replace(/\s/g, '') : '' if (curField === title && /计日工合计/.test(simpleName)) { // 计日工标题在根节点中已经提取了,不重复提取 return null; } const item = { name }; if (curField === detail) { item.code = getValue(src, ['_编号']); item.unit = getValue(src, ['_单位']); item.quantity = getValue(src, ['_暂定数量']); } return item; }); } return roots; } // 提取单位工程数据 function setupTender(tenderSrc) { const oneSevenSrc = getValue(tenderSrc, ['工程量清单表']); const dayWorkSrc = getValue(tenderSrc, ['计日工信息表']); const rootSrc = getValue(tenderSrc, ['造价汇总表']); return { name: getValue(tenderSrc, ['_标段名称']), bills: setupBills(rootSrc, oneSevenSrc, dayWorkSrc) }; } // 从xml对象提取需要的数据 function setupProject(projectSrc) { const tenders = arrayValue(projectSrc, ['公路工程数据', '公路标段工程']) .map(tenderSrc => setupTender(tenderSrc)); return { name: getValue(projectSrc, ['工程信息', '_项目名称']), info: setupInformation(projectSrc), tenders, }; } return setupProject(getValue(xmlObj, ['池州公路工程'])); } return { entry }; })();