gljUtil.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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={};
  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. getGLJPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio=false,_,scMathUtil) {
  118. let result = {};
  119. result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
  120. if(this.calcPriceDiff(glj,calcOptions)==true){//计取价差
  121. result.basePrice = this.getBasePrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
  122. result.adjustPrice = this.getAdjustPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
  123. }else {//不计价差
  124. result.basePrice = result.marketPrice;
  125. result.adjustPrice = result.marketPrice;
  126. }
  127. return result;
  128. },
  129. getMarketPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
  130. let price_decimal = decimalObj.glj.unitPrice;
  131. let quantity_decimal = decimalObj.glj.quantity;
  132. let process_decimal = decimalObj.process;
  133. if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
  134. let p =0;
  135. for(let ratio of glj.ratio_data){
  136. let tem = _.find(projectGLJDatas.gljList,{
  137. 'code': ratio.code,
  138. 'name': ratio.name,
  139. 'specs':ratio.specs,
  140. 'type': ratio.type,
  141. 'unit': ratio.unit
  142. });
  143. if(tem){
  144. let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
  145. p+=scMathUtil.roundForObj(priceData.marketPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
  146. }
  147. }
  148. return scMathUtil.roundForObj(p,price_decimal);
  149. }else {
  150. let tem_decimal = isRadio==true?process_decimal:price_decimal;
  151. return scMathUtil.roundForObj(glj.unit_price.market_price,tem_decimal);
  152. }
  153. },
  154. getBasePrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
  155. let price_decimal = decimalObj.glj.unitPrice;
  156. let quantity_decimal = decimalObj.glj.quantity;
  157. let process_decimal = decimalObj.process;
  158. if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
  159. let p =0;
  160. for(let ratio of glj.ratio_data){
  161. let tem = _.find( projectGLJDatas.gljList,{
  162. 'code': ratio.code,
  163. 'name': ratio.name,
  164. 'specs':ratio.specs,
  165. 'type': ratio.type,
  166. 'unit': ratio.unit
  167. });
  168. if(tem){
  169. let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
  170. p+=scMathUtil.roundForObj(priceData.basePrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
  171. }
  172. }
  173. return scMathUtil.roundForObj(p,price_decimal);
  174. }else {
  175. let tem_decimal = isRadio==true?process_decimal:price_decimal;
  176. return scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal);
  177. }
  178. },
  179. getAdjustPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio=false,_,scMathUtil) {
  180. let decimal = decimalObj.glj.unitPrice;
  181. let quantity_decimal = decimalObj.glj.quantity;
  182. let process_decimal = decimalObj.process;
  183. let tem_decimal = isRadio==true?process_decimal:decimal;
  184. if (glj.unit_price.type == this.gljType.LABOUR || glj.unit_price.type == this.gljType.MACHINE_LABOUR) {//人工、机上人工,调整价根据定额价*调整系数计算得出。
  185. let labour = _.find(labourCoeDatas.coes,{'ID':glj.adjCoe});
  186. let coe = labour && labour.coe ? labour.coe : 1;
  187. return scMathUtil.roundTo(parseFloat(coe * scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal)), -tem_decimal);
  188. } else if (notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班,调整价根据组成物计算得出。
  189. let p =0;
  190. for(let ratio of glj.ratio_data){
  191. let tem = _.find( projectGLJDatas.gljList,{
  192. 'code': ratio.code,
  193. 'name': ratio.name,
  194. 'specs':ratio.specs,
  195. 'type': ratio.type,
  196. 'unit': ratio.unit
  197. })
  198. if(tem){
  199. let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
  200. p+=scMathUtil.roundForObj(priceData.adjustPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
  201. }
  202. }
  203. return scMathUtil.roundForObj(p,decimal);
  204. } else {//对于其他普通材料等,无调整系数,调整价=定额价。
  205. return glj.unit_price.base_price
  206. }
  207. },
  208. calcPriceDiff:function (glj,calcOptions) {
  209. if(glj.is_evaluate==1){//先按是否暂估判断
  210. return calcOptions.calc_est;
  211. }
  212. if(glj.type==gljType.MAIN_MATERIAL||glj.type==gljType.EQUIPMENT){//再判断是否是主材和设备
  213. return calcOptions.calc_main;
  214. }
  215. if(glj.unit_price.is_add==1){//再判断是否新增
  216. return calcOptions.calc_add;
  217. }
  218. return true;
  219. },
  220. isFlag : function (v) {
  221. return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed) && this.isDef(v.flagsIndex.fixed.flag);
  222. }
  223. ,
  224. isDef:function (v) {
  225. return v !== undefined && v !== null;
  226. },
  227. getIndex(obj, pops){
  228. let t_index = '';
  229. let k_arr = [];
  230. for (let p of pops) {
  231. let tmpK = (obj[p] == undefined || obj[p] == null || obj[p] == '') ? 'null' : obj[p];
  232. k_arr.push(tmpK);
  233. }
  234. t_index = k_arr.join("|-|");
  235. return t_index;
  236. },
  237. fixedFlag : {
  238. // 分部分项工程
  239. SUB_ENGINERRING: 1,
  240. // 措施项目
  241. MEASURE: 2,
  242. // 施工技术措施项目
  243. CONSTRUCTION_TECH: 3
  244. },
  245. gljType : {
  246. // 人工
  247. LABOUR: 1,
  248. // ==============材料类型=================
  249. // 普通材料
  250. GENERAL_MATERIAL: 201,
  251. // 混凝土
  252. CONCRETE: 202,
  253. // 砂浆
  254. MORTAR: 203,
  255. // 配合比
  256. MIX_RATIO: 204,
  257. // 商品混凝土
  258. COMMERCIAL_CONCRETE: 205,
  259. // 商品砂浆
  260. COMMERCIAL_MORTAR: 206,
  261. // ==============材料类型=================
  262. // ==============机械类型=================
  263. // 机械台班
  264. GENERAL_MACHINE: 301,
  265. // 机械组成物
  266. MACHINE_COMPOSITION: 302,
  267. // 机上人工
  268. MACHINE_LABOUR: 303,
  269. // ==============机械类型=================
  270. // 主材
  271. MAIN_MATERIAL: 4,
  272. // 设备
  273. EQUIPMENT: 5
  274. },
  275. notEditType : [202, 203,204, 301, 4],
  276. }