|
|
@@ -0,0 +1,143 @@
|
|
|
+/*
|
|
|
+ * @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
|
|
|
+ };
|
|
|
+
|
|
|
+})();
|