| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | 
							- '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<void>}
 
-      */
 
-     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 = parseFloat(math.eval(formula));
 
-             return value;
 
-         } catch (err) {
 
-             return 0;
 
-         }
 
-     }
 
-     async calculateExpr(expr) {
 
-         await this.getCalcBase();
 
-         return this._calculateExpr(expr);
 
-     }
 
- }
 
- module.exports = MaterialCalculate;
 
 
  |