gljUtil.js 14 KB

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