浏览代码

自定义公式。

chenshilong 7 年之前
父节点
当前提交
3b1a19c80b

+ 1 - 0
modules/all_models/calc_program_model.js

@@ -10,6 +10,7 @@ let calcItemSchema = new Schema({
     name: String,
     fieldName: String,
     dispExpr: String,
+    dispExprUser: String,
     expression: String,
     compiledExpr: String,
     statement: String,

+ 28 - 43
web/building_saas/main/js/models/calc_program.js

@@ -728,30 +728,23 @@ let analyzer = {
         let idx = FName.slice(1) - 1;
         return calcTemplate.calcItems[idx];
     },
-    isCycleCalc: function (expression, calcTemplate) {     // 这里判断expression,是ID引用: @5+@6
-        let me = analyzer;
-        
-        function isCycle(nodeExpr, template) {
-            let atIDArr = me.getAtIDArr(nodeExpr);
-            for (let atID of atIDArr){
-                let ID = atID.slice(1);
-                let item = template.compiledCalcItems[ID];
-                if (item.expression.includes(atID)) {
-                    return true;
-                }
-                else {
-                    isCycle(item.expression, template);
-                }
-            };
-            return false;
-        };
+    isCycleCalc: function (expression, ID, template) {     // 这里判断expression,是ID引用: @5+@6
+        if (expression.includes(`@${ID}`))
+            return true;
+
+        let atIDs = analyzer.getAtIDArr(expression);
+        for (let atID of atIDs) {
+            let item = template.compiledCalcItems[atID.slice(1)];
+            if (analyzer.isCycleCalc(item.expression, ID, template))
+                return true;
+        }
 
-        return isCycle(expression, calcTemplate);
+        return false;
     },
-    isLegal: function (dispExpr, calcTemplate) {  // 检测包括:无效字符、基数是否中括号、基数是否定义、行引用、循环计算
+    isLegal: function (dispExpr, itemID, calcTemplate) {  // 检测包括:无效字符、基数是否中括号、基数是否定义、行引用、循环计算
         let me = analyzer;
         let expr = me.standard(dispExpr);
-        let invalidChars = /[^0-9\u4e00-\u9fa5\+\-\*\/\(\)\.\[\]F%]/g;
+        let invalidChars = /[^0-9\u4e00-\u9fa5\+\-\*\/\(\)\.\[\]FL%]/g;
         if (invalidChars.test(expr)){
             alert('表达式中含有无效的字符!');
             return false;
@@ -761,7 +754,11 @@ let analyzer = {
         let arrCn = expr.match(pattCn);
         let pattBase = new RegExp(/\[[\u4E00-\u9FA5]+\]/gi);
         let arrBase = expr.match(pattBase);
-        if (arrCn.length != arrBase.length){
+        if (arrCn && !arrBase){
+            alert('定额基数必须用中括号[]括起来!');
+            return false;
+        };
+        if (arrCn && arrBase && (arrCn.length != arrBase.length)){
             for (let cn of arrCn){
                 let tempBase = `[${cn}]`;
                   if (!arrBase.includes(tempBase)){
@@ -773,13 +770,14 @@ let analyzer = {
             alert('定额基数必须用中括号[]括起来!');
             return false;
         };
-
-        for (let base of arrBase){
-            let baseName = base.slice(1, -1);
-            if (!rationCalcBases[baseName]){
-                alert('定额基数 [' + baseName + '] 末定义!');
-                return false;
-            }
+        if (arrBase){
+            for (let base of arrBase){
+                let baseName = base.slice(1, -1);
+                if (!rationCalcBases[baseName]){
+                    alert('定额基数 [' + baseName + '] 末定义!');
+                    return false;
+                }
+            };
         };
 
         let arrF = me.getFArr(expr);
@@ -792,26 +790,13 @@ let analyzer = {
         };
 
         let expression = me.getExpression(expr, calcTemplate);
-        if (me.isCycleCalc(expression, calcTemplate)){
+        if (me.isCycleCalc(expression, itemID, calcTemplate)){
             alert('表达式中有循环计算!');
             return false;
         }
 
-        return true;
+        return true;  // 表达式合法
     },
-    analyzeUserExpr: function(calcItem, calcTemplate){
-        let me = analyzer;
-        let expr = calcItem.dispExpr;
-        expr = me.standard(expr);
-        calcItem.dispExpr = expr;
-
-        if (me.isLegal(expr, calcTemplate)){
-            calcItem.expression = expr;
-            return true;
-        }else
-            return false;
-    },
-
     getExpression: function (dispExpr, calcTemplate) {
         function refLineToID(expr, template) {
             let rst = expr;

+ 30 - 14
web/building_saas/main/js/views/calc_base_view.js

@@ -271,22 +271,38 @@ let calcBaseView = {
                 }
             }
             else if (me.curType === me.type.ration) {
+                let expr = me.inputExpr.val();
+                expr = analyzer.standard(expr);
+                me.inputExpr.val(expr);
+
+                let template = calcProgramManage.getSelectionInfo().template;
                 let calcItem = calcProgramManage.getSelectionInfo().calcItem;
-                if (calcItem.dispExprUser != me.inputExpr.val()){
-                    calcItem.dispExprUser = me.inputExpr.val();
-                    calcItem.dispExpr = me.inputExpr.val();
-                    let data = {
-                        'projectID': projectObj.project.ID(),
-                        'templatesID': calcProgramManage.getSelectionInfo().template.ID,
-                        'calcItem': calcItem
+
+                if (calcItem.dispExpr != expr){
+                    if (analyzer.isLegal(expr, calcItem.ID, template)){
+                        let cp = projectObj.project.calcProgram;
+                        let lc = 0;
+                        if (calcItem.labourCoeID)
+                            lc = cp.compiledLabourCoes[calcItem.labourCoeID].coe.toString();
+                        calcItem.dispExpr = expr;
+                        calcItem.dispExprUser = analyzer.getDispExprUser(expr, lc);
+                        calcItem.expression = analyzer.getExpression(expr, template);
+                        calcItem.compiledExpr = analyzer.getCompiledExpr(calcItem.expression, lc);
+
+                        let data = {
+                            'projectID': projectObj.project.ID(),
+                            'templatesID': template.ID,
+                            'calcItem': calcItem
+                        };
+                        calcProgramManage.saveCalcItem(data, function (rst) {
+                            if (rst){
+                                cp.compileTemplate(template);
+                                cp.calcAllNodesAndSave();
+                                calcProgramManage.refreshDetailSheet();
+                                $('#qd-jsjs').modal('hide');
+                            }
+                        });
                     };
-                    calcProgramManage.saveCalcItem(data, function (rst) {
-                        if (rst){
-                            projectObj.project.calcProgram.calcAllNodesAndSave();
-                            calcProgramManage.refreshDetailSheet();
-                            $('#qd-jsjs').modal('hide');
-                        }
-                    });
                 }
                 else
                     $('#qd-jsjs').modal('hide');

+ 6 - 2
web/building_saas/main/js/views/calc_program_manage.js

@@ -116,11 +116,15 @@ let calcProgramManage = {
         }
     },
     onEnterCell: function (sender, args) {
-        let t = calcProgramManage.getSelectionInfo().template;
+       /* let t = calcProgramManage.getSelectionInfo().template;
         let c = calcProgramManage.getSelectionInfo().calcItem;
         c.expression = analyzer.getExpression(c.dispExpr, t);
+        let lc = 0;
+        if (c.labourCoeID) lc = projectObj.project.calcProgram.compiledLabourCoes[c.labourCoeID].coe.toString();
+        c.compiledExpr = analyzer.getCompiledExpr(c.expression, lc);
+
         let e = c.dispExpr + '  ' + c.expression + '  ' + c.compiledExpr;
-        projectObj.testDisplay('', e);
+        projectObj.testDisplay('', e);*/
     },
     saveCalcItem: function (data,callback) {//data
         let me = this;

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

@@ -40,13 +40,6 @@ var projectObj = {
         // for test interface.  CSLAAAAA
         // projectObj.testDisplay('前四项累计值排除当前选中项' + projectObj.project.calcProgram.getBeforeTaxTotalFee([node]));
 
-        // 公式结果
-        /*        let t = projectObj.project.calcProgram.compiledTemplates[node.data.programID];
-                let c = t.calcItems[7];
-                c.dispExpr = '[定额基价人工费] + [定额基价材料费]  + F6 + [主材费]';
-                let rst = analyzer.analyzeUserExpr(t, c);
-                projectObj.testDisplay('结果', rst);*/
-
         // 基数
         // node.data.isSubcontract = true;
         // node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);