Просмотр исходного кода

Merge branch '1.0.0_online' of http://192.168.1.12:3000/SmartCost/ConstructionCost into 1.0.0_online

TonyKang 7 лет назад
Родитель
Сommit
589a500403

+ 2 - 1
modules/main/controllers/ration_controller.js

@@ -59,13 +59,14 @@ let controller = {
         let applyTasks = [
             ration_facade.addMultiRation(data.rations.create,req.session.sessionCompilation),//先生成新定额
             bill_facade.createNewBills(data.bills.create),
+            ration_facade.deleteMultiRation(data.rations.delete)
         ];
         //整理更新的数据,调用一个方法更新
         updateDatas.push(data.ration_template);
         if(data.rations.update.length > 0)  prepareUpdateNodes(data.rations.update,updateDatas,"ration");
         if(data.bills.update.length > 0)  prepareUpdateNodes(data.bills.update,updateDatas,"bills");
         applyTasks.push(project_facade.updateNodes(updateDatas));
-        let [rationResult,billsResult,updates] = await Promise.all(applyTasks);
+        let [rationResult,billsResult,deleteResult,updates] = await Promise.all(applyTasks);
         return {rationResult:rationResult,billsResult:billsResult,updateDatas:updateDatas};
     },
     //更新辅助定额

+ 12 - 9
modules/main/facade/project_facade.js

@@ -1,6 +1,17 @@
 /**
  * Created by zhang on 2018/1/26.
  */
+
+module.exports = {
+    markUpdateProject:markUpdateProject,
+    removeProjectMark:removeProjectMark,
+    updateNodes:updateNodes,
+    calcInstallationFee:calcInstallationFee,
+    saveProperty: saveProperty,
+    getDefaultColSetting: getDefaultColSetting,
+    markProjectsToChange:markProjectsToChange
+};
+
 let mongoose = require('mongoose');
 let logger = require("../../../logs/log_helper").logger;
 let  projectsModel = mongoose.model('projects');
@@ -18,15 +29,7 @@ const uuidV1 = require('uuid/v1');
 const gljUtil = require('../../../public/gljUtil');
 let stdColSettingModel = mongoose.model('std_main_col_lib');
 
-module.exports = {
-    markUpdateProject:markUpdateProject,
-    removeProjectMark:removeProjectMark,
-    updateNodes:updateNodes,
-    calcInstallationFee:calcInstallationFee,
-    saveProperty: saveProperty,
-    getDefaultColSetting: getDefaultColSetting,
-    markProjectsToChange:markProjectsToChange
-};
+
 
 async function calcInstallationFee(data) {
     let result={};

+ 57 - 36
modules/main/facade/ration_facade.js

@@ -1,6 +1,20 @@
 /**
  * Created by zhang on 2018/2/9.
  */
+//先导出后require可以解决循环引用问题
+module.exports = {
+    replaceRations: replaceRations,
+    addNewRation:addNewRation,
+    addMultiRation: addMultiRation,
+    deleteMultiRation:deleteMultiRation,
+    getSameSectionRations:getSameSectionRations,
+    getExtendData:getExtendData,
+    getDefaultProgramID:getDefaultProgramID,
+    deleteSubListByQuery:deleteSubListByQuery,
+    updateCoeAdjust:updateCoeAdjust
+};
+
+
 let mongoose = require('mongoose');
 import SearchDao from '../../complementary_ration_lib/models/searchModel';
 const scMathUtil = require('../../../public/scMathUtil').getUtil();
@@ -29,16 +43,6 @@ const projectDao = require('../../pm/models/project_model').project;
 let projectModel = mongoose.model('projects');
 const fs = require('fs');
 
-module.exports = {
-    replaceRations: replaceRations,
-    addNewRation:addNewRation,
-    addMultiRation: addMultiRation,
-    getSameSectionRations:getSameSectionRations,
-    getExtendData:getExtendData,
-    getDefaultProgramID:getDefaultProgramID,
-    deleteSubListByQuery:deleteSubListByQuery,
-    updateCoeAdjust:updateCoeAdjust
-};
 async function addNewRation(data,compilation) {
     let query = data.itemQuery;
     let stdRation = null;
@@ -72,6 +76,14 @@ async function addMultiRation(datas,compilation) {
     return rst;
 }
 
+async function deleteMultiRation(rations) {//这里是只有删除的情况,删除定额的同时删除定额下挂的其它子项目
+    if(rations.length > 0){//删除定额下的
+        let rationIDS = _.map(rations,'ID');
+        await deleteSubListByQuery({projectID:rations[0].projectID,rationID:{"$in": rationIDS}});
+        await ration_model.model.deleteMany({ID:{"$in": rationIDS}});
+    }
+}
+
 async function getSameSectionRations(data,userId,compilationId){
     //let userId
     //要先根据定额获取所属章节的ID
@@ -164,7 +176,7 @@ async function replaceRations(userID,data,compilation) {
     let recodes = [];
     for(let recode of data.nodeInfo){
         let stdRation = await searchDao.getRationItem(userID,compilation._id,data.libIDs,recode.newCode, null);
-        let newRecode = await replaceRation(recode,stdRation,data.defaultLibID,data.projectID,data.calQuantity,compilation);
+        let newRecode = await replaceRation(recode,stdRation,data.defaultLibID,data.projectID,data.calQuantity,compilation,data.cleanzmhs);
         if(newRecode){
             recodes.push(newRecode);
         }else {
@@ -186,20 +198,20 @@ async function getDefaultProgramID(data) {
     return programID;
 }
 
-async function replaceRation(nodeInfo,stdRation,defaultLibID,projectID,calQuantity,compilation) {
+async function replaceRation(nodeInfo,stdRation,defaultLibID,projectID,calQuantity,compilation,cleanzmhs) {
     if(nodeInfo.newCode == null||nodeInfo.newCode ==""){//说明是删除编号,则要变成一条空定额
         await deleRationSubRecode(projectID,nodeInfo.ID);//删除定额下挂的各种数据,如定额工料机等
         return await setEmptyRation(projectID,nodeInfo.ID);
     }else if(stdRation){
-        await deleRationSubRecode(projectID,nodeInfo.ID);//删除定额下挂的各种数据,如定额工料机等
-        let newRation = await updateRation(stdRation,defaultLibID,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
-        return await addRationSubList(stdRation,newRation,nodeInfo.needInstall,compilation);
+        await deleRationSubRecode(projectID,nodeInfo.ID,cleanzmhs);//删除定额下挂的各种数据,如定额工料机等
+        let newRation = await updateRation(stdRation,defaultLibID,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity,cleanzmhs);//生成并插入新的定额
+        return await addRationSubList(stdRation,newRation,nodeInfo.needInstall,compilation,cleanzmhs);
     }else {
         return null;
     }
 }
 
-async function addRationSubList(stdRation,newRation,needInstall,compilation) {
+async function addRationSubList(stdRation,newRation,needInstall,compilation,cleanzmhs=false) {
     let startTime = +new Date();
     let ration_gljs = await addRationGLJ(stdRation,newRation,compilation);
     let addRationGLJTime = +new Date();
@@ -208,13 +220,16 @@ async function addRationSubList(stdRation,newRation,needInstall,compilation) {
     let addRationCoeTime = +new Date();
     console.log("添加定额coe时间-----"+(addRationCoeTime - addRationGLJTime));
     let ration_installations = [];
-    if(needInstall && stdRation.type == 'std'){//只有标准的定额才有安装增加费,补充的定额没有安装增加费
-        ration_installations =  await addRationInstallFee(stdRation,newRation);
+    let ration_template = [];
+    if(cleanzmhs == false){//清除子目换算即cleanzmh==true时 模板子目、安装增加费不用恢复成标准的
+        if(needInstall && stdRation.type == 'std'){//只有标准的定额才有安装增加费,补充的定额没有安装增加费
+            ration_installations =  await addRationInstallFee(stdRation,newRation);
+        }
+        let addRationInstallFeeTime = +new Date();
+        console.log("添加定额install时间-----"+(addRationInstallFeeTime - addRationCoeTime));
+        //添加定额模板子目
+        ration_template = await addRationTemplate(stdRation,newRation);
     }
-    let addRationInstallFeeTime = +new Date();
-    console.log("添加定额install时间-----"+(addRationInstallFeeTime - addRationCoeTime));
-    //添加定额模板子目
-    let ration_template = await addRationTemplate(stdRation,newRation);
     return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installations:ration_installations,ration_templates:ration_template?[ration_template]:[]};
 }
 
@@ -464,18 +479,22 @@ async function addRationGLJ(std,newRation,compilation) {
     return rationGLJShowList;
 }
 
-async function deleRationSubRecode(projectID,rationID) {//删除挂在定额下的数据,如工程量明细,定额工料机等
+async function deleRationSubRecode(projectID,rationID,cleanzmhs=false) {//删除挂在定额下的数据,如工程量明细,定额工料机等
     let delete_query={projectID: projectID, rationID: rationID};
     //删除工程量明细
-    await deleteSubListByQuery(delete_query) ;
+    await deleteSubListByQuery(delete_query,cleanzmhs) ;
 }
 
-async function deleteSubListByQuery(delete_query) {
-    await quantity_detail.deleteByQuery(delete_query) ;//删除工程量明细
+async function deleteSubListByQuery(delete_query,cleanzmhs=false) {
+    if(cleanzmhs == false){//清空子目换算即cleanzmh==true时不需要清空工程量明细、模板关联子目、安装增加费
+        await quantity_detail.deleteByQuery(delete_query) ;//删除工程量明细
+        await rationInstallationModel.deleteMany(delete_query);//删除安装增加费
+        await rationTemplateModel.deleteMany(delete_query);//删除模板关联子目
+    }
+    //to do稳定土也要删除
+
     await ration_coe.deleteMany(delete_query);//删除附注条件
     await ration_glj.deleteMany(delete_query);//删除定额工料机
-    await rationInstallationModel.deleteMany(delete_query);//删除安装增加费
-    await rationTemplateModel.deleteMany(delete_query);//删除模板关联子目
 }
 
 async function updateCoeAdjust(data,compilation) {
@@ -512,7 +531,7 @@ async function updateCoeAdjust(data,compilation) {
 
 
 
-async function  updateRation(std,defaultLibID,rationID,billsItemID,projectID,calQuantity) {
+async function  updateRation(std,defaultLibID,rationID,billsItemID,projectID,calQuantity,cleanzmh=false) {
     // insertNewRation
     let ration ={};
     ration.code = std.code;
@@ -542,14 +561,16 @@ async function  updateRation(std,defaultLibID,rationID,billsItemID,projectID,cal
     else if(std.rationRepId === defaultLibID && ration.from === 'cpt') {
         ration.prefix = '补';
     }
-    if(std.feeType == undefined || std.feeType == null || std.feeType ==''){//定额取费专业为空的情况下,取项目属性中的定额取费专业ID
-        ration.programID = await getProgramForProject(projectID);
-    }else {
-        ration.programID = std.feeType;
-    }
     ration.rationAssList = createRationAss(std);//生成辅助定额
-    if(calQuantity){
-       await CalculateQuantity(ration,billsItemID,projectID);
+    if(cleanzmh==false){//如果是清空子目换算,即cleanzmh==true 保留定额工程量、工程量表达式、含量(分解系数)、取费专业(取费类别)
+        if(std.feeType == undefined || std.feeType == null || std.feeType ==''){//定额取费专业为空的情况下,取项目属性中的定额取费专业ID
+            ration.programID = await getProgramForProject(projectID);
+        }else {
+            ration.programID = std.feeType;
+        }
+        if(calQuantity){
+            await CalculateQuantity(ration,billsItemID,projectID);
+        }
     }
 
      let unsetObject = {

+ 1 - 0
modules/pm/facade/pm_facade.js

@@ -983,6 +983,7 @@ async function updateUsedList(userId, compilation) {
 async function copyCompleRationSection(userId, compilationId) {
     await sectionTreeDao.copyDataFromTemplate(userId, compilationId);
 }
+
 //拷贝补充人材机分类树
 async function copyCompleGljSection(userId, compilationId) {
     let templateData = await compleGljSectionTModel.find({compilationId: compilationId});

+ 153 - 2
public/web/sheet/sheet_common.js

@@ -193,6 +193,10 @@ var sheetCommonObj = {
                 this.setReplaceButton(row,col,sheet,setting.header[col]);
             }
 
+            if(setting.header[col].cellType === "cusButton"){
+                this.setCusButton(row,col,sheet,setting);
+            }
+
             if(setting.header[col].cellType === "tipsCell"){
                 this.setTipsCell(row,col,sheet,setting.header[col]);
             }
@@ -468,6 +472,19 @@ var sheetCommonObj = {
         };*/
         sheet.setCellType(row, col,this.getSelectButton(header.headerWidth),GC.Spread.Sheets.SheetArea.viewport);
     },
+
+    setCusButton:function (row,col,sheet,setting) {
+        let functionName = setting.header[col].callback;
+        let readOnly = setting.disable[setting.header[col].disable];
+        if(typeof(readOnly) == 'function' ){
+            readOnly = readOnly(row,col);
+        }
+        if(functionName){
+            sheet.setCellType(row, col,this.getCusButtonCellType(setting.callback[functionName],readOnly));
+        }
+        //sheet.setCellType(row, col,this.getSelectButton(header.headerWidth),GC.Spread.Sheets.SheetArea.viewport);
+    },
+
     getCusButtonCellType:function (callback,readOnly=false) {
         var ns = GC.Spread.Sheets;
         function CusButtonCellType() {
@@ -482,8 +499,10 @@ var sheetCommonObj = {
                     var imageWidth = 25;
                     var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
                     ctx.save();
-                    ctx.fillStyle = style.backColor;
-                    ctx.fillRect(x,y,w,h);
+                    if(style.backColor){
+                        ctx.fillStyle = style.backColor;
+                        ctx.fillRect(x,y,w,h);
+                    }
                     ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
                     ctx.beginPath();
                     ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
@@ -752,7 +771,139 @@ var sheetCommonObj = {
         }
         return new getTipsCombo();
     },
+    getTreeNodeCellType:function (datas,row,parentMap) {// 2018-09-26  不用spreadjs默认的树结构,自定义控件
+        var ns = GC.Spread.Sheets;
+        let rectW = 10;
+        let rectH = 10;
+        let margin = 3;
+
+        function TreeNodeCellType() {
+            this.collapsed = gljUtil.isDef(datas[row].collapsed)?datas[row].collapsed: true; //默认是折叠的
+            this. treeNodeType = true;
+            this.rectInfo = {};
+        }
+        TreeNodeCellType.prototype = new ns.CellTypes.Text();
+        TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
+            let offset = 0;
+            let step = 7;
+            let level = getTreeLevel(datas[row],datas);//从0开始,取当前节点是第几级的
+            let tem = offset+margin+ rectW/2+step;//两条线之间的间隔
+            let t_offset = offset;
+            let temParentID = datas[row].ParentID;
+            if(this.treeNodeType == true){
+                for(let i = level;i>0;i--){//这里是画子节点前面的竖线,从第二级开始
+                    let temParent = getParent(temParentID,datas);
+                    if(temParent){//父节点有下一个兄弟节点才需要画
+                        if(hasNextBrother(parentMap,temParent)) sheetCommonObj.drawLine(ctx,x+t_offset+tem*i,y,x+t_offset+tem*i,y+h);
+                        temParentID = temParent.ParentID;
+                    }
+                    offset +=tem;
+                }
+            }
+            offset+=step; //这个没法移动,所以要两个判断
+            if(this.treeNodeType == true){
+                if(hasChildern(datas[row].ID,datas)){//如果是有子节点
+                    //第一条 或者没有父节点(如费率子表综合里程项)不用画方框头上那条竖线其它都要
+                    if(row !=0 && gljUtil.isDef(datas[row].ParentID)) sheetCommonObj.drawLine(ctx,x+offset+ rectW/2+margin,y,x+offset+ rectW/2+margin,y + Math.round(h / 2) - rectH / 2);
+                    //画方框下面的那条竖线,如果没有下一个兄弟节点,则不用画
+                    if(hasNextBrother(parentMap,datas[row])) sheetCommonObj.drawLine(ctx,x+offset+ rectW/2+margin,y + Math.round(h / 2) + rectH / 2,x+offset+ rectW/2+margin,y + h);
+                    sheetCommonObj.drowRect(ctx, x+offset, y, w, h,rectW,rectH,margin);
+                    sheetCommonObj.drowSymbol(ctx, x+offset, y, w, h,rectW,rectH,margin, this.collapsed);
+                    this.rectInfo = {x:x+offset+margin,rectW:rectW}//计录一下可点击位置
+                }else {
+                    let hasNext = datas[row+1]?datas[row+1].ParentID == datas[row].ParentID:false;
+                    sheetCommonObj.drowSubItem(ctx, x, y, w, h, offset,hasNext,margin+ rectW/2);
+                }
+            }
+            offset += step;
+            offset += rectW;
+            x = x + offset;//设置偏移
+            w = w - offset;
+            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+        };
+        // override getHitInfo to allow cell type get mouse messages
+        TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
+            return {
+                x: x,
+                y: y,
+                row: context.row,
+                col: context.col,
+                cellStyle: cellStyle,
+                cellRect: cellRect,
+                sheetArea: context.sheetArea
+            };
+        }
+        TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
+            ////方框外1像素内都有效
+            if (!_.isEmpty(this.rectInfo)&&Math.floor(hitinfo.x) <= this.rectInfo.x+this.rectInfo.rectW+2 && Math.floor(hitinfo.x) >= this.rectInfo.x-2) {
+                this.collapsed = !this.collapsed;
+                datas[row].collapsed = this.collapsed;
+                this.refreshChildrenVisible(hitinfo.sheet);
+                hitinfo.sheet.invalidateLayout();
+                hitinfo.sheet.repaint();
+            }
+        };
+        TreeNodeCellType.prototype.refreshChildrenVisible = function (sheet) {
+            sheet.suspendPaint();
+            sheet.suspendEvent();
+            refreshVisible(datas[row]);
+            sheet.resumeEvent();
+            sheet.resumePaint();
+            function refreshVisible(item){
+                if(parentMap[item.ID]){
+                    for(let sub of parentMap[item.ID]){
+                        refreshVisible(sub)
+                    }
+                }
+                let visible = getVisible(item);
+                let trow = datas.indexOf(item);
+                sheet.getRange(trow , -1, 1, -1).visible(visible);
+            }
 
+            function getVisible(item) {
+                if(item.ParentID){
+                    let parent = getParent(item.ParentID,datas);
+                    if(!parent) return true;
+                    let p_row= datas.indexOf(parent);
+                    let visible = !sheet.getCellType(p_row,0).collapsed;
+                    if(visible == true){ //如果是显示的,则要再往父节点的父节点检查,只要有一个节点是隐藏的,则都是隐藏
+                        return getVisible(parent);
+                    }else {
+                        return visible
+                    }
+                }else {//如果parentID 为空则是最根节点
+                    return true;
+                }
+            }
+
+
+        };
+        return new TreeNodeCellType()
+
+        function getTreeLevel(item,data) {
+            if(item.ParentID){
+                let pitem =  _.find(data,{'ID':item.ParentID});
+                return  getTreeLevel(pitem,data) + 1;
+            }else {
+                return 0
+            }
+        }
+        function hasChildern(ID,data) {//返回是否有子项
+            let p = _.find(data,{'ParentID':ID});
+            if(p) return true;
+            return false
+        }
+        function getParent(ParentID,data) {
+            let p = _.find(data,{'ID':ParentID});
+            return p;
+        }
+        function hasNextBrother(parentMap,item){
+            let children =parentMap[item.ParentID];
+            if(!gljUtil.isDef(children)|| children.indexOf(item) == children.length -1) return false;
+            return true
+        }
+
+    },
     setDynamicCombo: function (sheet, beginRow, col, rowCount, items, itemsHeight, itemsType) {
         let me = this;
         sheet.suspendPaint();

+ 1 - 1
public/web/tree_sheet/tree_sheet_helper.js

@@ -170,7 +170,7 @@ var TREE_SHEET_HELPER = {
                         }/*else if(node.sourceType == ModuleNames.bills &&projectObj.ifItemCharHiden(setting)){//清单、并且项目特征列隐藏的时候悬浮提示  这里改成在 计量单位那里提示
                             tag = node.data.itemCharacterText?node.data.itemCharacterText:'';
                         }*/
-                        if(tag!=null&&tag!="") sheet.setTag(iRow, iCol,tag);
+                        if(tag!=null) sheet.setTag(iRow, iCol,tag);
                     }
                     /*if(colSetting.data.field=="name"){ 2018-08-06 改成在编号列悬浮提示
                         let tag = node.data.itemCharacterText?node.data.itemCharacterText:'';

+ 12 - 0
web/building_saas/main/js/models/bills.js

@@ -911,6 +911,18 @@ var Bills = {
             return data;
         };
 
+        //取需要父项汇总需要用到的子项(固定清单材料(工程设备)暂估价比较特殊,不进行父项汇总)
+        bills.prototype.getGatherNodes = function (node) {
+            let rst = [];
+            for (let child of node.source.children) {
+                if (cbTools.isFlag(child.data) && child.data.flagsIndex.fixed.flag === fixedFlag.MATERIAL_PROVISIONAL) {
+                    continue;
+                }
+                rst.push(child);
+            }
+            return rst;
+        };
+
         return new bills(project);
     }
 };

+ 95 - 336
web/building_saas/main/js/models/calc_base.js

@@ -14,7 +14,7 @@ let cbTools = {
         return this.isDef(v) && !isNaN(v) && v !== Infinity;
     },
     isFlag: function (v) {
-        return this.isDef(v) && this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed);
+        return this.isDef(v) && this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed) && this.isDef(v.flagsIndex.fixed.flag);
     },
     returnV: function (v, r) {
         if(this.isDef(v)){
@@ -163,76 +163,9 @@ let cbTools = {
                     mapObj[figureClass][figure] = baseFigures[figure];
                 }
             }
-            /*if(filter.indexOf(baseFigures[figure]['base']) === -1){
-                mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'QTXMF' && baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
-                mapObj['OTHER'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'GF' && baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
-                mapObj['CHARGE'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'SJ' && baseFigures[figure]['base'] !== 'SQGCZJ'){
-                mapObj['TAX'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'SQGCZJ'){
-                mapObj['ENGINEERINGCOST'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
-                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']);
 
     },
-    /*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);
-        mapObj['ENGINEERINGCOST'] = Object.create(null);
-        let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ', 'SQGCZJ', 'AQWMSGZXF'];
-        let needFixedBillsClass = ['FBFX', 'CXSM', 'QTXM', 'GF', 'SJ'];
-        //不需要关联节点的、但是下挂在固定清单分类下的基数
-        let noneFixedBillsFigures = ['JZMJ'];
-        //安全文明施工专项费用只有税金和工程造价能用
-        for(let figure in baseFigures){
-            if(!noneFixedBillsFigures.includes(baseFigures[figure]['base'])){
-                //过滤相关清单固定行不存在的
-                if(needFixedBillsClass.includes(baseFigures[figure]['class']) && !baseFigures[figure]['fixedBill']){
-                    continue;
-                }
-            }
-            if(filter.indexOf(baseFigures[figure]['base']) === -1){
-                mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'QTXMF' && baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
-                mapObj['OTHER'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'GF' && baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
-                mapObj['CHARGE'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'SJ' && baseFigures[figure]['base'] !== 'SQGCZJ'){
-                mapObj['TAX'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'SQGCZJ'){
-                mapObj['ENGINEERINGCOST'][figure] = baseFigures[figure];
-            }
-            if(baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
-                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;
         let parent = node.parent;
@@ -255,40 +188,6 @@ let cbTools = {
             return this.getFigure(parent);
         }
     },
-    /*getFigure: function (node) {
-        let calcBase = projectObj.project.calcBase;
-        let parent = node.parent;
-        if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
-            || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
-            return null;
-        }
-        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;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CHARGE){
-            return calcBase.baseFigureClass.CHARGE;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.TAX){
-            return calcBase.baseFigureClass.TAX;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.ENGINEERINGCOST){
-            return calcBase.baseFigureClass.ENGINEERINGCOST;
-        }
-        else {
-            if(!parent){
-                return calcBase.baseFigureClass.OTHERS;
-            }
-            else {
-                return this.getFigure(parent);
-            }
-        }
-    },*/
     getBaseBill: function (node) {
         let calcBase = projectObj.project.calcBase;
         let parent = node.parent;
@@ -346,30 +245,10 @@ let cbTools = {
                             }
                         }
                     }
-
-                    //税前工程造价算法用了分部分项、项目措施(已排除)、其他项目、规费里的底层价格,相当于引用了4条固定清单,特殊处理
-                   /* if(bases[i]['value'] === '税前工程造价'){
-                        let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
-                            other = cbTools.findBill(calcBase.fixedFlag.OTHER),
-                            charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
-                        if(subEngineering){
-                            block.push(subEngineering.ID);
-                        }
-                        if(other){
-                            block.push(other.ID);
-                        }
-                        if(charge){
-                            block.push(charge.ID);
-                        }
-                    }*/
                     else if(cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
                         block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
                     }
                 }
-               /* 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'){
                     let node = cbTools.getNodeByID(bases[i]['value']);
                     if(cbTools.isDef(node)){
@@ -446,89 +325,67 @@ let cbTools = {
         for (let node of nodes){
              if (node.data.calcBase.hasSubStr(sID)) return true;
         };
-    }
+    },
+    //获取清单节点的金额
+    //@param {Number}fixedFlag(清单固定行类别) {String}feeField(外层金额字段: common) {String}subFeeField(子金额字段: totalFee)
+    //@return {Number}
+    getBillsFee: function(fixedFlag, feeField, subFeeField) {
+        //固定清单类别与清单数据、关联基数的映射
+        let fixedBills = calcBase.fixedBills[fixedFlag];
+        if (this.isUnDef(fixedBills)) {
+            return 0;
+        }
+        let bills = fixedBills.bill;
+        if (this.isUnDef(bills)) {
+            return 0;
+        }
+        if (this.isUnDef(bills.feesIndex) || _.isEmpty(bills.feesIndex)) {
+            return 0;
+        }
+        return this.isDef(bills.feesIndex[feeField]) && this.isDef(bills.feesIndex[feeField][subFeeField]) ? bills.feesIndex[feeField][subFeeField] : 0;
+    },
 };
 
 let baseFigureTemplate = {
     'FBFXGCF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXDEJJRGF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.labour) && cbTools.isDef(bill.feesIndex.labour[totalFeeType]) ? bill.feesIndex.labour[totalFeeType] : 0;
+        let feeField = 'labour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXDEJJCLF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.material) && cbTools.isDef(bill.feesIndex.material[totalFeeType]) ? bill.feesIndex.material[totalFeeType] : 0;
+        let feeField = 'material',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXDEJJJXF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.machine) && cbTools.isDef(bill.feesIndex.machine[totalFeeType]) ? bill.feesIndex.machine[totalFeeType] : 0;
+        let feeField = 'machine',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXTZRGF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.adjustLabour) && cbTools.isDef(bill.feesIndex.adjustLabour[totalFeeType]) ? bill.feesIndex.adjustLabour[totalFeeType] : 0;
+        let feeField = 'adjustLabour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXTZJSRGF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.adjustMachineLabour) && cbTools.isDef(bill.feesIndex.adjustMachineLabour[totalFeeType]) ? bill.feesIndex.adjustMachineLabour[totalFeeType] : 0;
+        let feeField = 'adjustMachineLabour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXZCF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.mainMaterial) && cbTools.isDef(bill.feesIndex.mainMaterial[totalFeeType]) ? bill.feesIndex.mainMaterial[totalFeeType] : 0;
+        let feeField = 'mainMaterial',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXSBF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['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.equipment) && cbTools.isDef(bill.feesIndex.equipment[totalFeeType]) ? bill.feesIndex.equipment[totalFeeType] : 0;
+        let feeField = 'equipment',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     },
     'FBFXWJJCLF': function (tender) {
         return (this['FBFXZCF'](tender) + this['FBFXSBF'](tender)).toDecimal(decimalObj.bills.totalPrice);
@@ -551,137 +408,72 @@ let baseFigureTemplate = {
         return (this['FBFXDEJJRGF'](tender) + this['FBFXDEJJCLF'](tender) + this['FBFXDEJJJXF'](tender)).toDecimal(decimalObj.bills.totalPrice);
     },
     'CSXMF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.MEASURE])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.MEASURE]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.MEASURE, feeField, subFeeField);
     },
     'ZZCSXMF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_ORGANIZATION, feeField, subFeeField);
     },
     'ZZCSXMDEJJZJGCF': function (tender) {
         return (this['ZZCSXMDEJJRGF'](tender) + this['ZZCSXMDEJJCLF'](tender) + this['ZZCSXMDEJJJXF'](tender)).toDecimal(decimalObj.bills.totalPrice);
     },
     'ZZCSXMDEJJRGF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['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.labour) && cbTools.isDef(bill.feesIndex.labour[totalFeeType]) ? bill.feesIndex.labour[totalFeeType] : 0;
+        let feeField = 'labour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_ORGANIZATION, feeField, subFeeField);
     },
     'ZZCSXMDEJJCLF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['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.material) && cbTools.isDef(bill.feesIndex.material[totalFeeType]) ? bill.feesIndex.material[totalFeeType] : 0;
+        let feeField = 'material',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_ORGANIZATION, feeField, subFeeField);
     },
     'ZZCSXMDEJJJXF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['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.machine) && cbTools.isDef(bill.feesIndex.machine[totalFeeType]) ? bill.feesIndex.machine[totalFeeType] : 0;
+        let feeField = 'machine',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_ORGANIZATION, feeField, subFeeField);
     },
     'JSCSXMF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMDEJJRGF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.labour) && cbTools.isDef(bill.feesIndex.labour[totalFeeType]) ? bill.feesIndex.labour[totalFeeType] : 0;
+        let feeField = 'labour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMDEJJCLF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.material) && cbTools.isDef(bill.feesIndex.material[totalFeeType]) ? bill.feesIndex.material[totalFeeType] : 0;
+        let feeField = 'material',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMDEJJJXF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.machine) && cbTools.isDef(bill.feesIndex.machine[totalFeeType]) ? bill.feesIndex.machine[totalFeeType] : 0;
+        let feeField = 'machine',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMTZRGF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.adjustLabour) && cbTools.isDef(bill.feesIndex.adjustLabour[totalFeeType]) ? bill.feesIndex.adjustLabour[totalFeeType] : 0;
+        let feeField = 'adjustLabour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMTZJSRGF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.adjustMachineLabour) && cbTools.isDef(bill.feesIndex.adjustMachineLabour[totalFeeType]) ? bill.feesIndex.adjustMachineLabour[totalFeeType] : 0;
+        let feeField = 'adjustMachineLabour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMZCF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.mainMaterial) && cbTools.isDef(bill.feesIndex.mainMaterial[totalFeeType]) ? bill.feesIndex.mainMaterial[totalFeeType] : 0;
+        let feeField = 'mainMaterial',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMSBF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['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.equipment) && cbTools.isDef(bill.feesIndex.equipment[totalFeeType]) ? bill.feesIndex.equipment[totalFeeType] : 0;
+        let feeField = 'equipment',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     },
     'JSCSXMWJJCLF': function (tender) {
         return (this['JSCSXMZCF'](tender) + this['JSCSXMSBF'](tender)).toDecimal(decimalObj.bills.totalPrice);
@@ -703,44 +495,24 @@ let baseFigureTemplate = {
         return (this['JSCSXMDEJJRGF'](tender) + this['JSCSXMDEJJCLF'](tender) + this['JSCSXMDEJJJXF'](tender)).toDecimal(decimalObj.bills.totalPrice);
     },
     'QTXMF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.OTHER])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.OTHER]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.OTHER, feeField, subFeeField);
     },
     'GF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.CHARGE])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CHARGE]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CHARGE, feeField, subFeeField);
     },
     'SJ': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.TAX])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.TAX]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.TAX, feeField, subFeeField);
     },
     'AQWMSGZXF': function (tender) {
-        if(cbTools.isUnDef(calcBase.fixedBills[calcBase.fixedFlag.SAFETY_CONSTRUCTION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SAFETY_CONSTRUCTION]['bill'];
-        if(cbTools.isUnDef(bill) || cbTools.isUnDef(bill.ID)) 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[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SAFETY_CONSTRUCTION, feeField, subFeeField);
     },
     'JZMJ': function () {
         let buildingArea = projFeatureView.getFeature('buildingArea');
@@ -1059,16 +831,6 @@ let baseFigureTemplate = {
         return rst;
     },
     'JDZCF': function (tender) {//甲定主材费
-       /* const quantityType = tender ? 'tenderQuantity' : 'quantity';
-        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 || glj.supply === supplyText.JDYG)){
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
-                rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
-            }
-        }
-        return rst;*/
         const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
@@ -1099,9 +861,6 @@ let baseFigureTemplate = {
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return cbTools.isDef(bill.feesIndex.estimate) && cbTools.isDef(bill.feesIndex.estimate[totalFeeType]) ? bill.feesIndex.estimate[totalFeeType] : 0;
     },
-   /* 'ZGCLFFGLJ': function () {//暂估材料费(从工料机汇总表汇总)
-        return 0;
-    },*/
     'FBF': function (tender) {//分包费
         const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
         let rst = 0;

+ 3 - 1
web/building_saas/main/js/models/calc_program.js

@@ -1714,8 +1714,10 @@ class CalcProgram {
             if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){
                 calcTools.getGLJList(treeNode, true);
                 nodes = me.project.Ration.getRationNodes(treeNode);
+            } else { //固定清单材料(工程设备)暂估价比较特殊,不进行父项汇总(需求)
+                nodes = me.project.Bills.getGatherNodes(treeNode);
             }
-            else nodes = treeNode.children;
+            //else nodes = treeNode.children;
 
             let rst = [];
             for (let ft of cpFeeTypes) {

+ 6 - 0
web/building_saas/main/js/models/fee_rate.js

@@ -316,6 +316,12 @@ var FeeRate = {
                     me.datas.libID=data.libID;
                     me.datas.libName=data.libName;
                     me.datas.feeRateID=data.feeRateID;
+                    if(newVal==feeRate.libID){//如果是本身,则是恢复标准值,设置回旧的树节点折叠属性
+                        let oldRates =  me.datas.rates;
+                        for(let i =0;i< oldRates.length;i++){
+                            data.rates[i].collapsed = oldRates[i].collapsed;
+                        }
+                    }
                     me.datas.rates=data.rates;
                     projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),feeRateID:me.getActivateFeeRateFileID()},'feeRate');
                     me.onFeeRateFileChange();

+ 10 - 3
web/building_saas/main/js/models/ration.js

@@ -108,6 +108,13 @@ var Ration = {
             });
             controller.sheet.getCell(selected[0].row,col).value(data[fieldName]);
         };
+        ration.prototype.getContain = function (billNode,quantity) {
+            if(billNode && billNode.data.quantity&&billNode.data.quantity!=0&&billNode.data.quantity!=""){
+                let billQuantity = scMathUtil.roundForObj(billNode.data.quantity,getDecimal("quantity",billNode));
+                return scMathUtil.roundForObj(parseFloat(quantity)/billQuantity,getDecimal("process"));
+            }
+            return 0
+        };
         ration.prototype.getTempRationData = function (id, billsID, serialNo, rType,priceType) {
             let newData = {'ID': id, 'serialNo': serialNo, projectID: this.project.ID()};
             let pEngineer = projectInfoObj.projectInfo.property.projectEngineering;//量价默认使用后台设置的单位工程取费专业
@@ -378,7 +385,7 @@ var Ration = {
                 ration.contain = scMathUtil.roundForObj(ration.quantity/billsQuantity,process_decimal);
             }
         };
-        ration.prototype.updateRationCodes = function (recodes) {
+        ration.prototype.updateRationCodes = function (recodes,cleanzmhs = false) {
             let libID =  rationLibObj.getCurrentStdRationLibID();
             let libIDs = rationLibObj.getStdRationLibIDs();
             let defaultLibID = rationLibObj.getDefaultStdRationLibID();
@@ -397,14 +404,14 @@ var Ration = {
                     needInstall = project.Bills.isFBFX(r.node);
                 }
                 r.value===null||r.value===undefined?"":r.value = r.value.replace(/[\s\r\n]/g, "");//去掉空格回车换行等字符
-                if(r.value != r.node.data.code){
+                if(cleanzmhs  == true||r.value != r.node.data.code){
                     nodeInfo.push({ID:r.node.data.ID,billsItemID:r.node.data.billsItemID,newCode:r.value,needInstall:needInstall});
                     refershNodes.push(r.node);
                 }
             }
             let calQuantity = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
             $.bootstrapLoading.start();
-            CommonAjax.post("/ration/replaceRations",{nodeInfo:nodeInfo,libIDs:libIDs,defaultLibID: defaultLibID,projectID:projectID,calQuantity:calQuantity},function (data) {
+            CommonAjax.post("/ration/replaceRations",{nodeInfo:nodeInfo,libIDs:libIDs,defaultLibID: defaultLibID,projectID:projectID,calQuantity:calQuantity,cleanzmhs:cleanzmhs},function (data) {
                 for(let recode of data){
                    let node =  mainTree.getNodeByID(recode.ration.ID);
                    if(node) {

+ 7 - 1
web/building_saas/main/js/views/billsElf.js

@@ -742,14 +742,20 @@ const BillsElf = (function() {
     function bindListener(){
         //插入定额
         $('#elfInsertRation').click(function () {
+            if (!projectObj.project.Ration.canAdd(projectObj.project.mainTree.selected)) {
+                return;
+            }
             let addRationDatas =  getInsertElfRationData();
             insertRations(addRationDatas);
         });
         //插入单条
         $('#elfInsertSingle').click(function () {
+            if (!projectObj.project.Ration.canAdd(projectObj.project.mainTree.selected)) {
+                return;
+            }
             let addRationDatas = getInsertElfSingleRation();
             insertRations(addRationDatas);
-        })
+        });
     }
     return {buildSheet, refreshWorkBook, billsSelElf, setColumnWidthByRate, bindListener};
 })();

+ 12 - 85
web/building_saas/main/js/views/calc_base_view.js

@@ -140,8 +140,7 @@ let calcBaseView = {
     ifEdit: function (type, row) {
         if (type == 'ration'){
             return true;
-        }
-        else{
+        } else{
             let selected = projectObj.project.mainTree.items[row];
             return selected && MainTreeCol.readOnly.forCalcBase(selected)?false:true;
         }
@@ -347,90 +346,18 @@ let calcBaseView = {
             }
         });
     },
-
-    getCalcBaseCellType:function (type) {
-        var ns = GC.Spread.Sheets;
-        function CalcBaseCellType() {
-            var init=false;
+    onCalcBaseButtonClick:function (hitinfo,type='bills') {
+        let me = calcBaseView;
+        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
+        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
+            let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
+            projectObj.mainController.setTreeSelected(node);
         }
-        CalcBaseCellType.prototype = new ns.CellTypes.Text();
-        CalcBaseCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            if(!projectReadOnly && calcBaseView.ifEdit(type, options.row)){
-                if(options.sheet.getActiveRowIndex()==options.row&&options.sheet.getActiveColumnIndex()==options.col){
-                    var image = document.getElementById('f_btn'),imageMagin = 3;
-                    var imageHeight = 15;
-                    var imageWidth = 25;
-                    var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
-                    ctx.save();
-                    ctx.fillStyle = style.backColor;
-                    ctx.fillRect(x,y,w,h);
-                    ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
-                    ctx.beginPath();
-                    ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.fillStyle="black";//填充颜色,默认是黑色
-                    ctx.fill();//画实心圆
-                    ctx.closePath();
-                    ctx.restore();
-                    w = w - imageWidth - imageMagin;
-                }
-            }
-            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
-        };
-        CalcBaseCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
-            return {
-                x: x,
-                y: y,
-                row: context.row,
-                col: context.col,
-                cellStyle: cellStyle,
-                cellRect: cellRect,
-                sheetArea: context.sheetArea
-            };
-        };
-        CalcBaseCellType.prototype.processMouseDown = function (hitinfo) {
-            let me = calcBaseView;
-            if(hitinfo.sheet.getActiveRowIndex()==hitinfo.row&&hitinfo.sheet.getActiveColumnIndex()==hitinfo.col){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageWidth = 25;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
-                        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            projectObj.mainController.setTreeSelected(node);
-                        }
-                        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
-                        calcBaseView.confirmBtn.attr('toggle', 'calcBase');
-                        changeCalcBaseFeeRate('calcBase');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                    }
-                }
-            }
-        };
-        CalcBaseCellType.prototype.processMouseDown = function (hitinfo) {
-            let me = calcBaseView;
-            if(hitinfo.sheet.getActiveRowIndex()==hitinfo.row&&hitinfo.sheet.getActiveColumnIndex()==hitinfo.col){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageWidth = 25;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
-                        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
-                            projectObj.mainController.setTreeSelected(node);
-                        }
-                        calcBaseView.confirmBtn.attr('toggle', 'calcBase');
-                        changeCalcBaseFeeRate('calcBase');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                    }
-                }
-            }
-        };
-        return new CalcBaseCellType();
-    },
+        calcBaseView.confirmBtn.attr('toggle', 'calcBase');
+        changeCalcBaseFeeRate('calcBase');
+        $('#tabCalcBase').tab('show');
+        calcBaseView.initCalctor(type);
+    }
 };
 
 $(document).ready(function () {

+ 12 - 2
web/building_saas/main/js/views/calc_program_manage.js

@@ -25,7 +25,7 @@ let calcProgramManage = {
             // {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
             {headerName:"费用代号",headerWidth:CP_Col_Width.code, dataCode:"code", dataType: "String"},
             {headerName:"费用名称",headerWidth:CP_Col_Width.name, dataCode:"name", dataType: "String"},
-            {headerName:"计算基数",headerWidth:CP_Col_Width.dispExprUser, dataCode:"dispExprUser", dataType: "String"},
+            {headerName:"计算基数",headerWidth:CP_Col_Width.dispExprUser, dataCode:"dispExprUser", dataType: "String",cellType:'cusButton',callback:'calcBase',disable:'calcBase'},
             {headerName:"费率",headerWidth:CP_Col_Width.feeRate, dataCode:"feeRate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
             {headerName:"费用类别",headerWidth:CP_Col_Width.displayFieldName, dataCode:"displayFieldName", dataType: "String", hAlign: "center"},
             {headerName:"基数说明",headerWidth:CP_Col_Width.statement, dataCode:"statement", dataType: "String"},
@@ -36,6 +36,17 @@ let calcProgramManage = {
             lockColumns:[2,5],
             colHeaderHeight: CP_Col_Width.colHeader,
             rowHeaderWidth: CP_Col_Width.rowHeader
+        },
+        //callback 和disable都是和 cusButton配套使用的
+        callback:{
+            calcBase:function (hitinfo) {
+                calcBaseView.onCalcBaseButtonClick(hitinfo,'ration');
+            }
+        },
+        disable:{
+            calcBase:function (row,col) {
+                return projectReadOnly || !calcBaseView.ifEdit('ration', row)
+            }
         }
     },
 
@@ -71,7 +82,6 @@ let calcProgramManage = {
 
         me.detailSheet.name('calc_detail');
         feeRateObject.setFeeRateCellCol(me.detailSheet, _.findIndex(me.detailSetting.header,{'dataCode':'feeRate'}));
-        me.detailSheet.getRange(-1, _.findIndex(me.detailSetting.header, {'dataCode': 'dispExprUser'}), -1, 1).cellType(calcBaseView.getCalcBaseCellType('ration'));
         sheetCommonObj.showData(me.detailSheet, me.detailSetting, me.datas[0].calcItems);
         me.getfeeRateColor(me.datas[0].calcItems);
         customRowHeader(me.detailSheet, me.datas[0].calcItems.length);

+ 16 - 3
web/building_saas/main/js/views/fee_rate_view.js

@@ -170,16 +170,27 @@ var feeRateObject={
                 }
                 sheet.setValue(row, col, val, ch);
                 if(col==0){
-                    let treeType = feeRateObject.getTreeNodeCellType(data,row,parentMap);
+                    let treeType = sheetCommonObj.getTreeNodeCellType(data,row,parentMap);
                     sheet.getCell(row, 0).cellType(treeType);
                     visibleMap[data[row].ID] = treeType.collapsed;
-                    if(visibleMap[data[row].ParentID] ) sheet.getRange(row , -1, 1, -1).visible(false);//显示或隐藏
+                    feeRateObject.setRowVisible(data,row,visibleMap,sheet);
                 }
             }
         }
         sheet.resumeEvent();
         sheet.resumePaint();
     },
+    setRowVisible:function (data,row,visibleMap,sheet) {
+        sheet.getRange(row , -1, 1, -1).visible(getVisible(data[row].ParentID));//显示或隐藏
+        function getVisible(ParentID) {
+            if(visibleMap[ParentID]) return false //如果父节点是缩起的,那就隐藏本身。
+            if(visibleMap[ParentID] == false){//如果父节点不是缩起的,要再往父节点找看
+                let pnode = _.find(data,{'ID':ParentID});
+                if(pnode) return getVisible(pnode.ParentID);//如果有父节点,递归调用
+                return true;//没有,返回显示
+            }
+        }
+    },
     getFeeRateLevel:function (rate,data) {
         if(rate.ParentID){
          let prate =  _.find(data,{'ID':rate.ParentID});
@@ -1023,7 +1034,9 @@ $(function(){
     $('#changeConfirm').bind('click', function (){
         var newVal=$('#standardSelect').val();
         var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
-        if(newVal&&newVal!=feeRateFile.libID)  feeRateObject.changeFeeRateStandard(newVal);
+        feeRateObject.changeFeeRateStandard(newVal);
+        //这里改成不判断了,只是点击确定了就重选
+        //if(newVal&&newVal!=feeRateFile.libID)  feeRateObject.changeFeeRateStandard(newVal);
     });
 
     $('#saveAs').bind('click', function (){

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

@@ -54,7 +54,7 @@ let gljCol = {
             {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
         ],
         view: {
-            lockColumns: [0,1,2,3,4,6,8]
+            lockColumns: ["code","name","specs","unit","short_name","adjustPrice","quantity"]
         },
         frozenCols:4
     },

+ 6 - 4
web/building_saas/main/js/views/main_tree_col.js

@@ -294,8 +294,9 @@ let MainTreeCol = {
               return  quantityEditObj.getQuantityEditCellType();
             }
         },
-        calcBase: function () {
-            return calcBaseView.getCalcBaseCellType('bills');
+        calcBase: function (node) {
+            let readOnly = projectReadOnly || !calcBaseView.ifEdit('bills', projectObj.project.mainTree.items.indexOf(node));
+            return sheetCommonObj.getCusButtonCellType(calcBaseView.onCalcBaseButtonClick,readOnly)
         },
 
         // CSL, 2017-11-28
@@ -350,8 +351,9 @@ let MainTreeCol = {
             }
 
         },
-        commonTotalFee: function () {
-            return projectObj.getCommonTotalFeeCellType();
+        commonTotalFee: function (node) {
+            let readOnly = projectReadOnly || !calcBaseView.ifEdit('bills', projectObj.project.mainTree.items.indexOf(node));
+            return sheetCommonObj.getCusButtonCellType(projectObj.onCommonTotalFeeButtonClick,readOnly) //projectObj.getCommonTotalFeeCellType();
         }
     },
     editChecking:function(node){

+ 12 - 7
web/building_saas/main/js/views/mbzm_view.js

@@ -146,7 +146,7 @@ let mbzm_obj={
         let selected = projectObj.project.mainTree.selected;
         let template = projectObj.project.ration_template.getTemplateByRationID(selected.data.ID);
         let createLocation = $("#createLocation").val();
-        let rations = {update:[],create:[]},bills={update:[],create:[]};
+        let rations = {update:[],create:[],delete:[]},bills={update:[],create:[]};
         if(this.datas.length <= 0) return;
         for(let d of this.datas){
             if((gljUtil.isDef(d.quantity)&& parseFloat(d.quantity)>0)||(d.coe && d.coe!="0")){
@@ -231,7 +231,7 @@ let mbzm_obj={
         let mainRation = projectObj.project.mainTree.getNodeByID(referenceRationID);
         let billsID="";
         //先检查要更新的定额是否已经存在
-        let ration = this.getExistRation(data,referenceRationID,type);
+        let ration = this.getExistRation(data,referenceRationID,type,rations);
         if(ration) {//如果存在,则比较清耗量、工程量表达式是否一致
             let tem =  this.getRationData(ration,data,quantity);//取更新信息
 
@@ -244,8 +244,7 @@ let mbzm_obj={
         //定额不存在的情况下
         if(type == mbzm_obj.locateMap.AFTERRATION) {//如果是生成在主定额后面的位置
             this.createNewRationAfterMain(data,mainRation,quantity,rations);
-        }
-        if(type == mbzm_obj.locateMap.INMEASURE){//生成在措施项目下
+        }else if(type == mbzm_obj.locateMap.INMEASURE){//生成在措施项目下
             this.createNewRationInMeasure(data,mainRation,quantity,rations,bills);
         }else {
             this.createNewRationInFBFX(data,mainRation,quantity,rations,bills);
@@ -261,6 +260,7 @@ let mbzm_obj={
         if(!_.isEmpty(tem)) {
             tem.projectID = ration.projectID;
             tem.ID = ration.ID;
+            tem.contain = projectObj.project.Ration.getContain(projectObj.project.mainTree.findNode(ration.billsItemID),tem.quantity);
             return tem;
         }
         return null;
@@ -407,6 +407,8 @@ let mbzm_obj={
         newData.referenceRationID = referenceRationID;
         newData.quantity = quantity;
         newData.quantityEXP = gljUtil.isDef(data.coe) && data.coe != "0"?"MBGCL":quantity+"";
+        //这里还要生成根据清单生成含量,父清单如果是刚自动生成的,其工程量为0,含量也为0
+        newData.contain = projectObj.project.Ration.getContain(projectObj.project.mainTree.findNode(billsID),quantity);
         let temRation = this.getDefaultRationCreateData(newData,data.code,libID,isFBFX);
         return temRation;
     },
@@ -436,7 +438,7 @@ let mbzm_obj={
         }
         return quantity;
     },
-    getExistRation:function (data,referenceRationID,type) {
+    getExistRation:function (data,referenceRationID,type,updateRations) {
         let temRation = null;
         //先检查要更新的定额是否已经存在
         let rations =_.filter(projectObj.project.Ration.datas,{'referenceRationID':referenceRationID,'code':data.code});
@@ -470,6 +472,8 @@ let mbzm_obj={
                     }
                 }
             }
+            //如果没有执行到break,则说明这条定额是要被删除的
+            updateRations.delete.push({projectID:r.projectID,ID:r.ID});
         }
         return temRation;
     },
@@ -523,12 +527,13 @@ let mbzm_obj={
                         let t_times = parseInt(rnode.data.unit);
                         t_times = isNaN(t_times)?1:t_times;//工程量要乘以定额单位的倍数
                         rnode.data.quantity = scMathUtil.roundForObj(t_quantity/t_times,getDecimal('ration.quantity'));
-                        if(rnode.parent.data.quantity&&rnode.parent.data.quantity!=0&&rnode.parent.data.quantity!=""){
+                        rnode.data.contain = projectObj.project.Ration.getContain(rnode.parent,rnode.data.quantity);
+                       /* if(rnode.parent.data.quantity&&rnode.parent.data.quantity!=0&&rnode.parent.data.quantity!=""){
                             var billQuantity = scMathUtil.roundForObj(rnode.parent.data.quantity,getDecimal("quantity",node.parent));
                             rnode.data.contain = scMathUtil.roundForObj(rnode.data.quantity/billQuantity,getDecimal("process"));
                         }else {
                             rnode.data.contain=0;
-                        }
+                        }*/
                         rnode.change = true;
                         rationNodes.push(rnode)
                     }

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

@@ -333,11 +333,13 @@ var projectObj = {
                                 data.unit = existB.unit;
                                 project.Bills.replaceBills(node.source, data, formatCode);
                                 projectObj.mainController.refreshTreeNode([node], false);
+                                BillsElf.billsSelElf(node.data.code);
                             } else {
                                 ConfirmModal.stdBillsUnit.check(data, function (std) {
                                     updateBeforeInsert(node, data);
                                     project.Bills.replaceBills(node.source, std, formatCode);
                                     projectObj.mainController.refreshTreeNode([node], false);
+                                    BillsElf.billsSelElf(node.data.code);
                                 }, function () {
                                     projectObj.mainController.refreshTreeNode([node], false);
                                 });
@@ -346,6 +348,7 @@ var projectObj = {
                             updateBeforeInsert(node, data);
                             project.Bills.replaceBills(node.source, data, formatCode);
                             projectObj.mainController.refreshTreeNode([node], false);
+                            BillsElf.billsSelElf(node.data.code);
                         }
                     } else {
                         normalUpdate(node,value);
@@ -512,12 +515,14 @@ var projectObj = {
                     }
                     node.data.userCalcBase = value;
                     project.calcBase.calculate(node);
+
                     if(!project.calcBase.success){
                         let activeCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
                         projectObj.mainController.refreshTreeNode([node]);
                         return;
+                    } else if (value === '') {//删除清单基数,单价要清空
+                        calcTools.setFieldValue(node, 'feesIndex.common.unitFee', 0);
                     }
-                    // if (value) {value = parseFloat(value).toDecimal(decimalObj.decimal("totalPrice", node))};
                 };
                 //计算基数赋值要经过解析和标准化,已在calculate里赋值
                 if(fieldName !== 'calcBase'){
@@ -1425,6 +1430,21 @@ var projectObj = {
                         return projectObj.project.isInstall();
                     }
                 },
+                "cleanzmhs":{
+                    name:'清空子目换算',
+                    icon: 'fa-remove',
+                    callback: function (key, opt) {
+                        let selected = project.mainTree.selected;
+                        projectObj.project.Ration.updateRationCodes([{'node':selected, value:selected.data.code}],true);
+                    },
+                    visible: function(key, opt){
+                        let selected = project.mainTree.selected;
+                        if (selected && selected.sourceType == ModuleNames.ration) {
+                            return true;
+                        }
+                        return false;
+                    }
+                },
                 "delete": {
                     name: '删除',
                     icon: 'fa-remove',
@@ -1926,71 +1946,18 @@ var projectObj = {
         }
         return !this.itemCol.visible;
     },
-    //综合合价cellType
-    getCommonTotalFeeCellType:function () {
-        let type = 'bills';
-        var ns = GC.Spread.Sheets;
-        function CommonTotalFeeCellType() {
-            var init=false;
-        }
-        CommonTotalFeeCellType.prototype = new ns.CellTypes.Text();
-        CommonTotalFeeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            if(!projectReadOnly && calcBaseView.ifEdit(type, options.row)){
-                if(options.sheet.getActiveRowIndex()==options.row&&options.sheet.getActiveColumnIndex()==options.col){
-                    var image = document.getElementById('f_btn'),imageMagin = 3;
-                    var imageHeight = 15;
-                    var imageWidth = 25;
-                    var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
-                    ctx.save();
-                    ctx.fillStyle = style.backColor;
-                    ctx.fillRect(x,y,w,h);
-                    ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
-                    ctx.beginPath();
-                    ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.fillStyle="black";//填充颜色,默认是黑色
-                    ctx.fill();//画实心圆
-                    ctx.closePath();
-                    ctx.restore();
-                    w = w - imageWidth - imageMagin;
-                }
-            }
-            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
-        };
-        CommonTotalFeeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
-            return {
-                x: x,
-                y: y,
-                row: context.row,
-                col: context.col,
-                cellStyle: cellStyle,
-                cellRect: cellRect,
-                sheetArea: context.sheetArea
-            };
-        };
-        CommonTotalFeeCellType.prototype.processMouseDown = function (hitinfo) {
-            let me = calcBaseView;
-            if(hitinfo.sheet.getActiveRowIndex()==hitinfo.row&&hitinfo.sheet.getActiveColumnIndex()==hitinfo.col){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageWidth = 25;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
-                            projectObj.mainController.setTreeSelected(node);
-                        }
-                        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
-                        calcBaseView.confirmBtn.attr('toggle', 'commonTotalFee');
-                        changeCalcBaseFeeRate('commonTotalFee');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                        feeRateObject.showSelectModal(hitinfo);
-                    }
-                }
-            }
-        };
-        return new CommonTotalFeeCellType();
+    onCommonTotalFeeButtonClick:function(hitinfo) {
+        let me = calcBaseView;
+        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
+            let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
+            projectObj.mainController.setTreeSelected(node);
+        }
+        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
+        calcBaseView.confirmBtn.attr('toggle', 'commonTotalFee');
+        changeCalcBaseFeeRate('commonTotalFee');
+        $('#tabCalcBase').tab('show');
+        calcBaseView.initCalctor('bills');
+        feeRateObject.showSelectModal(hitinfo);
     },
     selectColAndFocus :function (newNode,field = 'code') {//选中单元格并设置焦点
         if(newNode){
@@ -3255,6 +3222,10 @@ $('#calcBaseFeeRateConf').click(function () {
             $('#calcBaseFeeRate').modal('hide');
         }
     }
+    //删除清单基数,要清空单价
+    if (projectObj.project.calcBase.success && calcBaseValue === '') {
+        calcTools.setFieldValue(selected, 'feesIndex.common.unitFee', 0);
+    }
     if(!projectObj.project.calcBase.success && cusFeeRate==false){
         return;
     } else if((!validateFeeRate || selected.data.feeRateID === parseInt(feeRateObject.feeRateSelection.ID)) && needToSave) {

+ 3 - 3
web/building_saas/main/js/views/std_ration_lib.js

@@ -247,7 +247,7 @@ var rationLibObj = {
     },
     onRationSpreadCellDoubleClick: function (sender, args) {
         var select = $('#stdRationLibSelect'), rationCode = args.sheet.getText(args.row, 0);
-        if (rationCode !== '') {
+        if (rationCode !== '' && projectObj.project.Ration.canAdd(projectObj.project.mainTree.selected)) {
             let query = {userID: userID, rationRepId: select.val(), code: rationCode};
             //搜索结果全部定额中双击添加定额、有可能同名不同库,更新查询的库ID
             if (rationLibObj.resultCache && rationLibObj.resultCache[args.row]) {
@@ -284,7 +284,7 @@ var rationLibObj = {
                     name: "插入定额",
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        return projectReadOnly;
+                        return projectReadOnly || !projectObj.project.Ration.canAdd(projectObj.project.mainTree.selected);
                     },
                     callback: function (key, opt) {
                         let select = $('#stdRationLibSelect'), rationSelect = rationSheet.getSelections();
@@ -299,7 +299,7 @@ var rationLibObj = {
                     name: "替换定额",
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        return projectReadOnly
+                        return projectReadOnly || !projectObj.project.Ration.canAdd(projectObj.project.mainTree.selected);
                     },
                     callback: function (key, opt) {
                         let select = $('#stdRationLibSelect'), rationSelect = rationSheet.getSelections();

+ 3 - 8
web/over_write/js/chongqing_2018.js

@@ -272,14 +272,9 @@ if(typeof baseFigureMap !== 'undefined'){
 }
 if(typeof baseFigureTemplate !== 'undefined'){
     baseFigureTemplate['ZZS'] =  function (tender) {//增值税
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.ADDED_VALUE_TAX])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.ADDED_VALUE_TAX]['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.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+        let feeField = 'common',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.ADDED_VALUE_TAX, feeField, subFeeField);
     };
 }
 if(typeof figureClassTemplate !== 'undefined'){

+ 27 - 93
web/over_write/js/jiangxi_2017.js

@@ -212,105 +212,50 @@ if(typeof baseFigureMap !== 'undefined'){
     };
 }
 if(typeof baseFigureTemplate !== 'undefined'){
-    /*baseFigureTemplate['FBFXZJF'] =  function (tender) {//分部分项直接费
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['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.direct) && cbTools.isDef(bill.feesIndex.direct[totalFeeType]) ? bill.feesIndex.direct[totalFeeType] : 0;
-    };*/
     baseFigureTemplate['FBFXRGF'] =  function (tender) {//分部分项人工费(市场人工费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['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.marketLabour) && cbTools.isDef(bill.feesIndex.marketLabour[totalFeeType]) ? bill.feesIndex.marketLabour[totalFeeType] : 0;
+        let feeField = 'marketLabour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     };
     baseFigureTemplate['FBFXCLF'] =  function (tender) {//分部分项材料费(市场材料费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['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.marketMaterial) && cbTools.isDef(bill.feesIndex.marketMaterial[totalFeeType]) ? bill.feesIndex.marketMaterial[totalFeeType] : 0;
+        let feeField = 'marketMaterial',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     };
     baseFigureTemplate['FBFXJXF'] =  function (tender) {//分部分项机械费(市场机械费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.SUB_ENGINERRING])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.SUB_ENGINERRING]['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.marketMachine) && cbTools.isDef(bill.feesIndex.marketMachine[totalFeeType]) ? bill.feesIndex.marketMachine[totalFeeType] : 0;
+        let feeField = 'marketMachine',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.SUB_ENGINERRING, feeField, subFeeField);
     };
     baseFigureTemplate['ZZCSXMRGF'] =  function (tender) {//组织措施项目人工费(市场人工费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION]['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.marketLabour) && cbTools.isDef(bill.feesIndex.marketLabour[totalFeeType]) ? bill.feesIndex.marketLabour[totalFeeType] : 0;
+        let feeField = 'marketLabour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_ORGANIZATION, feeField, subFeeField);
     };
     baseFigureTemplate['ZZCSXMCLF'] =  function (tender) {//组织措施项目材料费(市场材料费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION]['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.marketMaterial) && cbTools.isDef(bill.feesIndex.marketMaterial[totalFeeType]) ? bill.feesIndex.marketMaterial[totalFeeType] : 0;
+        let feeField = 'marketMaterial',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_ORGANIZATION, feeField, subFeeField);
     };
     baseFigureTemplate['ZZCSXMJXF'] =  function (tender) {//组织措施项目机械费(市场机械费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_ORGANIZATION]['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.marketMachine) && cbTools.isDef(bill.feesIndex.marketMachine[totalFeeType]) ? bill.feesIndex.marketMachine[totalFeeType] : 0;
+        let feeField = 'marketMachine',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_ORGANIZATION, feeField, subFeeField);
     };
     baseFigureTemplate['JSCSXMRGF'] =  function (tender) {//技术措施项目人工费(市场人工费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH]['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.marketLabour) && cbTools.isDef(bill.feesIndex.marketLabour[totalFeeType]) ? bill.feesIndex.marketLabour[totalFeeType] : 0;
+        let feeField = 'marketLabour',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     };
     baseFigureTemplate['JSCSXMCLF'] =  function (tender) {//技术措施项目材料费(市场材料费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH]['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.marketMaterial) && cbTools.isDef(bill.feesIndex.marketMaterial[totalFeeType]) ? bill.feesIndex.marketMaterial[totalFeeType] : 0;
+        let feeField = 'marketMaterial',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     };
     baseFigureTemplate['JSCSXMJXF'] =  function (tender) {//技术措施项目机械费(市场机械费)
-        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH])){
-            return 0;
-        }
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let bill = calcBase.fixedBills[fixedFlag.CONSTRUCTION_TECH]['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.marketMachine) && cbTools.isDef(bill.feesIndex.marketMachine[totalFeeType]) ? bill.feesIndex.marketMachine[totalFeeType] : 0;
+        let feeField = 'marketMachine',
+            subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
+        return cbTools.getBillsFee(fixedFlag.CONSTRUCTION_TECH, feeField, subFeeField);
     };
     baseFigureTemplate['FBRGF'] =  function (tender) {//分包人工费(市场人工费)
         const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
@@ -367,17 +312,6 @@ if(typeof baseFigureTemplate !== 'undefined'){
         }
         return rst;
     };
-    /*baseFigureTemplate['GJXMZJF'] =  function (tender) {//估计项目直接费
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        let rst = 0;
-        let rations = calcBase.project.Ration.datas;
-        for(let ration of rations){
-            if(ration.evaluationProject && ration.feesIndex && ration.feesIndex.direct){
-                rst = parseFloat(rst + ration.feesIndex.direct[totalFeeType]).toDecimal(decimalObj.ration.totalPrice)
-            }
-        }
-        return rst;
-    };*/
     baseFigureTemplate['GJXMRGF'] =  function (tender) {//估计项目人工费(市场人工费)
         const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
         let rst = 0;