gljUtil.js 14 KB

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