Browse Source

调价。

chenshilong 7 years ago
parent
commit
6c2fe14742

+ 187 - 102
web/building_saas/main/js/models/calc_program.js

@@ -211,6 +211,16 @@ let calcTools = {
             treeNode.data.feesIndex[feeObj.fieldName].totalFee = feeObj.totalFee;
             treeNode.data.feesIndex[feeObj.fieldName].totalFee = feeObj.totalFee;
             treeNode.changed = true;
             treeNode.changed = true;
         };
         };
+
+        if (treeNode.data.feesIndex[feeObj.fieldName].tenderUnitFee != feeObj.tenderUnitFee){
+            treeNode.data.feesIndex[feeObj.fieldName].tenderUnitFee = feeObj.tenderUnitFee;
+            treeNode.changed = true;
+        };
+
+        if (treeNode.data.feesIndex[feeObj.fieldName].tenderTotalFee != feeObj.tenderTotalFee){
+            treeNode.data.feesIndex[feeObj.fieldName].tenderTotalFee = feeObj.tenderTotalFee;
+            treeNode.changed = true;
+        };
     },
     },
     setFieldValue: function (treeNode, fieldName, value){
     setFieldValue: function (treeNode, fieldName, value){
         if (fieldName.includes('feesIndex')){
         if (fieldName.includes('feesIndex')){
@@ -245,31 +255,29 @@ let calcTools = {
         else
         else
             return 0;
             return 0;
     },
     },
-    rationBaseFee: function (treeNode, gljTypes, priceType){
+    rationBaseFee: function (treeNode, gljTypes, priceType, isTender){
         if (!treeNode.data.gljList) return 0;
         if (!treeNode.data.gljList) return 0;
         let me = this, result = 0;
         let me = this, result = 0;
         let price = 0, temp = 0, temp2 = 0;
         let price = 0, temp = 0, temp2 = 0;
         for (let glj of treeNode.data.gljList) {
         for (let glj of treeNode.data.gljList) {
             if (gljTypes.indexOf(glj.type) >= 0) {
             if (gljTypes.indexOf(glj.type) >= 0) {
-/*                if (priceType == priceTypes.ptDiffPrice){
-                    let aprice = me.uiGLJPrice(glj["adjustPrice"]);
-                    let mprice = me.uiGLJPrice(glj["marketPrice"]);
-                    temp = (me.uiGLJQty(glj["quantity"]) * mprice).toDecimal(decimalObj.process) - (me.uiGLJQty(glj["quantity"]) * aprice).toDecimal(decimalObj.process);
-                    temp = temp.toDecimal(decimalObj.process);
-                }*/
+                calcTools.calcGLJTenderPrice(glj);
+                calcTools.calcGLJTenderQty(treeNode, glj);
+                let qty = isTender ? me.uiGLJQty(glj["tenderQuantity"]) : me.uiGLJQty(glj["quantity"]);
+                let mprice = isTender ? me.uiGLJPrice(glj["tenderPrice"]) : me.uiGLJPrice(glj["marketPrice"]);
+                let aprice = me.uiGLJPrice(glj["adjustPrice"]);
+
                 if (priceType == priceTypes.ptDiffPrice){
                 if (priceType == priceTypes.ptDiffPrice){
-                    let aprice = me.uiGLJPrice(glj["adjustPrice"]);
-                    let mprice = me.uiGLJPrice(glj["marketPrice"]);
                     if (aprice != mprice){
                     if (aprice != mprice){
-                        temp = (temp + (me.uiGLJQty(glj["quantity"]) * mprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
-                        temp2 = (temp2 + (me.uiGLJQty(glj["quantity"]) * aprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
+                        temp = (temp + (qty * mprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
+                        temp2 = (temp2 + (qty * aprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
                     }
                     }
                 }
                 }
                 else {
                 else {
                     if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"]);}
                     if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"]);}
-                    else if (priceType == priceTypes.ptAdjustPrice){price = me.uiGLJPrice(glj["adjustPrice"]);}
-                    else if (priceType == priceTypes.ptMarketPrice){price = me.uiGLJPrice(glj["marketPrice"]);}
-                    temp = (me.uiGLJQty(glj["quantity"]) * price).toDecimal(decimalObj.process);
+                    else if (priceType == priceTypes.ptAdjustPrice){price = aprice;}
+                    else if (priceType == priceTypes.ptMarketPrice){price = mprice;}
+                    temp = (qty * price).toDecimal(decimalObj.process);
                     result = (result + temp).toDecimal(decimalObj.process);
                     result = (result + temp).toDecimal(decimalObj.process);
                 };
                 };
             };
             };
@@ -284,12 +292,19 @@ let calcTools = {
 
 
         return result;
         return result;
     },
     },
-    machineLabourFee: function (gljArr) {
+    machineLabourFee: function (treeNode, gljArr, isTender) {
         if (!gljArr) return 0;
         if (!gljArr) return 0;
         let result = 0;
         let result = 0;
         for (let glj of gljArr) {
         for (let glj of gljArr) {
             if (glj.type == gljType.GENERAL_MACHINE) {
             if (glj.type == gljType.GENERAL_MACHINE) {
-                // 获取机械组成物
+                let gljQ;
+                if (isTender){
+                    calcTools.calcGLJTenderQty(treeNode, glj);
+                    gljQ = glj.tenderQuantity;
+                }
+                else
+                    gljQ = glj.quantity;
+                // 获取机械组成物(调价不深入到组成物)
                 let mds = projectObj.project.composition.getCompositionByGLJ(glj);
                 let mds = projectObj.project.composition.getCompositionByGLJ(glj);
                 if (!mds) mds = [];
                 if (!mds) mds = [];
                 let mdSum = 0;
                 let mdSum = 0;
@@ -301,16 +316,16 @@ let calcTools = {
                         mdSum = (mdSum).toDecimal(decimalObj.ration.unitPrice);
                         mdSum = (mdSum).toDecimal(decimalObj.ration.unitPrice);
                     }
                     }
                 }
                 }
-                result = result + (glj["quantity"] * mdSum).toDecimal(decimalObj.ration.unitPrice);
+                result = result + (gljQ * mdSum).toDecimal(decimalObj.ration.unitPrice);
                 result = (result).toDecimal(decimalObj.ration.unitPrice);
                 result = (result).toDecimal(decimalObj.ration.unitPrice);
             }
             }
         }
         }
         return result;
         return result;
     },
     },
     // 总造价清单、叶子清单、定额的暂估费。父清单是汇总子清单的暂估费,走计算程序逻辑,不在这里。
     // 总造价清单、叶子清单、定额的暂估费。父清单是汇总子清单的暂估费,走计算程序逻辑,不在这里。
-    estimateFee: function (treeNode, isBase = false){
+    estimateFee: function (treeNode, isBase, isTender){
         let me = this, sumU = 0, sumT = 0;
         let me = this, sumU = 0, sumT = 0;
-        let nodeQ = me.uiNodeQty(treeNode);
+        let nodeQ = me.uiNodeQty(treeNode, isTender);
         let isGather = (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial);
         let isGather = (projectObj.project.property.zanguCalcMode == zanguCalcType.gatherMaterial);
 
 
         // 先汇总数量,再乘市场价。如果是叶子清单,进入这里的gljList中的材料,已经是同类材料跨定额汇总过的了。
         // 先汇总数量,再乘市场价。如果是叶子清单,进入这里的gljList中的材料,已经是同类材料跨定额汇总过的了。
@@ -443,7 +458,7 @@ let calcTools = {
 
 
         me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
         me.checkFeeField(treeNode, {'fieldName': 'estimate', 'unitFee': sumU, 'totalFee': sumT});
     },
     },
-    marketPriceToBase: function (treeNode, baseName) {
+    marketPriceToBase: function (treeNode, baseName, isTender) {
         if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
         if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
         let result = 0, me = this;
         let result = 0, me = this;
         if (
         if (
@@ -468,7 +483,7 @@ let calcTools = {
                 'quantity': 1,
                 'quantity': 1,
                 'type': treeNode.data.subType      // 注意:这里要取subType
                 'type': treeNode.data.subType      // 注意:这里要取subType
             };
             };
-            result = me.machineLabourFee([glj]);
+            result = me.machineLabourFee(treeNode, [glj], isTender);
         }
         }
         else if (
         else if (
             (treeNode.data.type == rationType.gljRation) &&
             (treeNode.data.type == rationType.gljRation) &&
@@ -482,7 +497,7 @@ let calcTools = {
         }
         }
         return result;
         return result;
     },
     },
-    partASupplyFee: function (treeNode, baseName) {
+    partASupplyFee: function (treeNode, baseName, isTender) {
         if (!treeNode.data.gljList) return 0;
         if (!treeNode.data.gljList) return 0;
         let projectGLJ = projectObj.project.projectGLJ;
         let projectGLJ = projectObj.project.projectGLJ;
 
 
@@ -536,16 +551,26 @@ let calcTools = {
 
 
         let sum = 0;
         let sum = 0;
         for (let glj of treeNode.data.gljList){
         for (let glj of treeNode.data.gljList){
+            let gljQ;
+            if (isTender){
+                calcTools.calcGLJTenderQty(treeNode, glj);
+                gljQ = glj.tenderQuantity;
+            }
+            else
+                gljQ = glj.quantity;
+
             let X = 1;    // 部分甲供系数(默认1,即完全甲供)
             let X = 1;    // 部分甲供系数(默认1,即完全甲供)
             let tempSGLJ = supplyGLJsIdx[glj.projectGLJID];
             let tempSGLJ = supplyGLJsIdx[glj.projectGLJID];
             // 当前材料是甲供材料:①普通 ②商品硂等不计组成物的母体材料
             // 当前材料是甲供材料:①普通 ②商品硂等不计组成物的母体材料
             if (tempSGLJ) {
             if (tempSGLJ) {
                 // 处理部分甲供
                 // 处理部分甲供
                 if (baseName.includes('甲供') && (tempSGLJ.supply == supplyType.BFJG)){
                 if (baseName.includes('甲供') && (tempSGLJ.supply == supplyType.BFJG)){
-                    let Q = tempSGLJ.quantity ? tempSGLJ.quantity : 1;
+                    // let Q =  isTender ? tempSGLJ.tenderQuantity : tempSGLJ.quantity;
+                    let Q = tempSGLJ.quantity;
+                    Q = Q ? Q : 1;
                     X = tempSGLJ.supply_quantity / Q;
                     X = tempSGLJ.supply_quantity / Q;
                 }
                 }
-                sum = (sum + glj.basePrice * glj.quantity * X).toDecimal(decimalObj.process);
+                sum = (sum + glj.basePrice * gljQ * X).toDecimal(decimalObj.process);
             }
             }
             else{   // 当前材料不是甲供材料
             else{   // 当前材料不是甲供材料
                 if (compT.includes(glj.type)) {   // 混凝土等。组成物的母体,母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
                 if (compT.includes(glj.type)) {   // 混凝土等。组成物的母体,母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
@@ -558,7 +583,7 @@ let calcTools = {
                                 if (baseName.includes('甲供') && (c.supply == supplyType.BFJG)){
                                 if (baseName.includes('甲供') && (c.supply == supplyType.BFJG)){
                                     X = c.supplyX;
                                     X = c.supplyX;
                                 };
                                 };
-                                sum = (sum + c.basePrice * c.consumption * glj.quantity * X).toDecimal(decimalObj.process);
+                                sum = (sum + c.basePrice * c.consumption * gljQ * X).toDecimal(decimalObj.process);
                             }
                             }
                         }
                         }
                     };
                     };
@@ -639,6 +664,46 @@ let calcTools = {
     uiNodeQty: function (treeNode){
     uiNodeQty: function (treeNode){
         return parseFloatPlus(treeNode.data.quantity).toDecimal(decimalObj.decimal("quantity", treeNode));
         return parseFloatPlus(treeNode.data.quantity).toDecimal(decimalObj.decimal("quantity", treeNode));
     },
     },
+    calcNodeTenderQty: function (treeNode){
+        let qCoe = (treeNode.data.rationQuantityCoe == undefined) ? 1 : treeNode.data.rationQuantityCoe;
+        treeNode.data.tenderQuantity = (this.uiNodeQty(treeNode) * qCoe).toDecimal(decimalObj.decimal("quantity", treeNode));
+    },
+    calcGLJTenderQty: function (treeNode, glj){
+        if (treeNode.data.quantityCoe == undefined){
+            glj.tenderQuantity = glj.quantity;
+            return;
+        };
+
+        let qCoe = 1;
+        if (gljType.LABOUR == glj.type){
+            if (treeNode.data.quantityCoe.labour)
+                qCoe = treeNode.data.quantityCoe.labour;
+        }
+        else if (baseMaterialTypes.indexOf(glj.type)){
+            if (treeNode.data.quantityCoe.material)
+                qCoe = treeNode.data.quantityCoe.material;
+        }
+        else if (baseMachineTypes.indexOf(glj.type)){
+            if (treeNode.data.quantityCoe.machine)
+                qCoe = treeNode.data.quantityCoe.machine;
+        }
+        else if (gljType.MAIN_MATERIAL == glj.type){
+            if (treeNode.data.quantityCoe.main)
+                qCoe = treeNode.data.quantityCoe.main;
+        }
+        else if (gljType.EQUIPMENT == glj.type){
+            if (treeNode.data.quantityCoe.equipment)
+                qCoe = treeNode.data.quantityCoe.equipment;
+        };
+
+        glj.tenderQuantity = (glj.quantity * qCoe).toDecimal(decimalObj.glj.quantity);
+    },
+    calcGLJTenderPrice: function (glj) {
+        let pCoe = 1;
+        if (projectObj.project.property.tenderSetting && projectObj.project.property.tenderSetting.gljPriceTenderCoe)
+            pCoe = projectObj.project.property.tenderSetting.gljPriceTenderCoe;
+        glj.tenderPrice = (glj.marketPrice * pCoe).toDecimal(decimalObj.glj.unitPrice);
+    },
     // 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
     // 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
     uiGLJPrice: function (price){
     uiGLJPrice: function (price){
         if (price)
         if (price)
@@ -718,99 +783,109 @@ const calcBaseNames = {
 };
 };
 
 
 const rationCalcBases = {
 const rationCalcBases = {
-    '定额基价人工费': function (node) {
-        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice);
+    '定额基价人工费': function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
     },
     },
-    '定额基价材料费': function (node) {
-        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice);
+    '定额基价材料费': function (node, isTender) {
+        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
     },
     },
-    '定额基价机械费': function (node) {
-        return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptBasePrice);
+    '定额基价机械费': function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptBasePrice, isTender);
     },
     },
-    '定额基价机上人工费': function (node) {
-        return calcTools.machineLabourFee(node.data.gljList);
+    '定额基价机上人工费': function (node, isTender) {
+        return calcTools.machineLabourFee(node, node.data.gljList, isTender);
     },
     },
-    '人工费价差': function (node) {
-        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptDiffPrice);
+    '人工费价差': function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptDiffPrice, isTender);
     },
     },
-    '材料费价差': function (node) {
-        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptDiffPrice);
+    '材料费价差': function (node, isTender) {
+        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptDiffPrice, isTender);
     },
     },
-    '机械费价差': function (node) {
-        return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptDiffPrice);
+    '机械费价差': function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptDiffPrice, isTender);
     },
     },
-    '主材费': function (node) {
-        return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice);
+    '主材费': function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice, isTender);
     },
     },
-    '设备费': function (node) {
-        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice);
+    '设备费': function (node, isTender) {
+        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
     },
     },
-    '人工工日': function (node) {
+    '人工工日': function (node, isTender) {
         if (!node.data.gljList) return 0;
         if (!node.data.gljList) return 0;
         let rst = 0;
         let rst = 0;
+
+        calcTools.uiNodeQty(node)
         for (let glj of node.data.gljList) {
         for (let glj of node.data.gljList) {
             if (glj.type == gljType.LABOUR) {
             if (glj.type == gljType.LABOUR) {
-                rst = rst + (calcTools.uiGLJQty(glj["quantity"]) * calcTools.uiNodeQty(node)).toDecimal(decimalObj.process);
+                let gljQ;
+                if (isTender){
+                    calcTools.calcGLJTenderQty(node, glj);
+                    gljQ = glj.tenderQuantity;
+                }
+                else
+                    gljQ = glj.quantity;
+
+                rst = rst + (gljQ * calcTools.uiNodeQty(node)).toDecimal(decimalObj.process);
                 rst = rst.toDecimal(decimalObj.process);
                 rst = rst.toDecimal(decimalObj.process);
             }
             }
         };
         };
         return rst.toDecimal(decimalObj.glj.quantity);
         return rst.toDecimal(decimalObj.glj.quantity);
     },
     },
-    '甲供定额基价人工费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJRGF);
+    '甲供定额基价人工费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJRGF, isTender);
     },
     },
-    '甲供定额基价材料费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJCLF);
+    '甲供定额基价材料费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJCLF, isTender);
     },
     },
-    '甲供定额基价机械费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJJXF);
+    '甲供定额基价机械费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJJXF, isTender);
     },
     },
-    '甲供主材费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JGZCF);
+    '甲供主材费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JGZCF, isTender);
     },
     },
-    '甲供设备费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JGSBF);
+    '甲供设备费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JGSBF, isTender);
     },
     },
-    '甲定定额基价人工费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJRGF);
+    '甲定定额基价人工费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJRGF, isTender);
     },
     },
-    '甲定定额基价材料费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJCLF);
+    '甲定定额基价材料费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJCLF, isTender);
     },
     },
-    '甲定定额基价机械费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJJXF);
+    '甲定定额基价机械费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJJXF, isTender);
     },
     },
-    '甲定主材费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JDZCF);
+    '甲定主材费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JDZCF, isTender);
     },
     },
-    '甲定设备费': function (node) {
-        return calcTools.partASupplyFee(node, calcBaseNames.JDSBF);
+    '甲定设备费': function (node, isTender) {
+        return calcTools.partASupplyFee(node, calcBaseNames.JDSBF, isTender);
     },
     },
-    '暂估材料费': function (node) {
-        return calcTools.estimateFee(node, true);
+    '暂估材料费': function (node, isTender) {
+        return calcTools.estimateFee(node, true, isTender);
     },
     },
-    '分包定额基价人工费': function (node) {
-        if (node.data.isSubcontract) return this.定额基价人工费(node)
+    '分包定额基价人工费': function (node, isTender) {
+        if (node.data.isSubcontract) return this.定额基价人工费(node, isTender)
         else return 0;
         else return 0;
     },
     },
-    '分包定额基价材料费': function (node) {
-        if (node.data.isSubcontract) return this.定额基价材料费(node)
+    '分包定额基价材料费': function (node, isTender) {
+        if (node.data.isSubcontract) return this.定额基价材料费(node, isTender)
         else return 0;
         else return 0;
     },
     },
-    '分包定额基价机械费': function (node) {
-        if (node.data.isSubcontract) return this.定额基价机械费(node)
+    '分包定额基价机械费': function (node, isTender) {
+        if (node.data.isSubcontract) return this.定额基价机械费(node, isTender)
         else return 0;
         else return 0;
     },
     },
-    '分包主材费': function (node) {
-        if (node.data.isSubcontract) return this.主材费(node)
+    '分包主材费': function (node, isTender) {
+        if (node.data.isSubcontract) return this.主材费(node, isTender)
         else return 0;
         else return 0;
     },
     },
-    '分包设备费': function (node) {
-        if (node.data.isSubcontract) return this.设备费(node)
+    '分包设备费': function (node, isTender) {
+        if (node.data.isSubcontract) return this.设备费(node, isTender)
         else return 0;
         else return 0;
     },
     },
-    '分包人工工日': function (node) {
-        if (node.data.isSubcontract) return this.人工工日(node)
+    '分包人工工日': function (node, isTender) {
+        if (node.data.isSubcontract) return this.人工工日(node, isTender)
         else return 0;
         else return 0;
     }
     }
 };
 };
@@ -1004,14 +1079,18 @@ let analyzer = {
         });
         });
         for (var i = 0; i < atIDArr.length; i++) {
         for (var i = 0; i < atIDArr.length; i++) {
             let patt = new RegExp(atIDArr[i]);
             let patt = new RegExp(atIDArr[i]);
-            let val = `$CE.at(${IDArr[i]})`;
+            let val = `$CE.at(${IDArr[i]}, false)`;
             rst = rst.replace(patt, val);
             rst = rst.replace(patt, val);
         };
         };
         rst = rst.replace(/\[/g, "$CE.base('");
         rst = rst.replace(/\[/g, "$CE.base('");
-        rst = rst.replace(/\]/g, "')");
+        rst = rst.replace(/\]/g, "', false)");
         rst = rst.replace(/L/g, labourCoe);
         rst = rst.replace(/L/g, labourCoe);
         return rst;
         return rst;
     },
     },
+    getCompiledTenderExpr: function (compiledExpr) {
+        let rst = compiledExpr.replace(/false/g, "true");
+        return rst;
+    },
     getStatement: function (expression, template) {
     getStatement: function (expression, template) {
         let rst = expression;
         let rst = expression;
         let atIDArr = analyzer.getAtIDArr(rst);
         let atIDArr = analyzer.getAtIDArr(rst);
@@ -1108,25 +1187,25 @@ let executeObj = {
     template: null,
     template: null,
     tempCalcItem: null,
     tempCalcItem: null,
 
 
-    at: function(ID) {
-        let me = executeObj;
-        let rst = me.template.compiledCalcItems[ID].unitFee;
+    at: function(ID, isTender) {
+        let item = executeObj.template.compiledCalcItems[ID];
+        let rst = isTender ? item.tenderUnitFee : item.unitFee;
         rst = parseFloat(rst);
         rst = parseFloat(rst);
         return rst;
         return rst;
     },
     },
-    base: function(baseName) {
+    base: function(baseName, isTender) {
         let me = executeObj;
         let me = executeObj;
 
 
         // 量价、工料机形式的定额, 要把自己的市场单价用于计算程序中的基数。
         // 量价、工料机形式的定额, 要把自己的市场单价用于计算程序中的基数。
         if (calcTools.isVolumePrice(me.treeNode) || calcTools.isGljRation(me.treeNode))
         if (calcTools.isVolumePrice(me.treeNode) || calcTools.isGljRation(me.treeNode))
-            return calcTools.marketPriceToBase(me.treeNode, baseName)
+            return calcTools.marketPriceToBase(me.treeNode, baseName, isTender)
         else{
         else{
             if (!rationCalcBases[baseName]){
             if (!rationCalcBases[baseName]){
                 hintBox.infoBox('系统提示', '定额基数“' + baseName + '”末定义,计算错误。 (模板 ' + me.template.ID + ',规则 ' + me.tempCalcItem.ID +')', 1);
                 hintBox.infoBox('系统提示', '定额基数“' + baseName + '”末定义,计算错误。 (模板 ' + me.template.ID + ',规则 ' + me.tempCalcItem.ID +')', 1);
                 return 0;
                 return 0;
             }
             }
             else
             else
-                return rationCalcBases[baseName](me.treeNode);
+                return rationCalcBases[baseName](me.treeNode, isTender);
         }
         }
     },
     },
     HJ: function () {
     HJ: function () {
@@ -1613,10 +1692,16 @@ class CalcProgram {
                     if (calcItem.feeRate != undefined)
                     if (calcItem.feeRate != undefined)
                         feeRate = parseFloat(calcItem.feeRate).toDecimal(decimalObj.feeRate);
                         feeRate = parseFloat(calcItem.feeRate).toDecimal(decimalObj.feeRate);
                     // console.log(`[${calcItem.ID}]: ${calcItem.compiledExpr}`);   // for test.
                     // console.log(`[${calcItem.ID}]: ${calcItem.compiledExpr}`);   // for test.
-                    calcItem.unitFee = (eval(calcItem.compiledExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));   // 如果eval()对清单树有影响,就换成小麦的Expression对象再试
 
 
-                    let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 0;
-                    calcItem.totalFee = (calcItem.unitFee * q).toDecimal(decimalObj.decimal('totalPrice', treeNode));
+                    calcItem.unitFee = (eval(calcItem.compiledExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
+                    calcItem.totalFee = (calcItem.unitFee * calcTools.uiNodeQty(treeNode)).toDecimal(decimalObj.decimal('totalPrice', treeNode));
+
+                    if (isTender) {
+                        calcTools.calcNodeTenderQty(treeNode);
+                        let tExpr = analyzer.getCompiledTenderExpr(calcItem.compiledExpr);
+                        calcItem.tenderUnitFee = (eval(tExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
+                        calcItem.tenderTotalFee = (calcItem.tenderUnitFee * treeNode.data.tenderQuantity).toDecimal(decimalObj.decimal('totalPrice', treeNode));
+                    };
 
 
                     if (calcItem.fieldName) {
                     if (calcItem.fieldName) {
                         fnArr.push(calcItem.fieldName);
                         fnArr.push(calcItem.fieldName);
@@ -1634,22 +1719,22 @@ class CalcProgram {
     };
     };
 
 
     // 计算本节点、所有父节点(默认,可选)、公式引用节点(默认,可选)。
     // 计算本节点、所有父节点(默认,可选)、公式引用节点(默认,可选)。
-    calculate(treeNode, calcParents = true, calcFormulas = true){
+    calculate(treeNode, calcParents = true, calcFormulas = true, isTender = false){
         let me = this;
         let me = this;
         let changedNodes = [];
         let changedNodes = [];
-        me.innerCalc(treeNode, changedNodes);
+        me.innerCalc(treeNode, changedNodes, isTender);
         if (treeNode.changed) {
         if (treeNode.changed) {
             // 计算父结点
             // 计算父结点
             if (calcParents){
             if (calcParents){
                 let curNode = treeNode.parent;
                 let curNode = treeNode.parent;
                 while (curNode){
                 while (curNode){
-                    me.innerCalc(curNode, changedNodes);
+                    me.innerCalc(curNode, changedNodes, isTender);
                     curNode = curNode.parent;
                     curNode = curNode.parent;
                 };
                 };
             };
             };
             // 父结点算完,再计算所有的公式结点(必须先算完父结点,再算公式结点)
             // 父结点算完,再计算所有的公式结点(必须先算完父结点,再算公式结点)
             if (calcFormulas) {
             if (calcFormulas) {
-                me.calcFormulaNodes(changedNodes);
+                me.calcFormulaNodes(changedNodes, isTender);
             };
             };
         };
         };
 
 
@@ -1662,7 +1747,7 @@ class CalcProgram {
         calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到)  不要用
         calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到)  不要用
         缺陷:calcAllType.catRations 参数情况不会计算父结点。(calcAllType.catBills 可以,因为清单的父结点也是清单会计算)
         缺陷:calcAllType.catRations 参数情况不会计算父结点。(calcAllType.catBills 可以,因为清单的父结点也是清单会计算)
     */
     */
-    calcAllNodes(calcType = calcAllType.catAll){
+    calcAllNodes(calcType = calcAllType.catAll, isTender){
         let me = this;
         let me = this;
         let changedNodes = [];
         let changedNodes = [];
         function calcNodes(nodes) {
         function calcNodes(nodes) {
@@ -1674,17 +1759,17 @@ class CalcProgram {
                 if (calcType == calcAllType.catAll || calcType == node.sourceType) {
                 if (calcType == calcAllType.catAll || calcType == node.sourceType) {
                     node.calcType = calcTools.getCalcType(node);
                     node.calcType = calcTools.getCalcType(node);
                     if (node.calcType != treeNodeCalcType.ctCalcBaseValue)
                     if (node.calcType != treeNodeCalcType.ctCalcBaseValue)
-                        me.innerCalc(node, changedNodes);
+                        me.innerCalc(node, changedNodes, isTender);
                 };
                 };
             }
             }
         };
         };
         calcNodes(me.project.mainTree.roots);
         calcNodes(me.project.mainTree.roots);
-        me.calcFormulaNodes(changedNodes);
+        me.calcFormulaNodes(changedNodes, isTender);
         return changedNodes;
         return changedNodes;
     };
     };
 
 
     // 计算全部公式项。 (参数意义:将通过本方法后发生改变的节点存入changedArr中)
     // 计算全部公式项。 (参数意义:将通过本方法后发生改变的节点存入changedArr中)
-    calcFormulaNodes(changedArr){
+    calcFormulaNodes(changedArr, isTender){
         let me = this;
         let me = this;
         let formulaNodes = cbTools.getFormulaNodes(true);
         let formulaNodes = cbTools.getFormulaNodes(true);
         if (formulaNodes.length == 0) return;
         if (formulaNodes.length == 0) return;
@@ -1693,13 +1778,13 @@ class CalcProgram {
             projectObj.project.calcBase.calculate(formulaNode, true);
             projectObj.project.calcBase.calculate(formulaNode, true);
             if (projectObj.project.calcBase.success){
             if (projectObj.project.calcBase.success){
                 // 计算公式结点
                 // 计算公式结点
-                me.innerCalc(formulaNode, changedArr);
+                me.innerCalc(formulaNode, changedArr, isTender);
 
 
                 // 计算父结点
                 // 计算父结点
                 if (formulaNode.changed){
                 if (formulaNode.changed){
                     let curNode = formulaNode.parent;
                     let curNode = formulaNode.parent;
                     while (curNode){
                     while (curNode){
-                        me.innerCalc(curNode, changedArr);
+                        me.innerCalc(curNode, changedArr, isTender);
                         curNode = curNode.parent;
                         curNode = curNode.parent;
                     };
                     };
                 };
                 };
@@ -1790,8 +1875,8 @@ class CalcProgram {
         this.calcNodesAndSave(billNodes, callback);
         this.calcNodesAndSave(billNodes, callback);
     };
     };
 
 
-    calcAllNodesAndSave(calcType = calcAllType.catAll, callback){
-        let changedNodes = this.calcAllNodes(calcType);
+    calcAllNodesAndSave(calcType = calcAllType.catAll, callback, isTender){
+        let changedNodes = this.calcAllNodes(calcType, isTender);
         this.saveNodes(changedNodes, callback);
         this.saveNodes(changedNodes, callback);
     };
     };
 
 

+ 3 - 4
web/building_saas/main/js/models/main_consts.js

@@ -21,7 +21,7 @@ const ModuleNames = {
 const gljType = {
 const gljType = {
     // 人工
     // 人工
     LABOUR: 1,
     LABOUR: 1,
-    // ==============材料类型=================
+
     // 普通材料
     // 普通材料
     GENERAL_MATERIAL: 201,
     GENERAL_MATERIAL: 201,
     // 混凝土
     // 混凝土
@@ -34,15 +34,14 @@ const gljType = {
     COMMERCIAL_CONCRETE: 205,
     COMMERCIAL_CONCRETE: 205,
     // 商品砂浆
     // 商品砂浆
     COMMERCIAL_MORTAR: 206,
     COMMERCIAL_MORTAR: 206,
-    // ==============材料类型=================
-    // ==============机械类型=================
+
     // 机械台班
     // 机械台班
     GENERAL_MACHINE: 301,
     GENERAL_MACHINE: 301,
     // 机械组成物
     // 机械组成物
     MACHINE_COMPOSITION: 302,
     MACHINE_COMPOSITION: 302,
     // 机上人工
     // 机上人工
     MACHINE_LABOUR: 303,
     MACHINE_LABOUR: 303,
-    // ==============机械类型=================
+
     // 主材
     // 主材
     MAIN_MATERIAL: 4,
     MAIN_MATERIAL: 4,
     // 设备
     // 设备

+ 6 - 1
web/building_saas/main/js/views/tender_price_view.js

@@ -266,7 +266,12 @@ $(function () {
         me.updateTenderData([updateData],function () {
         me.updateTenderData([updateData],function () {
             me.initPageContent();
             me.initPageContent();
         });
         });
-    })
+    });
+
+    $('#tenderPrice').on('click', function () {
+        projectObj.project.calcProgram.calcAllNodesAndSave(calcAllType.catAll, null, true);
+        tender_obj.showTenderData();
+    });
 
 
 
 
 });
 });