Explorar o código

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhangweicheng %!s(int64=7) %!d(string=hai) anos
pai
achega
e2c5b70c7a

+ 2 - 0
modules/pm/models/project_model.js

@@ -33,6 +33,8 @@ const defaultDecimal = {
     ration: {quantity: 3, unitPrice: 2, totalPrice: 2},
     glj: {quantity: 3, unitPrice: 2},
     feeRate: 2,
+    quantity_detail: 4,
+    process: 6
 };
 
 let ProjectsDAO = function(){};

+ 51 - 16
web/building_saas/main/js/models/calc_program.js

@@ -686,29 +686,64 @@ class CalcProgram {
     saveNode(treeNode, saveParents = true) {
         if (!treeNode.changed) return;
         let me = this;
-        let newDataArr = [], nodesArr = [];
-
-        me.project.beginUpdate('');
+        let nodesArr = [];
         let curNode = treeNode;
         while (curNode) {
-            if (curNode.changed){
+            if (curNode.changed){nodesArr.push(curNode)};
+            if (saveParents) curNode = curNode.parent
+            else break;
+        };
+        me.saveNodes(nodesArr);
+    };
+
+    // 待保存的树结点列表入库存储
+    saveNodes(treeNodes){
+        if (treeNodes.length < 1) return;
+
+        let me = this;
+
+        me.project.beginUpdate('');
+        for (let node of treeNodes){
+            if (node.changed){
                 let data = {
-                    ID: curNode.data.ID,
+                    ID: node.data.ID,
                     projectID: me.project.ID(),
-                    quantity: curNode.data.quantity,
-                    fees: curNode.data.fees
+                    quantity: node.data.quantity,
+                    fees: node.data.fees
                 };
-                let newDta = {'updateType': 'ut_update', 'updateData': data};
-                newDataArr.push(newDta);
-                nodesArr.push(curNode);
-                me.project.push(curNode.sourceType, newDataArr);
-            };
-            if (saveParents) curNode = curNode.parent
-            else break;
+                let newData = {'updateType': 'ut_update', 'updateData': data};
+                me.project.push(node.sourceType, [newData]);
+            }
         };
         me.project.endUpdate();
 
-        for (let node of nodesArr){delete node.changed;};
-        projectObj.mainController.refreshTreeNode(nodesArr);
+        for (let node of treeNodes){delete node.changed};
+        projectObj.mainController.refreshTreeNode(treeNodes);
+    };
+
+
+    // 参数取值如下:
+    // calcAllType.catAll       计算所有树结点 (不指定参数时的默认值)
+    // calcAllType.catBills     计算所有清单 (改变项目属性中清单取费算法时会用到)
+    // calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序。 (改变人工系数、费率值、工料机单价时会用到)
+    calcAllNodes(calcType = calcAllType.catAll){
+        let me = this;
+        let needSaveNodes = [];
+
+        function calcNodes(nodes) {
+            for (let node of nodes) {
+                if (node.children.length > 0) {
+                    calcNodes(node.children);
+                };
+
+                if ((calcType == calcAllType.catAll) || (calcType == node.sourceType)) {
+                    me.calculate(node, false);
+                    if (node.changed) needSaveNodes.push(node);
+                };
+            }
+        };
+
+        calcNodes(me.project.mainTree.roots);
+        me.saveNodes(needSaveNodes);
     };
 }

+ 18 - 2
web/building_saas/main/js/models/main_consts.js

@@ -36,10 +36,26 @@ const CP_Col_Width = {          // 多处计算程序界面的列宽统一设置
     totalFee: 90
 };
 
-treeNodeCalcType = {
+const treeNodeCalcType = {
     ctRationCalcProgram: 1,
     ctBillCalcProgram: 2,
     ctGatherRations: 3,
     ctGatherBills: 4,
     ctCalcBaseValue: 5
-};
+};
+
+const calcAllType = {
+    catAll: 'all',
+    catBills: 'bills',
+    catRations: 'ration'
+};
+
+const subSheetIndex = {
+    ssiRationGLJ: 0,
+    ssiRationCoe: 1,
+    ssiRationAssistant: 2,
+    ssiQuantityDetail: 3,
+    ssiCalcProgram: 4,
+    ssiMemo: 5,
+    ssiFeature: 6
+}

+ 0 - 7
web/building_saas/main/js/models/ration.js

@@ -373,13 +373,6 @@ var Ration = {
 
             this.project.endUpdate();
         };
-
-        ration.prototype.calcAll = function (){
-            for (let ration of this.datas){
-                let node = this.project.mainTree.findNode(ration.ID);
-                 this.project.calcProgram.calculate(node);
-            };
-        };
         
         return new ration(project);
     }

+ 9 - 1
web/building_saas/main/js/models/ration_glj.js

@@ -41,9 +41,11 @@ var ration_glj = {
         };
 
         ration_glj.prototype.getGljArrByRation = function (rationID) {
-            return this.datas.filter(function (data) {
+            let result =  this.datas.filter(function (data) {
                 return data.rationID === rationID;
             })
+            result = gljOprObj.combineWithProjectGlj(result);
+            return result;
         };
         ration_glj.prototype.getGatherGljArrByRations = function (rations) {
             let result = [];
@@ -110,6 +112,12 @@ var ration_glj = {
                 projectObj.project.ration_glj.datas = neRecodes;
             }
             gljOprObj.showRationGLJSheetData(true);
+            let node = project.mainTree.selected;
+            project.calcProgram.calculate(node);
+            project.calcProgram.saveNode(node);
+            if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
+                calcProgramObj.showData(node, false);
+            };
         };
         ration_glj.prototype.refreshAfterUpdate=function(data){
             var me = this;

+ 5 - 3
web/building_saas/main/js/views/calc_program_view.js

@@ -225,11 +225,13 @@ let calcProgramObj = {
         sheetCommonObj.initSheet(me.sheet, me.setting, 1);
     },
 
-    showData: function (treeNode) {
+    showData: function (treeNode, needCalc = true) {
         var me = this;
         me.treeNode = treeNode;
-        projectObj.project.calcProgram.calculate(treeNode);
-        projectObj.project.calcProgram.saveNode(treeNode);
+        if (needCalc){
+            projectObj.project.calcProgram.calculate(treeNode);
+            projectObj.project.calcProgram.saveNode(treeNode);
+        };
         me.datas = treeNode.data.calcTemplate.calcItems;
         sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
         sheetCommonObj.showData(me.sheet, me.setting, me.datas);

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

@@ -28,7 +28,7 @@ var projectInfoObj = {
                 that.projectInfo = data;
                 //init decimal
                 setDecimal(decimalObj, data.property.decimal);
-                billsQuanDecimal.datas = data.property.billsQuantityDecimal;
+                billsQuanDecimal.datas = data.property.billsQuantityDecimal || [billsDecimalView.angleDecimal];
                 $('#fullpath').html(that.getFullPathHtml(that.projectInfo));
             }
         });

+ 7 - 7
web/building_saas/main/js/views/project_property_decimal_view.js

@@ -5,7 +5,7 @@
 let defaultDecimal = {
     min: 0,
     max: 6,
-    _def: {//定义往这加, editable: 开放给用户编辑的(入库),定义editable为false的字段时,只需在此定义便可,定义editable为true的字段时,要在后端project_model.js defaultDecimal中添加定义,html添加input
+    _def: {//editable: 开放给用户编辑的
         bills: {editable: true, data: {unitPrice: 2, totalPrice: 2}},
         ration: {editable: true, data: {quantity: 3, unitPrice: 2, totalPrice: 2}},
         glj: {editable: true, data: {quantity: 3, unitPrice: 2}},
@@ -70,14 +70,9 @@ function toUpdateDecimal(orgV, newV){
 
 function setDecimal(_digits, data){
     if(isDef(data)){
-        for(let attr in data){//设置入库的数据
+        for(let attr in data){
             _digits[attr] = data[attr] || defaultDecimal['_def'][attr]['data'];
         }
-        for(let attr in defaultDecimal['_def']){//设置不入库的数据
-            if(!defaultDecimal['_def'][attr]['editable']){
-                _digits[attr] = defaultDecimal['_def'][attr]['data'];
-            }
-        }
     }
     else {
         for(let attr in defaultDecimal['_def']){
@@ -114,6 +109,11 @@ function m_getDecimalData(inputs){
             rst[attrs[0]] = parseInt($(inputs[i]).val());
         }
     }
+    for(let attr in defaultDecimal['_def']){
+        if(!defaultDecimal['_def'][attr]['editable']){
+            rst[attr] = defaultDecimal['_def'][attr]['data'];
+        }
+    }
     return rst;
 }
 

+ 35 - 13
web/building_saas/main/js/views/project_view.js

@@ -18,7 +18,7 @@ var projectObj = {
         gljOprObj.showDataIfRationSelect(node);
 
         // CSL.2017.07.25
-        if (SubActiveSheetNameIs('JSCX')) {
+        if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
             if (node.sourceType === project.Bills.getSourceType() || node.sourceType === project.Ration.getSourceType()) {
                 calcProgramObj.showData(node);
             } else {
@@ -247,9 +247,15 @@ var projectObj = {
     updateCode: function (node, value) {
         let project = projectObj.project;
         if (node.sourceType === project.Bills.getSourceType()) {
-            this.updateBillsCode(node, value);
+            this.updateBillsCode(node, value);   // 新清单不适合实时计算,下面套什么还不能确定,无数量计算也无意义
         } else if (node.sourceType === project.Ration.getSourceType()) {
-            this.updateRationCode(node, value);
+            this.updateRationCode(node, value);  // 新套定额适合实时计算
+            // 这里因异步问题暂时缺少工料机价格。该过程移到:ration_glj.js的refreshAfterSave方法中。
+            /*project.calcProgram.calculate(node);
+            project.calcProgram.saveNode(node);
+            if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
+                calcProgramObj.showData(node, false);
+            };*/
         }
     },
     updateCellValue: function (node, value, colSetting) {
@@ -258,12 +264,17 @@ var projectObj = {
             if (fieldName === 'code') {
                 projectObj.updateCode(node, value);
             } else if (fieldName === 'quantity' && project.quantity_detail.quantityEditChecking(value,node,fieldName)) {
+                if (value) {value = value.toDecimal(projectObj.project.Decimal.common.quantity);};
                 node.data.quantity = value;
                 project.calcProgram.calculate(node);
                 project.calcProgram.saveNode(node);
                 // projectObj.updateAndReCalculate(node, fieldName, value);
             } else if (fieldName === 'feesIndex.common.unitFee') {
-                projectObj.updateAndReCalculate(node, fieldName, value);
+                if (value) {value = value.toDecimal(projectObj.project.Decimal.common.unitFee);};
+                node.data.feesIndex.common.unitFee = value;
+                project.calcProgram.calculate(node);
+                project.calcProgram.saveNode(node);
+                // projectObj.updateAndReCalculate(node, fieldName, value);
             } else if(fieldName ==='feeRate'){
                 project.FeeRate.updateFeeRateFromBills(value,node,fieldName);
             }else {
@@ -468,7 +479,8 @@ var projectObj = {
                 "calculateAll_RationContent": {
                     name: '造价计算',
                     callback: function () {
-                        projectObj.calculateAll();
+                        // projectObj.calculateAll();
+                        project.calcProgram.calcAllNodes();
                     }
                 }
             }
@@ -476,7 +488,7 @@ var projectObj = {
     },
     // 计算node及node的所有父项
     converseCalculateBills: function (node) {
-        if (node) {
+/*        if (node) {
             let calc = new BillsCalcHelper(this.project);
             calc.calcNode(node, true);
             let cur = node, nodes = [];
@@ -487,16 +499,18 @@ var projectObj = {
             this.mainController.refreshTreeNode(nodes, false);
             this.project.Bills.updateNodes(nodes, true);
             calc = null;
-        }
+        }*/
+        projectObj.project.calcProgram.calculate(node);
+        projectObj.project.calcProgram.saveNode(node);
     },
     // 计算全部清单
-    calculateAll: function () {
+/*    calculateAll: function () {
         let calc = new BillsCalcHelper(this.project);
         calc.calcAll();
         this.mainController.showTreeData();
         this.project.Bills.updateAll();
         calc = null;
-    }
+    }*/
 };
 
 $('#insert').click(function () {
@@ -620,10 +634,18 @@ $('#property_ok').click(function () {
         reCalc = true;
     }
     if (reCalc) {
-        projectObj.calculateAll();
-        project.pushNow('editBillsCalcMode',
+        // projectObj.calculateAll();
+/*        project.pushNow('editBillsCalcMode',
             [project.projSetting.moduleName, project.Bills.getSourceType()],
-            [{projectID: project.ID(), billsCalcMode: project.projSetting.billsCalcMode}, project.Bills.getUpdateAllData()]
-        );
+            [{
+                projectID: project.ID(),
+                billsCalcMode: project.projSetting.billsCalcMode
+            }, project.Bills.getUpdateAllData()]
+        );*/
+        project.pushNow('', [project.projSetting.moduleName], [{
+            projectID: project.ID(),
+            billsCalcMode: project.projSetting.billsCalcMode
+        }]);
+        project.calcProgram.calcAllNodes(calcAllType.catBills);
     }
 });

+ 4 - 2
web/building_saas/main/js/views/sub_view.js

@@ -116,10 +116,12 @@ $("#linkTZJNR").click(function () {
     }
     gljOprObj.activeTab='#linkTZJNR';
 });
-function SubActiveSheetNameIs(sheetName){
-    let rst = subSpread.getActiveSheet().name() == sheetName;
+
+function activeSubSheetIs(idx){
+    let rst = subSpread.getActiveSheetIndex() == idx;
     return rst;
 }
+
 //弹出清单规则或定额库后导致subSpread和特征及内容spread显示出问题
 function refreshSubSpread(){
     if(pageCCOprObj.active){