Просмотр исходного кода

修改计算程序保存方法,对比更新

zhangweicheng 7 лет назад
Родитель
Сommit
86a21e242b

+ 1 - 1
public/web/id_tree.js

@@ -141,7 +141,7 @@ var idTree = {
             this.tree = tree;
             this.data = data;
             this.children = [];
-
+            this.updateData={};
             this.parent = null;
             this.nextSibling = null;
             this.preSibling = null;

+ 1 - 1
web/building_saas/main/js/models/cache_tree.js

@@ -108,7 +108,7 @@ var cacheTree = {
             // ���µ����ԣ�����Ԫ��������ֱ���޸�
             this.tree = tree;
             this.children = [];
-
+            this.updateData={};
             this.parent = null;
             this.nextSibling = null;
             this.preSibling = null;

+ 3 - 3
web/building_saas/main/js/models/calc_base.js

@@ -1773,9 +1773,9 @@ let calcBase = {
 
             //存储
             me.success = true;
-            node.data.calcBase = exp;
-            node.data.calcBaseValue = parseFloat(calcBaseValue).toDecimal(decimalObj.decimal('totalPrice', node));
-            node.data.tenderCalcBaseValue = parseFloat(tenderCalcBaseValue).toDecimal(decimalObj.decimal('totalPrice', node));
+            node.updateData.calcBase = exp;
+            node.updateData.calcBaseValue = parseFloat(calcBaseValue).toDecimal(decimalObj.decimal('totalPrice', node));
+            node.updateData.tenderCalcBaseValue = parseFloat(tenderCalcBaseValue).toDecimal(decimalObj.decimal('totalPrice', node));
             node.changed = true;
         }
         catch (err){

+ 58 - 40
web/building_saas/main/js/models/calc_program.js

@@ -148,12 +148,16 @@ let calcTools = {
         if (!treeNode.data.fees) {
             treeNode.data.fees = [];
             treeNode.data.feesIndex = {};
+            treeNode.updateData.fee = [];
+            treeNode.updateData.feesIndex = {};
             treeNode.changed = true;
         }
         else if (!treeNode.data.feesIndex){
             treeNode.data.feesIndex = {};
+            treeNode.updateData.feesIndex = {};
             for (let fee of treeNode.data.fees){
                 treeNode.data.feesIndex[fee.fieldName] = fee;
+                treeNode.updateData.feesIndex[fee.fieldName] = fee;
             };
             treeNode.changed = true;
         };
@@ -168,6 +172,8 @@ let calcTools = {
                 'tenderUnitFee': 0,
                 'tenderTotalFee': 0
             };
+            treeNode.updateData.fees.push(fee);
+            treeNode.updateData.feesIndex[fieldName] = fee;
             treeNode.data.fees.push(fee);
             treeNode.data.feesIndex[fieldName] = fee;
             treeNode.changed = true;
@@ -215,9 +221,10 @@ let calcTools = {
             let arr = fieldName.split('.');
             this.initFeeField(treeNode, arr[1]);
             treeNode.data.feesIndex[arr[1]][arr[2]] = value;
+            treeNode.updateData.feesIndex[arr[1]][arr[2]] = value;
         }
         else{
-            treeNode.data[fieldName] = value;
+            treeNode.updateData[fieldName] = value;
         };
         treeNode.changed = true;
     },
@@ -229,6 +236,12 @@ let calcTools = {
                 safetyFee: 0,
                 chargeFee: 0
             };
+            treeNode.updateData.summaryFees = {
+                totalFee: 0,
+                estimateFee: 0,
+                safetyFee: 0,
+                chargeFee: 0
+            };
             treeNode.changed = true;
         };
     },
@@ -679,44 +692,36 @@ let calcTools = {
         let me = this;
         /*  subType、quantity、calcBase、programID、marketUnitFee等等字段较为特殊,它们的改变一定会触发计算并导致计算
             结果的变化,从而引发保存动作。将这些字段放在该位置跟计算结果一起保存,可减少前端跟后端的通讯频率。              */
-        let data = {
-            projectID: projectObj.project.ID(),
-            ID: treeNode.data.ID,
-            unit: treeNode.data.unit,   //对清单来说,改变单位,工程量精度会跟着改变从而影响计算。
-            subType: treeNode.data.subType,
-            quantity: treeNode.data.quantity,
-            calcBase: treeNode.data.calcBase,
-            calcBaseValue: treeNode.data.calcBaseValue,
-            programID: treeNode.data.programID,
-            marketUnitFee: treeNode.data.marketUnitFee,
-            marketTotalFee: treeNode.data.marketTotalFee,
-            fees: treeNode.data.fees,
-            isFromDetail:treeNode.data.isFromDetail,
-            feeRate: treeNode.data.feeRate,
-            feeRateID: treeNode.data.feeRateID,
-            contain: treeNode.data.contain,
-            quantityEXP: treeNode.data.quantityEXP,
-            summaryFees: treeNode.data.summaryFees,
-            name:treeNode.data.name,
-            rationQuantityCoe: treeNode.data.rationQuantityCoe,
-            quantityCoe: treeNode.data.quantityCoe == null ? {} : treeNode.data.quantityCoe,
-            targetUnitFee: treeNode.data.targetUnitFee,
-            targetTotalFee: treeNode.data.targetTotalFee,
-            specialProvisional:treeNode.data.specialProvisional
-        };
-
+        let data = treeNode.updateData;
+        data.projectID = projectObj.project.ID();
+        data.ID = treeNode.data.ID;
+        //对比计算结果与原数据的值,有改变的才提交保存
+        if(treeNode.temData){
+            for(let key in treeNode.data){
+                if(key == "feesIndex" || key =="flagsIndex" || key =="gljList" || key =="calcTemplate") continue;// 这两个字段不用保存到后台;
+                if(treeNode.data[key]&& typeof treeNode.data[key] == "object"){//对象类型转换成字符串比较
+                    if(Array.isArray(treeNode.data[key])) treeNode.data[key].sort();
+                    if(Array.isArray(treeNode.temData[key])) treeNode.temData[key].sort();
+                    if(JSON.stringify(treeNode.temData[key])!== JSON.stringify(treeNode.data[key]) ){
+                        data[key] = treeNode.data[key];
+                    }
+                }else if(treeNode.temData[key]!==treeNode.data[key]){
+                    data[key] = treeNode.data[key];
+                }
+            }
+        }
         // 定额大类
         if (me.isRationCategory(treeNode)) {
-            data.isSubcontract = treeNode.data.isSubcontract;
-            data.evaluationProject = treeNode.data.evaluationProject;
+            // 这4个位置要分别找到更新的地方按新的来更新
+           // data.isSubcontract = treeNode.data.isSubcontract;
+           // data.evaluationProject = treeNode.data.evaluationProject;
             //定额类型的工料机做特殊处理
             if(me.isGljRation(treeNode)){
-                data.code = treeNode.data.code;
-                data.projectGLJID = treeNode.data.projectGLJID;
+             //   data.code = treeNode.data.code;
+              //  data.projectGLJID = treeNode.data.projectGLJID;
                 delete data.marketUnitFee;
             };
         };
-
         // 优化掉 undefined 属性
         data = JSON.parse(JSON.stringify(data));
         return data;
@@ -1581,9 +1586,10 @@ class CalcProgram {
     // 只计算treeNode自身。changedArr: 外部传来的一个数组,专门存储发生变动的节点。
     innerCalc(treeNode, changedArr, tender){
         let me = this;
+        me.setUpdateDataToNode(treeNode);//先更新要计算的节点信息
+        if(!treeNode.temData) treeNode.temData = _.cloneDeep(treeNode.data); //有可能会有多次计算,只有第一次才保存原始数据,用来对于更新。
         // 仅用作树节点显示的工料机不能参与计算。
         if (treeNode.sourceType === ModuleNames.ration_glj) return;
-
         treeNode.calcType = calcTools.getCalcType(treeNode);
         let nQ = calcTools.uiNodeQty(treeNode);
         let nTQ = calcTools.uiNodeTenderQty(treeNode);
@@ -1831,14 +1837,12 @@ class CalcProgram {
 
                 if (tender == tenderTypes.ttReverseRation || tender == tenderTypes.ttReverseGLJ)
                     this.calcTenderReverse(treeNode, tender);
-
                 deleteUselessFees(treeNode, fnArr);
             };
         };
 
         if (!calcTools.isTotalCostBill(treeNode))  // 已在上面的分支中计算过
             calcTools.estimateFee(treeNode);
-
         if (treeNode.changed && !changedArr.includes(treeNode)) changedArr.push(treeNode);
     };
 
@@ -1861,11 +1865,13 @@ class CalcProgram {
                 me.project.endUpdate();*/
 
         let dataArr = [];
+        let updateMap = {};
         for (let node of treeNodes){
             if (node.changed){
                 let data = calcTools.cutNodeForSave(node);
                 let newData = {'type': node.sourceType, 'data': data};
                 dataArr.push(newData);
+                updateMap[node.data.ID] = data;
             }
         };
         if (dataArr.length < 1) {
@@ -1877,13 +1883,15 @@ class CalcProgram {
         me.project.updateNodes(dataArr, function (data) {
             let endShowTime = +new Date();
             console.log(`保存所需时间——${endShowTime - startTime}`);
+            for (let node of treeNodes){
+                delete node.changed;
+                delete node.temData;
+                node.updateData = {};
+            };
             if(callback){
                 callback(data);
             };
-
-            for (let node of treeNodes){delete node.changed};
             projectObj.mainController.refreshTreeNode(treeNodes);
-
             // 批量树结点计算后,计算程序早已物是人非,所以这里要重新计算一下。警告:第二个参数千万不能改成3,否则死循环!
             if (activeSubSheetIsCalcProgram())
                 calcProgramObj.refreshCalcProgram(projectObj.project.mainTree.selected, 2);
@@ -1915,8 +1923,9 @@ class CalcProgram {
     };
     // 计算并保存一个树节点。(修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点)
     calcAndSave(treeNode, callback, tender){
-        let changedNodes = this.calculate(treeNode, true, true, tender);
-        this.saveNodes(changedNodes, callback);
+        this.calcNodesAndSave([treeNode],callback,tender)
+      /*  let changedNodes = this.calculate(treeNode, true, true, tender); 统一调用相同的方法
+        this.saveNodes(changedNodes, callback);*/
     };
 
     /* 计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。参数取值如下:
@@ -1930,6 +1939,7 @@ class CalcProgram {
         let changedNodes = [];
         function calcNodes(nodes) {
             for (let node of nodes) {
+                me.setUpdateDataToNode(node);
                 if (node.children.length > 0) {
                     calcNodes(node.children);
                 };
@@ -1955,6 +1965,13 @@ class CalcProgram {
         let changedNodes = this.calcAllNodes(calcType, tender);
         this.saveNodes(changedNodes, callback);
     };
+    setUpdateDataToNode(node){//将updateData里面的值设到node.data上,计算结点时才能拿到最新的值
+        if(_.isEmpty(node.updateData)){
+            for(let key in node.updateData){
+                node.data[key] = node.updateData[key];
+            }
+        }
+    };
 
     // 计算零散的、混杂的树节点:清单、定额混合等(如:用到某一计算程序的定额和清单)。
     // 计算多条零散的定额,并计算他们所属的清单、父清单、引用清单。如:批量替换工料机后受影响的定额。
@@ -1962,6 +1979,7 @@ class CalcProgram {
     calcNodesAndSave(nodes, callback, tender){
         let me = this, rationNodes = [], billNodes = [], leafBills = [], allChangedNodes = [];
         for (let node of nodes) {
+          me.setUpdateDataToNode(node);//多节点更新的情况,要先更新值,因为计算过程中有可能要引用新的值
             if (node.sourceType == ModuleNames.ration)
                 rationNodes.push(node)
             else

+ 2 - 2
web/building_saas/main/js/models/fee_rate.js

@@ -389,8 +389,8 @@ var FeeRate = {
             var me =this;
             if(node.sourceType === project.Bills.getSourceType()){
                 if(value === ''||value ===null ||value === undefined){//费费为空或空字符串时,请空对应的费率值和ID
-                    node.data.feeRateID = null;
-                    node.data.feeRate = null;
+                    node.updateData.feeRateID = null;
+                    node.updateData.feeRate = null;
                     node.changed = true;
                     project.calcProgram.calcAndSave(node);
                 }else {

+ 8 - 8
web/building_saas/main/js/models/project_glj.js

@@ -236,14 +236,14 @@ ProjectGLJ.prototype.updateGLJProperty = function (node, updateField, newval) {
     $.bootstrapLoading.start();
     CommonAjax.post("/glj/modifyKeyValue", postData, function (result) {
         console.log(result);  //更新节点信息
-        rationTypeGLJ[updateField] = newval;
-        rationTypeGLJ.projectGLJID = result.id;
-        rationTypeGLJ.code = result.code;
-        rationTypeGLJ.basePrice = result.unit_price.base_price;
-        rationTypeGLJ.marketUnitFee = result.unit_price.market_price;
-        rationTypeGLJ.isAdd = result.unit_price.is_add;
-        rationTypeGLJ.isEstimate = result.is_evaluate;
-        rationTypeGLJ.shortName = result.unit_price.short_name;
+        node.updateData[updateField] = newval;
+        node.updateData.projectGLJID = result.id;
+        node.updateData.code = result.code;
+        node.updateData.basePrice = result.unit_price.base_price;
+        node.updateData.marketUnitFee = result.unit_price.market_price;
+        node.updateData.isAdd = result.unit_price.is_add;
+        node.updateData.isEstimate = result.is_evaluate;
+        node.updateData.shortName = result.unit_price.short_name;
         //触发计算并更新节点信息
         node.changed = true;
         projectObj.project.projectGLJ.loadData(function () {

+ 9 - 9
web/building_saas/main/js/models/quantity_detail.js

@@ -725,14 +725,14 @@ var quantity_detail = {
 
         quantity_detail.prototype.updateBillQuantity=function (value,node,quantityEXP,editingText) {
             let oldQuantityEXP =  node.data.quantityEXP;
-            node.data.quantityEXP = quantityEXP?quantityEXP:editingText;
+            node.updateData.quantityEXP = quantityEXP?quantityEXP:editingText;
             value = scMathUtil.roundForObj(value,getDecimal("quantity",node));
             let newQuantity =  value+"";
             if(quantityEXP!="GCLMXHJ"&& oldQuantityEXP == node.data.quantityEXP && node.data.quantity == newQuantity){ //除了修改工程量明细表达式进来的操作,相当于什么都没改,不用做提交操作
                 projectObj.mainController.refreshTreeNode([node]);//这里要再刷新一下,因为工程量要把手工输入的值刷新为转换后的值再显示
                 return;
             }
-            node.data.quantity = newQuantity;
+            node.updateData.quantity = newQuantity;
             let needUpdateChildren = [];//需更新的子定额
             let gljNodes=[];//当定额工程量改变时需刷新的子工料机
             if(node.children.length>0){//如果有子项
@@ -745,8 +745,8 @@ var quantity_detail = {
                             if(isNaN(times)){
                                 times = 1;
                             }
-                            rationNode.data.quantity = scMathUtil.roundForObj(ration_value / times,getDecimal("quantity",rationNode));
-                            rationNode.data.contain = scMathUtil.roundForObj(rationNode.data.quantity/value,getDecimal("process"));
+                            rationNode.updateData.quantity = scMathUtil.roundForObj(ration_value / times,getDecimal("quantity",rationNode));
+                            rationNode.updateData.contain = scMathUtil.roundForObj(rationNode.data.quantity/value,getDecimal("process"));
                             rationNode.changed = true;
                             needUpdateChildren.push(rationNode);
                             if (rationNode.children.length>0){//如果有子工料机
@@ -760,7 +760,7 @@ var quantity_detail = {
                             // children_quantity = scMathUtil.roundForObj(this.reverseQuantity(children_quantity,rationNode),getDecimal("quantity",rationNode));  原先是要反算的,现在改成不用反算了
                             tem_contain =scMathUtil.roundForObj(children_quantity/value,getDecimal("process"));
                         }
-                        rationNode.data.contain = tem_contain;
+                        rationNode.updateData.contain = tem_contain;
                         rationNode.changed = true;
                         needUpdateChildren.push(rationNode);
                     }
@@ -797,7 +797,7 @@ var quantity_detail = {
         };
         quantity_detail.prototype.updateRationQuantity=function(value,node,quantityEXP,editingText){
             let oldQuantityEXP =  node.data.quantityEXP;
-            node.data.quantityEXP = quantityEXP?quantityEXP:editingText;
+            node.updateData.quantityEXP = quantityEXP?quantityEXP:editingText;
             //value = scMathUtil.roundForObj(value,getDecimal("ration.quantity"));
             value = project.quantity_detail.autoTransformQuantity(value,node);//先转换再4舍5入
             value = scMathUtil.roundForObj(value,decimalObj.decimal("quantity",node));
@@ -805,12 +805,12 @@ var quantity_detail = {
                 projectObj.mainController.refreshTreeNode([node]);//这里要再刷新一下,因为工程量要把手工输入的值刷新为转换后的值再显示
                 return;
             }
-            node.data.quantity=value;
+            node.updateData.quantity=value;
             if(node.parent.data.quantity&&node.parent.data.quantity!=0&&node.parent.data.quantity!=""){
                 var billQuantity = scMathUtil.roundForObj(node.parent.data.quantity,getDecimal("quantity",node.parent));
-                node.data.contain = scMathUtil.roundForObj(value/billQuantity,getDecimal("process"));
+                node.updateData.contain = scMathUtil.roundForObj(value/billQuantity,getDecimal("process"));
             }else {
-                node.data.contain=0;
+                node.updateData.contain=0;
             }
             node.changed = true;
             project.calcProgram.calcAndSave(node, function () {

+ 4 - 4
web/building_saas/main/js/models/ration.js

@@ -775,12 +775,12 @@ var Ration = {
             let contain = scMathUtil.roundForObj(value,getDecimal("process"));
             let billQuantity = billNode.data.quantity||billNode.data.quantity!=""?billNode.data.quantity:0;
             billQuantity = parseFloat(billQuantity);
-            node.data.contain = contain;
-            node.data.quantityEXP="QDL*"+contain;
-            node.data.quantity=scMathUtil.roundForObj(billQuantity*contain,getDecimal("quantity",node));
+            node.updateData.contain = contain;
+            node.updateData.quantityEXP="QDL*"+contain;
+            node.updateData.quantity=scMathUtil.roundForObj(billQuantity*contain,getDecimal("quantity",node));
             let times = parseInt(node.data.unit);
             if (!isNaN(times)) {
-                node.data.quantityEXP+='*'+times;
+                node.updateData.quantityEXP+='*'+times;
             }
             //  node.data.quantity = projectObj.project.quantity_detail.autoTransformQuantity(node.data.quantity,node);//按单位做转换
             node.changed = true;

+ 2 - 2
web/building_saas/main/js/views/fee_rate_view.js

@@ -934,8 +934,8 @@ var feeRateObject={
        if(selected.data.feeRateID === parseInt(rate.ID)) return $("#calcBaseFeeRate").modal('hide');
         $.bootstrapLoading.start();
         projectObj.project.FeeRate.submitFeeRateFromBill(rate,selected.data,function (data) {
-            selected.data.feeRateID= parseInt(rate.ID);
-            selected.data.feeRate=scMathUtil.roundToString(rate.rate,getDecimal("feeRate"));
+            selected.updateData.feeRateID= parseInt(rate.ID);
+            selected.updateData.feeRate=scMathUtil.roundToString(rate.rate,getDecimal("feeRate"));
             selected.changed = true;
             projectObj.project.calcProgram.calcAndSave(selected);
             $("#calcBaseFeeRate").modal('hide');

+ 17 - 20
web/building_saas/main/js/views/project_view.js

@@ -504,7 +504,7 @@ var projectObj = {
                     if(value === node.data.calcBase){
                         return;
                     }
-                    node.data.userCalcBase = value;
+                    node.updateData.userCalcBase = value;
                     project.calcBase.calculate(node);
                     if(!project.calcBase.success){
                         let activeCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
@@ -517,26 +517,23 @@ var projectObj = {
                 if(fieldName !== 'calcBase'){
                     calcTools.setFieldValue(node, fieldName, value);
                 };
-
                 project.calcProgram.calcAndSave(node);
                 gljOprObj.showRationGLJSheetData();
-            } else if (node.sourceType === project.Bills.getSourceType()&&(fieldName === 'unit'||fieldName === 'specialProvisional')){
-
-                //node.sourceType === project.Bills.getSourceType()&&fieldName === 'unit'
-                node.data[fieldName] = value;
+            } else if (node.sourceType === project.Bills.getSourceType()&&fieldName === 'unit'){
+                node.updateData[fieldName] = value;
                 node.changed = true;
-                if(fieldName === 'unit' && node.data.quantity)  node.data.quantity =scMathUtil.roundForObj(node.data.quantity,getDecimal("quantity",node));//修改清单单位的时候清单工程量要重新4舍5入
-                project.calcProgram.calcAndSave(node);
-            } else {
-                if (node.sourceType === project.Bills.getSourceType()) {
-                    project.Bills.updateField(node.source, fieldName, value, false);
-                } else if (node.sourceType === project.Ration.getSourceType()) {
-                    project.Ration.updateField(node.source, fieldName, value);
+                if(node.data.quantity){
+                    node.updateData.quantity = scMathUtil.roundForObj(node.data.quantity,getDecimal("quantity",node));//修改清单单位的时候清单工程量要重新4舍5入;
                 }
+                project.calcProgram.calcAndSave(node);
+            } else {//不涉及计算的,只改updateData的值就好了
+                node.updateData[fieldName] = value;
+                node.changed = true;
                 if (colSetting.data.wordWrap) {
                     this.mainSpread.getActiveSheet().autoFitRow(node.serialNo());
                 }
-                projectObj.mainController.refreshTreeNode([node]);
+                project.calcProgram.calcAndSave(node);
+               // projectObj.mainController.refreshTreeNode([node]);
             }
         } else if(value==null && fieldName ==='feeRate'){
             project.FeeRate.cleanFeeRateID(node);
@@ -1716,8 +1713,8 @@ var projectObj = {
         let checkboxValue = info.sheet.getCell(info.row, info.col).value();
         let newval = checkboxValue?0:1;
         projectObj.project.updateEvalproject(newval,node.data,function (programID) {
-            node.data.evaluationProject = newval;
-            node.data.programID = programID;
+            node.updateData.evaluationProject = newval;
+            node.updateData.programID = programID;
             node.changed=true;
             projectObj.project.calcProgram.calcAndSave(node);
         })
@@ -1742,8 +1739,8 @@ var projectObj = {
         }
     },
     onSubcontractClick:function (node) {//点击分包费checkbox
-        if (node.data.isSubcontract) node.data.isSubcontract = false;
-        else node.data.isSubcontract = true;
+        if (node.updateData.isSubcontract) node.updateData.isSubcontract = false;
+        else node.updateData.isSubcontract = true;
         node.changed = true;
         projectObj.project.calcProgram.calcAndSave(node);
     },
@@ -3286,8 +3283,8 @@ $('#calcBaseFeeRateConf').click(function () {
             newVal = number_util.checkNumberValue( $("#customFeeRate").val(),getDecimal("feeRate"));
             if(newVal == null) return
         }
-        selected.data.feeRateID = null;
-        selected.data.feeRate = newVal;
+        selected.updateData.feeRateID = null;
+        selected.updateData.feeRate = newVal;
         selected.changed = true;
         needToSave = true;
         cusFeeRate = true;