浏览代码

暂估费调价。

chenshilong 5 年之前
父节点
当前提交
8ba23245f6
共有 1 个文件被更改,包括 108 次插入53 次删除
  1. 108 53
      web/building_saas/main/js/models/calc_program.js

+ 108 - 53
web/building_saas/main/js/models/calc_program.js

@@ -275,7 +275,7 @@ let calcTools = {
 
         // 初始化前先拦截末定义的情况
         if (!treeNode.data.feesIndex || !treeNode.data.feesIndex[feeObj.fieldName]){
-            if (feeObj.unitFee == 0 && feeObj.totalFee == 0) return;
+            if (feeObj.unitFee == 0 && feeObj.totalFee == 0 && feeObj.tenderUnitFee == 0 && feeObj.tenderTotalFee == 0) return;
         }
 
         this.initFeeField(treeNode, feeObj.fieldName);
@@ -483,91 +483,113 @@ let calcTools = {
         result = (result).toDecimal(decimalObj.ration.unitPrice);
         return result;
     },
-    // 总造价清单、叶子清单、定额的暂估费。父清单是汇总子清单的暂估费,走计算程序逻辑,不在这里。
-    estimateFee: function (treeNode, isBase, isTender){
-        let me = this, sumU = 0, sumT = 0;
-        let nodeQ = me.uiNodeQty(treeNode, isTender);
+    // 叶子清单、定额、总造价清单的暂估费。(父级清单是汇总子清单的暂估费,走计算程序逻辑,不在这里)
+    estimateFee: function (treeNode, isBase, isTender){   // isBase, isTender 这两个参数用于基数计算
+        let me = this, sumU = 0, sumT = 0, sumTU = 0, sumTT = 0;
+        let nodeQ = me.uiNodeQty(treeNode);
+        let nodeTQ = me.uiNodeTenderQty(treeNode);
         let isGather = (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial);
 
         // 先汇总数量,再乘市场价。如果是叶子清单,进入这里的gljList中的材料,已经是同类材料跨定额汇总过的了。
         function eTFee(){
-            if (!treeNode.data.gljList) return 0;
+            let rst = {eT: 0, eTT: 0};
+            if (!treeNode.data.gljList) return rst;
+
             let GLJObjs = [];
             for (let glj of treeNode.data.gljList) {
                 if (!allMaterialTypes.includes(glj.type)) continue;
                 if (glj.isEstimate){
-                    GLJObjs.push({code: glj.code, name: glj.name, specs: glj.specs, unit: glj.unit, type: glj.type,
-                        // quantity: (nodeQ * glj.quantity).toDecimal(decimalObj.process),
-                        quantity: me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.process),
-                        marketPrice: glj.marketPrice});
+                    let q = me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.process);
+                    GLJObjs.push({code: glj.code, name: glj.name, specs: glj.specs, unit: glj.unit, type: glj.type, quantity: q,
+                        marketPrice: glj.marketPrice, tenderQuantity: glj.tenderQuantity, tenderPrice: glj.tenderPrice});
                 }
                 else{   // 组成物
                     if (!compositionTypes.includes(glj.type)) continue;
                     let mds = projectObj.project.composition.getCompositionByGLJ(glj);
                     if (!mds) mds = [];
                     for (let md of mds){
-                        if (md.isEstimate){
-                            let isExist = false;
-                            // let totalQ = (nodeQ * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.glj.quantity);
-                            let totalQ = me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.glj.quantity);
-                             let mdQ = (totalQ * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
-
-                            for (let obj of GLJObjs){
-                                if (gljOprObj.getIndex(md, gljKeyArray) == gljOprObj.getIndex(obj, gljKeyArray)){
-                                    isExist = true;
-                                    obj.quantity = (obj.quantity + mdQ).toDecimal(decimalObj.glj.quantity);
-                                    break;
-                                }
-                            };
-                            if (!isExist)
-                                GLJObjs.push({code: md.code, name: md.name, specs: md.specs, unit: md.unit, type: md.type,
-                                    quantity: mdQ, marketPrice: md.marketPrice});
-                        }
+                        if (!md.isEstimate) continue;
+                        let isExist = false;
+                        // let glj_totalQ = (nodeQ * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.glj.quantity);
+                        let glj_totalQ = me.uiGLJQty((glj.totalQuantity)).toDecimal(decimalObj.glj.quantity);
+                        let glj_tender_totalQ = (nodeTQ * me.uiGLJQty(glj.tenderQuantity)).toDecimal(decimalObj.glj.quantity);
+
+                         let mdQ = (glj_totalQ * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
+                         let mdTQ = (glj_tender_totalQ * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
+
+                        for (let obj of GLJObjs){
+                            if (gljOprObj.getIndex(md, gljKeyArray) == gljOprObj.getIndex(obj, gljKeyArray)){
+                                isExist = true;
+                                obj.quantity = (obj.quantity + mdQ).toDecimal(decimalObj.glj.quantity);
+                                obj.tenderQuantity = (obj.tenderQuantity + mdTQ).toDecimal(decimalObj.glj.quantity);
+                                break;
+                            }
+                        };
+
+                        if (!isExist)
+                            GLJObjs.push({code: md.code, name: md.name, specs: md.specs, unit: md.unit, type: md.type, quantity: mdQ,
+                                marketPrice: md.marketPrice, tenderQuantity: mdTQ, tenderPrice: md.tenderPrice});
+
                     }
                 }
             };
 
-            let rst = 0;
             for (let obj of GLJObjs){
-                let tp = (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
-                rst = (rst + tp).toDecimal(decimalObj.bills.totalPrice);
+                let t = (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
+                rst.eT = (rst.eT + t).toDecimal(decimalObj.bills.totalPrice);
+
+                let tt = (me.uiGLJQty(obj.tenderQuantity) * me.uiGLJPrice(obj.tenderPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
+                rst.eTT = (rst.eTT + tt).toDecimal(decimalObj.bills.totalPrice);
             };
             return rst;
         };
         // 汇总子结点的暂估合价
         function eTFeeByChildren(){
-            let rst = 0;
+            let rst = {eT: 0, eTT: 0};
             for (let node of treeNode.children){
                 if (node.data.feesIndex && node.data.feesIndex['estimate']) {
-                    rst = (rst + parseFloatPlus(node.data.feesIndex['estimate'].totalFee)).toDecimal(decimalObj.process);
+                    rst.eT = (rst.eT + parseFloatPlus(node.data.feesIndex['estimate'].totalFee)).toDecimal(decimalObj.process);
+                    rst.eTT = (rst.eTT + parseFloatPlus(node.data.feesIndex['estimate'].tenderTotalFee)).toDecimal(decimalObj.process);
                 };
             };
-            rst = (rst).toDecimal(decimalObj.bills.totalPrice);
+            rst.eT = (rst.eT).toDecimal(decimalObj.bills.totalPrice);
+            rst.eTT = (rst.eTT).toDecimal(decimalObj.bills.totalPrice);
             return rst;
         };
         // 先数量乘市场价,再汇总
         function eUFee(){
             if (!treeNode.data.gljList) return 0;
-            let rst = 0;
+            let rst = {eU: 0, eTU: 0};
             for (let glj of treeNode.data.gljList) {
                 if (!allMaterialTypes.includes(glj.type)) continue;
                 if (glj.isEstimate){
-                    rst = rst + (me.uiGLJQty(glj.quantity) * me.uiGLJPrice(glj.marketPrice, glj)).toDecimal(decimalObj.process);
-                    rst = rst.toDecimal(decimalObj.process);
+                    rst.eU = rst.eU + (me.uiGLJQty(glj.quantity) * me.uiGLJPrice(glj.marketPrice, glj)).toDecimal(decimalObj.process);
+                    rst.eU = rst.eU.toDecimal(decimalObj.process);
+                    // 不能直接用glj.tenderPrice,这个值不可靠。当调价界面删除单价系数后,tenderPrice没有实时计算,取得的值为0
+                    // rst.eTU = rst.eTU + (me.uiGLJQty(glj.tenderQuantity) * me.uiGLJPrice(glj.tenderPrice, glj)).toDecimal(decimalObj.process);
+                    rst.eTU = rst.eTU + (me.uiGLJQty(glj.tenderQuantity) * me.calcGLJTenderPrice(glj)).toDecimal(decimalObj.process);
+                    rst.eTU = rst.eTU.toDecimal(decimalObj.process);
                 }
-                else{   // 组成物
+                else{   // 组成物
                     if (!compositionTypes.includes(glj.type)) continue;
                     let mds = projectObj.project.composition.getCompositionByGLJ(glj);
                     if (!mds) mds = [];
                     for (let md of mds){
                         if (!md.isEstimate) continue;
+
                         let mdU = (me.uiGLJQty(md.consumption) * me.uiGLJPrice(md.marketPrice)).toDecimal(decimalObj.glj.unitPrice);
-                        rst = rst + (mdU * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.process);
-                        rst = rst.toDecimal(decimalObj.process);
+                        rst.eU = rst.eU + (mdU * me.uiGLJQty(glj.quantity)).toDecimal(decimalObj.process);
+                        rst.eU = rst.eU.toDecimal(decimalObj.process);
+
+                        // 调价时,数量只调到工料机级别,工料机下的组成物不调量(如机械、混凝土)。调价调的是工料机下的组成物的价。
+                        let mdTU = (me.uiGLJQty(md.consumption) * me.calcGLJTenderPrice(md)).toDecimal(decimalObj.glj.unitPrice);
+                        rst.eTU = rst.eTU + (mdTU * me.calcGLJTenderQty(treeNode, glj)).toDecimal(decimalObj.process);
+                        rst.eTU = rst.eTU.toDecimal(decimalObj.process);
                     }
                 }
             };
-            rst = rst.toDecimal(decimalObj.bills.unitPrice);
+            rst.eU = rst.eU.toDecimal(decimalObj.bills.unitPrice);
+            rst.eTU = rst.eTU.toDecimal(decimalObj.bills.unitPrice);
             return rst;
         };
 
@@ -576,56 +598,87 @@ let calcTools = {
             let nodes = projectObj.project.mainTree.roots;
             for (let node of nodes){
                 if (me.isTotalCostBill(node)) break;
-                let eU = 0, eT = 0;
+                let eU = 0, eT = 0, eTU = 0, eTT = 0;
                 if (node.data.feesIndex && node.data.feesIndex.estimate){
                     eU = node.data.feesIndex.estimate.unitFee;
                     eT = node.data.feesIndex.estimate.totalFee;
+                    eTU = node.data.feesIndex.estimate.tenderUnitFee;
+                    eTT = node.data.feesIndex.estimate.tenderTotalFee;
                 }
                 else {
-                    eU = 0, eT = 0;
+                    eU = 0, eT = 0, eTU = 0, eTT = 0;
                 };
                 sumU = (sumU + parseFloatPlus(eU)).toDecimal(decimalObj.process);
                 sumT = (sumT + parseFloatPlus(eT)).toDecimal(decimalObj.process);
+                sumTU = (sumTU + parseFloatPlus(eTU)).toDecimal(decimalObj.process);
+                sumTT = (sumTT + parseFloatPlus(eTT)).toDecimal(decimalObj.process);
             };
             sumU = (sumU).toDecimal(decimalObj.bills.unitPrice);
             sumT = (sumT).toDecimal(decimalObj.bills.totalPrice);
+            sumTU = (sumTU).toDecimal(decimalObj.bills.unitPrice);
+            sumTT = (sumTT).toDecimal(decimalObj.bills.totalPrice);
         }
         else if (me.isParentBill(treeNode)){  // 父清单不要汇总单价。
-            sumT = eTFeeByChildren();
+            let eTFBC = eTFeeByChildren();
+            sumT = eTFBC.eT;
+            sumTT = eTFBC.eTT;
             sumU = undefined;
+            sumTU = undefined;
         }
         else if (me.isLeafBill(treeNode)){
             if (projectObj.project.Bills.isEngineerEst(treeNode)){
                 if (treeNode.data.feesIndex['common'] != undefined){
                     sumT = treeNode.data.feesIndex['common'].totalFee;
                     sumU = treeNode.data.feesIndex['common'].unitFee;
+                    sumTT = treeNode.data.feesIndex['common'].tenderTotalFee;
+                    sumTU = treeNode.data.feesIndex['common'].tenderUnitFee;
                 }
             }
             else{
                 if (isGather){
                     me.getGLJList(treeNode, false);
-                    sumT = eTFee();
+                    let eTF = eTFee();
+                    sumT = eTF.eT;
+                    sumTT = eTF.eTT;
                 }
-                else
-                    sumT = eTFeeByChildren();
+                else{
+                    let eTFBC = eTFeeByChildren();
+                    sumT = eTFBC.eT;
+                    sumTT = eTFBC.eTT;
+                };
 
                 let q = nodeQ ? nodeQ : 1;
                 sumU = (sumT / q).toDecimal(decimalObj.bills.totalPrice);
+                let tq = nodeTQ ? nodeTQ : 1;
+                sumTU = (sumTT / tq).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         else if (me.isRationCategory(treeNode)){
             me.getGLJList(treeNode, false);
 
-            sumU = eUFee();
-            if (isBase) return sumU;
+            let eUF = eUFee();
+            sumU = eUF.eU;
+            sumTU = eUF.eTU;
+            if (isBase) {
+                if (isTender)
+                    return sumTU
+                else
+                    return sumU;
+            };
 
-            if (isGather)
-                sumT = eTFee()
-            else
+            if (isGather){
+                let eTF = eTFee();
+                sumT = eTF.eT;
+                sumTT = eTF.eTT;
+            }
+            else{
                 sumT = (nodeQ * sumU).toDecimal(decimalObj.ration.totalPrice);
+                sumTT = (nodeTQ * sumTU).toDecimal(decimalObj.ration.totalPrice);
+            }
         };
 
-        me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
+        me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT,
+            'tenderUnitFee': sumTU, 'tenderTotalFee': sumTT});
     },
     marketPriceToBase: function (treeNode, baseName, isTender) {
         if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
@@ -879,7 +932,7 @@ let calcTools = {
     calcGLJTenderQty: function (treeNode, glj){
         if (treeNode.data.quantityCoe == undefined){
             glj.tenderQuantity = glj.quantity;
-            return;
+            return glj.tenderQuantity;
         };
 
         let qCoe = 1;
@@ -907,6 +960,7 @@ let calcTools = {
             };
         }
         glj.tenderQuantity = (glj.quantity * qCoe).toDecimal(decimalObj.glj.quantity);
+        return glj.tenderQuantity;
     },
     calcGLJTenderPrice: function (glj) {
         let projGLJ = calcTools.getProjectGLJ(glj);
@@ -920,6 +974,7 @@ let calcTools = {
             };
             glj.tenderPrice = (glj.marketPrice * pCoe).toDecimal(decimalObj.glj.unitPrice);
         };
+        return glj.tenderPrice;
     },
     // 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
     uiGLJPrice: function (price, glj){