'use strict'; /** * 指标节点业务类 * * @author Mai * @date 2018/4/19 * @version */ module.exports = app => { class TemplateNode extends app.BaseService { /** * 构造函数 * * @param {Object} ctx - egg全局context * @return {void} */ constructor(ctx) { super(ctx); this.tableName = 'template_node'; } /** * 查找父节点(根据编号),忽略大小写 * e.g. z1(z), z1-e(z1), z1-e-a(z1-e) * @param code * @param nodes * @returns {*} * @private */ _findParentId(code, nodes) { if (nodes.length === 0) { return -1; } const codeList = code.split('-'); if (codeList.length > 1) { codeList.splice(codeList.length - 1); const parentCode = codeList.join('-'); for (const node of nodes) { if (parentCode.toLowerCase() === node.code.toLowerCase()) { return node.node_id; } } } else { for (const node of nodes) { if (code.toLowerCase().search(node.code.toLowerCase()) === 0) { return node.node_id; } } } } /** * 解析一个Excel工作表内的全部 指标节点 和 指标 * @param {Object} excelSheet * @param {Array} nodes - 解析后的指标节点 * @param {Array} indexes - 解析后的指标 * @private */ _parseSheetData(excelSheet, nodes, indexes) { for (const row of excelSheet.data) { if (!row[0]) { continue; } if (this.ctx.helper.ValidTemplateNodeCode(row[0])) { if (!this.ctx.helper.findObj(nodes, 'code', row[0])) { const node = { template_id: 1, node_id: nodes.length + 1, node_pid: this._findParentId(row[0], nodes) || -1, code: row[0], name: row[1], }; nodes.push(node); } } else if (this.ctx.helper.ValidTemplateIndexCode(row[0])) { const index = { code: row[0], name: row[1], unit1: row[2], unit2: row[3], node_id: nodes.length, index_id: indexes.length + 1, rule: row[9] }; if (row[4] === '√') { index.index_type = 1; } else if (row[5] === '√') { index.index_type = 2; } else if (row[6] === '√') { index.index_type = 3; } else if (row[7] === '√') { index.index_type = 4; } indexes.push(index); } } } /** * 导入Excel数据 * * @param {Array} excelSheets - Excel文件中的全部工作表 * @returns {Promise} */ async importData(excelSheets) { let result = false; const limit = 30000; const transaction = await this.db.beginTransaction(); try { const nodes = [], indexes = []; for (const sheet of excelSheets) { this._parseSheetData(sheet, nodes, indexes); } if (nodes.length > 0) { await transaction.delete(this.tableName, {template_id: 1}); const insertResult = await transaction.insert(this.tableName, nodes); if (insertResult.affectedRows !== nodes.length) { throw '导入指标节点错误'; } await this.ctx.service.templateIndex.importData(indexes, transaction); } else { throw 'Excel文件中无标准的指标数据'; } await transaction.commit(); result = true; } catch(err) { await transaction.rollback(); throw err; } return result; } } return TemplateNode; };