/** * Created by zhang on 2018/6/7. */ let gljUtil = { calcProjectGLJQuantity:function (projectGLJDatas,rationGLJDatas,rationDatas,billsDatas,q_decimal,_,scMathUtil) { let project_gljs = projectGLJDatas.gljList; let mixRatioMap = projectGLJDatas.mixRatioMap; let rations = rationDatas; let rationMap = _.indexBy(rations,'ID'); let quantityMap={},changeArray=[]; let rationGljGroup = _.groupBy(rationGLJDatas,'projectGLJID'); let [billIDs,tech_billIDS] = this.getSubdivisionAndTechBillsLeavesID(billsDatas);//分别取分部分项和技术措施项目的所有叶子清单ID for(let pglj of project_gljs ){ let pg_index = this.getIndex(pglj,gljKeyArray); pglj.subdivisionQuantity = 0; pglj.techQuantity = 0; pglj.quantity = 0; let gljGroup = rationGljGroup[pglj.id]?rationGljGroup[pglj.id]:[];//定额工料机没有,有可能是定额类型的工料机 let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil); pglj.subdivisionQuantity = result.subdivisionQuantity; pglj.techQuantity = result.techQuantity; pglj.quantity = result.quantity; quantityMap[pg_index] = pglj; } //计算做为组成物的消耗量 for(let pkey in mixRatioMap){ let mixRatioList = mixRatioMap[pkey]; for(let m of mixRatioList){ let m_index = gljOprObj.getIndex(m,gljKeyArray); let m_glj = quantityMap[m_index]; let p_glj = quantityMap[pkey]; if(m_glj&&p_glj){ let quantity = scMathUtil.roundForObj(p_glj.quantity*parseFloat(m.consumption),q_decimal); let techQuantity = scMathUtil.roundForObj(p_glj.techQuantity*parseFloat(m.consumption),q_decimal); let subdivisionQuantity = scMathUtil.roundForObj(p_glj.subdivisionQuantity*parseFloat(m.consumption),q_decimal); m_glj.quantity = scMathUtil.roundForObj(m_glj.quantity+quantity,q_decimal); m_glj.techQuantity = scMathUtil.roundForObj(m_glj.techQuantity+techQuantity,q_decimal); m_glj.subdivisionQuantity = scMathUtil.roundForObj(m_glj.subdivisionQuantity+subdivisionQuantity,q_decimal); } } } }, 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;//技术措施总消耗量 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); if(!r_quantity){ continue; } let total = scMathUtil.roundForObj(glj_quantity*r_quantity, q_decimal); quantity_sum = scMathUtil.roundForObj(quantity_sum+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); } } for(let ra of rations){//计算定额类型工料机的消耗量 if(ra.type == rationType.gljRation&&ra.projectGLJID===pglj.id){ let r_quantity = scMathUtil.roundForObj(ra.quantity,q_decimal); r_quantity = r_quantity?r_quantity:0; 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; return result; }, getSubdivisionAndTechBillsLeavesID:function (billsDatas) {//分别取分部分项和技术措施项目的所有叶子清单ID /* if(projectObj){//存在,说明在前端调用 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]; } if(this.isFlag(b)&&b.flagsIndex.fixed.flag==this.fixedFlag.SUB_ENGINERRING) { subdivisionBillID = b.ID; } if(this.isFlag(b)&&b.flagsIndex.fixed.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); } } } } }, 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 = []; 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; }, fixedFlag : { // 分部分项工程 SUB_ENGINERRING: 1, // 措施项目 MEASURE: 2, // 施工技术措施项目 CONSTRUCTION_TECH: 3 } }