소스 검색

税前工程造价基数。

chenshilong 7 년 전
부모
커밋
d64985752b
1개의 변경된 파일58개의 추가작업 그리고 11개의 파일을 삭제
  1. 58 11
      web/building_saas/main/js/models/calc_program.js

+ 58 - 11
web/building_saas/main/js/models/calc_program.js

@@ -563,6 +563,42 @@ let analyzer = {
         str = str.replace(/f/g, "F");               // f换成F
         return str;
     },
+    getFArr: function (expr) {
+        let pattF = new RegExp(/F\d+/gi);
+        let arrF = expr.match(pattF);
+        return arrF ? arrF : [];
+    },
+    getAtIDArr: function (expr) {
+        let patt = new RegExp(/@\d+/gi);
+        let arr = expr.match(patt);
+        return arr ? arr : [];
+    },
+    getFID: function (FName) {          // F3、F22
+        let me = this;
+        let idx = FName.slice(1) - 1;
+        let id = me.calcTemplate.calcItems[idx] ? me.calcTemplate.calcItems[idx].ID : null;
+        return id;
+    },
+    getFItem: function (FName){
+        let me = this;
+        let idx = FName.slice(1) - 1;
+        return me.calcTemplate.calcItems[idx];
+    },
+    isCycleCalc: function (expr) {     // @5+@6  这里已经是ID引用
+        let me = this;
+        
+        function checkCycle() {
+            
+        }
+        let atIDArr = me.getAtIDArr(expr);
+        for (let atID of atIDArr){
+            let ID = atID.slice(1);
+            let item = me.calcTemplate.compiledCalcItems[ID];
+            let expression = item.expression;
+            if (expression.includes(atID)) return false;
+
+        };
+    },
     isLegal: function (expr) {
         let me = this;
         let stdExpr = me.standard(expr);
@@ -590,20 +626,25 @@ let analyzer = {
             }
         };
 
-        let pattF = new RegExp(/F\d+/gi);
-        let arrF = s.match(pattF);
+        // 行引用检测、行引用转ID引用
+        let arrF = me.getFArr(stdExpr);
         for (let F of arrF){
             let num = F.slice(1);
             if (num > me.calcTemplate.calcItems.length){
-                alert('表达式中 “F'+ num +'” 引用行号无效!');
+                alert('表达式中 “F'+ num +'” 行号引用错误!');
                 return false;
             };
-            let id = me.calcTemplate.calcItems[num - 1].ID;
+            let id = me.getFID(F);
+            let fn = new RegExp(F, "g");
+            stdExpr = stdExpr.replace(fn, '@' + id);
         };
 
         // 循环计算
+        if (me.isCycleCalc(stdExpr)){
+            alert('表达式中有循环计算!');
+            return false;
+        }
     },
-
     analyzeCalcBase: function(expr){
         // 前提:必须无空格、无特殊符号
         function getCalcBase(expr){
@@ -1362,11 +1403,8 @@ class CalcProgram {
     };
 
     // 排除指定项的综合合价计算(用于带循环计算的情况)
-    getTotalFee(excludeNodes){
-        excludeNodes.push(calcTools.getNodeByFlag(fixedFlag.ENGINEERINGCOST));
-        let me = this;
+    getTotalFee(baseNodes, excludeNodes){
         let rst = 0;
-
         function calcNodes(nodes) {
             for (let node of nodes) {
                 if (!excludeNodes.includes(node)){
@@ -1381,8 +1419,17 @@ class CalcProgram {
                 }
             }
         };
-
-        calcNodes(me.project.mainTree.roots);
+        calcNodes(baseNodes);
         return rst;
     };
+
+    // 税前工程造价
+    getBeforeTaxTotalFee(excludeNodes){
+        let baseNodes = [], me = this;
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.SUB_ENGINERRING));
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.MEASURE));
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.OTHER));
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.CHARGE));
+        return me.getTotalFee(baseNodes, excludeNodes);
+    };
 };