Преглед на файлове

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

zhongzewei преди 7 години
родител
ревизия
3c63ef81a9

+ 38 - 1
modules/glj/controllers/glj_controller.js

@@ -17,6 +17,7 @@ let glj_type_util = require('../../../public/cache/std_glj_type_util');
 let mongoose = require('mongoose');
 let ration = mongoose.model('ration');
 
+
 const ProjectModel = require('../../pm/models/project_model').project;
 class GLJController extends BaseController {
 
@@ -227,10 +228,46 @@ class GLJController extends BaseController {
             responseData.err = 1;
             responseData.msg = error;
         }
-
         response.json(responseData);
     }
 
+
+    //添加组成物
+    async addMixRatio(request,response){
+
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let gljList = data.gljList, parentInfo = data.parentInfo,mixRatios = [];
+            let projectGljModel = new GLJListModel();
+            let mixRatioModel = new MixRatioModel();
+            for(let g of gljList){
+                let newProjectGLJ = await projectGljModel.addList(g,parentInfo.unit_price_file_id);
+                let mixRatio = {
+                    glj_id:newProjectGLJ.glj_id,
+                    consumption:0,
+                    unit_price_file_id:parentInfo.unit_price_file_id,
+                    connect_key:parentInfo.connect_key,
+                    type: newProjectGLJ.type,
+                    code: newProjectGLJ.code,
+                    specs:newProjectGLJ.specs,
+                    name:newProjectGLJ.name,
+                    unit:newProjectGLJ.unit
+                };
+                newProjectGLJ.ratio_data = await mixRatioModel.add(mixRatio);
+                mixRatios.push(newProjectGLJ);
+            }
+            result.data = mixRatios;
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
     /**
      * 获取项目与单价文件对应的数据
      *

+ 1 - 3
modules/glj/models/glj_list_model.js

@@ -417,7 +417,7 @@ class GLJListModel extends BaseModel {
                     };
                     newMixRatioData.push(tem);
                 }
-                mixInsertResult= mixRatioModel.add(newMixRatioData);
+                mixInsertResult= await mixRatioModel.add(newMixRatioData);
             }
         }
         return gljData;
@@ -771,8 +771,6 @@ class GLJListModel extends BaseModel {
             let u_index = this.getIndex(tmp,['code','name','specs','unit','type'])
             unitPriceData[u_index] = tmp;
         }
-
-
         return [gljData,mixRatioData,unitPriceData];
 
     }

+ 1 - 0
modules/glj/routes/glj_router.js

@@ -17,6 +17,7 @@ router.post('/getData', gljController.init, gljController.getGljList);
 router.post('/update', gljController.init, gljController.updateData);
 router.post('/get-ratio', gljController.init, gljController.getRatio);
 router.post('/delete-ratio', gljController.init, gljController.deleteMixRatio);
+router.post('/add-ratio', gljController.init, gljController.addMixRatio);
 router.post('/get-project-info', gljController.init, gljController.getProjectInfo);
 router.post('/change-file', gljController.init, gljController.changeUnitPriceFile);
 router.post('/checkUnitFileName', gljController.init, gljController.checkUnitFileName);

+ 188 - 103
web/building_saas/main/js/models/calc_program.js

@@ -151,7 +151,7 @@ let calcTools = {
         if (this.isRationCategory(treeNode)) {
             if (treeNode.data.type != rationType.volumePrice) {
                 treeNode.data.gljList = projectObj.project.ration_glj.getGljArrByRation(treeNode.data);
-            };
+            }
         }
         else if (this.isBill(treeNode)){
             let nodeQ = this.uiNodeQty(treeNode);
@@ -211,6 +211,16 @@ let calcTools = {
             treeNode.data.feesIndex[feeObj.fieldName].totalFee = feeObj.totalFee;
             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){
         if (fieldName.includes('feesIndex')){
@@ -245,31 +255,29 @@ let calcTools = {
         else
             return 0;
     },
-    rationBaseFee: function (treeNode, gljTypes, priceType){
+    rationBaseFee: function (treeNode, gljTypes, priceType, isTender){
         if (!treeNode.data.gljList) return 0;
         let me = this, result = 0;
         let price = 0, temp = 0, temp2 = 0;
         for (let glj of treeNode.data.gljList) {
             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){
-                    let aprice = me.uiGLJPrice(glj["adjustPrice"]);
-                    let mprice = me.uiGLJPrice(glj["marketPrice"]);
                     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 {
                     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);
                 };
             };
@@ -284,12 +292,19 @@ let calcTools = {
 
         return result;
     },
-    machineLabourFee: function (gljArr) {
+    machineLabourFee: function (treeNode, gljArr, isTender) {
         if (!gljArr) return 0;
         let result = 0;
         for (let glj of gljArr) {
             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);
                 if (!mds) mds = [];
                 let mdSum = 0;
@@ -301,16 +316,16 @@ let calcTools = {
                         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);
             }
         }
         return result;
     },
     // 总造价清单、叶子清单、定额的暂估费。父清单是汇总子清单的暂估费,走计算程序逻辑,不在这里。
-    estimateFee: function (treeNode, isBase = false){
+    estimateFee: function (treeNode, isBase, isTender){
         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);
 
         // 先汇总数量,再乘市场价。如果是叶子清单,进入这里的gljList中的材料,已经是同类材料跨定额汇总过的了。
@@ -443,7 +458,7 @@ let calcTools = {
 
         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;
         let result = 0, me = this;
         if (
@@ -468,7 +483,7 @@ let calcTools = {
                 'quantity': 1,
                 'type': treeNode.data.subType      // 注意:这里要取subType
             };
-            result = me.machineLabourFee([glj]);
+            result = me.machineLabourFee(treeNode, [glj], isTender);
         }
         else if (
             (treeNode.data.type == rationType.gljRation) &&
@@ -482,7 +497,7 @@ let calcTools = {
         }
         return result;
     },
-    partASupplyFee: function (treeNode, baseName) {
+    partASupplyFee: function (treeNode, baseName, isTender) {
         if (!treeNode.data.gljList) return 0;
         let projectGLJ = projectObj.project.projectGLJ;
 
@@ -536,16 +551,26 @@ let calcTools = {
 
         let sum = 0;
         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 tempSGLJ = supplyGLJsIdx[glj.projectGLJID];
             // 当前材料是甲供材料:①普通 ②商品硂等不计组成物的母体材料
             if (tempSGLJ) {
                 // 处理部分甲供
                 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;
                 }
-                sum = (sum + glj.basePrice * glj.quantity * X).toDecimal(decimalObj.process);
+                sum = (sum + glj.basePrice * gljQ * X).toDecimal(decimalObj.process);
             }
             else{   // 当前材料不是甲供材料
                 if (compT.includes(glj.type)) {   // 混凝土等。组成物的母体,母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
@@ -558,7 +583,7 @@ let calcTools = {
                                 if (baseName.includes('甲供') && (c.supply == supplyType.BFJG)){
                                     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){
         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 传入一个普通的价格数值即可。
     uiGLJPrice: function (price){
         if (price)
@@ -718,99 +783,109 @@ const calcBaseNames = {
 };
 
 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;
         let rst = 0;
+
+        calcTools.uiNodeQty(node)
         for (let glj of node.data.gljList) {
             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);
             }
         };
         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;
     },
-    '分包定额基价材料费': function (node) {
-        if (node.data.isSubcontract) return this.定额基价材料费(node)
+    '分包定额基价材料费': function (node, isTender) {
+        if (node.data.isSubcontract) return this.定额基价材料费(node, isTender)
         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;
     },
-    '分包主材费': function (node) {
-        if (node.data.isSubcontract) return this.主材费(node)
+    '分包主材费': function (node, isTender) {
+        if (node.data.isSubcontract) return this.主材费(node, isTender)
         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;
     },
-    '分包人工工日': function (node) {
-        if (node.data.isSubcontract) return this.人工工日(node)
+    '分包人工工日': function (node, isTender) {
+        if (node.data.isSubcontract) return this.人工工日(node, isTender)
         else return 0;
     }
 };
@@ -1004,14 +1079,18 @@ let analyzer = {
         });
         for (var i = 0; i < atIDArr.length; 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(/\[/g, "$CE.base('");
-        rst = rst.replace(/\]/g, "')");
+        rst = rst.replace(/\]/g, "', false)");
         rst = rst.replace(/L/g, labourCoe);
         return rst;
     },
+    getCompiledTenderExpr: function (compiledExpr) {
+        let rst = compiledExpr.replace(/false/g, "true");
+        return rst;
+    },
     getStatement: function (expression, template) {
         let rst = expression;
         let atIDArr = analyzer.getAtIDArr(rst);
@@ -1108,25 +1187,25 @@ let executeObj = {
     template: 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);
         return rst;
     },
-    base: function(baseName) {
+    base: function(baseName, isTender) {
         let me = executeObj;
 
         // 量价、工料机形式的定额, 要把自己的市场单价用于计算程序中的基数。
         if (calcTools.isVolumePrice(me.treeNode) || calcTools.isGljRation(me.treeNode))
-            return calcTools.marketPriceToBase(me.treeNode, baseName)
+            return calcTools.marketPriceToBase(me.treeNode, baseName, isTender)
         else{
             if (!rationCalcBases[baseName]){
                 hintBox.infoBox('系统提示', '定额基数“' + baseName + '”末定义,计算错误。 (模板 ' + me.template.ID + ',规则 ' + me.tempCalcItem.ID +')', 1);
                 return 0;
             }
             else
-                return rationCalcBases[baseName](me.treeNode);
+                return rationCalcBases[baseName](me.treeNode, isTender);
         }
     },
     HJ: function () {
@@ -1613,10 +1692,16 @@ class CalcProgram {
                     if (calcItem.feeRate != undefined)
                         feeRate = parseFloat(calcItem.feeRate).toDecimal(decimalObj.feeRate);
                     // 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) {
                         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 changedNodes = [];
-        me.innerCalc(treeNode, changedNodes);
+        me.innerCalc(treeNode, changedNodes, isTender);
         if (treeNode.changed) {
             // 计算父结点
             if (calcParents){
                 let curNode = treeNode.parent;
                 while (curNode){
-                    me.innerCalc(curNode, changedNodes);
+                    me.innerCalc(curNode, changedNodes, isTender);
                     curNode = curNode.parent;
                 };
             };
             // 父结点算完,再计算所有的公式结点(必须先算完父结点,再算公式结点)
             if (calcFormulas) {
-                me.calcFormulaNodes(changedNodes);
+                me.calcFormulaNodes(changedNodes, isTender);
             };
         };
 
@@ -1662,7 +1747,7 @@ class CalcProgram {
         calcAllType.catRations   计算所有定额、工料机形式的定额、量价,因为它们都走自己的计算程序 (改变人工系数、费率值、工料机单价时会用到)  不要用
         缺陷:calcAllType.catRations 参数情况不会计算父结点。(calcAllType.catBills 可以,因为清单的父结点也是清单会计算)
     */
-    calcAllNodes(calcType = calcAllType.catAll){
+    calcAllNodes(calcType = calcAllType.catAll, isTender){
         let me = this;
         let changedNodes = [];
         function calcNodes(nodes) {
@@ -1674,17 +1759,17 @@ class CalcProgram {
                 if (calcType == calcAllType.catAll || calcType == node.sourceType) {
                     node.calcType = calcTools.getCalcType(node);
                     if (node.calcType != treeNodeCalcType.ctCalcBaseValue)
-                        me.innerCalc(node, changedNodes);
+                        me.innerCalc(node, changedNodes, isTender);
                 };
             }
         };
         calcNodes(me.project.mainTree.roots);
-        me.calcFormulaNodes(changedNodes);
+        me.calcFormulaNodes(changedNodes, isTender);
         return changedNodes;
     };
 
     // 计算全部公式项。 (参数意义:将通过本方法后发生改变的节点存入changedArr中)
-    calcFormulaNodes(changedArr){
+    calcFormulaNodes(changedArr, isTender){
         let me = this;
         let formulaNodes = cbTools.getFormulaNodes(true);
         if (formulaNodes.length == 0) return;
@@ -1693,13 +1778,13 @@ class CalcProgram {
             projectObj.project.calcBase.calculate(formulaNode, true);
             if (projectObj.project.calcBase.success){
                 // 计算公式结点
-                me.innerCalc(formulaNode, changedArr);
+                me.innerCalc(formulaNode, changedArr, isTender);
 
                 // 计算父结点
                 if (formulaNode.changed){
                     let curNode = formulaNode.parent;
                     while (curNode){
-                        me.innerCalc(curNode, changedArr);
+                        me.innerCalc(curNode, changedArr, isTender);
                         curNode = curNode.parent;
                     };
                 };
@@ -1790,8 +1875,8 @@ class CalcProgram {
         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);
     };
 

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

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

+ 56 - 4
web/building_saas/main/js/models/project_glj.js

@@ -283,8 +283,7 @@ ProjectGLJ.prototype.updatePrice = function (recode, updateField, newval,from,cb
             gljs.push(glj);
             let nodes = me.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
             projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
-            socket.emit('unitFileChangeNotify', JSON.stringify(data));
-            projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),'unitFileID':socketObject.getUnitFileRoomID()},"unitFile");
+            projectGljObject.onUnitFileChange(data);
             if(cb){
                 cb(gljs);
             }
@@ -344,8 +343,7 @@ ProjectGLJ.prototype.batchUpdatePrice = function (changeInfo,callback) {
             let nodes = me.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
             projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
             gljOprObj.showRationGLJSheetData();
-            socket.emit('unitFileChangeNotify', JSON.stringify(gljs));
-            projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),'unitFileID':socketObject.getUnitFileRoomID()},"unitFile");
+            projectGljObject.onUnitFileChange(gljs);
             if(callback){
                 callback(gljs);
             }
@@ -412,6 +410,60 @@ ProjectGLJ.prototype.changeFile = function (changeData,callback) {
     });
 };
 
+ProjectGLJ.prototype.addMixRatio = function(selections,callback){
+    let gljList = [],allGLJ = gljOprObj.AllRecode;
+    $("#glj_tree_div").modal('hide');
+    if(selections.length == 0) {
+        return;
+    }
+    for(let glj of allGLJ){
+        let i_key = gljOprObj.getIndex(glj, gljLibKeyArray);
+        if(_.includes(selections,i_key)){
+            let pglj = {
+                project_id: projectObj.project.ID(),
+                glj_id: glj.ID,
+                name: glj.name,
+                code: glj.code,
+                original_code: glj.code,
+                unit: glj.unit,
+                specs: glj.specs,
+                base_price: glj.basePrice,
+                market_price: glj.basePrice,
+                shortName: glj.shortName,
+                type: glj.gljType,
+                adjCoe: glj.adjCoe,
+                from:'std',
+                repositoryId:glj.repositoryId,
+                materialType:glj.materialType,
+                materialCoe:glj.materialCoe,
+            };
+            if (glj.hasOwnProperty("compilationId")) {
+                pglj.from = "cpt";
+                if (glj.code.indexOf('-') != -1) {//这条工料机是用户通过修改名称、规格、型号等保存到补充工料机库的
+                    pglj.original_code = glj.code.split('-')[0];//取-前的编号作为原始编号
+                }
+            }
+            gljList.push(pglj);
+        }
+    }
+    gljList = _.sortByAll(gljList, ['type', 'code']);
+    if(gljList.length == 0) return;
+    let praentInfo = {
+        unit_price_file_id:projectObj.project.property.unitPriceFile.id,
+        connect_key:gljOprObj.getIndex(projectGljObject.selectedProjectGLJ,gljKeyArray)
+    };
+    $.bootstrapLoading.start();
+    CommonAjax.post("/glj/add-ratio", {gljList:gljList,parentInfo:praentInfo}, function (data) {
+        $.bootstrapLoading.end();
+        if(callback){
+            callback(data);
+        }
+    }, function () {
+        $.bootstrapLoading.end();
+    });
+
+}
+
 ProjectGLJ.prototype.checkUnitFileName = function(newVal,callback){
     let property = projectInfoObj.projectInfo.property;
     let data = {

+ 26 - 14
web/building_saas/main/js/views/glj_view.js

@@ -943,6 +943,8 @@ var gljOprObj = {
         }
         if ($('#actionType').val() == 'replace' || $('#actionType').val() == 'm_replace') {
             me.filterLibGLJByType();
+        }else if($('#actionType').val() == 'addMix'){
+            projectGljObject.filterLibGLJForMixRatio();
         }
         //文本筛选
         let searchStr = $('#gljSearchKeyword').val();
@@ -964,7 +966,7 @@ var gljOprObj = {
         }
     },
     setGLJSelection: function (args, newVal) {
-        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert') {
+        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert'|| $('#actionType').val() == 'addMix') {
             this.addGLJsSelection(args, newVal);
         } else {
             this.replaceGLJSelection(args, newVal);
@@ -1363,23 +1365,31 @@ $(function () {
             gljOprObj.gljLibSheet.name('glj_lib');
         }
         gljOprObj.gljLibSheetData = gljOprObj.AllRecode;
-        var selected = null;
-        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert') {
+        let selections = [],selectMap = {};
+        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert') {//插入,添加
             gljOprObj.GLJSelection = [];
-        } else {
-            selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
+        } else if($('#actionType').val() =='m_replace' || $('#actionType').val() == 'replace'){//替换、批量替换
+            let selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
             var connect_key = gljOprObj.getIndex(selected, gljKeyArray);
             gljOprObj.GLJSelection = [connect_key];
+            selectMap[connect_key] = true;
             gljOprObj.filterLibGLJByType();
-        }
-
-        if (selected != null) {
-            var s_key = gljOprObj.getIndex(selected, gljLibKeyArray);
-            var r = _.find(gljOprObj.gljLibSheetData, function (item) {
-                var item_key = gljOprObj.getIndex(item, gljKeyArray);
-                return s_key == item_key;
-            });
-            r ? r.select = 1 : "";
+        }else if($('#actionType').val() =='addMix'){//添加组成物
+            gljOprObj.GLJSelection = [];
+            projectGljObject.filterLibGLJForMixRatio();
+            /*selections = projectGljObject.mixRatioData;  添加组成物的时候先不选中
+            gljOprObj.GLJSelection = [];
+            for(let s of selections){
+                let s_key = gljOprObj.getIndex(s, gljKeyArray);
+                selectMap[s_key] = true;
+                gljOprObj.GLJSelection.push(s_key);
+            }*/
+        }
+        for(let item of gljOprObj.gljLibSheetData){
+            let item_key = gljOprObj.getIndex(item, gljLibKeyArray);
+            if(selectMap[item_key]){
+                item.select = 1 ;
+            }
         }
         gljOprObj.showLibGLJSheetData();
     });
@@ -1424,6 +1434,8 @@ $(function () {
             gljOprObj.doReplaceGLJ();
         } else if ($('#actionType').val() == 'm_replace') {//批量替换工料机
             gljOprObj.doMReplaceGLJ();
+        }else if($('#actionType').val() == 'addMix'){
+            projectGljObject.addMixRatio();
         }
     })
 

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

@@ -1370,7 +1370,7 @@ $(function () {
             return;
         }
         me.calcInstallationFee(function () {
-
+            gljOprObj.refreshView();
         });
     });
     $('#btn_reset_to_default').click(function (){

+ 97 - 34
web/building_saas/main/js/views/project_glj_view.js

@@ -137,6 +137,46 @@ projectGljObject={
     getUsedTenderInfo:function() {
         return projectGljObject.usedTenderList.join("<br>");
     },
+    filterLibGLJForMixRatio:function () {
+        let me = this;
+        if(me.selectedProjectGLJ){
+            let showTypes = [];
+            let materialArr = [202, 203, 204];//混凝土、砂浆、配合比,
+            if(me.selectedProjectGLJ.type == gljType.MAIN_MATERIAL){//对于主材,只显示没有组成物并且除了自已的主材
+                showTypes = [gljType.MAIN_MATERIAL];
+            }else if(_.includes(materialArr,me.selectedProjectGLJ.type)){//混凝土、砂浆、配合比
+                showTypes = [gljType.GENERAL_MATERIAL];
+            }else if(me.selectedProjectGLJ.type == gljType.GENERAL_MACHINE){//机械类型可添加机械组成物、机上人工
+                showTypes = [gljType.MACHINE_COMPOSITION,gljType.MACHINE_LABOUR];
+            }
+            gljOprObj.gljLibSheetData = _.filter(gljOprObj.gljLibSheetData, function (item) {
+                if(me.selectedProjectGLJ.type == gljType.MAIN_MATERIAL){
+                    let p_index = gljOprObj.getIndex(me.selectedProjectGLJ,gljKeyArray);
+                    let i_index = gljOprObj.getIndex(item,gljLibKeyArray);
+                    return item.gljType == gljType.MAIN_MATERIAL &&item.component.length == 0 && p_index!=i_index
+                }else {
+                    return _.includes(showTypes,item.gljType);
+                }
+            });
+        }
+    },
+    addMixRatio:function () {
+        let me = this, projectGLJ = projectObj.project.projectGLJ;
+        for(let mix of me.mixRatioData){
+            let m_key = gljOprObj.getIndex(mix, gljKeyArray);
+            let t_index = gljOprObj.GLJSelection.indexOf(m_key);
+            t_index != -1?gljOprObj.GLJSelection.splice(t_index,1):'';
+        }
+        projectGLJ.addMixRatio(gljOprObj.GLJSelection,function (mixRatios) {
+            me.showMixRatioData();//这里添加的组成物的消耗量默认都是0,所以对父工料机的价格不会有影响,不用触发计算
+            projectGLJ.loadData(function () {
+                me.showProjectGljData();
+                gljOprObj.showRationGLJSheetData();
+                me.onUnitFileChange(me.selectedProjectGLJ);
+            });
+
+        });
+    },
     showMixRatioData:function () {
         let me = this,gljId = null,gljType = null;
         let sheet = me.projectGljSpread.getActiveSheet();
@@ -219,7 +259,7 @@ projectGljObject={
         }
         if(dataCode=='basePrice'||dataCode=='marketPrice'||dataCode=='supply'){//有组成物时,市场单价、定额价、供货方式不能修改
             if (data.ratio_data  && data.ratio_data.length > 0){
-               return false;
+                return false;
             }
             if(dataCode=='basePrice'&&data.is_add!=1){//如果不是新增,定额价不可修改。
                 return false;
@@ -227,7 +267,7 @@ projectGljObject={
         }
         if(dataCode == 'supply_quantity'){
             if (data.supply != 1) {// 如果为部分甲供则甲供数量需要可编辑,其它的都不能编辑
-               return false;
+                return false;
             }
         }
         if(dataCode == 'materialCoe'){//三材类别为空时,三材系数应只读,不允许输入。
@@ -270,7 +310,7 @@ projectGljObject={
             changeInfo.push({row:c.row,col:c.col,value:value});
             if(me.projectGljEditChecking(c.row,c.col)==false){//如果不能编辑
                 canChange = false;
-             }
+            }
             if (canChange==true&&!me.checkData(c.col,me.projectGljSetting,value)) {
                 alert('输入的数据类型不对,请重新输入!');
                 canChange = false;
@@ -279,7 +319,7 @@ projectGljObject={
         if(canChange == false){//恢复原来的值
             info.sheetName =="materialTreeSheet"?me.showMaterialTreeData():me.showProjectGljData();
         }else if(info.sheetName =="projectGljSheet"){
-             me.batchUpdatePrice(changeInfo);
+            me.batchUpdatePrice(changeInfo);
         }
     },
     batchUpdatePrice(changeInfo){
@@ -564,11 +604,12 @@ projectGljObject={
         let prow = parentSheet.getActiveRowIndex();//取父机械或组成物的下标
         let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
         composition.updateConsumption(updateData,recode,prowData.id,function (sid) {
-           /* if(parentSheet.name() == 'projectGljSheet'){ 之前是单行刷新,父工料机与组成物对应的工料机分开刷,发现这样比整个刷新慢所以先整个刷新,当以后数据量大的时候再测试
-                me.refreshProjectGljRowByID(sid);
-            }*/
+            /* if(parentSheet.name() == 'projectGljSheet'){ 之前是单行刷新,父工料机与组成物对应的工料机分开刷,发现这样比整个刷新慢所以先整个刷新,当以后数据量大的时候再测试
+             me.refreshProjectGljRowByID(sid);
+             }*/
             projectObj.project.projectGLJ.calcQuantity();
             me.refreshParentData(prow,prowData.id,sid);
+            me.onUnitFileChange(recode);
         });
     },
     refreshParentData:function (row,pid,sid) {
@@ -613,10 +654,15 @@ projectGljObject={
         if(updateNodes.length>0){
             projectObj.project.calcProgram.calcRationsAndSave(updateNodes,function () {
                 projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
+                installationFeeObj.calcInstallationFee();//计算安装增加费
             });
         }
         gljOprObj.refreshView();
     },
+    onUnitFileChange:function (data) {
+        socket.emit('unitFileChangeNotify', JSON.stringify(data));
+        projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),'unitFileID':socketObject.getUnitFileRoomID()},"unitFile");
+    },
     deleteMixRatio:function (row) {
         let me = this, deleteRecode = me.mixRatioData[row];
         let consumption = deleteRecode.consumption;
@@ -628,6 +674,7 @@ projectGljObject={
         projectObj.project.composition.deleteComposition(updateData,deleteRecode,prowData.id,function () {
             me.refreshParentData(prow,prowData.id);
             me.mixRatioSheet.deleteRows(row,1);
+            me.onUnitFileChange(deleteRecode);
         });
     },
     getCompositionSumPrice : function(scene, affectRow, newValue = 0) {
@@ -692,7 +739,6 @@ projectGljObject={
             value= scMathUtil.roundForObj(value,getDecimal('glj.unitPrice'));//修改市场价和修改定额价时需要重新记算很多受影响的树节点,现在改成与定字额工料机那里调相同的方法。
             let editField = dataCode === 'basePrice'?"base_price":"market_price";
             projectObj.project.projectGLJ.updatePrice(recode,editField,value,'pg',callback);
-
         }else {
             let extend = {};
             // 如果是供货方式则需要处理数据
@@ -754,6 +800,22 @@ projectGljObject={
         }
         return result;
     },
+    getProjectGLJSelected:function () {
+        let me = projectGljObject;
+        let sheet = me.projectGljSpread.getActiveSheet();
+        let selectedProjectGLJ = null;
+        if(sheet.name() == 'projectGljSheet'){//projectGljSheet/materialSheet 工料机汇总和三材汇总表
+            let sel = me.projectGljSheet.getSelections()[0];
+            if(sel.row != -1 && me.projectGljSheetData.length>sel.row){
+                selectedProjectGLJ = me.projectGljSheetData[sel.row]
+            }
+        }else if(sheet.name() == 'materialTreeSheet' ){
+            if(me.materialTree.selected){
+                selectedProjectGLJ = me.materialTree.selected.data;
+            }
+        }
+        return selectedProjectGLJ;
+    },
     initRightClick : function() {
         let activeSheet = this.mixRatioSheet;
         let me = this;
@@ -780,11 +842,12 @@ projectGljObject={
                     name: '添加',
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        return me.rightClickTarget.row === undefined;
+                        let projectGLJ = projectGljObject.getProjectGLJSelected();
+                        return !_.includes(compositionTypes,projectGLJ.type);
                     },
                     callback: function (key, opt) {
-                        let row = me.rightClickTarget.row;
-                        console.log(row);
+                        me.selectedProjectGLJ = projectGljObject.getProjectGLJSelected();
+                        getGLJData('addMix');
                     }
                 }
             }
@@ -808,12 +871,12 @@ projectGljObject={
     },
     calcPartASupplyFeeByProjectGLJs: function (projectGLJsArr) {
         for (let pGLJ of projectGLJsArr){
-              if (pGLJ.supply == supplyType.BFJG){
-                  let rations = calcTools.getRationsByProjectGLJ(pGLJ.id);
-                  projectObj.project.calcProgram.calcNodesAndSave(rations, function () {
-                      projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
-                  });
-              }
+            if (pGLJ.supply == supplyType.BFJG){
+                let rations = calcTools.getRationsByProjectGLJ(pGLJ.id);
+                projectObj.project.calcProgram.calcNodesAndSave(rations, function () {
+                    projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
+                });
+            }
         }
     },
     checkUnitFileName:function (name,callback) {
@@ -875,23 +938,23 @@ $(function () {
         me.refreshDataSheet();
         loadProjectGljSize();
     });
-  /*  $('#ration_link').on('shown.bs.tab', function (e) {
-        let me = projectGljObject;
-        me.showTag='ration';
-        me.showProjectGljData();
-    });
-    $('#mix_ratio_link').on('shown.bs.tab', function (e) {
-        let me = projectGljObject;
-        me.showTag='mixRatio';
-        me.showProjectGljData();
-        me.initMixRatio();
-    });
-    $('#machine_ratio_link').on('shown.bs.tab', function (e) {
-        let me = projectGljObject;
-        me.showTag='machine';
-        me.showProjectGljData();
-        me.initMixRatio();
-    });*/
+    /*  $('#ration_link').on('shown.bs.tab', function (e) {
+     let me = projectGljObject;
+     me.showTag='ration';
+     me.showProjectGljData();
+     });
+     $('#mix_ratio_link').on('shown.bs.tab', function (e) {
+     let me = projectGljObject;
+     me.showTag='mixRatio';
+     me.showProjectGljData();
+     me.initMixRatio();
+     });
+     $('#machine_ratio_link').on('shown.bs.tab', function (e) {
+     let me = projectGljObject;
+     me.showTag='machine';
+     me.showProjectGljData();
+     me.initMixRatio();
+     });*/
     $('#pop-used-list').popover({
             placement: "bottom",
             html: true,

+ 59 - 15
web/building_saas/main/js/views/tender_price_view.js

@@ -13,7 +13,7 @@ let tender_obj={
             {headerName: "类别", headerWidth: 50, dataCode: "subType", hAlign: "center", dataType: "String",spanRows: [2],getText:'getText.subType'},
             {headerName: "项目名称", headerWidth: 200, dataCode: "name",showHint:true, hAlign: "left", dataType: "String",spanRows: [2]},
             {headerName: "计量\n单位", headerWidth: 60, dataCode: "unit", hAlign: "center", dataType: "String",spanRows: [2]},
-            {headerName: "工程量", headerWidth: 120, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number",spanRows: [2]},
+            {headerName: "工程量", headerWidth: 120, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"number",spanRows: [2],getText:'getText.quantity'},
             {headerName: "不调价", headerWidth: 55, dataCode: "is_adjust_price", hAlign: "center", cellType : "checkBox",dataType: "Number",spanRows: [2]},
             {headerName: ["初始报价","综合单价"], headerWidth: 80, dataCode: "feesIndex.common.unitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
             {headerName: ["","综合合价"], headerWidth: 80, dataCode: "feesIndex.common.totalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
@@ -113,8 +113,6 @@ let tender_obj={
             value = scMathUtil.roundForObj(value,getDecimal('process'));
             me.updateChildrenValue(node,dataCode,value,datas,nodes);
         }
-
-
         //在目标造价综合单价中输入数值,按项目属性中的清单单价精度取舍,并清空当前行的目标造价综合合价
         if(dataCode == 'targetUnitFee'){
             value = scMathUtil.roundForObj(value,getDecimal('unitPrice',node));
@@ -167,6 +165,15 @@ let tender_obj={
         scMathUtil.isDef(node.data.targetTotalFee)?updateData.data["targetTotalFee"] = null:'';
         return updateData;
     },
+    cleanTenderPrice:function (updateData,node) {//清空调整后报价
+        if(node.data.fees){
+            for(let i =0; i< node.data.fees.length; i++){
+                node.data.fees[i].tenderUnitFee?updateData.data["fees."+i+'.tenderUnitFee'] = 0:'';
+                node.data.fees[i].tenderTotalFee?updateData.data["fees."+i+'.tenderTotalFee'] = 0:'';
+            }
+        }
+    },
+
     calcOptionsChecking:function (option) {//调整选项检查,返回需要更新的数组
         let datas = [];
         let me = tender_obj;
@@ -206,7 +213,7 @@ let tender_obj={
                         if(key == 'ID' || key == 'id'){
                             continue;
                         }
-                        _.set(temObj,key,d.data[key]);
+                        me.setValue(temObj,key,d.data[key])
                     }
                 }
             }
@@ -214,6 +221,32 @@ let tender_obj={
             $.bootstrapLoading.end();
         })
     },
+    setValue:function (obj,key,value) {
+        let keyArray = key.split('.');
+        t_set(obj,value,keyArray,0);
+        function t_set(obj,value,arr,index) {
+            let nextIndex = index + 1;
+            let tkey = arr[index];
+            if(nextIndex < arr.length){
+                t_set(obj[tkey],value,arr,nextIndex)
+            }else if(nextIndex == arr.length){
+                obj[tkey] = value;
+            }
+        }
+
+    },
+    refreshTenderTreeByDatas:function (datas) {
+        let me = this;
+        let nodes = [];
+        for(let d of datas){
+            if(d.type == ModuleNames.bills || d.type == ModuleNames.ration){
+                let node = me.tenderTree.getNodeByID(d.data.ID);
+                node?nodes.push(node):'';
+            }
+        }
+        me.tenderController.refreshTreeNode(nodes);
+        me.initPageContent();
+    },
     treeSelectedChanged:function (node) {
         let me = tender_obj;
         //设置选中行底色和恢复前选中行底色
@@ -302,7 +335,21 @@ $(function () {
     });
 
     $('#cleanTender').bind('click',function () {
-       console.log("clean tender")
+        let me = tender_obj,datas = [];
+        for(let node of me.tenderTree.items){
+            let tem_updateData = {type:node.sourceType,data:{}};
+            me.cleanTargetPrice(tem_updateData,node);
+            me.cleanTenderCoe(tem_updateData,node);
+            me.cleanTenderPrice(tem_updateData,node);
+            if(!_.isEmpty(tem_updateData.data)){//如果需要更新
+                tem_updateData.data.ID = node.data.ID;
+                datas.push(tem_updateData);
+            }
+        }
+        datas.push({type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.tenderSetting.gljPriceTenderCoe':1}});//恢复人材机单价调整系数为1。
+        me.updateTenderData(datas,function () {
+            me.refreshTenderTreeByDatas(datas);
+        });
     });
 
     $('#calcPriceOption').change(function(){
@@ -312,15 +359,7 @@ $(function () {
         let updateData = {type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.tenderSetting.calcPriceOption':newVal}};
         datas.push(updateData);
         me.updateTenderData(datas,function () {
-            let nodes = [];
-            for(let d of datas){
-                if(d.type == ModuleNames.bills || d.type == ModuleNames.ration){
-                    let node = me.tenderTree.getNodeByID(d.data.ID);
-                    node?nodes.push(node):'';
-                }
-            }
-            me.tenderController.refreshTreeNode(nodes);
-            me.initPageContent();
+            me.refreshTenderTreeByDatas(datas);
         });
     });
 
@@ -333,7 +372,12 @@ $(function () {
         me.updateTenderData([updateData],function () {
             me.initPageContent();
         });
-    })
+    });
+
+    $('#tenderPrice').on('click', function () {
+        projectObj.project.calcProgram.calcAllNodesAndSave(calcAllType.catAll, null, true);
+        tender_obj.showTenderData();
+    });
 
 
 });