|
@@ -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文件中无标准的指标数据';
|
|
|
}
|