|  | @@ -0,0 +1,452 @@
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Created by Zhong on 2017/11/28.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +//清单固定行
 | 
	
		
			
				|  |  | +const fixedFlag = {
 | 
	
		
			
				|  |  | +    // 分部分项工程
 | 
	
		
			
				|  |  | +    SUB_ENGINERRING: 1,
 | 
	
		
			
				|  |  | +    // 措施项目
 | 
	
		
			
				|  |  | +    MEASURE: 2,
 | 
	
		
			
				|  |  | +    // 施工技术措施项目
 | 
	
		
			
				|  |  | +    CONSTRUCTION_TECH: 3,
 | 
	
		
			
				|  |  | +    // 安全文明施工按实计算费用
 | 
	
		
			
				|  |  | +    SAFETY_CONSTRUCTION_ACTUAL: 4,
 | 
	
		
			
				|  |  | +    // 施工组织措施专项费用
 | 
	
		
			
				|  |  | +    CONSTRUCTION_ORGANIZATION: 5,
 | 
	
		
			
				|  |  | +    // 安全文明施工专项费用
 | 
	
		
			
				|  |  | +    SAFETY_CONSTRUCTION: 6,
 | 
	
		
			
				|  |  | +    // 其他项目
 | 
	
		
			
				|  |  | +    OTHER: 7,
 | 
	
		
			
				|  |  | +    // 暂列金额
 | 
	
		
			
				|  |  | +    PROVISIONAL: 8,
 | 
	
		
			
				|  |  | +    // 暂估价
 | 
	
		
			
				|  |  | +    ESTIMATE: 9,
 | 
	
		
			
				|  |  | +    // 材料(工程设备)暂估价
 | 
	
		
			
				|  |  | +    MATERIAL_PROVISIONAL: 10,
 | 
	
		
			
				|  |  | +    // 专业工程暂估价
 | 
	
		
			
				|  |  | +    ENGINEERING_ESITIMATE: 11,
 | 
	
		
			
				|  |  | +    // 计日工
 | 
	
		
			
				|  |  | +    DAYWORK: 12,
 | 
	
		
			
				|  |  | +    // 总承包服务费
 | 
	
		
			
				|  |  | +    TURN_KEY_CONTRACT: 13,
 | 
	
		
			
				|  |  | +    // 索赔与现场签证
 | 
	
		
			
				|  |  | +    CLAIM_VISA: 14,
 | 
	
		
			
				|  |  | +    // 规费
 | 
	
		
			
				|  |  | +    CHARGE: 15,
 | 
	
		
			
				|  |  | +    // 社会保险费及住房公积金 Social insurance fee and housing accumulation fund
 | 
	
		
			
				|  |  | +    SOCIAL_INSURANCE_HOUSING_FUND: 16,
 | 
	
		
			
				|  |  | +    // 工程排污费 charges for disposing pollutants
 | 
	
		
			
				|  |  | +    POLLUTANTS: 17,
 | 
	
		
			
				|  |  | +    // 税金
 | 
	
		
			
				|  |  | +    TAX: 18
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +let cbTools = {
 | 
	
		
			
				|  |  | +    isDef: function (v) {
 | 
	
		
			
				|  |  | +        return v !== undefined && v !== null;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    isUnDef: function (v) {
 | 
	
		
			
				|  |  | +        return v === undefined || v === null;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    isNum: function (v) {
 | 
	
		
			
				|  |  | +        return this.isDef(v) && !isNaN(v) && v !== Infinity;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    returnV: function (v, r) {
 | 
	
		
			
				|  |  | +        if(this.isDef(v)){
 | 
	
		
			
				|  |  | +            return v;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return r;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    findBill: function (fixedFlag) {
 | 
	
		
			
				|  |  | +        let bills = projectObj.project.Bills.datas;
 | 
	
		
			
				|  |  | +        for(let i = 0, len = bills.length; i < len; i++){
 | 
	
		
			
				|  |  | +            if(bills[i].flagsIndex.flag === fixedFlag){
 | 
	
		
			
				|  |  | +                return bills[i];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //需要用到计算基数的时候,先找出所有的固定清单,避免每个基数都要去遍历寻找清单
 | 
	
		
			
				|  |  | +    setFixedBills: function (project, billsObj, fixedFlag) {
 | 
	
		
			
				|  |  | +        let bills = project.Bills.datas;
 | 
	
		
			
				|  |  | +        for(let i = 0, len = bills.length; i < len; i++){
 | 
	
		
			
				|  |  | +            if(this.isDef(bills[i].flagsIndex.fixed)){
 | 
	
		
			
				|  |  | +                for(let flag in fixedFlag){
 | 
	
		
			
				|  |  | +                    if(fixedFlag[flag] === bills[i].flagsIndex.fixed.flag){
 | 
	
		
			
				|  |  | +                        billsObj[fixedFlag[flag]] = bills[i];
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //生成清单基数计算分类模板
 | 
	
		
			
				|  |  | +    setBaseFigureClass: function (baseFigures, mapObj) {
 | 
	
		
			
				|  |  | +        mapObj['CONSTRUCTION_ORGANIZATION'] = Object.create(null);
 | 
	
		
			
				|  |  | +        mapObj['OTHER'] = Object.create(null);
 | 
	
		
			
				|  |  | +        mapObj['CHARGE'] = Object.create(null);
 | 
	
		
			
				|  |  | +        mapObj['TAX'] = Object.create(null);
 | 
	
		
			
				|  |  | +        mapObj['OTHERS'] = Object.create(null);
 | 
	
		
			
				|  |  | +        let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ'];
 | 
	
		
			
				|  |  | +        for(let figure in baseFigures){
 | 
	
		
			
				|  |  | +            if(filter.indexOf(baseFigures[figure]) === -1){
 | 
	
		
			
				|  |  | +                mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if(baseFigures[figure] !== 'QTXMF'){
 | 
	
		
			
				|  |  | +                mapObj['OTHER'][figure] = baseFigures[figure];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if(baseFigures[figure] !== 'GF'){
 | 
	
		
			
				|  |  | +                mapObj['CHARGE'][figure] = baseFigures[figure];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if(baseFigures[figure] !== 'SJ'){
 | 
	
		
			
				|  |  | +                mapObj['TAX'][figure] = baseFigures[figure];
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            mapObj['OTHERS'][figure] = baseFigures[figure];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +let baseFigureTemplate = {
 | 
	
		
			
				|  |  | +    'FBFXGCF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.common.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXDEJJRGF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.labour.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXDEJJCLF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.material.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXDEJJJXF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.machine.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXTZRGF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.adjustLabour.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXTZJSRGF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.adjustMachineLabour.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXZCF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.mainMaterial.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXSBF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.mainMaterial.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXWJJCLF': function () {
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXRGGR': function () {
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'FBFXGCLQDJJZJGCF': function () {
 | 
	
		
			
				|  |  | +        return this['FBFXDEJJRGF']() + this['FBFXDEJJCLF']() + this['FBFXDEJJJXF']();
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'CSXMF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.MEASURE];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.common.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'ZZCSXMF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.common.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'ZZCSXMDEJJZJGCF': function () {
 | 
	
		
			
				|  |  | +        return this['ZZCSXMDEJJRGF']() + this['ZZCSXMDEJJCLF']() + this['ZZCSXMDEJJJXF']()
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'ZZCSXMDEJJRGF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.labour.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'ZZCSXMDEJJCLF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.material.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'ZZCSXMDEJJJXF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.machine.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.common.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMDEJJRGF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.labour.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMDEJJCLF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.material.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMDEJJJXF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.machine.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMTZRGF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.adjustLabour.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMTZJSRGF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.adjustMachineLabour.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMZCF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.mainMaterial.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMSBF': function () {
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMWJJCLF': function () {
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMRGGR': function () {
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'JSCSXMQDDEJJZJGCF': function () {
 | 
	
		
			
				|  |  | +        return this['JSCSXMDEJJRGF']() + this['JSCSXMDEJJCLF']() + this['JSCSXMDEJJJXF']();
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'QTXMF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.OTHER];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.common.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'GF': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.CHARGE];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.common.totalFee || 0;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    'SJ': function () {
 | 
	
		
			
				|  |  | +        let bill = calcBase.fixedBills[calcBase.fixedFlag.TAX];
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill)) return 0;
 | 
	
		
			
				|  |  | +        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
 | 
	
		
			
				|  |  | +        return bill.feesIndex.common.totalFee || 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +let baseFigureMap = {
 | 
	
		
			
				|  |  | +    '分部分项工程费': 'FBFXGCF',
 | 
	
		
			
				|  |  | +    '分部分项定额基价人工费': 'FBFXDEJJRGF',
 | 
	
		
			
				|  |  | +    '分部分项定额基价材料费': 'FBFXDEJJCLF',
 | 
	
		
			
				|  |  | +    '分部分项定额基价机械费': 'FBFXDEJJJXF',
 | 
	
		
			
				|  |  | +    '分部分项调整人工费': 'FBFXTZRGF',
 | 
	
		
			
				|  |  | +    '分部分项调整机上人工费': 'FBFXTZJSRGF',
 | 
	
		
			
				|  |  | +    '分部分项主材费': 'FBFXZCF',
 | 
	
		
			
				|  |  | +    '分部分项设备费': 'FBFXSBF',
 | 
	
		
			
				|  |  | +    '分部分项未计价材料费': 'FBFXWJJCLF',
 | 
	
		
			
				|  |  | +    '分部分项人工工日': 'FBFXRGGR',
 | 
	
		
			
				|  |  | +    '分部分项工程量清单中的基价直接工程费': 'FBFXGCLQDJJZJGCF',
 | 
	
		
			
				|  |  | +    '措施项目费': 'CSXMF',
 | 
	
		
			
				|  |  | +    '组织措施项目费': 'ZZCSXMF',
 | 
	
		
			
				|  |  | +    '组织措施项目定额基价直接工程费': 'ZZCSXMDEJJZJGCF',
 | 
	
		
			
				|  |  | +    '组织措施项目定额基价人工费': 'ZZCSXMDEJJRGF',
 | 
	
		
			
				|  |  | +    '组织措施项目定额基价材料费': 'ZZCSXMDEJJCLF',
 | 
	
		
			
				|  |  | +    '组织措施项目定额基价机械费': 'ZZCSXMDEJJJXF',
 | 
	
		
			
				|  |  | +    '技术措施项目费': 'JSCSXMF',
 | 
	
		
			
				|  |  | +    '技术措施项目定额基价人工费': 'JSCSXMDEJJRGF',
 | 
	
		
			
				|  |  | +    '技术措施项目定额基价材料费': 'JSCSXMDEJJCLF',
 | 
	
		
			
				|  |  | +    '技术措施项目定额基价机械费': 'JSCSXMDEJJJXF',
 | 
	
		
			
				|  |  | +    '技术措施项目调整人工费': 'JSCSXMTZRGF',
 | 
	
		
			
				|  |  | +    '技术措施项目调整机上人工费': 'JSCSXMTZJSRGF',
 | 
	
		
			
				|  |  | +    '技术措施项目主材费': 'JSCSXMZCF',
 | 
	
		
			
				|  |  | +    '技术措施项目设备费': 'JSCSXMSBF',
 | 
	
		
			
				|  |  | +    '技术措施项目未计价材料费': 'JSCSXMWJJCLF',
 | 
	
		
			
				|  |  | +    '技术措施项目人工工日': 'JSCSXMRGGR',
 | 
	
		
			
				|  |  | +    '技术措施项目清单中的定额基价直接工程费': 'JSCSXMQDDEJJZJGCF',
 | 
	
		
			
				|  |  | +    '其他项目费': 'QTXMF',
 | 
	
		
			
				|  |  | +    '规费': 'GF',
 | 
	
		
			
				|  |  | +    '税金': 'SJ'
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//输入式分析器
 | 
	
		
			
				|  |  | +let cbAnalyzer = {
 | 
	
		
			
				|  |  | +    standar: function (exp) {
 | 
	
		
			
				|  |  | +        //去空格
 | 
	
		
			
				|  |  | +        exp = exp.replace(/\s/g, '');
 | 
	
		
			
				|  |  | +        //( to (
 | 
	
		
			
				|  |  | +        exp = exp.replace(/(/g, '(');
 | 
	
		
			
				|  |  | +        //)to )
 | 
	
		
			
				|  |  | +        exp = exp.replace(/)/g, ')');
 | 
	
		
			
				|  |  | +        return exp;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //输入合法性
 | 
	
		
			
				|  |  | +    inputLegal: function (exp) {
 | 
	
		
			
				|  |  | +        let ilegalRex = /[^0-9,\u4e00-\u9fa5,\+,\-,\/,\*,\(,\),.]/g;
 | 
	
		
			
				|  |  | +        return !ilegalRex.test(exp);
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //基数合法性、存在性
 | 
	
		
			
				|  |  | +    baseLegal: function (baseFigures, exp) {
 | 
	
		
			
				|  |  | +        let expFigures = cbParser.getFigure(exp);
 | 
	
		
			
				|  |  | +        for(let i = 0, len = expFigures.length; i < len; i++){
 | 
	
		
			
				|  |  | +            if(cbTools.isUnDef(baseFigures[expFigures[i]])){
 | 
	
		
			
				|  |  | +                return false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //四则运算合法性,前端控制不允许重复出现运算符,这里主要判断()的使用问题,这里再判断一次
 | 
	
		
			
				|  |  | +    arithmeticLeagl: function (exp) {
 | 
	
		
			
				|  |  | +        let ilegalRex = /[\+,\-,\*,\/]{2}/g;
 | 
	
		
			
				|  |  | +        return !ilegalRex.test(exp);
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //
 | 
	
		
			
				|  |  | +    legalExp: function (exp) {
 | 
	
		
			
				|  |  | +        exp = this.standar(exp);
 | 
	
		
			
				|  |  | +        if(this.inputLegal(exp)){
 | 
	
		
			
				|  |  | +            if(this.baseLegal(calcBase.baseFigures, exp)){
 | 
	
		
			
				|  |  | +                if(this.arithmeticLeagl(exp)){
 | 
	
		
			
				|  |  | +                    return exp;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return null;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    isCN: function(v){
 | 
	
		
			
				|  |  | +        let regex = /[\u4e00-\u9fa5]/g;
 | 
	
		
			
				|  |  | +        return (regex.test(v));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//输入式转换器
 | 
	
		
			
				|  |  | +let cbParser = {
 | 
	
		
			
				|  |  | +    //获取表达式中的基数
 | 
	
		
			
				|  |  | +    getFigure: function(expr){
 | 
	
		
			
				|  |  | +        let rst = [];
 | 
	
		
			
				|  |  | +        let cnRex = /[^\u4e00-\u9fa5]/;
 | 
	
		
			
				|  |  | +        let temp = expr.split(cnRex);
 | 
	
		
			
				|  |  | +        for(let i = 0, len = temp.length; i < len; i++){
 | 
	
		
			
				|  |  | +            if(temp[i] !== '' && rst.indexOf(temp[i]) === -1){
 | 
	
		
			
				|  |  | +                rst.push(temp[i]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return rst;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //将表达式转换为可编译的表达式
 | 
	
		
			
				|  |  | +    toCompileExpr: function(v){
 | 
	
		
			
				|  |  | +        let strs = this.getFigure(v);
 | 
	
		
			
				|  |  | +        let exps = [];
 | 
	
		
			
				|  |  | +        for(let i = 0, len = strs.length; i < len; i++){
 | 
	
		
			
				|  |  | +            let exp = Object.create(null);
 | 
	
		
			
				|  |  | +            exp.orgExp = strs[i];
 | 
	
		
			
				|  |  | +            exps.push(exp);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        for(let i = 0, len = exps.length;i < len; i++){
 | 
	
		
			
				|  |  | +            exps[i].compileExp = '$CBC.base(\'' + exps[i].orgExp;
 | 
	
		
			
				|  |  | +            exps[i].compileExp = exps[i].compileExp + '\')';
 | 
	
		
			
				|  |  | +            v = v.replace(new RegExp(exps[i].orgExp,"g"), exps[i].compileExp);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return v;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +let cbCalctor = {
 | 
	
		
			
				|  |  | +    //计算基数
 | 
	
		
			
				|  |  | +    base: function (figure) {
 | 
	
		
			
				|  |  | +        return baseFigureTemplate[calcBase.baseFigures[figure]]();
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //计算
 | 
	
		
			
				|  |  | +    exec: function () {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +let calcBase = {
 | 
	
		
			
				|  |  | +    //清单固定行
 | 
	
		
			
				|  |  | +    fixedFlag: null,
 | 
	
		
			
				|  |  | +    fixedBills: Object.create(null),
 | 
	
		
			
				|  |  | +    //清单基数
 | 
	
		
			
				|  |  | +    baseFigures: Object.create(null),
 | 
	
		
			
				|  |  | +    //清单可选基数映射,分两类:组织措施项目:排除父项和计算的父项; 其他项目、规费、税金、工程造价,及新增部分:显示所有计算基数
 | 
	
		
			
				|  |  | +    baseFigureClass: Object.create(null),
 | 
	
		
			
				|  |  | +    //初始化
 | 
	
		
			
				|  |  | +    init: function (project) {
 | 
	
		
			
				|  |  | +        let me = this;
 | 
	
		
			
				|  |  | +        me.project = project;
 | 
	
		
			
				|  |  | +        me.fixedFlag = fixedFlag;
 | 
	
		
			
				|  |  | +        cbTools.setFixedBills(project, me.fixedBills, me.fixedFlag);
 | 
	
		
			
				|  |  | +        me.baseFigures = baseFigureMap;
 | 
	
		
			
				|  |  | +        //me.baseFigures.fixedBills = me.fixedBills;
 | 
	
		
			
				|  |  | +        cbTools.setBaseFigureClass(me.baseFigures, me.baseFigureClass);
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getBase: function (figure) {
 | 
	
		
			
				|  |  | +       return  cbCalctor.base(figure);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    calculate: function (node) {
 | 
	
		
			
				|  |  | +        let me = calcBase,
 | 
	
		
			
				|  |  | +            $CBA = cbAnalyzer,
 | 
	
		
			
				|  |  | +            $CBP = cbParser,
 | 
	
		
			
				|  |  | +            $CBC = cbCalctor;
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            //分析输入式合法性
 | 
	
		
			
				|  |  | +            let exp = $CBA.legalExp(node.data.userCalcBase);
 | 
	
		
			
				|  |  | +            if(!exp){
 | 
	
		
			
				|  |  | +                throw '表达式不正确';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //输入式转换表达式
 | 
	
		
			
				|  |  | +            let compileExp = $CBP.toCompileExpr(exp);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //计算
 | 
	
		
			
				|  |  | +            let calcBaseValue = eval(compileExp);
 | 
	
		
			
				|  |  | +            if(!cbTools.isNum(calcBaseValue)){
 | 
	
		
			
				|  |  | +                throw '表达式不正确';
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //存储
 | 
	
		
			
				|  |  | +            node.data.calcBase = exp;
 | 
	
		
			
				|  |  | +            node.data.calcBaseValue = parseFloat(calcBaseValue).toDecimal(decimalObj.decimal('totalPrice', node));
 | 
	
		
			
				|  |  | +            me.project.calcProgram.calculate(node);
 | 
	
		
			
				|  |  | +            me.project.calcProgram.saveNode(node);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        catch (err){
 | 
	
		
			
				|  |  | +            alert('表达式不正确');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +};
 |