|  | @@ -8,6 +8,49 @@
 | 
	
		
			
				|  |  |   * @version
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +const paramCode = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
 | 
	
		
			
				|  |  | +    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'aa', 'ab', 'ac', 'ad', 'ae', 'af',
 | 
	
		
			
				|  |  | +    'ag', 'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an', 'ao', 'ap', 'aq', 'ar', 'as', 'at', 'au',
 | 
	
		
			
				|  |  | +    'av', 'aw', 'ax', 'ay', 'az'];
 | 
	
		
			
				|  |  | +const defaultGlobalParams = [
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        template_id: 1,
 | 
	
		
			
				|  |  | +        node_id: 0,
 | 
	
		
			
				|  |  | +        param_id: 1,
 | 
	
		
			
				|  |  | +        code: 'g_a',
 | 
	
		
			
				|  |  | +        name: '公路基本造价',
 | 
	
		
			
				|  |  | +    },{
 | 
	
		
			
				|  |  | +        template_id: 1,
 | 
	
		
			
				|  |  | +        node_id: 0,
 | 
	
		
			
				|  |  | +        param_id: 2,
 | 
	
		
			
				|  |  | +        code: 'g_b',
 | 
	
		
			
				|  |  | +        name: '建安费',
 | 
	
		
			
				|  |  | +    },{
 | 
	
		
			
				|  |  | +        template_id: 1,
 | 
	
		
			
				|  |  | +        node_id: 0,
 | 
	
		
			
				|  |  | +        param_id: 3,
 | 
	
		
			
				|  |  | +        code: 'g_c',
 | 
	
		
			
				|  |  | +        name: '工程建设其他费用',
 | 
	
		
			
				|  |  | +    },{
 | 
	
		
			
				|  |  | +        template_id: 1,
 | 
	
		
			
				|  |  | +        node_id: 0,
 | 
	
		
			
				|  |  | +        param_id: 4,
 | 
	
		
			
				|  |  | +        code: 'g_d',
 | 
	
		
			
				|  |  | +        name: '路线总长度(主线长度)',
 | 
	
		
			
				|  |  | +    },{
 | 
	
		
			
				|  |  | +        template_id: 1,
 | 
	
		
			
				|  |  | +        node_id: 0,
 | 
	
		
			
				|  |  | +        param_id: 5,
 | 
	
		
			
				|  |  | +        code: 'g_e',
 | 
	
		
			
				|  |  | +        name: '建筑总面积{路线总长度(主线长度)×路基(或桥隧)宽度}',
 | 
	
		
			
				|  |  | +    },{
 | 
	
		
			
				|  |  | +        template_id: 1,
 | 
	
		
			
				|  |  | +        node_id: 0,
 | 
	
		
			
				|  |  | +        param_id: 6,
 | 
	
		
			
				|  |  | +        code: 'g_f',
 | 
	
		
			
				|  |  | +        name: '路基长度(指不含桥梁、隧道的路基长度(双幅平均计))',
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +];
 | 
	
		
			
				|  |  |  module.exports = app => {
 | 
	
		
			
				|  |  |      class TemplateNode extends app.BaseService {
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -23,6 +66,54 @@ module.exports = app => {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /**
 | 
	
		
			
				|  |  | +         * 从计算规则中解析出指标参数
 | 
	
		
			
				|  |  | +         * @param {String} rule - 指标规则
 | 
	
		
			
				|  |  | +         * @param {Number} nodeId - 指标节点id
 | 
	
		
			
				|  |  | +         * @param {Array} params - 参数列表
 | 
	
		
			
				|  |  | +         * @returns {*[]}
 | 
	
		
			
				|  |  | +         * @private
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        _parseParam(rule, nodeId, params) {
 | 
	
		
			
				|  |  | +            if (rule === '') { return; }
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  | +            const ruleParams = rule.split('/');
 | 
	
		
			
				|  |  | +            const nodeParams = params.filter(function (p) {
 | 
	
		
			
				|  |  | +                return p.node_id === nodeId;
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +            const addParam = function (paramName) {
 | 
	
		
			
				|  |  | +                if (paramName === '') { return ''; }
 | 
	
		
			
				|  |  | +                let param = self.ctx.helper.findObj(defaultGlobalParams, 'name', paramName);
 | 
	
		
			
				|  |  | +                if (!param) {
 | 
	
		
			
				|  |  | +                    param = self.ctx.helper.findObj(nodeParams, 'name', paramName);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!param) {
 | 
	
		
			
				|  |  | +                    const newParam = {
 | 
	
		
			
				|  |  | +                        template_id: 1,
 | 
	
		
			
				|  |  | +                        node_id: nodeId,
 | 
	
		
			
				|  |  | +                        param_id: nodeParams.length + 1,
 | 
	
		
			
				|  |  | +                        code: paramCode[nodeParams.length],
 | 
	
		
			
				|  |  | +                        name: paramName,
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                    nodeParams.push(newParam);
 | 
	
		
			
				|  |  | +                    params.push(newParam);
 | 
	
		
			
				|  |  | +                    return newParam.code;
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    return param.code;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (ruleParams.length > 1) {
 | 
	
		
			
				|  |  | +                const paramName1 = ruleParams[0];
 | 
	
		
			
				|  |  | +                const paramCode1 = addParam(paramName1);
 | 
	
		
			
				|  |  | +                const paramName2 = ruleParams.slice(1, ruleParams.length).join('/');
 | 
	
		
			
				|  |  | +                const paramCode2 = addParam(paramName2);
 | 
	
		
			
				|  |  | +                return [paramCode1 +  '/' + paramCode2,
 | 
	
		
			
				|  |  | +                    paramCode1 + '(' + paramName1 + ')' + '/' + paramCode2 + '(' + paramName2 + ')'];
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                const paramCode = addParam(rule);
 | 
	
		
			
				|  |  | +                return [paramCode, paramCode + '(' + rule + ')'];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  |           * 查找父节点(根据编号),忽略大小写
 | 
	
		
			
				|  |  |           * e.g. z1(z), z1-e(z1), z1-e-a(z1-e)
 | 
	
		
			
				|  |  |           * @param code
 | 
	
	
		
			
				|  | @@ -56,7 +147,7 @@ module.exports = app => {
 | 
	
		
			
				|  |  |           * @param {Array} indexes - 解析后的指标
 | 
	
		
			
				|  |  |           * @private
 | 
	
		
			
				|  |  |           */
 | 
	
		
			
				|  |  | -        _parseSheetData(excelSheet, nodes, indexes) {
 | 
	
		
			
				|  |  | +        _parseSheetData(excelSheet, nodes, indexes, params) {
 | 
	
		
			
				|  |  |              for (const row of excelSheet.data) {
 | 
	
		
			
				|  |  |                  if (!row[0]) { continue; }
 | 
	
		
			
				|  |  |                  if (this.ctx.helper.ValidTemplateNodeCode(row[0])) {
 | 
	
	
		
			
				|  | @@ -89,6 +180,7 @@ module.exports = app => {
 | 
	
		
			
				|  |  |                      } else if (row[7] === '√') {
 | 
	
		
			
				|  |  |                          index.index_type = 4;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    [index.calc_rule, index.parse_rule] = this._parseParam(index.rule, index.node_id, params);
 | 
	
		
			
				|  |  |                      indexes.push(index);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -105,9 +197,9 @@ module.exports = app => {
 | 
	
		
			
				|  |  |              const limit = 30000;
 | 
	
		
			
				|  |  |              const transaction = await this.db.beginTransaction();
 | 
	
		
			
				|  |  |              try {
 | 
	
		
			
				|  |  | -                const nodes = [], indexes = [];
 | 
	
		
			
				|  |  | +                const nodes = [], indexes = [], params = [];
 | 
	
		
			
				|  |  |                  for (const sheet of excelSheets) {
 | 
	
		
			
				|  |  | -                    this._parseSheetData(sheet, nodes, indexes);
 | 
	
		
			
				|  |  | +                    this._parseSheetData(sheet, nodes, indexes, params);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (nodes.length > 0) {
 | 
	
	
		
			
				|  | @@ -117,6 +209,7 @@ module.exports = app => {
 | 
	
		
			
				|  |  |                          throw '导入指标节点错误';
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      await this.ctx.service.templateIndex.importData(indexes, transaction);
 | 
	
		
			
				|  |  | +                    await this.ctx.service.templateParam.importData(params.concat(defaultGlobalParams), transaction);
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  |                      throw 'Excel文件中无标准的指标数据';
 | 
	
		
			
				|  |  |                  }
 |