Explorar el Código

ration calculation

TonyKang hace 8 años
padre
commit
45f6d98fd0
Se han modificado 2 ficheros con 129 adiciones y 21 borrados
  1. 45 16
      public/calc_util.js
  2. 84 5
      test/calculation/testCalc.js

+ 45 - 16
public/calc_util.js

@@ -1,11 +1,16 @@
 /**
  * Created by Tony on 2017/6/21.
  */
-let calcBaseCodeCollection = ["定额基价材料费", "定额基价机械费", "定额基价人工费"
+let calcBaseCodeCollection = ["定额基价人工费", "定额基价材料费", "定额基价机械费"
     , "定额基价人工费(调整后)", "定额基价材料费(调整后)", "定额基价机械费(调整后)"
     , "市场价格人工费", "市场价格材料费", "市场价格机械费"
     , "定额基价机上人工费", "主材费", "设备费"
 ];
+let dummyCalcBaseCodeTypeCollection = [[2], [6], [64]
+    , [], [], []
+    , [], [], []
+    , [], [], []
+];
 
 let executeObj = {
     currentTpl : null,
@@ -18,26 +23,42 @@ let executeObj = {
         return rst;
     },
     base: function(calcBaseCode) {
-        let me = executeObj, rst = -1,
-            idx = 10 + calcBaseCodeCollection.indexOf(calcBaseCode);
+        let me = executeObj, rst = 0,
+            idx = calcBaseCodeCollection.indexOf(calcBaseCode);
         if (idx >= 0) {
-            //
-        } else {
-            //
+            if (dummyCalcBaseCodeTypeCollection[idx].length > 0) {
+                let tmpSum = 0;
+                for (let glj of me.currentRationItem.rationGljList) {
+                    if (dummyCalcBaseCodeTypeCollection[idx].indexOf(glj["glj"]["gljType"]) >= 0) {
+                        tmpSum += glj["glj"]["basePrice"] * glj["consumeAmt"];
+                    }
+                }
+                rst = tmpSum;
+            } else {
+                //rst = 10 + idx; //随便给个数
+            }
         }
-        rst = idx; //暂时返回值,测试用
+        //rst = idx; //暂时返回值,测试用
         return rst;
     },
     fee: function(feeID) {
-        let me = executeObj, rst = -1;
-        //
-        //rst = parseInt(feeID); //暂时返回值,测试用
-        rst = 0.89;
+        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) {
         let me = executeObj;
-        //
+        let rst = 0.89; //暂时固定输出,测试用
+        return rst;
     }
 };
 
@@ -120,10 +141,20 @@ class calculation {
                 //console.log(item.compiledExpr);
             }
         };
+        let private_comile_feeFile = function() {
+            if (me.calFee) {
+                me.compiledFee = {};
+                for (let fee of me.calFee) {
+                    me.compiledFee["fee_" + fee.ID] = fee;
+                }
+            }
+        };
+
         if (me.calcTpl && me.calcTpl.calcItems && me.calcTpl.calcItems.length > 0) {
             me.calcTpl.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];
                 me.compileAssistantObj[item.code] = item;
@@ -149,14 +180,12 @@ class calculation {
             let $CE = executeObj;
             $CE.currentRationItem = $RATION;
             $CE.currentTpl = me;
+            $CE.currentFeeRateFile = me.calFee;
+            $CE.compiledFeeRateFile = me.compiledFee;
             for (let idx of me.calcTpl.compiledSeq) {
                 let item = me.calcTpl.calcItems[idx];
                 item.execRst = eval(item.compiledExpr);
             }
-            for (let idx of me.calcTpl.compiledSeq) {
-                let item = me.calcTpl.calcItems[idx];
-                console.log('code: ' + item.code + ' | expression: ' + item.compiledExpr +  ' | result: ' + item.execRst);
-            }
         }
     }
 }

+ 84 - 5
test/calculation/testCalc.js

@@ -221,7 +221,6 @@ let dummyCalcTpl = {
     calType: 3,
     calTypeName: "测试用_重庆",
     compiledSeq: [],
-    intermediateRst: [],
     calcItems: [{
         code: "1",
         name: "基价直接工程费",
@@ -240,14 +239,15 @@ let dummyCalcTpl = {
         code: "1.1.1",
         name: "定额基价人工费",
         dispExpr: "定额基价人工费",
-        expression: "base('定额基价人工费')",
+        //expression: "base('定额基价人工费')",
+        expression: "base('定额基价人工费').toFixed(2)",
         compiledExpr: "",
         statement: "定额基价人工费"
     },{
         code: "1.1.2",
         name: "定额人工单价(基价)调整",
         dispExpr: "1.1.1*[1.89-1]",
-        expression: "@('1.1.1') * fee('1')",
+        expression: "@('1.1.1') * fee('3')",
         compiledExpr: "",
         statement: "定额基价人工费*[定额人工单价(基价)调整系数-1]"
     },{
@@ -282,7 +282,7 @@ let dummyCalcTpl = {
         code: "1.3.2",
         name: "定额人工单价(基价)调整",
         dispExpr: "1.3.1.1*[1.89-1]",
-        expression: "@('1.3.1.1') * fee('1')",
+        expression: "@('1.3.1.1') * fee('30')",
         compiledExpr: "",
         statement: "定额基价人工费*[定额人工单价(基价)调整系数-1]"
     },{
@@ -352,11 +352,90 @@ let dummyCalcTpl = {
     ]
 };
 
+let dummyRation = {
+    "sectionId" : 76,
+    "ID" : 15,
+    "code" : "AA0001",
+    "name" : "人工挖土方",
+    "unit" : "100m3",
+    "basePrice" : 840.84,
+    "caption" : "人工挖土方",
+    "feeType" : 2,
+    "rationGljList" : [
+        {
+            "glj" : {
+                "repositoryId" : 3,
+                "ID" : 17,
+                "code" : "00010201",
+                "name" : "土石方综合工日",
+                "specs" : null,
+                "unit" : "工日",
+                "basePrice" : 22,
+                "gljDistType" : "人工",
+                "gljType" : 2
+            },
+            "consumeAmt" : 38.22,
+            "proportion" : 0
+        },{
+            "glj": {
+                "repositoryId" : 3,
+                "ID" : 68,
+                "code" : "85030207",
+                "name" : "履带式起重机",
+                "specs" : "50t",
+                "unit" : "台班",
+                "basePrice" : 1194.05,
+                "gljDistType" : "机械",
+                "gljType" : 64
+            },
+            "consumeAmt" : 1.22,
+            "proportion" : 0
+        },{
+            "glj": {
+                "repositoryId" : 3,
+                "ID" : 200,
+                "code" : "36290101",
+                "name" : "水",
+                "specs" : "",
+                "unit" : "m3",
+                "basePrice" : 2,
+                "gljDistType" : "材料",
+                "gljType" : 6
+            },
+            "consumeAmt" : 9.2,
+            "proportion" : 0
+        }
+    ],
+    "rationRepId" : 3
+}
+
+/*
 test('计算式测试', function(t){
     calcUtil.init(dummyCalcTpl, dummyFee);
     calcUtil.compile();
-    calcUtil.calculate({});
+    calcUtil.calculate(dummyRation);
+    for (let idx of dummyCalcTpl.compiledSeq) {
+        let item = dummyCalcTpl.calcItems[idx];
+        console.log('code: ' + item.code + ' | expression: ' + item.compiledExpr +  ' | result: ' + item.execRst);
+    }
     t.pass('just pass for calculation initialization!');
     t.end();
 })
 
+/*/
+let cnt = 100000;
+test('极限计算式测试:' + cnt + '次', function(t){
+    let dt0 = new Date();
+    calcUtil.init(dummyCalcTpl, dummyFee);
+    calcUtil.compile();
+    let dt1 = new Date();
+    for (let i = 0; i < cnt; i++) {
+        calcUtil.calculate(dummyRation);
+    }
+    let dt2 = new Date();
+    console.log("总计算时间(毫秒): " + (dt2 - dt1));
+    console.log("总测试时间(毫秒): " + (dt2 - dt0));
+    t.pass('just pass for calculation initialization!');
+    t.end();
+})
+//*/