Browse Source

循环引用的公式基数算法。

chenshilong 7 years ago
parent
commit
200fa2ffa7

+ 57 - 5
web/building_saas/main/js/models/calc_program.js

@@ -530,6 +530,24 @@ let treeNodeTools = {
     },
     uiQuantity(treeNode){
         return parseFloatPlus(treeNode.data.quantity).toDecimal(decimalObj.decimal("quantity", treeNode));
+    },
+
+    getFee(treeNode, fieldName) {    // fieldName: 'common.totalFee'、'equipment.unitFee'
+        let ns = fieldName.split(".");
+        if (ns.length != 2)
+            return 0
+        else if (treeNode.data.feesIndex[ns[0]] && treeNode.data.feesIndex[ns[0]][ns[1]])
+            return parseFloat(treeNode.data.feesIndex[ns[0]][ns[1]])
+        else
+            return 0;
+    },
+    getNodeByFlag(flag) {
+         let bill = cbTools.findBill(flag);
+         if (bill) return this.getNodeByID(bill.ID)
+         else return null;
+    },
+    getNodeByID(ID){
+        return cbTools.getNodeByID(ID);
     }
 };
 
@@ -1022,11 +1040,9 @@ class CalcProgram {
                 calcEstimateFee(treeNode);
                 treeNodeTools.initSummaryFee(treeNode);
                 treeNode.data.summaryFees.totalFee = tf;
-                treeNode.data.summaryFees.estimateFee = (treeNode.data.feesIndex && treeNode.data.feesIndex.estimate) ? treeNode.data.feesIndex.estimate.totalFee:0;
-                let bill_safe = cbTools.findBill(fixedFlag.SAFETY_CONSTRUCTION);
-                treeNode.data.summaryFees.safetyFee = (bill_safe && bill_safe.feesIndex && bill_safe.feesIndex.common)?bill_safe.feesIndex.common.totalFee:0;
-                let bill_charge = cbTools.findBill(fixedFlag.CHARGE);
-                treeNode.data.summaryFees.chargeFee = (bill_charge && bill_charge.feesIndex && bill_charge.feesIndex.common)?bill_charge.feesIndex.common.totalFee:0;
+                treeNode.data.summaryFees.estimateFee = treeNodeTools.getFee(treeNode, 'estimate.totalFee');
+                treeNode.data.summaryFees.safetyFee = treeNodeTools.getFee(treeNodeTools.getNodeByFlag(fixedFlag.SAFETY_CONSTRUCTION), 'common.totalFee');
+                treeNode.data.summaryFees.chargeFee = treeNodeTools.getFee(treeNodeTools.getNodeByFlag(fixedFlag.CHARGE), 'common.totalFee');
             }
 
             treeNode.data.calcTemplate = {"calcItems": []};
@@ -1231,4 +1247,40 @@ class CalcProgram {
         let changedNodes = this.calcAllNodes(calcType);
         this.saveNodes(changedNodes);
     };
+
+    // 排除指定项的综合合价计算(用于带循环计算的情况)
+    getTotalFee(excludeNodes){
+        excludeNodes.push(treeNodeTools.getNodeByFlag(fixedFlag.ENGINEERINGCOST));
+        let me = this;
+        let rst = 0;
+
+        function calcNodes(nodes) {
+            /*for (let node of nodes) {
+                if (node.children.length > 0) {
+                    calcNodes(node.children);
+                }
+                else{
+                    if (!excludeNodes.includes(node) && node.sourceType != ModuleNames.ration_glj) {
+                        rst = (rst + treeNodeTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
+                    };
+                }
+            }*/
+
+            for (let node of nodes) {
+                if (!excludeNodes.includes(node)){
+                    if (node.children.length > 0) {
+                        calcNodes(node.children);
+                    }
+                    else{
+                        if (node.sourceType != ModuleNames.ration_glj) {
+                            rst = (rst + treeNodeTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
+                        };
+                    }
+                }
+            }
+        };
+
+        calcNodes(me.project.mainTree.roots);
+        return rst;
+    };
 }

+ 2 - 0
web/building_saas/main/js/views/project_view.js

@@ -31,6 +31,8 @@ var projectObj = {
                 pageCCOprObj.clearData();
             }
         }
+
+        alert(project.calcProgram.getTotalFee([node]));
     },
     refreshBaseActn: function (tree) {
         let setButtonValid = function (valid, btn) {