Browse Source

基于计算程序模板的用户自定义公式解析。

Chenshilong 7 years ago
parent
commit
c3847b1407

+ 9 - 5
public/calc_util.js

@@ -40,13 +40,14 @@ let executeObj = {
 };
 };
 
 
 let analyzer = {
 let analyzer = {
+    calcTemplate: null,
+
     standard: function(expr){
     standard: function(expr){
         let str = expr;
         let str = expr;
         str = str.replace(/\s/g, "");               // 去空格、去中文空格
         str = str.replace(/\s/g, "");               // 去空格、去中文空格
         str = str.replace(/(/g, "(");              // 中文括号"("换成英文括号"("
         str = str.replace(/(/g, "(");              // 中文括号"("换成英文括号"("
         str = str.replace(/)/g, ")");              // 中文括号")"换成英文括号")"
         str = str.replace(/)/g, ")");              // 中文括号")"换成英文括号")"
         str = str.replace(/f/g, "F");               // f换成F
         str = str.replace(/f/g, "F");               // f换成F
-        console.log(str);
         return str;
         return str;
     },
     },
 
 
@@ -82,7 +83,7 @@ let analyzer = {
             else if (base == '[机械费]'){
             else if (base == '[机械费]'){
                 id = 333;
                 id = 333;
             }
             }
-            else id = 999;
+            else id = "错误";
 
 
             return "@('" + id + "')";
             return "@('" + id + "')";
         };
         };
@@ -151,14 +152,17 @@ let analyzer = {
         return expr;
         return expr;
     },
     },
 
 
-    analyzeUserExpr: function(expr){
+    analyzeUserExpr: function(calcTemplate, calcItem){
+        this.calcTemplate = calcTemplate;
+        let expr = calcItem.dispExpr;
         // 标准化:处理特殊字符、中文符号、大小写
         // 标准化:处理特殊字符、中文符号、大小写
         expr = this.standard(expr);
         expr = this.standard(expr);
+        calcItem.dispExpr = expr;
         // 先换掉计算基数
         // 先换掉计算基数
         expr = this.analyzeCalcBase(expr);
         expr = this.analyzeCalcBase(expr);
         // 再换掉行引用
         // 再换掉行引用
         expr = this.analyzeLineRef(expr);
         expr = this.analyzeLineRef(expr);
-        return expr;
+        calcItem.expression = expr;
     }
     }
 };
 };
 
 
@@ -359,4 +363,4 @@ class Calculation {
     }
     }
 };
 };
 
 
-export default analyzer;
+//export default analyzer;

+ 200 - 4
test/calculation/test_analyzer.js

@@ -5,9 +5,205 @@ var test = require('tape');
 import analyzer from '../../public/calc_util';
 import analyzer from '../../public/calc_util';
 
 
 test('解析测试', function(t){
 test('解析测试', function(t){
-    let userExpr = "12 +[人工费]*1.2+f4+ (F6+ f10) +F23+[人工费] + f6+[材料费]";
-    let rst = analyzer.analyzeUserExpr(userExpr);
-    console.log(rst);
-    t.equal(rst, "12+@('111')*1.2+@('5')+(@('7')+@('11'))+@('24')+@('111')+@('7')+@('222')");
+    let calcTemplate = {
+        ID: 1,
+        name: "建筑工程",
+        calcItems: [
+            {
+                ID: "1",
+                code: "1",
+                name: "基价直接工程费",
+                fieldName: "baseDirect",
+                dispExpr: "F2+F5+F6+F10",
+                expression: "@('2') + @('5') + @('6') + @('10')",
+                compiledExpr: "",
+                statement: "基价人工费+基价材料费+基价机械费+未计价材料费"
+            },
+            {
+                ID: "2",
+                code: "1.1",
+                name: "基价人工费",
+                fieldName: "baseLabour",
+                dispExpr: "F3+F4",
+                expression: "@('3') + @('4')",
+                compiledExpr: "",
+                statement: "定额基价人工费+定额人工单价(基价)调整"
+            },
+            {
+                ID: "3",
+                code: "1.1.1",
+                name: "定额基价人工费",
+                fieldName: "rationBaseLabour",
+                dispExpr: "[定额基价人工费]",
+                expression: "base('定额基价人工费').toFixed(2)",
+                compiledExpr: "",
+                statement: "定额基价人工费"
+            },
+            {
+                ID: "4",
+                code: "1.1.2",
+                name: "定额人工单价(基价)调整",
+                fieldName: "rationLabourFixed",
+                dispExpr: "F3*(L-1)",
+                expression: "@('3') * (L-1)",
+                labourCoeID: 22,
+                compiledExpr: "",
+                statement: "定额基价人工费*[定额人工单价(基价)调整系数-1]",
+                memo: "渝建发(2013)51"
+            },
+            {
+                ID: "5",
+                code: "1.2",
+                name: "基价材料费",
+                fieldName: "baseMaterial",
+                dispExpr: "[定额基价材料费]",
+                expression: "base('定额基价材料费')",
+                compiledExpr: "",
+                statement: "定额基价材料费"
+            },
+            {
+                ID: "6",
+                code: "1.3",
+                name: "基价机械费",
+                fieldName: "baseMachine",
+                dispExpr: "F7+F9",
+                expression: "@('7') + @('9')",
+                compiledExpr: "",
+                statement: "定额基价机械费+定额机上人工单价(基价)调整"
+            },
+            {
+                ID: "7",
+                code: "1.3.1",
+                name: "定额基价机械费",
+                fieldName: "rationBaseMachine",
+                dispExpr: "[定额基价机械费]",
+                expression: "base('定额基价机械费')",
+                compiledExpr: "",
+                statement: "定额基价机械费"
+            },
+            {
+                ID: "8",
+                code: "1.3.1.1",
+                name: "其中:定额基价机上人工费",
+                fieldName: "rationBaseMachineLabour",
+                dispExpr: "[定额基价机上人工费]",
+                expression: "base('定额基价机上人工费')",
+                compiledExpr: "",
+                statement: "定额基价机上人工费"
+            },
+            {
+                ID: "9",
+                code: "1.3.2",
+                name: "定额机上人工单价(基价)调整",
+                fieldName: "rationBaseMachineLabourFixed",
+                dispExpr: "F8*(L-1)",
+                expression: "@('8') * (L-1)",
+                labourCoeID: 24,
+                compiledExpr: "",
+                statement: "定额基价机上人工费*[定额机上人工单价(基价)调整系数-1]"
+            },
+            {
+                ID: "10",
+                code: "1.4",
+                name: "未计价材料费",
+                fieldName: "unPriceMaterial",
+                dispExpr: "[主材费]+[设备费]",
+                expression: "base('主材费') + base('设备费')",
+                compiledExpr: "",
+                statement: "主材费+设备费"
+            },
+            {
+                ID: "11",
+                code: "2",
+                name: "企业管理费",
+                fieldName: "manageFee",
+                dispExpr: "F3+F5+F7",
+                feeRateID: 101,
+                expression: "@('3') + @('5') + @('7')",
+                compiledExpr: "",
+                statement: "定额基价人工费",
+                memo: "渝建发[2014]27号"
+            },
+            {
+                ID: "12",
+                code: "3",
+                name: "利润",
+                fieldName: "profit",
+                dispExpr: "F3+F5+F7",
+                feeRateID: 301,
+                expression: "@('3') + @('5') + @('7')",
+                compiledExpr: "",
+                statement: "定额基价人工费"
+            },
+            {
+                ID: "13",
+                code: "4",
+                name: "风险因素",
+                fieldName: "risk",
+                dispExpr: "F3+F5+F7",
+                feeRateID: 701,
+                expression: "@('3') + @('5') + @('7')",
+                compiledExpr: "",
+                statement: "定额基价人工费",
+                memo: "同定额包干费"
+            },
+            {
+                ID: "14",
+                code: "5",
+                name: "人材机价差",
+                fieldName: "lmmDiff",
+                dispExpr: "F15+F16+F17",
+                expression: "@('15') + @('16') + @('17')",
+                compiledExpr: "",
+                statement: "人工费价差+材料费价差+机械费价差"
+            },
+            {
+                ID: "15",
+                code: "5.1",
+                name: "人工费价差",
+                fieldName: "labourDiff",
+                dispExpr: "[人工费价差]",
+                expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
+                compiledExpr: "",
+                statement: "市场价格人工费-调整后的定额人工费(基价)"
+            },
+            {
+                ID: "16",
+                code: "5.2",
+                name: "材料费价差",
+                fieldName: "materialDiff",
+                dispExpr: "[材料费价差]",
+                expression: "base('市场价格材料费') - base('定额基价材料费(调整后)')",
+                compiledExpr: "",
+                statement: "市场价格材料费-定额基价材料费"
+            },
+            {
+                ID: "17",
+                code: "5.3",
+                name: "机械费价差",
+                fieldName: "machineDiff",
+                dispExpr: "[机械费价差]",
+                expression: "base('市场价格机械费') - base('定额基价机械费(调整后)')",
+                compiledExpr: "",
+                statement: "市场价格机械费-调整后的定额基价机械费(基价)"
+            },
+            {
+                ID: "18",
+                code: "6",
+                name: "综合单价",
+                fieldName: "common",
+                dispExpr: "F1+F11+F12+F13+F14",
+                expression: "@('1') + @('11') + @('12') + @('13') + @('14')",
+                compiledExpr: "",
+                statement: "基价直接工程费+企业管理费+利润+风险因素+人材机价差"
+            }
+        ]
+    };
+    let calcItem = {dispExpr: "12 +[人工费]*1.2+f4+ (F6+ f10) +F23+[人工费] + f6+[材料费]"};
+    let target = "12+@('111')*1.2+@('5')+(@('7')+@('11'))+@('24')+@('111')+@('7')+@('222')";
+    analyzer.analyzeUserExpr(calcTemplate, calcItem);
+    console.log(calcItem.dispExpr);
+    console.log(calcItem.expression);
+    t.equal(calcItem.expression, target);
     t.end();
     t.end();
 });
 });

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

@@ -159,6 +159,8 @@ var projectObj = {
                     that.loadGLJSpreadContextMenu();
                     that.loadGLJSpreadContextMenu();
                 }*/
                 }*/
 
 
+                that.project.calcProgram = new CalcProgram(that.project);
+                that.project.calcProgram.compileAllTemps();
 
 
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, function (node) {
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, function (node) {
                     gljOprObj.showDataIfRationSelect(node);
                     gljOprObj.showDataIfRationSelect(node);
@@ -191,8 +193,7 @@ var projectObj = {
 
 
             }
             }
         });
         });
-        this.project.calcProgram = new CalcProgram(this.project);
-        this.project.calcProgram.compileAllTemps();
+
     },
     },
     loadMainSpreadContextMenu: function () {
     loadMainSpreadContextMenu: function () {
         var project = this.project, spread = this.mainSpread, controller = this.mainController;
         var project = this.project, spread = this.mainSpread, controller = this.mainController;