| 
					
				 | 
			
			
				@@ -12,45 +12,8 @@ const paramCode = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', ' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     '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: '路基长度(指不含桥梁、隧道的路基长度(双幅平均计))', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const paramConst = require('../const/template_param'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const nodeConst = require('../const/template_node'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     class TemplateNode extends app.BaseService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -66,6 +29,39 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 加载默认节点参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Array} params - 参数数组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Array} defaultParams - 默认参数数组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} nodeId - 指标节点Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @private 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _loadDefaultParam(params, defaultParams, nodeId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const newParams = JSON.parse(JSON.stringify(defaultParams)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (const p of newParams) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                p.node_id = nodeId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                params.push(p); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 过滤指标节点的参数(含节点参数初始化) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Array} params - 全部参数数组 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} nodeId - 指标节点Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @private 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _filterNodeParams(params, nodeId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let nodeParams = params.filter(function (p) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return p.node_id === nodeId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (nodeParams.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return nodeParams; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this._loadDefaultParam(params, paramConst.defaultNodeParams, nodeId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return params.filter(function (p) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return p.node_id === nodeId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * 从计算规则中解析出指标参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {String} rule - 指标规则 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} nodeId - 指标节点id 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -77,12 +73,10 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (rule === '') { return; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const self = this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const ruleParams = rule.split('/'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const nodeParams = params.filter(function (p) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return p.node_id === nodeId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const nodeParams = this._filterNodeParams(params, nodeId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const addParam = function (paramName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (paramName === '') { return ''; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                let param = self.ctx.helper.findObj(defaultGlobalParams, 'name', paramName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let param = self.ctx.helper.findObj(paramConst.defaultGlobalParams, 'name', paramName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (!param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     param = self.ctx.helper.findObj(nodeParams, 'name', paramName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -93,6 +87,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         param_id: nodeParams.length + 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         code: paramCode[nodeParams.length], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         name: paramName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        match_type: paramConst.matchType.non_match, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     nodeParams.push(newParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     params.push(newParam); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -100,7 +95,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     return param.code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (ruleParams.length > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const paramName1 = ruleParams[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const paramCode1 = addParam(paramName1); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -209,7 +204,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         throw '导入指标节点错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     await this.ctx.service.templateIndex.importData(indexes, transaction); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    await this.ctx.service.templateParam.importData(params.concat(defaultGlobalParams), transaction); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this.ctx.service.templateParam.importData(params.concat(paramConst.defaultGlobalParams), transaction); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     throw 'Excel文件中无标准的指标数据'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -218,11 +213,32 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 result = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } catch(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await transaction.rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 throw err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 保存指标节点绑定信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @returns {Promise<*>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        async updateNodeMatch(data, condition) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (this.ctx.helper.validMatchCode(data.match_key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    data.match_type = nodeConst.matchType.code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    data.match_type = nodeConst.matchType.name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.db.update(this.tableName, data, {where: condition}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return await this.getDataByCondition(condition); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return TemplateNode; 
			 |