Selaa lähdekoodia

正算、反算

chenshilong 6 vuotta sitten
vanhempi
commit
752f2902d9

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

@@ -1740,23 +1740,29 @@ class CalcProgram {
                 treeNode.changed = true;
             };
 
-            // 第1、2部分以外的叶子清单在没有公式的情况下可以手工修改综合单价并参与计算。
-            // 2017-09-27 需求改了,除了第 1 、 2.2部分以外,都可以手工修改综合单价、综合合价并参与计算
-            if(!calcTools.isFBFX(treeNode) && !calcTools.isTechMeasure(treeNode)){
-                if (treeNode.data.feesIndex && treeNode.data.feesIndex.common){
-                    let ftObj = {};
-                    ftObj.fieldName = 'common';
-                    ftObj.unitFee = parseFloatPlus(treeNode.data.feesIndex.common.unitFee);
-                    ftObj.totalFee = (ftObj.unitFee * nQ).toDecimal(decimalObj.bills.totalPrice);
-                    calcTools.checkFeeField(treeNode, ftObj);
+            // 叶子清单在没有公式的情况下可以手工修改综合单价并参与计算。
+            if (treeNode.data.feesIndex && treeNode.data.feesIndex.common){
+                let uf, tf;
+                let ftObj = {fieldName: 'common'};
+
+                if (treeNode.modifyFlag == 2){    // 修改了清单单价:以单价为准,算金额
+                    uf = parseFloatPlus(treeNode.data.feesIndex.common.unitFee);
+                    if (nQ == 0) nQ = 1;
+                    tf = (uf * nQ).toDecimal(decimalObj.bills.totalPrice);
                 }
-            } else{
-                if (treeNode.data.fees && treeNode.data.fees.length > 0){
-                    treeNode.data.fees = null;
-                    treeNode.data.feesIndex = null;
-                    treeNode.changed = true;
-                }
-            };
+                else if (treeNode.modifyFlag == 3 || treeNode.modifyFlag == 1){  // 修改了清单金额:以金额为准,算单价。修改了清单数量也一样
+                    tf = parseFloatPlus(treeNode.data.feesIndex.common.totalFee);
+                    uf = nQ ? (tf / nQ) : tf;        // 如果工程量为0或空,综合合单直接填到综合单价
+                    uf = uf.toDecimal(decimalObj.bills.unitPrice);
+                    if (projectObj.project.property.valuationType != 'bill') {  // 招投标项目, 还要反算
+                        tf = (uf * nQ).toDecimal(decimalObj.bills.totalPrice);
+                    };
+                };
+
+                ftObj.unitFee = uf;
+                ftObj.totalFee = tf;
+                calcTools.checkFeeField(treeNode, ftObj);
+            }
 
             treeNode.data.calcTemplate = {"calcItems": []};
         }
@@ -1861,6 +1867,7 @@ class CalcProgram {
 
         if (!calcTools.isTotalCostBill(treeNode))  // 已在上面的分支中计算过
             calcTools.estimateFee(treeNode);
+
         if (treeNode.changed && !changedArr.includes(treeNode)) changedArr.push(treeNode);
     };
 
@@ -1904,6 +1911,7 @@ class CalcProgram {
             for (let node of treeNodes){
                 delete node.changed;
                 delete node.temData;
+                if (node.modifyFlag) delete node.modifyFlag;
                 node.updateData = {};
             };
             if(callback){

+ 45 - 37
web/building_saas/main/js/views/project_view.js

@@ -440,56 +440,71 @@ var projectObj = {
     },
     updateCellValue: function (node, value, colSetting,editingText) {
         let project = projectObj.project, fieldName = colSetting.data.field;
-        if(node.sourceType==project.ration_glj.getSourceType()){
+        if(node.sourceType == ModuleNames.ration_glj){
             project.ration_glj.updateFromMainSpread(value,node,fieldName);
-        } else if(fieldName === 'remark'){
-            projectObj.updateNodeField(node,value,'remark');
-        } else if(calcTools.isGljRation(node)){
+        }
+        else if(calcTools.isGljRation(node)){
             gljOprObj.updateRationTypeGLJ(value,node,fieldName,editingText);
-        } else if (value !== calcFees.getFee(node.data, fieldName)||fieldName == 'quantity') {//工程量需要进行转换,所以做特殊处理
+        }
+        else if(fieldName === 'remark'){
+            projectObj.updateNodeField(node,value,'remark');
+        }
+        else if(fieldName ==='feeRate' && value==null){
+            project.FeeRate.cleanFeeRateID(node);
+        }
+        else if (value !== calcFees.getFee(node.data, fieldName) || fieldName == 'quantity') {//工程量需要进行转换,所以做特殊处理
             if (fieldName === 'code' && value != '' && !calcTools.isVolumePrice(node)) {
                 projectObj.updateCode(node, value);
             }
+            else if (fieldName === 'unit' && node.sourceType == ModuleNames.bills){
+                node.updateData[fieldName] = value;
+                node.changed = true;
+                if(node.data.quantity){
+                    node.updateData.quantity = scMathUtil.roundForObj(node.data.quantity,getDecimal("quantity",node));//修改清单单位的时候清单工程量要重新4舍5入;
+                }
+                project.calcProgram.calcAndSave(node);
+            }
             else if(fieldName ==='feeRate'){
                 project.FeeRate.updateFeeRateFromBills(value,node,fieldName);
             }
             else if(fieldName ==='contain'){//编辑含量
                 project.Ration.updateContain(value,node);
             }
-            else if (fieldName === 'quantity' || fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee'||fieldName === 'feesIndex.common.totalFee' || fieldName === 'programID' ||
-                fieldName === 'subType' || fieldName === 'calcBase' || fieldName === 'isSubcontract'){
+            else if (fieldName === 'quantity' ||
+                fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee'||fieldName === 'feesIndex.common.totalFee' ||
+                fieldName === 'calcBase' ||
+                fieldName === 'programID' || fieldName === 'subType' || fieldName === 'isSubcontract'){
                 if (fieldName === 'quantity') {
+                    node.modifyFlag = 1;
                     quantityEditObj.checkingAndUpdate(editingText,node);
-                   // project.quantity_detail.editMainTreeNodeQuantity(value,node,fieldName,editingText);
                     return;
-                } else if (fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee'||fieldName === 'feesIndex.common.totalFee') {
-                    if(isNaN(value)){//说明输入的是无效的字符
-                        //value == null && editingText!=null && editingText!=""
+                }
+                else if (fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee'||fieldName === 'feesIndex.common.totalFee') {
+                    if(isNaN(value)){// 输入的是无效的字符
                         alert("当前输入的数据类型不正确,请重新输入。");
                         projectObj.mainController.refreshTreeNode([node]);
                         return
-                    }
+                    };
+
                     if (value) {
                         if(fieldName === 'feesIndex.common.unitFee') {
                             value = parseFloat(value).toDecimal(decimalObj.decimal("unitPrice", node));
+
                             //当前是量价/人材机,综合单价可输入,输入的值读取到市场单价,重算综合单价。
                             if(node.sourceType == ModuleNames.ration && node.data.type != rationType.ration){
                                 fieldName = 'marketUnitFee';
                             }
-                        }
-                        else if(fieldName === 'feesIndex.common.totalFee'){//修改了综合合价后,反算综合单价,然后再由计算程序算个综合合价出来
-                            let unitfee = 0;
-                            if(node.data.quantity){//如果工程量为0或空,综合合单直接填到综合单价
-                                let t_quantity = scMathUtil.roundForObj(node.data.quantity,getDecimal("quantity",node));
-                                value = scMathUtil.roundForObj(value,getDecimal("unitPrice", node));
-                                unitfee = scMathUtil.roundForObj(value/t_quantity,getDecimal("totalPrice", node));
-                            }else {
-                                unitfee = scMathUtil.roundForObj(value,getDecimal("totalPrice", node));
+                            else if (node.sourceType == ModuleNames.bills){
+                                node.modifyFlag = 2;
                             }
-                            calcTools.setFieldValue(node, 'feesIndex.common.unitFee', unitfee);
+                        }
+                        else if(fieldName === 'feesIndex.common.totalFee'){
+                            value = scMathUtil.roundForObj(value, getDecimal("totalPrice", node));
+                            node.modifyFlag = 3;
                         }
                     }
-                } else if (fieldName === 'calcBase') {
+                }
+                else if (fieldName === 'calcBase') {
                     //zhong
                     if(value === undefined ||value === null || value.toString().trim() === ''){
                         value = '';
@@ -508,21 +523,15 @@ var projectObj = {
                     }
                     // if (value) {value = parseFloat(value).toDecimal(decimalObj.decimal("totalPrice", node))};
                 };
+
                 //计算基数赋值要经过解析和标准化,已在calculate里赋值
-                if(fieldName !== 'calcBase'){
+                if(fieldName !== 'calcBase')
                     calcTools.setFieldValue(node, fieldName, value);
-                };
+
                 project.calcProgram.calcAndSave(node);
                 gljOprObj.showRationGLJSheetData();
             }
-            else if (node.sourceType === project.Bills.getSourceType()&&fieldName === 'unit'){
-                node.updateData[fieldName] = value;
-                node.changed = true;
-                if(node.data.quantity){
-                    node.updateData.quantity = scMathUtil.roundForObj(node.data.quantity,getDecimal("quantity",node));//修改清单单位的时候清单工程量要重新4舍5入;
-                }
-                project.calcProgram.calcAndSave(node);
-            } else {//不涉及计算的,只改updateData的值就好了
+            else {//不涉及计算的,只改updateData的值就好了
                 node.updateData[fieldName] = value;
                 node.changed = true;
                 if (colSetting.data.wordWrap) {
@@ -531,11 +540,10 @@ var projectObj = {
                 project.calcProgram.calcAndSave(node);
                // projectObj.mainController.refreshTreeNode([node]);
             }
-        } else if(value==null && fieldName ==='feeRate'){
-            project.FeeRate.cleanFeeRateID(node);
-        } else {
-            projectObj.mainController.refreshTreeNode([node], false);
         }
+        else {
+            projectObj.mainController.refreshTreeNode([node], false);
+        };
     },
     mainSpreadLeaveCell: function (sender, info) {
         let colSetting = projectObj.mainController.setting.cols[info.col];