瀏覽代碼

定额计算程序:1、计算值同步到定额费字段。2、同步费用时实时计算出现卡顿,优化速度。

Chenshilong 7 年之前
父節點
當前提交
2f14110239
共有 3 個文件被更改,包括 69 次插入79 次删除
  1. 45 57
      public/calc_util.js
  2. 4 2
      test/tmp_data/test_ration_calc/ration_calc_base.js
  3. 20 20
      web/building_saas/main/js/models/ration_calc.js

+ 45 - 57
public/calc_util.js

@@ -1,26 +1,14 @@
 /**
  * Created by Tony on 2017/6/21.
  */
-/*let calcBaseCodeCollection = ["定额基价人工费", "定额基价材料费", "定额基价机械费"
-    , "定额基价人工费(调整后)", "定额基价材料费(调整后)", "定额基价机械费(调整后)"
-    , "市场价格人工费", "市场价格材料费", "市场价格机械费"
-    , "定额基价机上人工费", "主材费", "设备费"
-];
-
-let dummyCalcBaseCodeTypeCollection = [[2], [6], [64]
-    , [], [], []
-    , [], [], []
-    , [], [], []
-];*/
-
 let executeObj = {
-    currentTpl : null,
-    currentRationItem: null,
-    currentFeeRateFile: null,
+    calculation : null,
+    ration: null,
+    feeRate: null,
     at: function(ID) {
         let me = executeObj,
             rst = 0;
-        rst = me.currentTpl.compileAssistantObj[ID].unitFee;
+        rst = me.calculation.compileAssistantObj[ID].unitFee;
         rst = parseFloat(rst);
         return rst;
     },
@@ -30,7 +18,7 @@ let executeObj = {
 
         if (base != null) {
             let price = 0, tmpSum = 0;
-            for (let glj of me.currentRationItem.data.gljList) {
+            for (let glj of me.ration.data.gljList) {
                 if (base.gljTypes.indexOf(glj.type) >= 0) {
                     if (base.calcType == baseCalc){ price = glj["basePrice"];}
                     else if (base.calcType == adjustCalc){price = glj["adjustPrice"];}
@@ -46,16 +34,7 @@ let executeObj = {
     },
     fee: function(feeID) {
         let me = executeObj, rst = 0;
-        /*
-        for (let fee of me.currentFeeRateFile) {
-            if (fee.ID == feeID) {
-                rst = fee.rate;
-                break;
-            }
-        }
-        /*/
         if (me.compiledFeeRateFile["fee_" + feeID]) rst = me.compiledFeeRateFile["fee_" + feeID].rate;
-        //*/
         return rst;
     },
     factor: function(factorCode) {
@@ -65,11 +44,11 @@ let executeObj = {
     }
 };
 
-class calculation {
-    init(calcTpl, calFee){
+class Calculation {
+    init(calcTemplate, feeRate){
         let me = this;
-        me.calcTpl = calcTpl;
-        me.calFee = calFee;
+        me.calcTemplate = calcTemplate;
+        me.feeRate = feeRate;
         me.hasCompiled = false;
     };
 
@@ -103,9 +82,6 @@ class calculation {
             return rst;
         };
         let private_parse_ref = function(item, itemIdx){
-            //let expr = item.expression.split('at(').join('@(');
-            //item.expression = expr;
-            //console.log('expression: ' + expr);
             let idx = item.expression.indexOf('@(', 0);
             while (idx >= 0) {
                 let ID = private_extract_ID(item.expression, idx);
@@ -124,47 +100,46 @@ class calculation {
                 }
                 idx = item.expression.indexOf('@(', idx + ID.length + 3);
             }
-            if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
-                me.calcTpl.compiledSeq.push(itemIdx);
+            if (me.calcTemplate.compiledSeq.indexOf(itemIdx) < 0) {
+                me.calcTemplate.compiledSeq.push(itemIdx);
             }
         };
         let private_setup_seq = function(item, itemIdx){
-            if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
+            if (me.calcTemplate.compiledSeq.indexOf(itemIdx) < 0) {
                 private_parse_ref(item, itemIdx);
             }
         };
         let private_compile_items = function() {
-            for (let idx of me.calcTpl.compiledSeq) {
-                let item = me.calcTpl.calcItems[idx];
+            for (let idx of me.calcTemplate.compiledSeq) {
+                let item = me.calcTemplate.calcItems[idx];
                 item.compiledExpr = item.expression.split('@(').join('$CE.at(');
                 item.compiledExpr = item.compiledExpr.split('base(').join('$CE.base(');
                 item.compiledExpr = item.compiledExpr.split('fee(').join('$CE.fee(');
                 item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');
-                //console.log(item.compiledExpr);
             }
         };
         let private_comile_feeFile = function() {
-            if (me.calFee) {
+            if (me.feeRate) {
                 me.compiledFee = {};
-                for (let fee of me.calFee) {
+                for (let fee of me.feeRate) {
                     me.compiledFee["fee_" + fee.ID] = fee;
                 }
             }
         };
 
-        if (me.calcTpl && me.calcTpl.calcItems && me.calcTpl.calcItems.length > 0) {
-            me.calcTpl.compiledSeq = [];
+        if (me.calcTemplate && me.calcTemplate.calcItems && me.calcTemplate.calcItems.length > 0) {
+            me.calcTemplate.compiledSeq = [];
             me.compileAssistantObj = {};
             //1. first round -> prepare
             private_comile_feeFile();
-            for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
-                let item = me.calcTpl.calcItems[i];
+            for (let i = 0; i < me.calcTemplate.calcItems.length; i++) {
+                let item = me.calcTemplate.calcItems[i];
                 me.compileAssistantObj[item.ID] = item;
                 me.compileAssistantObj[item.ID + "_idx"] = i;
             }
             //2. second round -> go!
-            for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
-                private_setup_seq(me.calcTpl.calcItems[i], i);
+            for (let i = 0; i < me.calcTemplate.calcItems.length; i++) {
+                private_setup_seq(me.calcTemplate.calcItems[i], i);
             }
             if (me.errs.length == 0) {
                 private_compile_items();
@@ -174,21 +149,34 @@ class calculation {
             }
         }
     };
-    calculate( $RATION){
+    calculate($RATION){         // 参数$RATION也可以是清单
         let me = this;
         if ($RATION && me.hasCompiled) {
             let $CE = executeObj;
-            $CE.currentRationItem = $RATION;
-            $CE.currentTpl = me;
-            $CE.currentFeeRateFile = me.calFee;
+            $CE.ration = $RATION;
+            $CE.calculation = me;
+            $CE.feeRate = me.feeRate;
             $CE.compiledFeeRateFile = me.compiledFee;
-            for (let idx of me.calcTpl.compiledSeq) {
-                let item = me.calcTpl.calcItems[idx];
-                item.unitFee = eval(item.compiledExpr);
-                item.totalFee = item.unitFee * 3;     // AAAAA 5为测试值 $RATION.data.Quantity
+
+            if (!$RATION.fees) {
+                $RATION.fees = [];
+                $RATION.feesIndex = {};
+            };
+
+            for (let idx of me.calcTemplate.compiledSeq) {
+                let calcItem = me.calcTemplate.calcItems[idx];
+
+                // 这两项用于界面显示。
+                calcItem.unitFee = eval(calcItem.compiledExpr);   // AAAAA 如果eval()对清单树有影响,就换成小麦的Expression对象再试
+                calcItem.totalFee = calcItem.unitFee * 3;     // AAAAA 测试值,因目前定额无数量(保存不上) $RATION.data.Quantity
+
                 // 费用同步到定额
-                $RATION.feesIndex[item.type].unitFee = item.unitFee;
-                $RATION.feesIndex[item.type].totalFee = item.totalFee;
+                // 引入小麦的字段检测后,快速切换定额出现计算卡顿现象,过多的循环造成。这里把她的代码拆出来,减少微循环。
+                if (!$RATION.feesIndex[calcItem.type]){
+                    calcFees.addFee($RATION, calcItem.type);
+                };
+                $RATION.feesIndex[calcItem.type].unitFee = calcItem.unitFee;
+                $RATION.feesIndex[calcItem.type].totalFee = calcItem.totalFee;
             }
         }
     }

+ 4 - 2
test/tmp_data/test_ration_calc/ration_calc_base.js

@@ -88,8 +88,10 @@ let rationCalcBase = [
 function getRationCalcBase(dispName){
     let rst = null;
     for (let base of rationCalcBase) {
-       if (base.dispName == dispName)
-          rst = base;
+       if (base.dispName == dispName) {
+           rst = base;
+           break;
+       };
     }
     return rst;
 };

+ 20 - 20
web/building_saas/main/js/models/ration_calc.js

@@ -224,7 +224,7 @@ let calcTemplate = {
             ID: "1",
             code: "1",
             name: "基价直接工程费",
-            type: "rationBaseLabour",
+            type: "baseDirect",
             dispExpr: "F2+F5+F6+F10",
             expression: "@('2') + @('5') + @('6') + @('10')",
             compiledExpr: "",
@@ -234,7 +234,7 @@ let calcTemplate = {
             ID: "2",
             code: "1.1",
             name: "基价人工费",
-            type: "rationBaseLabour",
+            type: "baseLabour",
             dispExpr: "F3+F4",
             expression: "@('3') + @('4')",
             compiledExpr: "",
@@ -254,7 +254,7 @@ let calcTemplate = {
             ID: "4",
             code: "1.1.2",
             name: "定额人工单价(基价)调整",
-            type: "rationBaseLabour",
+            type: "rationLabourFixed",
             dispExpr: "F3*(1.89-1)",
             expression: "@('3') * (1.89-1)",
             compiledExpr: "",
@@ -265,7 +265,7 @@ let calcTemplate = {
             ID: "5",
             code: "1.2",
             name: "基价材料费",
-            type: "rationBaseLabour",
+            type: "baseMaterial",
             dispExpr: "[定额基价材料费]",
             expression: "base('定额基价材料费')",
             compiledExpr: "",
@@ -275,7 +275,7 @@ let calcTemplate = {
             ID: "6",
             code: "1.3",
             name: "基价机械费",
-            type: "rationBaseLabour",
+            type: "baseMachine",
             dispExpr: "F7+F9",
             expression: "@('7') + @('9')",
             compiledExpr: "",
@@ -285,7 +285,7 @@ let calcTemplate = {
             ID: "7",
             code: "1.3.1",
             name: "定额基价机械费",
-            type: "rationBaseLabour",
+            type: "rationBaseMachine",
             dispExpr: "[定额基价机械费]",
             expression: "base('定额基价机械费')",
             compiledExpr: "",
@@ -295,7 +295,7 @@ let calcTemplate = {
             ID: "8",
             code: "1.3.1.1",
             name: "其中:定额基价机上人工费",
-            type: "rationBaseLabour",
+            type: "rationBaseMachineLabour",
             dispExpr: "[定额基价机上人工费]",
             expression: "base('定额基价机上人工费')",
             compiledExpr: "",
@@ -305,7 +305,7 @@ let calcTemplate = {
             ID: "9",
             code: "1.3.2",
             name: "定额机上人工单价(基价)调整",
-            type: "rationBaseLabour",
+            type: "rationBaseMachineLabourFixed",
             dispExpr: "F8*(1.89-1)",
             expression: "@('8') * (1.89-1)",
             compiledExpr: "",
@@ -315,7 +315,7 @@ let calcTemplate = {
             ID: "10",
             code: "1.4",
             name: "未计价材料费",
-            type: "rationBaseLabour",
+            type: "unPriceMaterial",
             dispExpr: "[主材费]+[设备费]",
             expression: "base('主材费') + base('设备费')",
             compiledExpr: "",
@@ -325,7 +325,7 @@ let calcTemplate = {
             ID: "11",
             code: "2",
             name: "企业管理费",
-            type: "rationBaseLabour",
+            type: "manageFee",
             dispExpr: "F3",
             feeRate: 8.21,
             expression: "@('3')*8.21 / 100",
@@ -337,7 +337,7 @@ let calcTemplate = {
             ID: "12",
             code: "3",
             name: "利润",
-            type: "rationBaseLabour",
+            type: "profit",
             dispExpr: "F3",
             feeRate: 6.5,
             expression: "@('3')*6.5 / 100",
@@ -348,7 +348,7 @@ let calcTemplate = {
             ID: "13",
             code: "4",
             name: "风险因素",
-            type: "rationBaseLabour",
+            type: "risk",
             dispExpr: "F3",
             feeRate: 3,
             expression: "@('3')*3 / 100",
@@ -360,7 +360,7 @@ let calcTemplate = {
             ID: "14",
             code: "5",
             name: "人材机价差",
-            type: "rationBaseLabour",
+            type: "lmmDiff",
             dispExpr: "F15+F16+F17",
             expression: "@('15') + @('16') + @('17')",
             compiledExpr: "",
@@ -370,7 +370,7 @@ let calcTemplate = {
             ID: "15",
             code: "5.1",
             name: "人工费价差",
-            type: "rationBaseLabour",
+            type: "labourDiff",
             dispExpr: "[人工费价差]",
             expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
             compiledExpr: "",
@@ -380,7 +380,7 @@ let calcTemplate = {
             ID: "16",
             code: "5.2",
             name: "材料费价差",
-            type: "rationBaseLabour",
+            type: "materialDiff",
             dispExpr: "[材料费价差]",
             expression: "base('市场价格材料费') - base('定额基价材料费(调整后)')",
             compiledExpr: "",
@@ -390,7 +390,7 @@ let calcTemplate = {
             ID: "17",
             code: "5.3",
             name: "机械费价差",
-            type: "rationBaseLabour",
+            type: "machineDiff",
             dispExpr: "[机械费价差]",
             expression: "base('市场价格机械费') - base('定额基价机械费(调整后)')",
             compiledExpr: "",
@@ -400,7 +400,7 @@ let calcTemplate = {
             ID: "18",
             code: "6",
             name: "综合单价",
-            type: "rationBaseLabour",
+            type: "common",
             dispExpr: "F1+F11+F12+F13+F14",
             expression: "@('1') + @('11') + @('12') + @('13') + @('14')",
             compiledExpr: "",
@@ -415,11 +415,11 @@ class RationCalc {
     };
 
     calculate(ration){
-        let calc = new calculation();
+        ration.data.gljList = projectObj.project.ration_glj.getGljArrByRation(ration.data.ID);
+
+        let calc = new Calculation();
         calc.init(calcTemplate, calcFeeRate);
         calc.compile();
-        calcFees.checkFields(ration, rationCalcFields);  // AAAAAAAAAA calcFeeRate
-        ration.data.gljList = projectObj.project.ration_glj.getGljArrByRation(ration.data.ID);
         calc.calculate(ration);
     };
 }