Przeglądaj źródła

用户自定义计算规则

chenshilong 7 lat temu
rodzic
commit
1056c8ef61

+ 5 - 2
modules/all_models/calc_program_model.js

@@ -16,13 +16,16 @@ let calcItemSchema = new Schema({
     statement: String,
     feeRateID: Number,
     feeRate: String,
-    labourCoeID: Number
+    labourCoeID: Number,
+    memo: String,
+    custom: Boolean
 },{versionKey:false, _id: false});
 
 let templateSchema = new Schema({
     ID: Number,
     name: String,
-    calcItems: [calcItemSchema]
+    calcItems: [calcItemSchema],
+    custom: Boolean
 },{versionKey:false, _id: false});
 
 let stdCalcPrograms = new Schema({

+ 29 - 4
modules/main/controllers/calc_program_controller.js

@@ -9,7 +9,8 @@ module.exports = {
     getProjectCalcProgram: getProjectCalcProgram,
     getStdCalcProgram: getStdCalcProgram,
     saveCalcItem: saveCalcItem,
-    saveCalcItems: saveCalcItems
+    saveCalcItems: saveCalcItems,
+    updateTemplate: updateTemplate
 };
 
 async function getProjectCalcProgram(req, res) {
@@ -41,15 +42,21 @@ async function getStdCalcProgram(req, res) {
 };
 
 async function saveCalcItem(req, res) {
-    let result = {error: 0, message: ''};
+    let result = {error: -1, data: -1, message: ''};
 
     calcProgramFacade.saveCalcItem(req.body.data, function (err, msg) {
         if (err) {
             result.error = 1;
-        };
+            result.data = 0;
+        }
+        else {
+            result.error = 0;
+            result.data = 1;
+        }
         result.message = msg;
+        res.json(result);
     });
-    res.json(result);
+
 };
 
 async function saveCalcItems(req, res) {
@@ -63,3 +70,21 @@ async function saveCalcItems(req, res) {
     });
     res.json(result);
 };
+
+async function updateTemplate(req, res) {
+    let result = {};
+
+    calcProgramFacade.updateTemplate(req.body.data, function (err, msg) {
+        if (err) {
+            result.error = 1;
+            result.data = 0;
+        }
+        else{
+            result.error = 0;
+            result.data = 1;
+        }
+        result.message = msg;
+        res.json(result);
+    });
+
+};

+ 34 - 4
modules/main/facade/calc_program_facade.js

@@ -19,7 +19,8 @@ module.exports = {
     getData: getData,
     save: save,
     saveCalcItem: saveCalcItem,
-    saveCalcItems: saveCalcItems
+    saveCalcItems: saveCalcItems,
+    updateTemplate: updateTemplate
 };
 
 async function newProjectCalcProgramFile(data) {
@@ -104,9 +105,9 @@ function saveCalcItem(dataObj, callback) {
                             data.templates[i].calcItems[j] = dataObj.calcItem;
                             data.save(function (err) {
                                 if (err) {
-                                    callback({err:1, msg:'本条计算规则保存失败'});
+                                    callback(1, '本条计算规则保存失败');
                                 } else {
-                                    callback({err:0, msg:'本条计算规则保存成功'});
+                                    callback(0, '本条计算规则保存成功');
                                 }
                             });
                             break;
@@ -117,7 +118,7 @@ function saveCalcItem(dataObj, callback) {
             };
         }
         else {
-            callback( {err:1, msg:'没有找到计算程序文件'} );
+            callback(1, '没有找到计算程序文件');
         }
     });
 };
@@ -154,6 +155,35 @@ function saveCalcItems(datas, callback) {
     });
 };
 
+// {  projectID: 3, templatesID: 5, name: '建筑工程', calcItems: [{},{}] }  其中name可选,calcItems可选,其它必填。
+function updateTemplate(dataObj, callback) {
+    dataObj=JSON.parse(dataObj);
+    projectCalcProgramsModel.findOne({projectID: dataObj.projectID}, function (err, data) {
+        if(!err){
+            for (let i = 0; i < data.templates.length; i++){
+                if (data.templates[i].ID == dataObj.templatesID){
+                    if (dataObj.name)
+                        data.templates[i].name = dataObj.name;
+                    if (dataObj.calcItems)
+                        data.templates[i].calcItems = dataObj.calcItems;
+                    data.save(function (err) {
+                        if (err) {
+                            callback(1, '计算模板保存失败');
+                        } else {
+                            callback(0, '计算模板保存成功');
+                        }
+                    });
+
+                    break;
+                };
+            };
+        }
+        else {
+            callback(1, '没有找到计算程序文件');
+        }
+    });
+};
+
 // for test
 /*let udata = {ID:8, code: '8.8.8', name: '被改成了888', hehe: '增加的属性'};
 saveCalcItem({projectID: 597, templatesID: 4, data: udata}, function (data) {

+ 1 - 0
modules/main/routes/calc_program_route.js

@@ -13,6 +13,7 @@ module.exports = function (app) {
     cpRouter.post('/getStdCalcProgram', cpController.getStdCalcProgram);
     cpRouter.post('/saveCalcItem', cpController.saveCalcItem);
     cpRouter.post('/saveCalcItems', cpController.saveCalcItems);
+    cpRouter.post('/updateTemplate', cpController.updateTemplate);
 
     app.use('/calcProgram',cpRouter);
 }

+ 10 - 1
web/building_saas/main/js/models/calc_program.js

@@ -895,7 +895,16 @@ let analyzer = {
             item.dispExpr = analyzer.getDispExpr(item.expression, template);
             item.dispExprUser = analyzer.getDispExprUser(item.dispExpr, me.calcItemLabourCoe(item));
         };
-    }
+    },
+    templateMaxID: function(){
+        let ts = projectObj.project.calcProgram.templates;
+        let MaxID = 0;
+        for (let t of ts){
+            if (t.ID > MaxID)
+                MaxID = t.ID;
+        };
+        return MaxID;
+    },
 };
 
 let executeObj = {

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

@@ -298,6 +298,7 @@ let calcBaseView = {
                                 cp.calcAllNodesAndSave();
                                 calcProgramManage.refreshDetailSheet();
                                 $('#qd-jsjs').modal('hide');
+                                $.bootstrapLoading.end();
                             }
                         });
                     };

+ 81 - 39
web/building_saas/main/js/views/calc_program_manage.js

@@ -115,6 +115,7 @@ let calcProgramManage = {
             me.saveCalcItem(data, function (rst) {
                 if (rst){
                     projectObj.project.calcProgram.calcAllNodesAndSave();
+                    $.bootstrapLoading.end();
                 }
             });
         }
@@ -126,7 +127,7 @@ let calcProgramManage = {
         c.dispExpr = analyzer.getDispExpr(c.expression, t);
         c.dispExprUser = analyzer.getDispExprUser(c.dispExpr, lc);
         c.compiledExpr = analyzer.getCompiledExpr(c.expression, lc);
-        let e = c.expression + ' ' + c.dispExpr + ' ' + c.dispExprUser + ' ' + c.compiledExpr;
+        let e = `ID:${c.ID} ${c.expression} ${c.dispExpr} ${c.dispExprUser} ${c.compiledExpr} ${c.custom}`;
         projectObj.testDisplay('', e);
     },
     loadMainContextMenu: function () {
@@ -139,14 +140,34 @@ let calcProgramManage = {
                 "copyTemplate": {
                     name: "另存为...",
                     icon: 'fa-sign-in',
-                    disabled: function () {
-                        return false;
-                    },
-                    visible: function(key, opt){
-                        return true;
-                    },
                     callback: function (key, opt) {
-                        // doCopy
+                        let template = calcProgramManage.getSelectionInfo().template;
+                        let idx = calcProgramManage.mainSpread.getActiveSheet().getActiveRowIndex();
+
+                        let newTemplate = {};
+                        newTemplate.ID = analyzer.templateMaxID() + 1;
+                        newTemplate.name = `模板${newTemplate.ID}`;
+                        newTemplate.custom = true;
+                        newTemplate.calcItems = [];
+                        $.extend(true, newTemplate.calcItems, template.calcItems);
+                        let ts = projectObj.project.calcProgram.templates;
+                        ts.push(newTemplate);
+                        calcProgramManage.buildSheet();
+
+                        // let data = {
+                        //     'projectID': projectObj.project.ID(),
+                        //     'templatesID': template.ID,
+                        //     'calcItems': template.calcItems
+                        // };
+                        // calcProgramManage.updateTemplate(data, function (rst) {
+                        //     if (rst){
+                        //         projectObj.project.calcProgram.compileTemplate(template);
+                        //         calcProgramManage.refreshDetailSheet();
+                        //         calcProgramManage.detailSpread.getActiveSheet().setSelection(idx + 1, 0, 1, 1);
+                        //         // projectObj.project.calcProgram.calcAllNodesAndSave();
+                        //         $.bootstrapLoading.end();
+                        //     }
+                        // });
                     }
                 },
                 "spr1": '--------',
@@ -154,13 +175,16 @@ let calcProgramManage = {
                     name: '删除',
                     icon: 'fa-remove',
                     disabled: function () {
-                        return false;
-                    },
-                    visible: function(key, opt){
-                        return true;
+                        let custom = calcProgramManage.getSelectionInfo().template.custom;
+                        let canDelete = custom ? custom : false;
+                        return !canDelete;
                     },
                     callback: function () {
-                        // doDelete
+                        let ts = projectObj.project.calcProgram.templates;
+                        let idx = calcProgramManage.mainSpread.getActiveSheet().getActiveRowIndex();
+                        ts.splice(idx, 1);
+                        calcProgramManage.buildSheet();
+
                     }
                 }
             }
@@ -178,17 +202,28 @@ let calcProgramManage = {
                     icon: 'fa-sign-in',
                     callback: function () {
                         let template = calcProgramManage.getSelectionInfo().template;
-                        var idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex();
+                        let idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex();
 
                         let newItem = {};
                         newItem.ID = analyzer.calcItemMaxID(template) + 1;
-                        newItem.memo = '用户自定义';
+                        newItem.memo = '自定义';
+                        newItem.custom = true;
                         newItem.expression = '0';
                         template.calcItems.splice(idx + 1, 0, newItem);
-
-                        projectObj.project.calcProgram.compileTemplate(template);
-                        calcProgramManage.refreshDetailSheet();
-                        calcProgramManage.detailSpread.getActiveSheet().setSelection(idx + 1, 0, 1, 1);
+                        let data = {
+                            'projectID': projectObj.project.ID(),
+                            'templatesID': template.ID,
+                            'calcItems': template.calcItems
+                        };
+                        calcProgramManage.updateTemplate(data, function (rst) {
+                            if (rst){
+                                projectObj.project.calcProgram.compileTemplate(template);
+                                calcProgramManage.refreshDetailSheet();
+                                calcProgramManage.detailSpread.getActiveSheet().setSelection(idx + 1, 0, 1, 1);
+                                // projectObj.project.calcProgram.calcAllNodesAndSave();
+                                $.bootstrapLoading.end();
+                            }
+                        });
                     }
                 },
                 "deleteCalcItem": {
@@ -196,7 +231,7 @@ let calcProgramManage = {
                     icon: 'fa-remove',
                     callback: function () {
                         let template = calcProgramManage.getSelectionInfo().template;
-                        var idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex();
+                        let idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex();
                         let item = template.calcItems[idx];
 
                         if (analyzer.calcItemIsUsed(template, item)){
@@ -205,8 +240,18 @@ let calcProgramManage = {
                         }
                         else{
                             template.calcItems.splice(idx, 1);
-                            projectObj.project.calcProgram.compileTemplate(template);
-                            calcProgramManage.refreshDetailSheet();
+                            let data = {
+                                'projectID': projectObj.project.ID(),
+                                'templatesID': template.ID,
+                                'calcItems': template.calcItems
+                            };
+                            calcProgramManage.updateTemplate(data, function (rst) {
+                                if (rst){
+                                    projectObj.project.calcProgram.compileTemplate(template);
+                                    calcProgramManage.refreshDetailSheet();
+                                    $.bootstrapLoading.end();
+                                }
+                            });
                         }
                     }
                 }
@@ -215,26 +260,23 @@ let calcProgramManage = {
 
 
     },
-    saveCalcItem: function (data,callback) {//data
-        let me = this;
-        $.ajax({
-            type: 'POST',
-            url: '/calcProgram/saveCalcItem',
-            data: {'data':JSON.stringify(data)},
-            dataType: 'json',
-            success: function (result) {
-                if(!result.error){
-                    if(callback){
-                        callback(result);
-                        return;
-                    }
+    saveCalcItem: function (data, callback) {//data
+        CommonAjax.post('/calcProgram/saveCalcItem', data,
+            function (result) {
+                if(callback){
+                    callback(result);
                 }
-                else{
-                    alert('失败:' + result.message);
+            }
+        );
+    },
+    updateTemplate: function (data, callback) {//data
+        CommonAjax.post('/calcProgram/updateTemplate', data,
+            function (result) {
+                if(callback){
+                    callback(result);
                 }
-                $.bootstrapLoading.end();
             }
-        })
+        );
     },
     getSelectionInfo:function () {
         var templateIndex = this.mainSpread.getActiveSheet().getActiveRowIndex();