|
@@ -0,0 +1,150 @@
|
|
|
|
+/**
|
|
|
|
+ * 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
|
|
|
|
+ }
|
|
|
|
+}
|