'use strict'; /** * * * @author Mai * @date * @version */ const math = require('mathjs'); class MaterialCalculate { constructor(ctx, stage_id_list, tenderInfo) { this.ctx = ctx; this.stageList = stage_id_list; this.percentReg = /[0-9]+%/g; this.tenderInfo = tenderInfo; } /** * 获取 计算基数 * @returns {Promise} */ async getCalcBase() { if (this.bases) { return; } const stage_list = await this.ctx.service.stage.getStageMsgByStageId(this.stageList); const bases = await this.ctx.service.stage.getMaterialCalcBase(stage_list, this.tenderInfo); this.bases = bases.sort(function(a, b) { return a.sort - b.sort; // if (a && b) { // return b.code.indexOf(a.code) >= 0 ? 1 : 0; // } else { // return 0; // } }); for (const b of this.bases) { b.reg = new RegExp(b.code, 'igm'); } } _calculateExpr(expr) { try { let formula = expr; for (const b of this.bases) { formula = formula.replace(b.reg, b.value); } const percent = formula.match(this.percentReg); if (percent) { for (const p of percent) { const v = math.eval(p.replace('%', '/100')); formula = formula.replace(p, v); } } const value = math.eval(formula); return value; } catch (err) { return 0; } } async calculateExpr(expr) { await this.getCalcBase(); return this._calculateExpr(expr); } } module.exports = MaterialCalculate;