gljUtil.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. * Created by zhang on 2018/6/7.
  3. */
  4. let gljUtil = {
  5. calcProjectGLJQuantity:function (projectGLJDatas,rationGLJDatas,rationDatas,billsDatas,q_decimal,_,scMathUtil) {
  6. let project_gljs = projectGLJDatas.gljList;
  7. let mixRatioMap = projectGLJDatas.mixRatioMap;
  8. let rations = rationDatas;
  9. let rationMap = _.indexBy(rations,'ID');
  10. let quantityMap={},changeArray=[];
  11. let rationGljGroup = _.groupBy(rationGLJDatas,'projectGLJID');
  12. let [billIDs,tech_billIDS] = this.getSubdivisionAndTechBillsLeavesID(billsDatas);//分别取分部分项和技术措施项目的所有叶子清单ID
  13. for(let pglj of project_gljs ){
  14. let pg_index = this.getIndex(pglj,gljKeyArray);
  15. pglj.subdivisionQuantity = 0;
  16. pglj.techQuantity = 0;
  17. pglj.quantity = 0;
  18. let gljGroup = rationGljGroup[pglj.id]?rationGljGroup[pglj.id]:[];//定额工料机没有,有可能是定额类型的工料机
  19. let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil);
  20. pglj.subdivisionQuantity = result.subdivisionQuantity;
  21. pglj.techQuantity = result.techQuantity;
  22. pglj.quantity = result.quantity;
  23. quantityMap[pg_index] = pglj;
  24. }
  25. //计算做为组成物的消耗量
  26. for(let pkey in mixRatioMap){
  27. let mixRatioList = mixRatioMap[pkey];
  28. for(let m of mixRatioList){
  29. let m_index = gljOprObj.getIndex(m,gljKeyArray);
  30. let m_glj = quantityMap[m_index];
  31. let p_glj = quantityMap[pkey];
  32. if(m_glj&&p_glj){
  33. let quantity = scMathUtil.roundForObj(p_glj.quantity*parseFloat(m.consumption),q_decimal);
  34. let techQuantity = scMathUtil.roundForObj(p_glj.techQuantity*parseFloat(m.consumption),q_decimal);
  35. let subdivisionQuantity = scMathUtil.roundForObj(p_glj.subdivisionQuantity*parseFloat(m.consumption),q_decimal);
  36. m_glj.quantity = scMathUtil.roundForObj(m_glj.quantity+quantity,q_decimal);
  37. m_glj.techQuantity = scMathUtil.roundForObj(m_glj.techQuantity+techQuantity,q_decimal);
  38. m_glj.subdivisionQuantity = scMathUtil.roundForObj(m_glj.subdivisionQuantity+subdivisionQuantity,q_decimal);
  39. }
  40. }
  41. }
  42. },
  43. getQuantityPerGLJ : function (ration_glj_list,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil) {
  44. let result={};
  45. let quantity_sum=0;//工料机汇总消耗量
  46. let sum = 0;//分部分项总消耗量
  47. let tech_sum = 0;//技术措施总消耗量
  48. for(let rg of ration_glj_list){
  49. let tem_ration = rationMap[rg.rationID];
  50. let r_quantity = tem_ration?scMathUtil.roundForObj(tem_ration.quantity,q_decimal):0;
  51. let glj_quantity = scMathUtil.roundForObj(rg.quantity, q_decimal);
  52. if(!r_quantity){
  53. continue;
  54. }
  55. let total = scMathUtil.roundForObj(glj_quantity*r_quantity, q_decimal);
  56. quantity_sum = scMathUtil.roundForObj(quantity_sum+total,q_decimal);
  57. if(_.includes(billIDs,rg.billsItemID)){//计算分部分项
  58. sum = scMathUtil.roundForObj(sum+total,q_decimal);
  59. }
  60. if(_.includes(tech_billIDS,rg.billsItemID)){//计算技术措施项目消耗量
  61. tech_sum = scMathUtil.roundForObj(tech_sum+total,q_decimal);
  62. }
  63. }
  64. for(let ra of rations){//计算定额类型工料机的消耗量
  65. if(ra.type == rationType.gljRation&&ra.projectGLJID===pglj.id){
  66. let r_quantity = scMathUtil.roundForObj(ra.quantity,q_decimal);
  67. r_quantity = r_quantity?r_quantity:0;
  68. quantity_sum = scMathUtil.roundForObj(quantity_sum+r_quantity,q_decimal);
  69. if(_.includes(billIDs,ra.billsItemID)){//计算分部分项
  70. sum = scMathUtil.roundForObj(sum+r_quantity,q_decimal);
  71. }
  72. if(_.includes(tech_billIDS,ra.billsItemID)){//计算技术措施项目消耗量
  73. tech_sum = scMathUtil.roundForObj(tech_sum+r_quantity,q_decimal);
  74. }
  75. }
  76. }
  77. result.subdivisionQuantity = sum;
  78. result.techQuantity = tech_sum;
  79. result.quantity = quantity_sum;
  80. return result;
  81. },
  82. getSubdivisionAndTechBillsLeavesID:function (billsDatas) {//分别取分部分项和技术措施项目的所有叶子清单ID
  83. /* if(projectObj){//存在,说明在前端调用
  84. return [projectObj.project.Bills.getSubdivisionProjectLeavesID(),projectObj.project.Bills.getTechLeavesID()];
  85. }*/
  86. let parentMap ={};
  87. let subdivisionBillID = null,techBillID = null,sIDs = [],tIDS = [];
  88. for(let b of billsDatas){
  89. if(parentMap[b.ParentID]){
  90. parentMap[b.ParentID].push(b);
  91. }else {
  92. parentMap[b.ParentID]= [b];
  93. }
  94. if(this.isFlag(b)&&b.flagsIndex.fixed.flag==this.fixedFlag.SUB_ENGINERRING) {
  95. subdivisionBillID = b.ID;
  96. }
  97. if(this.isFlag(b)&&b.flagsIndex.fixed.flag==this.fixedFlag.CONSTRUCTION_TECH){
  98. techBillID = b.ID;
  99. }
  100. }
  101. getLeaveIDs(subdivisionBillID,parentMap,sIDs);
  102. getLeaveIDs(techBillID,parentMap,tIDS);
  103. return [sIDs,tIDS];
  104. function getLeaveIDs(ID,parentM,leaveIDs) {
  105. if(parentM[ID] && parentM[ID].length > 0){
  106. let children = parentM[ID];
  107. for(let c of children){
  108. if(parentM[c.ID]){
  109. getLeaveIDs(c.ID,parentM,leaveIDs);
  110. }else {
  111. leaveIDs.push(c.ID);
  112. }
  113. }
  114. }
  115. }
  116. },
  117. isFlag : function (v) {
  118. return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed) && this.isDef(v.flagsIndex.fixed.flag);
  119. }
  120. ,
  121. isDef:function (v) {
  122. return v !== undefined && v !== null;
  123. },
  124. getIndex(obj, pops){
  125. let t_index = '';
  126. let k_arr = [];
  127. for (let p of pops) {
  128. let tmpK = (obj[p] == undefined || obj[p] == null || obj[p] == '') ? 'null' : obj[p];
  129. k_arr.push(tmpK);
  130. }
  131. t_index = k_arr.join("|-|");
  132. return t_index;
  133. },
  134. fixedFlag : {
  135. // 分部分项工程
  136. SUB_ENGINERRING: 1,
  137. // 措施项目
  138. MEASURE: 2,
  139. // 施工技术措施项目
  140. CONSTRUCTION_TECH: 3
  141. }
  142. }