gljUtil.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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 IDarray = this.getSubdivisionAndTechBillsLeavesID(billsDatas);//分别取分部分项和技术措施项目的所有叶子清单ID
  13. let billIDs = IDarray[0],tech_billIDS = IDarray[1];
  14. for(let pglj of project_gljs ){
  15. let pg_index = this.getIndex(pglj,gljKeyArray);
  16. pglj.subdivisionQuantity = 0;
  17. pglj.techQuantity = 0;
  18. pglj.quantity = 0;
  19. let gljGroup = rationGljGroup[pglj.id]?rationGljGroup[pglj.id]:[];//定额工料机没有,有可能是定额类型的工料机
  20. let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil);
  21. pglj.subdivisionQuantity = result.subdivisionQuantity;
  22. pglj.techQuantity = result.techQuantity;
  23. pglj.quantity = result.quantity;
  24. quantityMap[pg_index] = pglj;
  25. }
  26. //计算做为组成物的消耗量
  27. for(let pkey in mixRatioMap){
  28. let mixRatioList = mixRatioMap[pkey];
  29. for(let m of mixRatioList){
  30. let m_index = gljOprObj.getIndex(m,gljKeyArray);
  31. let m_glj = quantityMap[m_index];
  32. let p_glj = quantityMap[pkey];
  33. if(m_glj&&p_glj){
  34. let quantity = scMathUtil.roundForObj(p_glj.quantity*parseFloat(m.consumption),q_decimal);
  35. let techQuantity = scMathUtil.roundForObj(p_glj.techQuantity*parseFloat(m.consumption),q_decimal);
  36. let subdivisionQuantity = scMathUtil.roundForObj(p_glj.subdivisionQuantity*parseFloat(m.consumption),q_decimal);
  37. m_glj.quantity = scMathUtil.roundForObj(m_glj.quantity+quantity,q_decimal);
  38. m_glj.techQuantity = scMathUtil.roundForObj(m_glj.techQuantity+techQuantity,q_decimal);
  39. m_glj.subdivisionQuantity = scMathUtil.roundForObj(m_glj.subdivisionQuantity+subdivisionQuantity,q_decimal);
  40. }
  41. }
  42. }
  43. },
  44. getQuantityPerGLJ : function (ration_glj_list,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil) {
  45. let result={};
  46. let quantity_sum=0;//工料机汇总消耗量
  47. let sum = 0;//分部分项总消耗量
  48. let tech_sum = 0;//技术措施总消耗量
  49. for(let rg of ration_glj_list){
  50. let tem_ration = rationMap[rg.rationID];
  51. let r_quantity = tem_ration?scMathUtil.roundForObj(tem_ration.quantity,q_decimal):0;
  52. let glj_quantity = scMathUtil.roundForObj(rg.quantity, q_decimal);
  53. if(!r_quantity){
  54. continue;
  55. }
  56. let total = scMathUtil.roundForObj(glj_quantity*r_quantity, q_decimal);
  57. quantity_sum = scMathUtil.roundForObj(quantity_sum+total,q_decimal);
  58. if(_.includes(billIDs,rg.billsItemID)){//计算分部分项
  59. sum = scMathUtil.roundForObj(sum+total,q_decimal);
  60. }
  61. if(_.includes(tech_billIDS,rg.billsItemID)){//计算技术措施项目消耗量
  62. tech_sum = scMathUtil.roundForObj(tech_sum+total,q_decimal);
  63. }
  64. }
  65. for(let ra of rations){//计算定额类型工料机的消耗量
  66. if(ra.type == rationType.gljRation&&ra.projectGLJID===pglj.id){
  67. let r_quantity = scMathUtil.roundForObj(ra.quantity,q_decimal);
  68. r_quantity = r_quantity?r_quantity:0;
  69. quantity_sum = scMathUtil.roundForObj(quantity_sum+r_quantity,q_decimal);
  70. if(_.includes(billIDs,ra.billsItemID)){//计算分部分项
  71. sum = scMathUtil.roundForObj(sum+r_quantity,q_decimal);
  72. }
  73. if(_.includes(tech_billIDS,ra.billsItemID)){//计算技术措施项目消耗量
  74. tech_sum = scMathUtil.roundForObj(tech_sum+r_quantity,q_decimal);
  75. }
  76. }
  77. }
  78. result.subdivisionQuantity = sum;
  79. result.techQuantity = tech_sum;
  80. result.quantity = quantity_sum;
  81. return result;
  82. },
  83. getSubdivisionAndTechBillsLeavesID:function (billsDatas) {//分别取分部分项和技术措施项目的所有叶子清单ID
  84. if(projectObj){//存在,说明在前端调用
  85. return [projectObj.project.Bills.getSubdivisionProjectLeavesID(),projectObj.project.Bills.getTechLeavesID()];
  86. }
  87. let parentMap ={};
  88. let subdivisionBillID = null,techBillID = null,sIDs = [],tIDS = [];
  89. for(let b of billsDatas){
  90. if(parentMap[b.ParentID]){
  91. parentMap[b.ParentID].push(b);
  92. }else {
  93. parentMap[b.ParentID]= [b];
  94. }
  95. if(this.isFlag(b)&&b.flagsIndex.fixed.flag==this.fixedFlag.SUB_ENGINERRING) {
  96. subdivisionBillID = b.ID;
  97. }
  98. if(this.isFlag(b)&&b.flagsIndex.fixed.flag==this.fixedFlag.CONSTRUCTION_TECH){
  99. techBillID = b.ID;
  100. }
  101. }
  102. getLeaveIDs(subdivisionBillID,parentMap,sIDs);
  103. getLeaveIDs(techBillID,parentMap,tIDS);
  104. return [sIDs,tIDS];
  105. function getLeaveIDs(ID,parentM,leaveIDs) {
  106. if(parentM[ID] && parentM[ID].length > 0){
  107. let children = parentM[ID];
  108. for(let c of children){
  109. if(parentM[c.ID]){
  110. getLeaveIDs(c.ID,parentM,leaveIDs);
  111. }else {
  112. leaveIDs.push(c.ID);
  113. }
  114. }
  115. }
  116. }
  117. },
  118. getGLJPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
  119. let result = {};
  120. result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
  121. if(this.calcPriceDiff(glj,calcOptions)==true){//计取价差
  122. result.basePrice = this.getBasePrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
  123. result.adjustPrice = this.getAdjustPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
  124. }else {//不计价差
  125. result.basePrice = result.marketPrice;
  126. result.adjustPrice = result.marketPrice;
  127. }
  128. return result;
  129. },
  130. getMarketPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
  131. let price_decimal = decimalObj.glj.unitPrice;
  132. let quantity_decimal = decimalObj.glj.quantity;
  133. let process_decimal = decimalObj.process;
  134. if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
  135. let p =0;
  136. for(let ratio of glj.ratio_data){
  137. let tem = _.find(projectGLJDatas.gljList,{
  138. 'code': ratio.code,
  139. 'name': ratio.name,
  140. 'specs':ratio.specs,
  141. 'type': ratio.type,
  142. 'unit': ratio.unit
  143. });
  144. if(tem){
  145. let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
  146. p+=scMathUtil.roundForObj(priceData.marketPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
  147. }
  148. }
  149. return scMathUtil.roundForObj(p,price_decimal);
  150. }else {
  151. let tem_decimal = isRadio==true?process_decimal:price_decimal;
  152. return scMathUtil.roundForObj(glj.unit_price.market_price,tem_decimal);
  153. }
  154. },
  155. getBasePrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
  156. let price_decimal = decimalObj.glj.unitPrice;
  157. let quantity_decimal = decimalObj.glj.quantity;
  158. let process_decimal = decimalObj.process;
  159. if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
  160. let p =0;
  161. for(let ratio of glj.ratio_data){
  162. let tem = _.find( projectGLJDatas.gljList,{
  163. 'code': ratio.code,
  164. 'name': ratio.name,
  165. 'specs':ratio.specs,
  166. 'type': ratio.type,
  167. 'unit': ratio.unit
  168. });
  169. if(tem){
  170. let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
  171. p+=scMathUtil.roundForObj(priceData.basePrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
  172. }
  173. }
  174. return scMathUtil.roundForObj(p,price_decimal);
  175. }else {
  176. let tem_decimal = isRadio==true?process_decimal:price_decimal;
  177. return scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal);
  178. }
  179. },
  180. getAdjustPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
  181. let decimal = decimalObj.glj.unitPrice;
  182. let quantity_decimal = decimalObj.glj.quantity;
  183. let process_decimal = decimalObj.process;
  184. let tem_decimal = isRadio==true?process_decimal:decimal;
  185. if (glj.unit_price.type == this.gljType.LABOUR || glj.unit_price.type == this.gljType.MACHINE_LABOUR) {//人工、机上人工,调整价根据定额价*调整系数计算得出。
  186. let labour = _.find(labourCoeDatas.coes,{'ID':glj.adjCoe});
  187. let coe = labour && labour.coe ? labour.coe : 1;
  188. return scMathUtil.roundTo(parseFloat(coe * scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal)), -tem_decimal);
  189. } else if (notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班,调整价根据组成物计算得出。
  190. let p =0;
  191. for(let ratio of glj.ratio_data){
  192. let tem = _.find( projectGLJDatas.gljList,{
  193. 'code': ratio.code,
  194. 'name': ratio.name,
  195. 'specs':ratio.specs,
  196. 'type': ratio.type,
  197. 'unit': ratio.unit
  198. })
  199. if(tem){
  200. let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
  201. p+=scMathUtil.roundForObj(priceData.adjustPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
  202. }
  203. }
  204. return scMathUtil.roundForObj(p,decimal);
  205. } else {//对于其他普通材料等,无调整系数,调整价=定额价。
  206. return glj.unit_price.base_price
  207. }
  208. },
  209. calcPriceDiff:function (glj,calcOptions) {
  210. if(glj.is_evaluate==1){//先按是否暂估判断
  211. return calcOptions.calc_est;
  212. }
  213. if(glj.type==gljType.MAIN_MATERIAL||glj.type==gljType.EQUIPMENT){//再判断是否是主材和设备
  214. return calcOptions.calc_main;
  215. }
  216. if(glj.unit_price.is_add==1){//再判断是否新增
  217. return calcOptions.calc_add;
  218. }
  219. return true;
  220. },
  221. isFlag : function (v) {
  222. return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed) && this.isDef(v.flagsIndex.fixed.flag);
  223. }
  224. ,
  225. isDef:function (v) {
  226. return v !== undefined && v !== null;
  227. },
  228. getIndex(obj, pops){
  229. let t_index = '';
  230. let k_arr = [];
  231. for (let p of pops) {
  232. let tmpK = (obj[p] == undefined || obj[p] == null || obj[p] == '') ? 'null' : obj[p];
  233. k_arr.push(tmpK);
  234. }
  235. t_index = k_arr.join("|-|");
  236. return t_index;
  237. },
  238. fixedFlag : {
  239. // 分部分项工程
  240. SUB_ENGINERRING: 1,
  241. // 措施项目
  242. MEASURE: 2,
  243. // 施工技术措施项目
  244. CONSTRUCTION_TECH: 3
  245. },
  246. gljType : {
  247. // 人工
  248. LABOUR: 1,
  249. // ==============材料类型=================
  250. // 普通材料
  251. GENERAL_MATERIAL: 201,
  252. // 混凝土
  253. CONCRETE: 202,
  254. // 砂浆
  255. MORTAR: 203,
  256. // 配合比
  257. MIX_RATIO: 204,
  258. // 商品混凝土
  259. COMMERCIAL_CONCRETE: 205,
  260. // 商品砂浆
  261. COMMERCIAL_MORTAR: 206,
  262. // ==============材料类型=================
  263. // ==============机械类型=================
  264. // 机械台班
  265. GENERAL_MACHINE: 301,
  266. // 机械组成物
  267. MACHINE_COMPOSITION: 302,
  268. // 机上人工
  269. MACHINE_LABOUR: 303,
  270. // ==============机械类型=================
  271. // 主材
  272. MAIN_MATERIAL: 4,
  273. // 设备
  274. EQUIPMENT: 5
  275. },
  276. notEditType : [202, 203,204, 301, 4],
  277. }