| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666 | /** * Created by zhang on 2018/6/7. */let gljUtil = {    calcProjectGLJQuantity:function (projectGLJDatas,rationGLJDatas,rationDatas,billsDatas,q_decimal,_,scMathUtil,isReport) {        let project_gljs = projectGLJDatas.gljList;        let mixRatioMap = projectGLJDatas.mixRatioMap;        let rations = rationDatas;        let rationMap = _.indexBy(rations,'ID');        let quantityMap={};        let rationGljGroup = _.groupBy(rationGLJDatas,'projectGLJID');        let IDarray =  this.getSubdivisionAndTechBillsLeavesID(billsDatas);//分别取分部分项和技术措施项目的所有叶子清单ID        let billIDs = IDarray[0],tech_billIDS = IDarray[1];        let sField = "subdivisionQuantity";        let tField = "techQuantity";        let qField = "quantity";        for(let pglj of project_gljs ){            let pg_index = this.getIndex(pglj,this.gljKeyArray);            pglj[sField] = 0;            pglj[tField] = 0;            pglj[qField] = 0;            let gljGroup = rationGljGroup[pglj.id]?rationGljGroup[pglj.id]:[];//定额工料机没有,有可能是定额类型的工料机            let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil);            pglj[sField] = result.subdivisionQuantity;            pglj[tField] = result.techQuantity;            pglj[qField] = result.quantity;            pglj.tenderQuantity = result.tenderQuantity;            quantityMap[pg_index] = pglj;        }        //计算做为组成物的消耗量        for(let pkey in mixRatioMap){            let mixRatioList = mixRatioMap[pkey];            for(let m of mixRatioList){                let m_index = this.getIndex(m,this.gljKeyArray);                let m_glj = quantityMap[m_index];                let p_glj = quantityMap[pkey];                if(m_glj&&p_glj){                    let quantity = scMathUtil.roundForObj(parseFloat(p_glj[qField])*parseFloat(m.consumption),q_decimal);                    let tenderQuantity = scMathUtil.roundForObj(parseFloat(p_glj.tenderQuantity)*parseFloat(m.consumption),q_decimal);                    let techQuantity = scMathUtil.roundForObj(parseFloat(p_glj[tField])*parseFloat(m.consumption),q_decimal);                    let subdivisionQuantity = scMathUtil.roundForObj(parseFloat(p_glj[sField])*parseFloat(m.consumption),q_decimal);                    m_glj[qField] =  scMathUtil.roundForObj(parseFloat(m_glj[qField])+quantity,q_decimal);                    m_glj.tenderQuantity =  scMathUtil.roundForObj(parseFloat(m_glj.tenderQuantity)+tenderQuantity,q_decimal);                    m_glj[tField] =  scMathUtil.roundForObj(parseFloat(m_glj[tField])+techQuantity,q_decimal);                    m_glj[sField] =  scMathUtil.roundForObj(parseFloat(m_glj[sField])+subdivisionQuantity,q_decimal);                }            }        }        if (isReport) {            for(let pglj of project_gljs ){                pglj[qField] = pglj.tenderQuantity;            }        }    },    getQuantityPerGLJ : function (ration_glj_list,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil) {        let result={};        let quantity_sum=0;//工料机汇总消耗量        let sum = 0;//分部分项总消耗量        let tech_sum = 0;//技术措施总消耗量        let tender_qantity_sum = 0;        for(let rg of ration_glj_list){            let tem_ration = rationMap[rg.rationID];            let r_quantity = tem_ration?scMathUtil.roundForObj(tem_ration.quantity,q_decimal):0;            let glj_quantity = scMathUtil.roundForObj(rg.quantity, q_decimal);            let tender_r_quantity = r_quantity;            let tender_glj_quantity = glj_quantity;            if(!r_quantity){                continue;            }            if(!pglj.is_adjust_price){                tender_glj_quantity = this.getRationGLJTenderQuantity(rg,tem_ration,q_decimal,scMathUtil);                tender_r_quantity = this.getRationTenderQuantity(tem_ration,q_decimal,scMathUtil);            }            let total = scMathUtil.roundForObj(glj_quantity*r_quantity, q_decimal);            let tender_total = scMathUtil.roundForObj(tender_glj_quantity*tender_r_quantity, q_decimal);            quantity_sum = scMathUtil.roundForObj(quantity_sum+total,q_decimal);            tender_qantity_sum = scMathUtil.roundForObj(tender_qantity_sum+tender_total,q_decimal);            if(_.includes(billIDs,rg.billsItemID)){//计算分部分项                sum = scMathUtil.roundForObj(sum+total,q_decimal);            }            if(_.includes(tech_billIDS,rg.billsItemID)){//计算技术措施项目消耗量                tech_sum = scMathUtil.roundForObj(tech_sum+total,q_decimal);            }        }        //2019-11-07 定额类型工料机已经屏蔽,如果打开,记得加上调价后的消耗量        /*for(let ra of rations){//计算定额类型工料机的消耗量            if(ra.type == this.rationType.gljRation&&ra.projectGLJID===pglj.id){                let r_quantity = scMathUtil.roundForObj(ra.quantity,q_decimal);                r_quantity = r_quantity?r_quantity:0;                if(isTender == true){                    r_quantity = this.getRationTenderQuantity(ra,q_decimal,scMathUtil);                }                quantity_sum = scMathUtil.roundForObj(quantity_sum+r_quantity,q_decimal);                if(_.includes(billIDs,ra.billsItemID)){//计算分部分项                    sum = scMathUtil.roundForObj(sum+r_quantity,q_decimal);                }                if(_.includes(tech_billIDS,ra.billsItemID)){//计算技术措施项目消耗量                    tech_sum = scMathUtil.roundForObj(tech_sum+r_quantity,q_decimal);                }            }        }*/        result.subdivisionQuantity = sum;        result.techQuantity = tech_sum;        result.quantity = quantity_sum;        result.tenderQuantity = tender_qantity_sum;        return result;    },    getRationGLJTenderQuantity:function (ration_glj,ration,q_decimal,scMathUtil) {        let coeMap = {          1:'labour',  //人工          2:'material',//材料          3:'machine',//机械          4:'main', //主材          5:'equipment'//设备        };        let typeString = ration_glj.type +"";        let coeField = "";        for(let key in coeMap){            if(typeString.indexOf(key) == 0){              coeField = coeMap[key];              break;            }        }        let coe = 1;        coe = ration.quantityCoe&&this.isNotEmpty(ration.quantityCoe[coeField])?ration.quantityCoe[coeField]:1;        coe = parseFloat(coe);        if (coe == 0) coe = 1;        let glj_quantity = scMathUtil.roundForObj(ration_glj.quantity, q_decimal);        return scMathUtil.roundForObj(glj_quantity * coe,q_decimal);    },    getRationTenderQuantity:function (ration,q_decimal,scMathUtil) {        let rationQuantityCoe = this.isNotEmpty(ration.rationQuantityCoe)?ration.rationQuantityCoe:1;        rationQuantityCoe = parseFloat(rationQuantityCoe);        if (rationQuantityCoe == 0) rationQuantityCoe = 1;        let r_quantity = ration?scMathUtil.roundForObj(ration.quantity,q_decimal):0;        return scMathUtil.roundForObj(r_quantity * rationQuantityCoe,q_decimal);    },    isNotEmpty:function (str) {        return this.isDef(str) && str!="";    },    getSubdivisionAndTechBillsLeavesID:function (billsDatas) {//分别取分部分项和技术措施项目的所有叶子清单ID         if(typeof (projectObj) !== 'undefined'){//存在,说明在前端调用             return [projectObj.project.Bills.getSubdivisionProjectLeavesID(),projectObj.project.Bills.getTechLeavesID()];         }        let parentMap ={};        let subdivisionBillID  = null,techBillID = null,sIDs = [],tIDS = [];        for(let b of billsDatas){            if(parentMap[b.ParentID]){                parentMap[b.ParentID].push(b);            }else {                parentMap[b.ParentID]= [b];            }            let flag = this.getFlag(b);            if(this.isDef(flag)&&flag.flag == this.fixedFlag.SUB_ENGINERRING){                subdivisionBillID = b.ID;            }            if(this.isDef(flag)&&flag.flag == this.fixedFlag.CONSTRUCTION_TECH){                techBillID = b.ID;            }        }        getLeaveIDs(subdivisionBillID,parentMap,sIDs);        getLeaveIDs(techBillID,parentMap,tIDS);        return [sIDs,tIDS];        function getLeaveIDs(ID,parentM,leaveIDs) {            if(parentM[ID] && parentM[ID].length > 0){                let children  =  parentM[ID];                for(let c of children){                    if(parentM[c.ID]){                        getLeaveIDs(c.ID,parentM,leaveIDs);                    }else {                        leaveIDs.push(c.ID);                    }                }            }        }    },    getFlag:function (b) {        return _.find(b.flags,{"fieldName":"fixed"});    },    getGLJPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe, isReport) {        let result = {};        if(isReport){            result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,decimalObj,isRadio,_,scMathUtil,tenderCoe);        }else {            result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,decimalObj,isRadio,_,scMathUtil);            result.tenderPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,decimalObj,isRadio,_,scMathUtil,tenderCoe);        }        if(this.calcPriceDiff(glj,calcOptions)==true){//计取价差            result.basePrice = this.getBasePrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);            result.adjustPrice = this.getAdjustPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);        }else {//不计价差            result.basePrice = result.marketPrice;            result.adjustPrice = result.marketPrice;        }        return result;    },    getMarketPrice:function (glj,projectGLJDatas,calcOptions,decimalObj,isRadio,_,scMathUtil,tenderCoe) {        let price_decimal = decimalObj.glj.unitPrice;        let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;        let quantity_decimal = decimalObj.glj.quantity;        let process_decimal = decimalObj.process;        let priceCoe = this.isDef(tenderCoe)?tenderCoe:1;        if (priceCoe == '0' || priceCoe == 0) priceCoe = 1;   // 这里加个保护        if (['GLF', 'LR', 'FXF'].includes(glj.code)) priceCoe = 1; // 类型是“企业管理费”、“利润”、“一般风险费”的,不应调整单价。        if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。            let p =0;            for(let ratio of glj.ratio_data){                let rIndex = gljUtil.getIndex(ratio);                let tem =  _.find(projectGLJDatas.gljList,function(item){                    return rIndex == gljUtil.getIndex(item)                });                if(tem){                    let tem_marketPrice = this.getMarketPrice(tem,projectGLJDatas,calcOptions,decimalObj,true,_,scMathUtil);  //let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);                    let temP = scMathUtil.roundForObj(                        scMathUtil.roundForObj(tem_marketPrice * priceCoe, price_decimal) *                        scMathUtil.roundForObj(ratio.consumption,quantity_decimal), process_decimal);                    p = scMathUtil.roundForObj(temP + p, process_decimal);                }            }            return scMathUtil.roundForObj(p,price_hasM_decimal);        }else {            let tem_decimal =price_decimal; //isRadio==true?process_decimal:price_decimal;            let tem_price = scMathUtil.roundForObj(glj.unit_price.market_price,price_decimal);            return scMathUtil.roundForObj(tem_price*priceCoe,tem_decimal);        }    },    getBasePrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {        let price_decimal = decimalObj.glj.unitPrice;        let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;        let quantity_decimal = decimalObj.glj.quantity;        let process_decimal = decimalObj.process;        if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。            //2018-09-07 需求修改,定额价不按组成物的量和价实时计算出来,直接取单价文件中的定额价       /*     let p =0;            for(let ratio of glj.ratio_data){                let tem =  _.find( projectGLJDatas.gljList,{                    'code': ratio.code,                    'name': ratio.name,                    'specs':ratio.specs,                    'type': ratio.type,                    'unit': ratio.unit                });                if(tem){                    let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);                    let temP = scMathUtil.roundForObj(priceData.basePrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);                    p = scMathUtil.roundForObj(temP + p,process_decimal);                }            }            return scMathUtil.roundForObj(p,price_hasM_decimal);*/            return scMathUtil.roundForObj(glj.unit_price.base_price,price_hasM_decimal);        }else {            let tem_decimal =price_decimal; //isRadio==true?process_decimal:price_decimal;            return scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal);        }    },    //这个函数isRadio目前看来没有用,如果后续改了方法,导致isRadio的值会影响结果的话,需要调整调用这个方法的地方.    getAdjustPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {        let decimal = decimalObj.glj.unitPrice;        let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;        let quantity_decimal =  decimalObj.glj.quantity;        let process_decimal = decimalObj.process;        let  tem_decimal = isRadio==true?process_decimal:decimal;        if (glj.unit_price.type == this.gljType.LABOUR || glj.unit_price.type == this.gljType.MACHINE_LABOUR) {//人工、机上人工,调整价根据定额价*调整系数计算得出。            let labour = _.find(labourCoeDatas.coes,{'ID':glj.adjCoe});            let coe = labour && labour.coe ? labour.coe : 1;            return scMathUtil.roundTo(parseFloat(coe * scMathUtil.roundForObj(glj.unit_price.base_price,decimal)), -decimal);        } else if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班,调整价根据组成物计算得出。            let p =0;            for(let ratio of glj.ratio_data){                let rIndex = gljUtil.getIndex(ratio);                let tem =  _.find(projectGLJDatas.gljList,function(item){                    return rIndex == gljUtil.getIndex(item);                });                if(tem){                    let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);                    let temP = scMathUtil.roundForObj(priceData.adjustPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);                    p = scMathUtil.roundForObj(temP + p,process_decimal);                }            }            return scMathUtil.roundForObj(p,price_hasM_decimal);        } else {//对于其他普通材料等,无调整系数,调整价=定额价。            return  scMathUtil.roundForObj(glj.unit_price.base_price,decimal)        }    },    calcPriceDiff:function (glj,calcOptions) {        if(glj.is_evaluate==1){//先按是否暂估判断            return calcOptions.calc_est;        }        if(glj.type == this.gljType.MAIN_MATERIAL || glj.type == this.gljType.EQUIPMENT){//再判断是否是主材和设备            return calcOptions.calc_main;        }        if(glj.unit_price.is_add==1){//再判断是否新增            return calcOptions.calc_add;        }        return true;    },    isFlag : function (v) {        return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed) && this.isDef(v.flagsIndex.fixed.flag);    },    isDef:function (v) {        return v !== undefined && v !== null;    },    getIndex(obj, pops){        let t_index = '';        let k_arr = [];        if(!pops) pops = this.gljKeyArray;        for (let p of pops) {            let tmpK = (obj[p] == undefined || obj[p] == null || obj[p] == '') ? 'null' : obj[p];            k_arr.push(tmpK);        }        t_index = k_arr.join("|-|");        return t_index;    },    getGljTypeSeq:function () {        let gljType = this.gljType;        return   [gljType.LABOUR,gljType.MAIN_MATERIAL,gljType.CONCRETE,gljType.MORTAR,gljType.MIX_RATIO,gljType.COMMERCIAL_CONCRETE,                gljType.COMMERCIAL_MORTAR,gljType.GENERAL_MATERIAL,gljType.OTHER_MATERIAL,gljType.GENERAL_MACHINE,gljType.INSTRUMENT,gljType.OTHER_MACHINE_USED,                gljType.MACHINE_COMPOSITION,gljType.MACHINE_LABOUR,gljType.FUEL_POWER_FEE,gljType.DEPRECIATION_FEE,gljType.INSPECTION_FEE,gljType.MAINTENANCE,                gljType.DISMANTLING_FREIGHT_FEE,gljType.VERIFICATION_FEE,gljType.OTHER_FEE,gljType.EQUIPMENT,gljType.MANAGEMENT_FEE,gljType.PROFIT,gljType.GENERAL_RISK_FEE]    },    sortRationGLJ:function (list,std) {        list = _.sortByAll(list, [function (item) {            let typeField = std == true?"gljType":"type";            return _.indexOf(gljUtil.getGljTypeSeq(),item[typeField])        }, "code"]);        return list;    },    getTotalQuantity:function(glj,ration,rd,gd){        if(ration){            let quantity = ration.quantity;            quantity = (quantity == 0 || quantity == undefined || quantity == null || quantity == "") ? 0 : quantity;            quantity = scMathUtil.roundForObj(quantity, rd);//计算前进行4舍5入            glj.quantity = scMathUtil.roundForObj(glj.quantity, gd);            glj.tenderQuantity = this.getRationGLJTenderQuantity(glj, ration, gd, scMathUtil);            return scMathUtil.roundToString(quantity * glj.quantity, gd);        }    },    getEngineerCostData:function(property,bills,fixedFlag,scMathUtil){        let priceIndex = {            name:"工程造价指标",            attrs:[],            children:[],        };        let fixMap = {};        let buildingArea = this.getBuildArea(property.engineerFeatures); //tender.property.projectFeature?getItemValueBykey(tender.property.projectFeature,"buildingArea"):1;//建筑面积        for(let b of bills){            if(b.flags && b.flags.length > 0){                let f = _.find(b.flags,{"fieldName":"fixed"});                if(f) fixMap[f.flag] = this.getTotalFee(b,scMathUtil,property.decimal);            }        }        //计算其他组织措施费 = 施工组织措施项目下的子项,除了  安全文明施工费、建设工程竣工档案编制费以外的项        let CONSTRUCTION_ORGANIZATION = fixMap[fixedFlag.CONSTRUCTION_ORGANIZATION]?fixMap[fixedFlag.CONSTRUCTION_ORGANIZATION]:0;        let SAFETY_CONSTRUCTION =  fixMap[fixedFlag.SAFETY_CONSTRUCTION]?fixMap[fixedFlag.SAFETY_CONSTRUCTION]:0;        let PROJECT_COMPLETE_ARCH_FEE =  fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE]? fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE]:0;        let other_org_fee = CONSTRUCTION_ORGANIZATION - SAFETY_CONSTRUCTION - PROJECT_COMPLETE_ARCH_FEE;        other_org_fee = other_org_fee >0 ?other_org_fee:0;        let engineerCost = fixMap[fixedFlag.ENGINEERINGCOST]?fixMap[fixedFlag.ENGINEERINGCOST]:1;        priceIndex.children.push(this.getEngineerFlag("分部分项工程费",fixMap[fixedFlag.SUB_ENGINERRING],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("技术措施费",fixMap[fixedFlag.CONSTRUCTION_TECH],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("安全文明施工费",fixMap[fixedFlag.SAFETY_CONSTRUCTION],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("建设工程竣工档案编制费",fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("其他组织措施费",other_org_fee,engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("暂列金额",fixMap[fixedFlag.PROVISIONAL],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("专业工程暂估价",fixMap[fixedFlag.ENGINEERING_ESITIMATE],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("计日工",fixMap[fixedFlag.DAYWORK],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("总承包服务费",fixMap[fixedFlag.TURN_KEY_CONTRACT],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("索赔与现场签证",fixMap[fixedFlag.CLAIM_VISA],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("规费",fixMap[fixedFlag.CHARGE],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("税金",fixMap[fixedFlag.TAX],engineerCost,buildingArea,scMathUtil));        priceIndex.children.push(this.getEngineerFlag("工程造价",fixMap[fixedFlag.ENGINEERINGCOST],engineerCost,buildingArea,scMathUtil));        return priceIndex;    },    getBuildArea:function (features) {        if(features){            let areas = [];            for(let f of features){                if(f.index == true && f.value && f.value !=="" && this.IsNumber(f.value)) areas.push(f.value);            }            return areas.length==0?1:areas;        }        return 1    },    getEngineerFlag: function (name,totalCost,engineerCost,buildingArea,scMathUtil) {        totalCost = totalCost?totalCost:0;        let flag = {            name:name,            attrs:[                {name: "金额", value: scMathUtil.roundToString(totalCost,3)},                {name: "单方造价", value: scMathUtil.roundToString(this.calcUnitB(totalCost,buildingArea,scMathUtil),2)},                {name: "占造价比例", value: scMathUtil.roundToString(totalCost/engineerCost * 100,2)},            ],        };        return flag;    },    getTotalFee:function (b,scMathUtil,decimal) {        let total = 0;        if(b.fees && b.fees.length > 0){            for(let f of b.fees){                if(f.fieldName == "common"){                    total = scMathUtil.roundForObj(f.tenderTotalFee,decimal?decimal.bills.totalPrice:getDecimal("bills.totalPrice"));                }            }        }        return total;    },     IsNumber : function(pstrVal){        let dblNo = Number.NaN;        dblNo = new Number(pstrVal);        if (isNaN(dblNo)) return false;        return true;     },    calcUnitB:function (total,building,scMathUtil,coe,decimal = 3) {        if(Array.isArray(building)){            for(let b of building){                total = scMathUtil.roundForObj(total/b,6);            }        }else {            total = scMathUtil.roundForObj(total/building,6);        }        coe = gljUtil.isDef(coe)?coe:1;        return scMathUtil.roundForObj(total*coe,decimal);    },    getEconomicDatas:function(engineerFeatures,economics,billsList,fixedFlag,_,scMathUtil,decimal){        let datas = [];        let [bills,totalFee] = gljUtil.getIndexBills(billsList,fixedFlag,_,scMathUtil,decimal);        let billsGroup = _.groupBy(bills,'economicType');        if(!economics) return datas;        for(let e of economics){            let tem = {                name:e.name,                exportName:e.exportName,                cost:0,                unitCost:0,                per:0            };            if(billsGroup[e.name]) setEconomics(billsGroup[e.name],totalFee,tem);            datas.push(tem);        }        function setEconomics(items,engineerCost,data) {            let cost = 0;            let priceDe = decimal?decimal.bills.totalPrice:getDecimal("bills.totalPrice");//getDecimal("bills.totalPrice");            for(let i of items){                i.totalFee =  scMathUtil.roundForObj(i.totalFee,priceDe);                cost = scMathUtil.roundForObj(cost + i.totalFee,decimal?decimal.process:getDecimal("process"))//getDecimal("process");            }            data.cost = scMathUtil.roundForObj(cost,priceDe);            data.unitCost = gljUtil.calUnitWidthCoe(data.cost,true,engineerFeatures,_,scMathUtil);//noNeedCoe = true 这里不需要乘以系数            data.per = engineerCost?scMathUtil.roundForObj(data.cost/engineerCost * 100,2):0;        }        return datas;    },    calUnitWidthCoe:function (total,noNeedCoe,engineerFeatures,_,scMathUtil) {        let areas = gljUtil.getBuildArea(engineerFeatures);        let f = _.find(engineerFeatures,{index:true});        return f && noNeedCoe!==true?gljUtil.calcUnitB(total,areas,scMathUtil,f.coe):gljUtil.calcUnitB(total,areas,scMathUtil);    },    getIndexBills:function (bills,fixedFlag,_,scMathUtil,decimal) {        let parentMap = {},datas = [],totalCost = 0;        let FBFX_b = null,teh_b = null,costNode=null;        for(let b of bills) {            parentMap[b.ParentID] ? parentMap[b.ParentID].push(b) : parentMap[b.ParentID] = [b];//有添加,无则生成            if(b.flags && b.flags.length > 0){                let f = _.find(b.flags,{"fieldName":"fixed"});                if(!f) continue;                if(f.flag == fixedFlag.SUB_ENGINERRING) FBFX_b = b;//过滤出分部分项工程;                if(f.flag == fixedFlag.CONSTRUCTION_TECH) teh_b = b;//过滤出技术措施项目;                if(f.flag == fixedFlag.ENGINEERINGCOST) costNode = b;//过滤出工程造价项目;            }        }        if(FBFX_b) getChildren(FBFX_b,parentMap,datas);        if(teh_b) getChildren(teh_b,parentMap,datas);        if(costNode) totalCost = gljUtil.getTotalFee(costNode,scMathUtil,decimal);        for(let td of datas){            if(parentMap[td.ID]){                td.economicType = "";                td.quantityIndexType = "";                td.quantityIndexUnit = "";                td.quantityIndexCoe = "";            }        }        return [datas,totalCost];        function getChildren(d,map,arr) {            let tem = {                ID:d.ID,                ParentID:d.ParentID,                code:d.code,                name:d.name,                unit:d.unit,                quantity:d.quantity,                totalFee:gljUtil.getTotalFee(d,scMathUtil,decimal),                economicType:d.economicType,                quantityIndexType:d.quantityIndexType,                quantityIndexUnit:d.quantityIndexUnit,                quantityIndexCoe:d.quantityIndexCoe,            };            arr.push(tem);            if(map[d.ID]){                for(let s of map[d.ID]){                    getChildren(s,map,arr)                }            }        }    },    getMainMaterialDatas:function (projectProperty,engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {        let datas = [];        let materialGroup = _.groupBy(projectGLJData.gljList,'materialIndexType');        if(!materials) return datas;        for(let m of materials){            let tem = {                name:m.name,                unit:m.unit,                exportName:m.exportName,                unitPrice:0,                quantity:0,                unitIndex:0            };            if(materialGroup[m.name]) setMainMaterial(materialGroup[m.name],tem);            datas.push(tem);        }        function setMainMaterial(gljs,data) {            let quantity = 0 ,unitPrice=0;            for(let g of gljs){                if(!g.tenderQuantity || g.tenderQuantity=="") continue;                let tenderCoe = gljUtil.getTenderPriceCoe(g,projectProperty);                let marketPrice = gljUtil.getMarketPrice(g,projectGLJData,calcOptions,decimalObj,false,_,scMathUtil,tenderCoe); // gljOprObj.setGLJPrice(tem,g);                let materialIndexCoe = g.materialIndexCoe?scMathUtil.roundForObj(g.materialIndexCoe,decimalObj.process):0;                let t_quantity = scMathUtil.roundForObj(g.tenderQuantity * materialIndexCoe,decimalObj.process);                quantity = scMathUtil.roundForObj(t_quantity + quantity,decimalObj.process);                let temPrice = scMathUtil.roundForObj(g.tenderQuantity * marketPrice,decimalObj.process);                unitPrice = scMathUtil.roundForObj(temPrice + unitPrice,decimalObj.process);            }            data.quantity = scMathUtil.roundForObj(quantity,2);            if(data.quantity) data.unitPrice = scMathUtil.roundForObj(unitPrice/data.quantity,2);            data.unitIndex = gljUtil.calUnitWidthCoe(data.quantity,false,engineerFeatures,_,scMathUtil);        }        return datas;    },    getQuantityDatas:function (engineerFeatures,mainQuantities,billsList,fixedFlag,_,scMathUtil,decimal) {//主要工程量指标        let datas = [];        let [bills,totalFee] = gljUtil.getIndexBills(billsList,fixedFlag,_,scMathUtil,decimal);//bills,fixedFlag,_,scMathUtil        let billsGroup = _.groupBy(bills,'quantityIndexType');        if(!mainQuantities) return datas;        for(let m of mainQuantities){            let tem = {                name : m.name,                quantityIndexUnit:m.unit,                exportName:m.exportName,                quantity:0            };            if(billsGroup[m.name]) setQuantities(billsGroup[m.name],tem);            datas.push(tem);        }        function setQuantities(items,data) {            let quantity = 0;            for (let i of items){                let coe = i.quantityIndexCoe && i.quantityIndexCoe!=""?parseFloat(i.quantityIndexCoe):0;                i.quantity = scMathUtil.roundForObj(parseFloat(i.quantity)*coe,decimal.process);                quantity = scMathUtil.roundForObj(quantity +  i.quantity,decimal.process);            }            data.quantity = gljUtil.calUnitWidthCoe(quantity,false,engineerFeatures,_,scMathUtil);        }        return datas;    },    getTenderPriceCoe : function(glj,tproperty){        let tenderCoe = 1;        let property = tproperty?tproperty:projectObj.project.property;        if (!glj.is_adjust_price&&property.tenderSetting && isDef(property.tenderSetting.gljPriceTenderCoe) ){            tenderCoe = parseFloat(property.tenderSetting.gljPriceTenderCoe);            if (tenderCoe == 0) tenderCoe = 1;        }        return tenderCoe;        function isDef (v) {            return v !== undefined && v !== null;        }    },    setProperty:function(Obj,updateData) {        for(let ukey in updateData){            if(_.isObject(updateData[ukey]) && _.isObject(Obj[ukey])&&!_.isArray(updateData[ukey])){                setProperty(Obj[ukey],updateData[ukey]);            }else {                Obj[ukey] = updateData[ukey];            }        }    },    sortProjectGLJ:function(jsonData) {      if (jsonData.length > 0) {          jsonData = _.sortByAll(jsonData, [function (item) {            let unit_price = item.unit_price?item.unit_price:item;            return _.indexOf(gljTypeSeq,unit_price.type);          }, 'code']);      }      return jsonData  },    fixedFlag : {        // 分部分项工程        SUB_ENGINERRING: 1,        // 措施项目        MEASURE: 2,        // 施工技术措施项目        CONSTRUCTION_TECH: 3    },    gljType : {        LABOUR: 1,                                  // 人工        // ==============材料类型 ↓=================        GENERAL_MATERIAL: 201,                      // 普通材料        CONCRETE: 202,                              // 混凝土        MORTAR: 203,                                // 砂浆        MIX_RATIO: 204,                             // 配合比        COMMERCIAL_CONCRETE: 205,                   // 商品混凝土        COMMERCIAL_MORTAR: 206,                     // 商品砂浆        OTHER_MATERIAL: 207,                        // 其它材料        // ==============材料类型 ↑=================        // ==============机械类型 ↓=================        GENERAL_MACHINE: 301,                       // 机械台班        MACHINE_COMPOSITION: 302,                   // 机械组成物        MACHINE_LABOUR: 303,                        // 机上人工        INSTRUMENT: 304,                            // 仪器仪表        FUEL_POWER_FEE:305,                         // 燃料动力费        DEPRECIATION_FEE:306,                       // 折旧费        INSPECTION_FEE:307,                         // 检修费        MAINTENANCE:308,                            // 维护费        DISMANTLING_FREIGHT_FEE:309,                // 安拆费及场外运费        VERIFICATION_FEE:310,                       // 校验费        OTHER_FEE:311,                              // 其他费用        OTHER_MACHINE_USED:312,                     // 其他施工机具使用费        // ==============机械类型 ↑=================        MAIN_MATERIAL: 4,                           // 主材        EQUIPMENT: 5,                               // 设备        MANAGEMENT_FEE: 6,                          // 企业管理费        PROFIT: 7,                                  // 利润        GENERAL_RISK_FEE: 8                         // 一般风险费    },    extraType:[6,7,8],//一些其它的工料机类型    notEditType : [202,203,204,301,304,4],    gljKeyArray : ['code','name','specs','unit','type'],    materialKeyArray:['code','name','specs','unit'],    rationType : {        ration: 1,        volumePrice: 2,        gljRation: 3,        install:4    },    hasCompMaterial:[202, 203, 204],//有组成物的材料    hasCompMachine:[301],//有组成物的机械    machineComposition:[302,303]//可以做为机械组成物的类型}
 |