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

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

zhangweicheng преди 7 години
родител
ревизия
b6847be885

+ 24 - 15
modules/reports/util/rpt_excel_util.js

@@ -342,21 +342,21 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     let private_pre_analyze_pos = function(){
         let cell, pos;
         let self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
-            theShtData.cells.sort(function(cell1, cell2) {
-                let rst = 0;
-                if (cell1[JV.PROP_AREA][JV.PROP_TOP] > cell2[JV.PROP_AREA][JV.PROP_TOP]) {
-                    rst = 1;
-                } else if (cell1[JV.PROP_AREA][JV.PROP_TOP] < cell2[JV.PROP_AREA][JV.PROP_TOP]) {
-                    rst = -1;
-                } else {
-                    if (cell1[JV.PROP_AREA][JV.PROP_LEFT] > cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
-                        rst = 1;
-                    } else if (cell1[JV.PROP_AREA][JV.PROP_LEFT] < cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
-                        rst = -1;
-                    }
-                }
-                return rst;
-            });
+            // theShtData.cells.sort(function(cell1, cell2) {
+            //     let rst = 0;
+            //     if (cell1[JV.PROP_AREA][JV.PROP_TOP] > cell2[JV.PROP_AREA][JV.PROP_TOP]) {
+            //         rst = 1;
+            //     } else if (cell1[JV.PROP_AREA][JV.PROP_TOP] < cell2[JV.PROP_AREA][JV.PROP_TOP]) {
+            //         rst = -1;
+            //     } else {
+            //         if (cell1[JV.PROP_AREA][JV.PROP_LEFT] > cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+            //             rst = 1;
+            //         } else if (cell1[JV.PROP_AREA][JV.PROP_LEFT] < cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+            //             rst = -1;
+            //         }
+            //     }
+            //     return rst;
+            // });
             for (let i = 0; i < theShtData.cells.length; i++) {
                 cell = theShtData.cells[i];
                 pos = cell[JV.PROP_AREA][JV.PROP_LEFT];
@@ -625,11 +625,20 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         //remark: 1 excel unit width = 2.117 mm
         rst.push('<cols>');
         let w = 0;
+        /*
         for (let i = 1; i < xPos.length - 1; i++) {
             w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
             w = Math.round(w * 1000) / 1000;
             rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
         }
+        /*/
+        for (let i = 1; i < xPos.length - 2; i++) {
+            w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
+            w = Math.round(w * 1000) / 1000;
+            rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
+        }
+        rst.push('<col min="' + (xPos.length - 1) +'" max="' + (xPos.length - 1) +'" width="' + 10 + '" customWidth="1"/>');
+        //*/
         rst.push('</cols>');
     };
     let private_setMergedCells = function() {

+ 2 - 2
web/building_saas/glj/js/project_glj_spread.js

@@ -48,8 +48,8 @@ ProjectGLJSpread.prototype.init = function () {
         {name: 'ID', field: 'id', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '总消耗量', field: 'quantity', visible: true,width:100,decimalField:'glj.quantity'},
-        {name: '分部分项总消耗量', field: 'subdivisionQuantity', visible: false,width:100,decimalField:'glj.quantity'},
-        {name: '技术措施项目总消耗量', field: 'techQuantity', visible: false,width:100,decimalField:'glj.quantity'},
+        {name: '分部分项总消耗量', field: 'subdivisionQuantity', visible: true,width:100,decimalField:'glj.quantity'},
+        {name: '技术措施项目总消耗量', field: 'techQuantity', visible: true,width:100,decimalField:'glj.quantity'},
         {name: '定额价', field: "base_price", visible: true,width:70,decimalField:"glj.unitPrice",validator: 'number'},//这里feiedID设置是为了在计不计取价差的时候做显示用
         {name: '调整价', field: 'adjust_price', visible: true,width:70,decimalField:"glj.unitPrice"},
         {name: '市场价', field: "unit_price.market_price", visible: true, validator: 'number',width:70,decimalField:"glj.unitPrice"},

+ 488 - 12
web/building_saas/main/js/models/calc_base.js

@@ -81,7 +81,7 @@ let cbTools = {
         for(let i = 0, len = figureF.length; i < len; i++){
             let figure = figureF[i];
             if(figure.type === 'base' && cbTools.isDef(calcBase.baseFigures[figure.value])){
-                let bill = calcBase.baseFigures[figure.value]['fixedBill']['bill'];
+                let bill = this.isDef(calcBase.baseFigures[figure.value]['fixedBill']) ? calcBase.baseFigures[figure.value]['fixedBill']['bill'] : null;
                 if(this.isDef(bill) && ids.indexOf(bill.ID) === -1){
                     let node = this.getNodeByID(bill.ID);
                     if(this.isDef(node)){
@@ -120,7 +120,7 @@ let cbTools = {
         for(let i in baseFigure){
             let calcBase = baseFigure[i];
             calcBase.fixedBill = null;
-            if(cbTools.isDef(fixedBills[calcBase.fixedFlag])){
+            if(cbTools.isDef(calcBase.fixedFlag) && cbTools.isDef(fixedBills[calcBase.fixedFlag])){
                 fixedBills[calcBase.fixedFlag]['base'][i] = calcBase;
                 calcBase.fixedBill = fixedBills[calcBase.fixedFlag];
             }
@@ -129,26 +129,34 @@ let cbTools = {
     //生成清单基数计算分类模板
     setBaseFigureClass: function (baseFigures, mapObj) {
         mapObj['CONSTRUCTION_ORGANIZATION'] = Object.create(null);
+        mapObj['SAFETY_CONSTRUCTION'] = Object.create(null);
         mapObj['OTHER'] = Object.create(null);
         mapObj['CHARGE'] = Object.create(null);
         mapObj['TAX'] = Object.create(null);
         mapObj['OTHERS'] = Object.create(null);
-        let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ'];
+        let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ', 'SQGCZJ'];
         for(let figure in baseFigures){
             if(filter.indexOf(baseFigures[figure]['base']) === -1){
                 mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure]['base'] !== 'QTXMF'){
+            if(baseFigures[figure]['base'] !== 'QTXMF' && baseFigures[figure]['base'] !== 'SQGCZJ'){
                 mapObj['OTHER'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure]['base'] !== 'GF'){
+            if(baseFigures[figure]['base'] !== 'GF' && baseFigures[figure]['base'] !== 'SQGCZJ'){
                 mapObj['CHARGE'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure]['base'] !== 'SJ'){
+            if(baseFigures[figure]['base'] !== 'SJ' && baseFigures[figure]['base'] !== 'SQGCZJ'){
                 mapObj['TAX'][figure] = baseFigures[figure];
             }
-            mapObj['OTHERS'][figure] = baseFigures[figure];
+            if(baseFigures[figure]['base'] !== 'SQGCZJ'){
+                mapObj['OTHERS'][figure] = baseFigures[figure];
+            }
+            if(baseFigures[figure]['base'] === 'SQGCZJ'){
+                mapObj['SAFETY_CONSTRUCTION'][figure] = baseFigures[figure];
+            }
         }
+        mapObj['SAFETY_CONSTRUCTION'] = Object.assign(mapObj['SAFETY_CONSTRUCTION'], mapObj['CONSTRUCTION_ORGANIZATION']);
+
     },
     getFigure: function (node) {
         let calcBase = projectObj.project.calcBase;
@@ -160,6 +168,9 @@ let cbTools = {
         else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
             return calcBase.baseFigureClass.CONSTRUCTION_ORGANIZATION;
         }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SAFETY_CONSTRUCTION){
+            return calcBase.baseFigureClass.SAFETY_CONSTRUCTION;
+        }
         else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.OTHER){
             return calcBase.baseFigureClass.OTHER;
         }
@@ -219,7 +230,9 @@ let cbTools = {
             let bases = Array.from(new Set(tempBases));
             //根据基数和行引用获取清单ID
             for(let i = 0, len = bases.length; i < len; i++){
-                if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
+                //基数是跟清单直接关联的
+                if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
+                    && cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
                     block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
                 }
                 else if(bases[i]['type'] === 'id'){
@@ -353,8 +366,18 @@ let baseFigureTemplate = {
     'FBFXWJJCLF': function () {
         return (this['FBFXZCF']() + this['FBFXSBF']()).toDecimal(decimalObj.bills.totalPrice);
     },
+    //统计分部分项下工料机类型为“人工”的总消耗量
     'FBFXRGGR': function () {
-        return 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        let rst = 0;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                if(cbTools.isDef(glj.subdivisionQuantity)){
+                    rst = parseFloat(rst + glj.subdivisionQuantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
+        return rst;
     },
     'FBFXGCLQDJJZJGCF': function () {
         return (this['FBFXDEJJRGF']() + this['FBFXDEJJCLF']() + this['FBFXDEJJJXF']()).toDecimal(decimalObj.bills.totalPrice);
@@ -444,6 +467,15 @@ let baseFigureTemplate = {
         return (this['JSCSXMZCF']() + this['JSCSXMSBF']()).toDecimal(decimalObj.bills.totalPrice);
     },
     'JSCSXMRGGR': function () {
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                if(cbTools.isDef(glj.techQuantity)){
+                    rst = parseFloat(rst + glj.techQuantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
         return 0;
     },
     'JSCSXMQDDEJJZJGCF': function () {
@@ -466,10 +498,415 @@ let baseFigureTemplate = {
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return cbTools.isDef(bill.feesIndex.common) && cbTools.isDef(bill.feesIndex.common.totalFee) ? bill.feesIndex.common.totalFee : 0;
+    },
+    'SQGCZJ': function () {//税前工程造价
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SAFETY_CONSTRUCTION]['bill'];
+        if(cbTools.isUnDef(bill) || cbTools.isUnDef(bill.ID)) return 0;
+        let node = cbTools.getNodeByID(bill.ID);
+        if(cbTools.isUnDef(node)) return 0;
+        return projectObj.project.calcProgram.getBeforeTaxTotalFee([node]);
+    },
+    'RCJJC': function () {//人材机价差
+        return (this['RGJC']() + this['CLJC']() + this['JXJC']()).toDecimal(2);
+    },
+    'RGJC': function () {//人工价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'CLJC': function () {//材料价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){//含有组成物的则用组成物计算,不含则自身算
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JXJC': function () {//机械价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'FBFXRCJJC': function () {//分部分项人材机价差
+        return (this['FBFXRGJC']() + this['FBFXCLJC']() + this['FBFXJXJC']()).toDecimal(2);
+    },
+    'FBFXRGJC': function () {//分部分项人工价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && cbTools.isDef(glj.subdivisionQuantity)){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'FBFXCLJC': function () {//分部分项材料价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && cbTools.isDef(glj.subdivisionQuantity) &&glj.ratio_data.length === 0){//含有组成物的则用组成物计算,不含则自身算
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'FBFXJXJC': function () {//分部分项机械价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && cbTools.isDef(glj.subdivisionQuantity) && glj.ratio_data.length === 0){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JSCSXMRCJJC': function () {//技术措施项目人材机价差
+        return (this['JSCSXMRGJC']() + this['JSCSXMCLJC']() + this['JSCSXMJXJC']()).toDecimal(2);
+    },
+    'JSCSXMRGJC': function () {//技术措施项目人工价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && cbTools.isDef(glj.techQuantity)){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JSCSXMCLJC': function () {//技术措施项目材料价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && cbTools.isDef(glj.techQuantity) &&glj.ratio_data.length === 0){//含有组成物的则用组成物计算,不含则自身算
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JSCSXMJXJC': function () {//技术措施项目机械价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && cbTools.isDef(glj.techQuantity) && glj.ratio_data.length === 0){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGDEJJRGF': function () {//甲供定额基价人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGDEJJCLF': function () {//甲供定额基价材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGDEJJJXF': function () {//甲供定额基价机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGRGF': function () {//甲供人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGCLF': function () {//甲供材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGJXF': function () {//甲供机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGZCF': function () {//甲供主材费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.MAIN_MATERIAL && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGSBF': function () {//甲供设备费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.EQUIPMENT){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDDEJJRGF': function () {//甲定定额基价人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDDEJJCLF': function () {//甲定定额基价材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDDEJJJXF': function () {//甲定定额基价机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDRGF': function () {//甲定人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDCLF': function () {//甲定材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDJXF': function () {//甲定机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                console.log(glj);
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+                console.log(rst);
+            }
+        }
+        return rst;
+    },
+    'JDZCF': function () {//甲定主材费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.MAIN_MATERIAL && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDSBF': function () {//甲定设备费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.EQUIPMENT && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'ZGCLFFZM': function () {//暂估材料费(从子目汇总)
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.ENGINEERINGCOST]['bill'];
+        if(cbTools.isUnDef(bill)) return 0;
+        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
+        return cbTools.isDef(bill.feesIndex.estimate) && cbTools.isDef(bill.feesIndex.estimate.totalFee) ? bill.feesIndex.estimate.totalFee : 0;
+    },
+    'ZGCLFFGLJ': function () {//暂估材料费(从工料机汇总表汇总)
+        return 0;
+    },
+    'FBF': function () {//分包费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.common){
+                rst = parseFloat(rst + ration.feesIndex.common.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBDEJJRGF': function () {//分包定额基价人工费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.labour){
+                rst = parseFloat(rst + ration.feesIndex.labour.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBDEJJCLF': function () {//分包定额基价材料费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.material){
+                rst = parseFloat(rst + ration.feesIndex.material.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBDEJJJXF': function(){//分包定额基价机械费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.machine){
+                rst = parseFloat(rst + ration.feesIndex.machine.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBZCF': function () {//分包主材费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.mainMaterial){
+                rst = parseFloat(rst + ration.feesIndex.mainMaterial.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBSBF': function () {//分包设备费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.equipment){
+                rst = parseFloat(rst + ration.feesIndex.equipment.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBRGGR': function () {//分包人工工日
+        let rst = 0;
+        let rationIds = [];//查找定额工料机
+        let rations = calcBase.project.Ration.datas;
+        let rationGljs = calcBase.project.ration_glj.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract){
+                //定额
+                if(ration.type === rationType.ration){
+                    rationIds.push(ration.ID);
+                }
+                //量人 type 2, subType 1
+                else if(ration.type === rationType.volumePrice && ration.subType === volumePriceMaps['量人']){
+                    rst = parseFloat(rst + ration.quantity).toDecimal(decimalObj.glj.quantity);
+                }
+                //定额类型的人工工料机,type 3, subType 1
+                else if(ration.type === rationType.gljRation && ration.subType === gljType.LABOUR){
+                    rst = parseFloat(rst + ration.quantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
+        for(let rationID of rationIds){
+            for(let glj of rationGljs){
+                if(rationID === glj.rationID){
+                    rst = parseFloat(rst + glj.quantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
+        return rst;
     }
 };
 
+//基数的值不是通过清单节点获得的,则该基数的fixedBill为空,如价差、甲供、分包
 let baseFigureMap = {
+    //与清单直接关联=======
     '分部分项工程费': {base: 'FBFXGCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
     '分部分项定额基价人工费': {base: 'FBFXDEJJRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
     '分部分项定额基价材料费': {base: 'FBFXDEJJCLF', fixedFlag: fixedFlag.SUB_ENGINERRING},
@@ -500,7 +937,46 @@ let baseFigureMap = {
     '技术措施项目清单中的定额基价直接工程费': {base: 'JSCSXMQDDEJJZJGCF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
     '其他项目费': {base: 'QTXMF',  fixedFlag: fixedFlag.OTHER},
     '规费': {base: 'GF', fixedFlag: fixedFlag.CHARGE},
-    '税金': {base: 'SJ', fixedFlag: fixedFlag.TAX}
+    '税金': {base: 'SJ', fixedFlag: fixedFlag.TAX},
+    '税前工程造价': {base: 'SQGCZJ', fixedFlag: fixedFlag.SAFETY_CONSTRUCTION},//安全文明施工专项费用使用
+    //不于清单直接关联==========
+    '人材机价差': {base: 'RCJJC'},
+    '人工价差': {base: 'RGJC'},
+    '材料价差': {base: 'CLJC'},
+    '机械价差': {base: 'JXJC'},
+    '分部分项人材机价差': {base: 'FBFXRCJJC'},
+    '分部分项人工价差': {base: 'FBFXRGJC'},
+    '分部分项材料价差': {base: 'FBFXCLJC'},
+    '分部分项机械价差': {base: 'FBFXJXJC'},
+    '技术措施项目人材机价差': {base: 'JSCSXMRCJJC'},
+    '技术措施项目人工价差': {base: 'JSCSXMRGJC'},
+    '技术措施项目材料价差': {base: 'JSCSXMCLJC'},
+    '技术措施项目机械价差': {base: 'JSCSXMJXJC'},
+    '甲供定额基价人工费': {base: 'JGDEJJRGF'},
+    '甲供定额基价材料费': {base: 'JGDEJJCLF'},
+    '甲供定额基价机械费': {base: 'JGDEJJJXF'},
+    '甲供人工费': {base: 'JGRGF'},
+    '甲供材料费': {base: 'JGCLF'},
+    '甲供机械费': {base: 'JGJXF'},
+    '甲供主材费': {base: 'JGZCF'},
+    '甲供设备费': {base: 'JGSBF'},
+    '甲定定额基价人工费': {base: 'JDDEJJRGF'},
+    '甲定定额基价材料费': {base: 'JDDEJJCLF'},
+    '甲定定额基价机械费': {base: 'JDDEJJJXF'},
+    '甲定人工费': {base: 'JDRGF'},
+    '甲定材料费': {base: 'JDCLF'},
+    '甲定机械费': {base: 'JDJXF'},
+    '甲定主材费': {base: 'JDZCF'},
+    '甲定设备费': {base: 'JDSBF'},
+    '暂估材料费(从子目汇总)': {base: 'ZGCLFFZM'},
+    '暂估材料费(从工料机汇总表汇总)': {base: 'ZGCLFFGLJ'},
+    '分包费': {base: 'FBF'},
+    '分包定额基价人工费': {base: 'FBDEJJRGF'},
+    '分包定额基价材料费': {base: 'FBDEJJCLF'},
+    '分包定额基价机械费': {base: 'FBDEJJJXF'},
+    '分包主材费': {base: 'FBZCF'},
+    '分包设备费': {base: 'FBSBF'},
+    '分包人工工日': {base: 'FBRGGR'}
 };
 
 //输入式分析器
@@ -576,7 +1052,7 @@ let cbAnalyzer = {
             let figure = figureF[i];
             let bill = null;
             if(figure.type === 'base' && cbTools.isDef(baseFigures[figure.value])){
-                bill = baseFigures[figure.value]['fixedBill']['bill'];
+                bill = cbTools.isDef(baseFigures[figure.value]['fixedBill']) ? baseFigures[figure.value]['fixedBill']['bill'] : null;
             }
             else if(figure.type === 'id'){
                 let node = cbTools.getNodeByID(figure.value);
@@ -868,7 +1344,7 @@ let calcBase = {
         cbTools.setBaseFigureClass(me.baseFigures, me.baseFigureClass);
     },
     getBase: function (figure) {
-       return cbCalctor.base(figure);
+        return cbCalctor.base(figure);
 
     },
     getBaseByClass: function (node) {

+ 74 - 159
web/building_saas/main/js/models/calc_program.js

@@ -249,6 +249,7 @@ let calcTools = {
         }
         return result;
     },
+    // 这里的小数取舍比较复杂,必须严格遵循需求,不能随意改动,否则计算结果会差1分钱。
     estimateFee: function (treeNode, isBase = false){
         let me = this, sumU = 0, sumT = 0;
         // 父清单暂估费的汇总计算走计算程序逻辑,不在这里。
@@ -313,7 +314,8 @@ let calcTools = {
                         for (let md of mds){
                             if (md.isEstimate){
                                 let isExist = false;
-                                let mdQ = (rq * me.uiGLJQty(glj.quantity) * me.uiGLJQty(md.consumption)).toDecimal(decimalObj.process);
+                                let totalQ = (rq * me.uiGLJQty(glj.quantity)).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)){
@@ -331,7 +333,7 @@ let calcTools = {
                 };
 
                 for (let obj of GLJObjs){
-                    sumT = sumT + (obj.quantity * me.uiGLJPrice(obj.marketPrice)).toDecimal(decimalObj.process);
+                    sumT = sumT + (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice)).toDecimal(decimalObj.process);
                     sumT = sumT.toDecimal(decimalObj.process);
                 };
                 sumT = sumT.toDecimal(decimalObj.bills.totalPrice);
@@ -553,7 +555,6 @@ const rationCalcBases = {
 
 let analyzer = {
     calcTemplate: null,
-    success: true,
 
     standard: function(expr){
         let str = expr;
@@ -587,47 +588,59 @@ let analyzer = {
     isCycleCalc: function (expr) {     // @5+@6  这里已经是ID引用
         let me = this;
         
-        function checkCycle() {
-            
-        }
-        let atIDArr = me.getAtIDArr(expr);
-        for (let atID of atIDArr){
-            let ID = atID.slice(1);
-            let item = me.calcTemplate.compiledCalcItems[ID];
-            let expression = item.expression;
-            if (expression.includes(atID)) return false;
-
+        function isCycle(nodeExpr) {
+            let atIDArr = me.getAtIDArr(nodeExpr);
+            for (let atID of atIDArr){
+                let ID = atID.slice(1);
+                let item = me.calcTemplate.compiledCalcItems[ID];
+                if (item.expression.includes(atID)) {
+                    return true;
+                }
+                else {
+                    isCycle(item.expression);
+                }
+            };
+            return false;
         };
+
+        return isCycle(expr);
     },
-    isLegal: function (expr) {
+    isLegal: function (expr) {   // 调用前必须先标准化
         let me = this;
-        let stdExpr = me.standard(expr);
 
         let invalidChars = /[^0-9\u4e00-\u9fa5\+\-\*\/\(\)\.\[\]F%]/g;
-        if (invalidChars.test(stdExpr)){
+        if (invalidChars.test(expr)){
             alert('表达式中含有无效的字符!');
             return false;
         };
 
         let pattCn = new RegExp(/[\u4E00-\u9FA5]+/gi);
-        let arrCn = stdExpr.match(pattCn);
+        let arrCn = expr.match(pattCn);
         let pattBase = new RegExp(/\[[\u4E00-\u9FA5]+\]/gi);
-        let arrBase = stdExpr.match(pattBase);
+        let arrBase = expr.match(pattBase);
         if (arrCn.length != arrBase.length){
-            alert('定额基数必须用“[]”括起来!');
+            for (let cn of arrCn){
+                let tempBase = `[${cn}]`;
+                  if (!arrBase.includes(tempBase)){
+                      alert(`定额基数“${cn}”必须用中括号[]括起来!`);
+                      return false;
+                  }
+            };
+            // 这里要加一个保险。因为上面的 for 循环在“主材费 + [主材费]” 情况下有Bug
+            alert('定额基数必须用中括号[]括起来!');
             return false;
         };
 
         for (let base of arrBase){
             let baseName = base.slice(1, -1);
             if (!rationCalcBases[baseName]){
-                alert('定额基数“' + baseName + '”末定义!');
+                alert('定额基数 [' + baseName + '] 末定义!');
                 return false;
             }
         };
 
         // 行引用检测、行引用转ID引用
-        let arrF = me.getFArr(stdExpr);
+        let arrF = me.getFArr(expr);
         for (let F of arrF){
             let num = F.slice(1);
             if (num > me.calcTemplate.calcItems.length){
@@ -636,140 +649,28 @@ let analyzer = {
             };
             let id = me.getFID(F);
             let fn = new RegExp(F, "g");
-            stdExpr = stdExpr.replace(fn, '@' + id);
+            expr = expr.replace(fn, `@('${id}')`);
         };
 
         // 循环计算
-        if (me.isCycleCalc(stdExpr)){
+        if (me.isCycleCalc(expr)){
             alert('表达式中有循环计算!');
             return false;
         }
-    },
-    analyzeCalcBase: function(expr){
-        // 前提:必须无空格、无特殊符号
-        function getCalcBase(expr){
-            let base = '',
-                iPos1 = -1, iPos2 = -1;
-            for (let i = 0; i < expr.length; i++) {
-                if (expr[i] === '['){
-                    iPos1 = i;
-                }
-                else if (iPos1 != -1 && expr[i]===']'){
-                    iPos2 = i;
-                };
-
-                if (iPos1 != -1 && iPos2 != -1){
-                    base = expr.slice(iPos1, iPos2 + 1);
-                    break;
-                }
-            };
-            return base;
-        };
-        function calcBaseToIDExpr(base){
-            /*// for test. 公路模式,基数到ID
-            let id = -1;
-            if (base == '[人工费]'){
-                id = 111;
-            }
-            else if (base == '[材料费]'){
-                id = 222;
-            }
-            else if (base == '[机械费]'){
-                id = 333;
-            }
-            else id = "错误";
-
-            return "@('" + id + "')";*/
-            let baseValue = base.slice(1, -1);
-            return "base('" + baseValue + "')";
-        };
-
-        while (expr.indexOf('[') > 0) {
-            let base = getCalcBase(expr);
-            let id = calcBaseToIDExpr(base);
-            let baseValue = base.slice(1, -1);   // []会给下面的正则带来干扰,这里去掉
-            var pattBase =new RegExp(baseValue, "g");
-            expr = expr.replace(pattBase, id);
-            expr = expr.replace(/\[base\('/g, "base('");      // [@('       [base('
-            expr = expr.replace(/'\)\]/g, "')");        // ')]
-        };
-
-        return expr;
-    },
-
-    analyzeLineRef: function(expr){
-        let me = this;
-        function isOperator(char){
-            var operator = "+-*/()";
-            return operator.indexOf(char) > -1;
-        };
-        function lineNumToID(lineNum){
-            if (lineNum > me.calcTemplate.calcItems.length){
-                me.success = false;
-                return '越界';
-            }
-            else{
-                let id = me.calcTemplate.calcItems[lineNum - 1].ID;
-                return id;
-            }
-        };
-        // 前提:必须无空格、无特殊符号、标准大写F
-        function getSection(expr){
-            let section = '',
-                iPos1 = -1, iPos2 = -1;
-            for (let i = 0; i < expr.length; i++) {
-                if (expr[i] === 'F'){
-                    iPos1 = i;
-                }
-                else if (iPos1 != -1 && isOperator(expr[i])){
-                    iPos2 = i;
-                }
-                else if (iPos1 != -1 && i == expr.length - 1){
-                    iPos2 = i + 1;
-
-                };
-                if (iPos1 != -1 && iPos2 != -1){
-                    section = expr.slice(iPos1, iPos2);
-                    break;
-                }
-            };
-            return section;
-        };
-        function sectionToIDExpr(section){
-            if (section){
-                let lineNum = section.slice(1);
-                if (isNaN(lineNum)){
-                    me.success = false;
-                    return '错误';      // 这里的返回提示不能加上section,因为会无限循环
-                }
-                else
-                    return "@('" + lineNumToID(lineNum) + "')";
-            }
-            else return '';
-        };
 
-        while (expr.indexOf('F') > 0) {
-            let sec = getSection(expr);
-            let id = sectionToIDExpr(sec);
-            var pattSec =new RegExp(sec, "g");
-            expr = expr.replace(pattSec, id);
-        };
-        return expr;
+        return true;
     },
-
     analyzeUserExpr: function(calcTemplate, calcItem){
         let me = this;
         me.calcTemplate = calcTemplate;
         let expr = calcItem.dispExpr;
-        // 标准化:处理特殊字符、中文符号、大小写
         expr = me.standard(expr);
         calcItem.dispExpr = expr;
-        // 先换掉计算基数
-        expr = me.analyzeCalcBase(expr);
-        // 再换掉行引用
-        expr = me.analyzeLineRef(expr);
-        calcItem.expression = expr;
-        return me.success;
+        if (me.isLegal(expr)){
+            calcItem.expression = expr;
+            return true;
+        }else
+            return false;
     }
 };
 
@@ -1079,10 +980,12 @@ class CalcProgram {
             let nodes = (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees) ? treeNode.children : me.project.Ration.getRationNodes(treeNode);
             let rst = [];
             for (let ft of cpFeeTypes) {
+                let isEstimate = ft.name == '暂估费';
                 let ftObj = {};
                 ftObj.fieldName = ft.type;
                 ftObj.name = ft.name;
                 let buf = 0, btf = 0, btuf = 0, bttf = 0;
+                let bq = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
 
                 if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
                     for (let node of nodes) {
@@ -1097,7 +1000,6 @@ class CalcProgram {
                 }
                 else if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){     // 这里的算法要配合冷姐姐的神图才能看懂^_^
                     let sum_rtf = 0, sum_rttf = 0;
-                    let bq = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
                     for (let node of nodes) {
                         let rq = calcTools.uiNodeQty(node) ? calcTools.uiNodeQty(node) : 0;
                         let ruf = 0, rtuf = 0, rtf = 0, rttf = 0;
@@ -1108,33 +1010,46 @@ class CalcProgram {
                             rttf = parseFloat(node.data.feesIndex[ft.type].tenderTotalFee);
                         };
                         if (me.project.property.billsCalcMode === leafBillGetFeeType.rationContent) {
-                            buf = (buf + (ruf * rq / bq).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
-                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
+                            buf = (buf + (ruf * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
+                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
                         };
                         sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
                         sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
                     };
-
-                    if (me.project.property.billsCalcMode == leafBillGetFeeType.rationPriceConverse ||
-                        me.project.property.billsCalcMode == leafBillGetFeeType.rationPrice) {
-                        buf = (sum_rtf / bq).toDecimal(decimalObj.process);
-                        btuf = (sum_rttf / bq).toDecimal(decimalObj.process);
-                    };
-                    if (isBaseFeeType(ft.type) ||
-                        (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice && ft.type == "common")){
+                    if (isEstimate){
                         btf = sum_rtf;
                         bttf = sum_rttf;
-                    }
-                    else{
-                        btf = (buf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
-                        bttf = (btuf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
+                    }else{
+                        if (me.project.property.billsCalcMode == leafBillGetFeeType.rationPriceConverse ||
+                            me.project.property.billsCalcMode == leafBillGetFeeType.rationPrice) {
+                            buf = (sum_rtf / bq).toDecimal(decimalObj.process);
+                            btuf = (sum_rttf / bq).toDecimal(decimalObj.process);
+                        };
+                        if (isBaseFeeType(ft.type) ||
+                            (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice && ft.type == "common")){
+                            btf = sum_rtf;
+                            bttf = sum_rttf;
+                        }
+                        else{
+                            btf = (buf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
+                            bttf = (btuf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
+                        };
                     };
                 };
 
-                ftObj.unitFee = buf.toDecimal(decimalObj.bills.unitPrice);
                 ftObj.totalFee = btf.toDecimal(decimalObj.bills.totalPrice);
-                ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
                 ftObj.tenderTotalFee = bttf.toDecimal(decimalObj.bills.totalPrice);
+                if (isEstimate){
+                    if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){
+                        ftObj.unitFee = (ftObj.totalFee / bq).toDecimal(decimalObj.bills.unitPrice);
+                        ftObj.tenderUnitFee = (ftObj.tenderTotalFee / bq).toDecimal(decimalObj.bills.unitPrice);
+                    }
+                }
+                else{
+                    ftObj.unitFee = buf.toDecimal(decimalObj.bills.unitPrice);
+                    ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
+                }
+
                 calcTools.checkFeeField(treeNode, ftObj);
 
                 rst.push(ftObj);
@@ -1413,7 +1328,7 @@ class CalcProgram {
                     }
                     else{
                         if (node.sourceType != ModuleNames.ration_glj) {
-                            rst = (rst + calcTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
+                            rst = (rst + calcTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.decimal("totalPrice", node));
                         };
                     }
                 }

+ 18 - 1
web/building_saas/main/js/models/main_consts.js

@@ -55,6 +55,11 @@ const baseMaterialTypes = [
     gljType.COMMERCIAL_CONCRETE,
     gljType.COMMERCIAL_MORTAR
 ];
+const baseMachineTypes = [
+    gljType.GENERAL_MACHINE,
+    gljType.MACHINE_COMPOSITION,
+    gljType.MACHINE_LABOUR
+];
 // 全部材料类型。用于暂估等 (多了主材和设备)
 const allMaterialTypes = [
     gljType.GENERAL_MATERIAL,
@@ -159,6 +164,18 @@ const zanguCalcType = {
     gatherMaterial: 1
 };
 
+//供货方式
+const supplyType = {
+    //自行采购
+    ZXCG: 0,
+    //部分甲供
+    BFJG: 1,
+    //完全甲供
+    WQJG: 2,
+    //甲定乙供
+    JDYG: 3
+};
+
 //清单固定行
 const fixedFlag = {
     // 分部分项工程
@@ -265,4 +282,4 @@ const engineeringType = {
     BUILDING_REPAIR: 13,
     // 安装修缮工程
     BUILD_IN_REPAIR: 14
-};
+};

+ 9 - 9
web/building_saas/main/js/views/project_view.js

@@ -16,8 +16,6 @@ var projectObj = {
         let project = projectObj.project;
         subViewObj.loadComments(node);
         gljOprObj.showDataIfRationSelect(node);
-
-        // CSL.2017.07.25
         if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
             calcProgramObj.showData(node);
         };
@@ -37,6 +35,15 @@ var projectObj = {
         node.data.isSubcontract = true;
         let bname = '分包人工工日';
         alert(bname + ': ' + rationCalcBases[bname](node));*/
+
+/*        let value = projectObj.project.calcProgram.getBeforeTaxTotalFee([node]);
+        alert('前四项累计值排除当前选中项:' + value);*/
+
+/*        let t = projectObj.project.calcProgram.compiledTemplates[node.data.programID];
+        let c = t.calcItems[7];
+        c.dispExpr = '[定额基价人工费] + [定额基价材料费]  + F6 + [主材费]';
+        let rst = analyzer.analyzeUserExpr(t, c);
+        alert(`${rst}: ` + JSON.stringify(c));*/
     },
     refreshBaseActn: function (tree) {
         let setButtonValid = function (valid, btn) {
@@ -426,13 +433,6 @@ var projectObj = {
                 const autoHeight = that.project.property.displaySetting !== undefined ?
                     that.project.property.displaySetting.autoHeight : false;
                 that.project.projSetting.mainGridSetting.cols.forEach(function (col) {
-                    // for test.  后端没有绑定,暂时写死用于测试。
-/*                    if (col.data.field == '' && col.head.titleNames[0] == "取费专业") {
-                        col.data.field = 'programID';
-                        col.data.getText = 'getText.calcProgramName';
-                        col.data.cellType = 'cellType.calcProgramName';
-                    };*/
-
                     col.data.splitFields = col.data.field.split('.');
                     if (col.data.getText && Object.prototype.toString.apply(col.data.getText) === "[object String]") {
                         col.data.getText = MainTreeCol.getEvent(col.data.getText);