ソースを参照

自定义计算规则。

chenshilong 7 年 前
コミット
b515a38f61

+ 70 - 79
web/building_saas/main/js/models/calc_program.js

@@ -719,22 +719,22 @@ let analyzer = {
         return arrBase ? arrBase : [];
     },
 
-    getID: function (FName, calcTemplate) {          // F13 → 4
+    getID: function (FName, template) {          // F13 → 4
         let idx = FName.slice(1) - 1;
-        let id = calcTemplate.calcItems[idx] ? calcTemplate.calcItems[idx].ID : null;
+        let id = template.calcItems[idx] ? template.calcItems[idx].ID : null;
         return id;
     },
-    getFName: function (atID, calcTemplate) {          // @3 → F7
-        for (var i = 0; i < calcTemplate.calcItems.length; i++) {
-            if (calcTemplate.calcItems[i].ID == atID.slice(1)) {
+    getFName: function (atID, template) {          // @3 → F7
+        for (var i = 0; i < template.calcItems.length; i++) {
+            if (template.calcItems[i].ID == atID.slice(1)) {
                 return 'F'+ (i + 1);
             }
         }
         return null;
     },
-    getItem: function (FName, calcTemplate){      // F3 → calcItems[2] → {Object}
+    getItem: function (FName, template){      // F3 → calcItems[2] → {Object}
         let idx = FName.slice(1) - 1;
-        return calcTemplate.calcItems[idx];
+        return template.calcItems[idx];
     },
     isCycleCalc: function (expression, ID, template) {     // 这里判断expression,是ID引用: @5+@6
         if (expression.includes(`@${ID}`))
@@ -749,7 +749,7 @@ let analyzer = {
 
         return false;
     },
-    isLegal: function (dispExpr, itemID, calcTemplate) {  // 检测包括:无效字符、基数是否中括号、基数是否定义、行引用、循环计算
+    isLegal: function (dispExpr, itemID, template) {  // 检测包括:无效字符、基数是否中括号、基数是否定义、行引用、循环计算
         let me = analyzer;
         let expr = me.standard(dispExpr);
         let invalidChars = /[^0-9\u4e00-\u9fa5\+\-\*\/\(\)\.\[\]FL%]/g;
@@ -791,14 +791,14 @@ let analyzer = {
         let arrF = me.getFArr(expr);
         for (let F of arrF){
             let num = F.slice(1);
-            if (num > calcTemplate.calcItems.length){
+            if (num > template.calcItems.length){
                 alert('表达式中 “F'+ num +'” 行号引用错误!');
                 return false;
             };
         };
 
-        let expression = me.getExpression(expr, calcTemplate);
-        if (me.isCycleCalc(expression, itemID, calcTemplate)){
+        let expression = me.getExpression(expr, template);
+        if (me.isCycleCalc(expression, itemID, template)){
             alert('表达式中有循环计算!');
             return false;
         }
@@ -835,11 +835,11 @@ let analyzer = {
         };
         return rst;
     },
-    getDispExpr: function (expression, calcTemplate) {
-        return analyzer.refIDToLines(expression, calcTemplate);
+    getDispExpr: function (expression, template) {
+        return analyzer.refIDToLines(expression, template);
     },
-    getExpression: function (dispExpr, calcTemplate) {
-        return analyzer.refLineToIDs(dispExpr, calcTemplate);
+    getExpression: function (dispExpr, template) {
+        return analyzer.refLineToIDs(dispExpr, template);
     },
     getDispExprUser: function (dispExpr, labourCoe) {   // labourCoe 是 str 类型
         let rst = analyzer.standard(dispExpr);
@@ -862,6 +862,60 @@ let analyzer = {
         rst = rst.replace(/\]/g, "')");
         rst = rst.replace(/L/g, labourCoe);
         return rst;
+    },
+
+    calcItemMaxID: function(template){
+        let MaxID = 0;
+        for (let item of template.calcItems){
+            if (item.ID > MaxID)
+                MaxID = item.ID;
+        };
+        return MaxID;
+    },
+    calcItemIsUsed: function(template, calcItem){
+        let atID = '@' + calcItem.ID;
+        for (var i = 0; i < template.calcItems.length; i++) {
+            let item = template.calcItems[i];
+            let atIDArr = analyzer.getAtIDArr(item.expression);
+            if (atIDArr.indexOf(atID) >= 0){
+                calcItem.tempUsed = i;
+                return true;
+            }
+        }
+        return false;
+    },
+    calcItemNew: function(template, idx){
+        let newItem = {};
+        newItem.ID = analyzer.calcItemMaxID(template) + 1;
+        newItem.statement = '用户自定义';
+        newItem.expression = '0';
+        template.calcItems.splice(idx + 1, 0, newItem);
+        projectObj.project.calcProgram.compileTemplate(template);
+    },
+    calcItemDelete: function(template, idx){
+        let item = template.calcItems[idx];
+        if (analyzer.calcItemIsUsed(template, item)){
+            alert(`第 ${idx + 1} 行“${item.name}”已被第 ${item.tempUsed + 1} 行引用,不允许删除!`);
+            delete item.tempUsed;
+            return false;
+        }
+        else{
+            template.calcItems.splice(idx, 1);
+            projectObj.project.calcProgram.compileTemplate(template);
+            return true;
+        }
+    },
+    calcItemLabourCoe: function(calcItem){
+        let lc = 0;
+        if (calcItem.labourCoeID)
+            lc = projectObj.project.calcProgram.compiledLabourCoes[calcItem.labourCoeID].coe.toString();
+        return lc;
+    },
+    templateRefresh: function(template){
+        for (let item of template){
+            item.dispExpr = analyzer.getDispExpr(item.expression, template);
+            item.dispExprUser = analyzer.getDispExprUser(item.dispExpr, me.calcItemLabourCoe(item));
+        };
     }
 };
 
@@ -993,53 +1047,6 @@ class CalcProgram {
         template.hasCompiled = false;
         template.errs = [];
 
-        /*let private_extract_ID = function(str, idx){
-            let rst = '', lBracket = 0, rBracket = 0, firstIdx = idx, lastIdx = 0;
-            for (let i = idx; i < str.length; i++) {
-                if (str[i] === '(') {
-                    lBracket++;
-                    if (lBracket == 1) firstIdx = i + 1;
-                }
-                if (str[i] === ')') {
-                    rBracket++;
-                    if (lBracket == rBracket) {
-                        lastIdx = i - 1;
-                        if (lastIdx > firstIdx) {
-                            if (str[firstIdx] === "'") firstIdx++;
-                            if (str[lastIdx] !== "'") lastIdx++;
-                            if (lastIdx > firstIdx) {
-                                rst = str.slice(firstIdx, lastIdx);
-                            }
-                        }
-                        break;
-                    }
-                }
-            }
-            return rst;
-        };*/
-        /*let private_parse_ref = function(item, itemIdx){
-            let idx = item.expression.indexOf('@(', 0);
-            while (idx >= 0) {
-                let ID = private_extract_ID(item.expression, idx);
-                if (ID.length > 0) {
-                    let subItem = template.compiledCalcItems[ID];
-                    if (subItem) {
-                        if (subItem.ID !== item.ID) {
-                            private_parse_ref(subItem, template.compiledCalcItems[ID + "_idx"]);
-                        } else {
-                            template.errs.push("There exists the self refer ID: " + ID);
-                        }
-                    } else {
-                        template.errs.push("There exists the invalid ID by which could not find the item: " + ID);
-                        console.log('invalid ID: ' + ID);
-                    }
-                }
-                idx = item.expression.indexOf('@(', idx + ID.length + 3);
-            }
-            if (template.compiledSeq.indexOf(itemIdx) < 0) {
-                template.compiledSeq.push(itemIdx);
-            }
-        };*/
         let private_extract_ID = function(str, idx){
             let subStr = str.slice(idx);
             let patt = new RegExp(/@\d+/);
@@ -1075,7 +1082,7 @@ class CalcProgram {
             for (let idx of template.compiledSeq) {
                 let item = template.calcItems[idx];
 
-                let lc = me.getLabourCoe(item);
+                let lc = analyzer.calcItemLabourCoe(item);
                 // 用于界面显示。disExpr是公式模板,不允许修改:人工系数占位符被修改后变成数值,第二次无法正确替换。
                 item.dispExprUser = analyzer.getDispExprUser(item.dispExpr, lc);
                 if (item.expression == 'HJ')
@@ -1125,22 +1132,6 @@ class CalcProgram {
             }
         };
     };
-    
-    refreshTemplate(template){
-        let me = this;
-        for (let item of template){
-             item.dispExpr = analyzer.getDispExpr(item.expression, template);
-             item.dispExprUser = analyzer.getDispExprUser(item.dispExpr, me.getLabourCoe(item));
-        };
-    };
-
-    getLabourCoe(calcItem){
-        let me = this;
-        let lc = 0;
-        if (calcItem.labourCoeID)
-            lc = me.compiledLabourCoes[calcItem.labourCoeID].coe.toString();
-        return lc;
-    };
 
     // 存储、刷新零散的多个结点。
     saveNodes(treeNodes, callback){

+ 1 - 1
web/building_saas/main/js/views/calc_base_view.js

@@ -281,7 +281,7 @@ let calcBaseView = {
                 if (calcItem.dispExpr != expr){
                     if (analyzer.isLegal(expr, calcItem.ID, template)){
                         let cp = projectObj.project.calcProgram;
-                        let lc = cp.getLabourCoe(calcItem);
+                        let lc = analyzer.calcItemLabourCoe(calcItem);
                         calcItem.dispExpr = expr;
                         calcItem.dispExprUser = analyzer.getDispExprUser(expr, lc);
                         calcItem.expression = analyzer.getExpression(expr, template);

+ 26 - 18
web/building_saas/main/js/views/calc_program_manage.js

@@ -62,8 +62,7 @@ let calcProgramManage = {
         me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.CellChanged, me.onDetailCellChanged);
         me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onDetailEditEnded);
         me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
-        me.loadMainContextMenu();
-        me.loadDetailContextMenu();
+
         let mSheet = me.mainSpread.getSheet(0);
         sheetCommonObj.showData(mSheet, me.mainSetting, me.datas);
 
@@ -72,6 +71,9 @@ let calcProgramManage = {
         feeRateObject.setFeeRateCellCol(dSheet,_.findIndex(me.detailSetting.header,{'dataCode':'feeRate'}));
         dSheet.getRange(-1, _.findIndex(me.detailSetting.header, {'dataCode': 'dispExprUser'}), -1, 1).cellType(calcBaseView.getCalcBaseCellType('ration'));
         sheetCommonObj.showData(dSheet, me.detailSetting, me.datas[0].calcItems);
+
+        me.loadMainContextMenu();
+        me.loadDetailContextMenu();
     },
     onMainEnterCell: function(sender, args) {
         var me = calcProgramManage;
@@ -120,7 +122,7 @@ let calcProgramManage = {
     onEnterCell: function (sender, args) {
         let t = calcProgramManage.getSelectionInfo().template;
         let c = calcProgramManage.getSelectionInfo().calcItem;
-        let lc = projectObj.project.calcProgram.getLabourCoe(c);
+        let lc = analyzer.calcItemLabourCoe(c);
         c.dispExpr = analyzer.getDispExpr(c.expression, t);
         c.dispExprUser = analyzer.getDispExprUser(c.dispExpr, lc);
         c.compiledExpr = analyzer.getCompiledExpr(c.expression, lc);
@@ -130,6 +132,9 @@ let calcProgramManage = {
     loadMainContextMenu: function () {
         $.contextMenu({
             selector: '#mainSpread',
+            build: function ($trigger, e) {
+                SheetDataHelper.safeRightClickSelection($trigger, e, calcProgramManage.mainSpread);
+            },
             items: {
                 "copyTemplate": {
                     name: "另存为...",
@@ -164,20 +169,22 @@ let calcProgramManage = {
     loadDetailContextMenu: function () {
         $.contextMenu({
             selector: '#detailSpread',
-            build: function ($trigger, e) {
-                var target = SheetDataHelper.safeRightClickSelection($trigger, e, calcProgramManage.detailSpread);
-                // return false;
-                // return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+            build: function ($triggerElement, event) {
+                SheetDataHelper.safeRightClickSelection($triggerElement, event, calcProgramManage.detailSpread);
+               // alert($triggerElement.attr("id"));   // detailSpread
             },
             items: {
-                "insertCalcItem": {
+                "newCalcItem": {
                     name: "插入行",
                     icon: 'fa-sign-in',
                     disabled: function () {
                         return false;
                     },
                     callback: function (key, opt) {
-                        // do
+                        let t = calcProgramManage.getSelectionInfo().template;
+                        var idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex();
+                        analyzer.calcItemNew(t, idx); // CSLAAAAA 这里要回调
+                        calcProgramManage.refreshDetailSheet();
                     }
                 },
                 "deleteCalcItem": {
@@ -189,12 +196,10 @@ let calcProgramManage = {
                         return false;
                     },
                     callback: function () {
-                        // var selected = project.mainTree.selected;
-                        // if(selected.sourceType == project.Bills.getSourceType()){
-                        //     project.Bills.deleteSelectedNode();
-                        // }else {
-                        //     $("#delete_row").modal({show:true});//弹出删除提示框;
-                        // }
+                        let t = calcProgramManage.getSelectionInfo().template;
+                        var idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex();
+                        if (analyzer.calcItemDelete(t, idx)) // CSLAAAAA 这里要回调
+                            calcProgramManage.refreshDetailSheet();
                     }
                 }
             }
@@ -233,10 +238,13 @@ let calcProgramManage = {
         return info;
     },
     refreshDetailSheet:function () {
-        var me=this;
+        var me = this;
         if(me.mainSpread && me.detailSpread){
-            var mainSheetIndex = me.mainSpread.getActiveSheet().getActiveRowIndex();
-            sheetCommonObj.showData(me.detailSpread.getSheet(0), me.detailSetting,me.datas[mainSheetIndex].calcItems);
+            let mainRowIdx = me.mainSpread.getActiveSheet().getActiveRowIndex();
+            let calcItems = me.datas[mainRowIdx].calcItems;
+            let detailSheet = me.detailSpread.getActiveSheet();
+            detailSheet.setRowCount(calcItems.length);
+            sheetCommonObj.showData(detailSheet, me.detailSetting, calcItems);
         }
     }