|
|
@@ -4,7 +4,7 @@
|
|
|
|
|
|
|
|
|
let gljUtil = {
|
|
|
- calcProjectGLJQuantity:function (projectGLJDatas,rationGLJDatas,rationDatas,billsDatas,q_decimal,_,scMathUtil,isTender) {
|
|
|
+ calcProjectGLJQuantity:function (projectGLJDatas,rationGLJDatas,rationDatas,billsDatas,q_decimal,_,scMathUtil,isReport) {
|
|
|
let project_gljs = projectGLJDatas.gljList, mixRatioMap = projectGLJDatas.mixRatioMap, com_electrovalence = projectGLJDatas.com_electrovalence;
|
|
|
let rations = rationDatas;
|
|
|
let rationMap = _.indexBy(rations,'ID');
|
|
|
@@ -15,7 +15,7 @@ let gljUtil = {
|
|
|
let materialCalcMap={};
|
|
|
//养护没有分部分项消耗量这一说的所以不用管
|
|
|
|
|
|
- let qField = isTender==true?"tenderQuantity":"quantity";
|
|
|
+ let qField = "quantity";
|
|
|
let mField = "materialQuantity"; //材料计算的工料机消耗量
|
|
|
|
|
|
let elecIndex = "";//记住电的标识
|
|
|
@@ -26,8 +26,9 @@ let gljUtil = {
|
|
|
pglj[qField] = 0;
|
|
|
pglj[mField] = 0;
|
|
|
let gljGroup = rationGljGroup[pglj.id]?rationGljGroup[pglj.id]:[];//定额工料机没有,有可能是定额类型的工料机
|
|
|
- let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil,isTender);
|
|
|
+ let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil);
|
|
|
pglj[qField] = result.quantity;
|
|
|
+ pglj.tenderQuantity = result.tenderQuantity;
|
|
|
quantityMap[pg_index] = pglj;
|
|
|
if(pglj.code == gljUtil.getElecCode() && pglj.name == '电' && pglj.unit == "kW·h") elecIndex = pg_index;
|
|
|
if(pglj.unit_price.calcMaterial == 1) materialCalcMap[pg_index] = true;
|
|
|
@@ -41,7 +42,9 @@ let gljUtil = {
|
|
|
let p_glj = quantityMap[pkey];
|
|
|
if(m_glj&&p_glj&&!gljUtil.isConcreteType(p_glj.type) ){//混凝土、砂浆、配合比组成物的消耗量在定额下已经有体现了,不用再计算进去
|
|
|
let quantity = scMathUtil.roundForObj(parseFloat(p_glj[qField])*parseFloat(m.consumption),q_decimal);
|
|
|
+ let tenderQuantity = scMathUtil.roundForObj(parseFloat(p_glj.tenderQuantity)*parseFloat(m.consumption),q_decimal);
|
|
|
m_glj[qField] = scMathUtil.roundForObj(parseFloat(m_glj[qField])+quantity,q_decimal);
|
|
|
+ m_glj.tenderQuantity = scMathUtil.roundForObj(parseFloat(m_glj.tenderQuantity)+tenderQuantity,q_decimal);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -53,17 +56,21 @@ let gljUtil = {
|
|
|
offSiteTransportLossRate = offSiteTransportLossRate/100;
|
|
|
pglj.transportLossQuantity = scMathUtil.roundForObj(pglj.quantity*offSiteTransportLossRate,q_decimal);
|
|
|
pglj.quantity = scMathUtil.roundForObj(pglj.quantity + pglj.transportLossQuantity ,q_decimal);
|
|
|
+ pglj.tenderTransportLossQuantity = scMathUtil.roundForObj(pglj.tenderQuantity*offSiteTransportLossRate,q_decimal);
|
|
|
+ pglj.tenderQuantity = scMathUtil.roundForObj(pglj.tenderQuantity + pglj.tenderTransportLossQuantity ,q_decimal);
|
|
|
+ if (isReport)
|
|
|
+ pglj.quantity = pglj.tenderQuantity;
|
|
|
}
|
|
|
//材料计算中,工料机的消耗量
|
|
|
|
|
|
//材料计算中,有可能A包含B,B包含C。。。。。等情况,为避免循环计算,只多计算一次,不做再深的嵌套处理
|
|
|
// 1.先计算做为父工料机的材料计算消耗量
|
|
|
- if(projectGLJDatas.freightList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,true,projectGLJDatas.freightList,q_decimal,_,scMathUtil,isTender); //运费计算中工料机的消耗量
|
|
|
- if(projectGLJDatas.originalList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,true,projectGLJDatas.originalList,q_decimal,_,scMathUtil,isTender);//原价计算中工料机的消耗量
|
|
|
+ if(projectGLJDatas.freightList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,true,projectGLJDatas.freightList,q_decimal,_,scMathUtil); //运费计算中工料机的消耗量
|
|
|
+ if(projectGLJDatas.originalList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,true,projectGLJDatas.originalList,q_decimal,_,scMathUtil);//原价计算中工料机的消耗量
|
|
|
|
|
|
// 2.再计算做为子工料机的材料计算消耗量
|
|
|
- if(projectGLJDatas.freightList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,false,projectGLJDatas.freightList,q_decimal,_,scMathUtil,isTender); //运费计算中工料机的消耗量
|
|
|
- if(projectGLJDatas.originalList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,false,projectGLJDatas.originalList,q_decimal,_,scMathUtil,isTender);//原价计算中工料机的消耗量
|
|
|
+ if(projectGLJDatas.freightList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,false,projectGLJDatas.freightList,q_decimal,_,scMathUtil); //运费计算中工料机的消耗量
|
|
|
+ if(projectGLJDatas.originalList) this.setMaterialCalcQuantity(quantityMap,materialCalcMap,false,projectGLJDatas.originalList,q_decimal,_,scMathUtil);//原价计算中工料机的消耗量
|
|
|
|
|
|
|
|
|
//因为材料计算里自采材料产生的消耗量和进行材料计算的父工料机的消耗量有关,所以材料计算中的组成物的消耗量要在上一步的组成物计算完后,再计算自采材料里组成物的消耗量,所认两个组成物计算不能合并,而且乘的值也不同
|
|
|
@@ -110,8 +117,9 @@ let gljUtil = {
|
|
|
}
|
|
|
|
|
|
},
|
|
|
- setMaterialCalcQuantity:function (quantityMap,materialCalcMap,isParent,calcList,q_decimal,_,scMathUtil,isTender) {
|
|
|
- let qField = isTender==true?"tenderQuantity":"quantity";
|
|
|
+ setMaterialCalcQuantity:function (quantityMap,materialCalcMap,isParent,calcList,q_decimal,_,scMathUtil) {
|
|
|
+ let qField = "quantity";
|
|
|
+ // let qField = isTender==true?"tenderQuantity":"quantity";
|
|
|
for(let t of calcList){
|
|
|
if(quantityMap[t.connect_key] && quantityMap[t.connect_key][qField] > 0){
|
|
|
let rationIDMap = _.indexBy(t.rations,"ID");
|
|
|
@@ -158,34 +166,42 @@ let gljUtil = {
|
|
|
// 场外运输损耗率%+(装卸总次数-1)*每增加一次装卸损耗率%
|
|
|
return (offSiteTransportLossRate + (totalLoadingTimes - 1) * handlingLossRate);
|
|
|
},
|
|
|
- getQuantityPerGLJ : function (ration_glj_list,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil,isTender) {
|
|
|
+ getQuantityPerGLJ : function (ration_glj_list,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil) {
|
|
|
let result={};
|
|
|
let quantity_sum=0;//工料机汇总消耗量
|
|
|
+ let tender_qantity_sum = 0;
|
|
|
for(let rg of ration_glj_list){
|
|
|
let tem_ration = rationMap[rg.rationID];
|
|
|
let r_quantity = tem_ration?scMathUtil.roundForObj(tem_ration.quantity,q_decimal):0;
|
|
|
let glj_quantity = scMathUtil.roundForObj(rg.quantity, q_decimal);
|
|
|
+ let tender_r_quantity = r_quantity;
|
|
|
+ let tender_glj_quantity = glj_quantity;
|
|
|
if(!r_quantity){
|
|
|
continue;
|
|
|
}
|
|
|
- if(isTender == true){
|
|
|
- glj_quantity = this.getRationGLJTenderQuantity(rg,tem_ration,q_decimal,scMathUtil);
|
|
|
- r_quantity = this.getRationTenderQuantity(tem_ration,q_decimal,scMathUtil);
|
|
|
+ if(!pglj.is_adjust_price){
|
|
|
+ tender_glj_quantity = this.getRationGLJTenderQuantity(rg,tem_ration,q_decimal,scMathUtil);
|
|
|
+ tender_r_quantity = this.getRationTenderQuantity(tem_ration,q_decimal,scMathUtil);
|
|
|
}
|
|
|
let total = scMathUtil.roundForObj(glj_quantity*r_quantity, q_decimal);
|
|
|
+ let tender_total = scMathUtil.roundForObj(tender_glj_quantity*tender_r_quantity, q_decimal);
|
|
|
quantity_sum = scMathUtil.roundForObj(quantity_sum+total,q_decimal);
|
|
|
+ tender_qantity_sum = scMathUtil.roundForObj(tender_qantity_sum+tender_total,q_decimal);
|
|
|
}
|
|
|
for(let ra of rations){//计算定额类型工料机的消耗量
|
|
|
if(ra.type == this.rationType.gljRation&&ra.projectGLJID===pglj.id){
|
|
|
let r_quantity = scMathUtil.roundForObj(ra.quantity,q_decimal);
|
|
|
r_quantity = r_quantity?r_quantity:0;
|
|
|
- if(isTender == true){
|
|
|
- r_quantity = this.getRationTenderQuantity(ra,q_decimal,scMathUtil);
|
|
|
+ let tender_r_quantity = r_quantity;
|
|
|
+ if(!pglj.is_adjust_price){
|
|
|
+ tender_r_quantity = this.getRationTenderQuantity(ra,q_decimal,scMathUtil);
|
|
|
}
|
|
|
quantity_sum = scMathUtil.roundForObj(quantity_sum+r_quantity,q_decimal);
|
|
|
+ tender_qantity_sum = scMathUtil.roundForObj(tender_qantity_sum+tender_r_quantity,q_decimal);
|
|
|
}
|
|
|
}
|
|
|
result.quantity = quantity_sum;
|
|
|
+ result.tenderQuantity = tender_qantity_sum;
|
|
|
return result;
|
|
|
},
|
|
|
getRationGLJTenderQuantity:function (ration_glj,ration,q_decimal,scMathUtil) {
|
|
|
@@ -199,18 +215,22 @@ let gljUtil = {
|
|
|
let typeString = ration_glj.type +"";
|
|
|
let coeField = "";
|
|
|
for(let key in coeMap){
|
|
|
- if(typeString.indexOf(key)!= -1){
|
|
|
- coeField = coeMap[key];
|
|
|
+ if(typeString.indexOf(key) == 0){
|
|
|
+ coeField = coeMap[key];
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
- let coe = ration.quantityCoe&&this.isNotEmpty(ration.quantityCoe[coeField])?ration.quantityCoe[coeField]:1;
|
|
|
+ let coe = 1;
|
|
|
+ coe = ration.quantityCoe&&this.isNotEmpty(ration.quantityCoe[coeField])?ration.quantityCoe[coeField]:1;
|
|
|
coe = parseFloat(coe);
|
|
|
+ if (coe == 0) coe = 1;
|
|
|
let glj_quantity = scMathUtil.roundForObj(ration_glj.quantity, q_decimal);
|
|
|
return scMathUtil.roundForObj(glj_quantity * coe,q_decimal);
|
|
|
},
|
|
|
getRationTenderQuantity:function (ration,q_decimal,scMathUtil) {
|
|
|
let rationQuantityCoe = this.isNotEmpty(ration.rationQuantityCoe)?ration.rationQuantityCoe:1;
|
|
|
rationQuantityCoe = parseFloat(rationQuantityCoe);
|
|
|
+ if (rationQuantityCoe == 0) rationQuantityCoe = 1;
|
|
|
let r_quantity = ration?scMathUtil.roundForObj(ration.quantity,q_decimal):0;
|
|
|
return scMathUtil.roundForObj(r_quantity * rationQuantityCoe,q_decimal);
|
|
|
},
|
|
|
@@ -258,9 +278,14 @@ let gljUtil = {
|
|
|
getFlag:function (b) {
|
|
|
return _.find(b.flags,{"fieldName":"fixed"});
|
|
|
},
|
|
|
- getGLJPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,ext) {
|
|
|
+ getGLJPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,ext,tenderCoe, isReport) {
|
|
|
let result = {};
|
|
|
- result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,null,ext);
|
|
|
+ if(isReport){
|
|
|
+ result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe,ext);
|
|
|
+ }else {
|
|
|
+ result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
|
|
|
+ result.tenderPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe);
|
|
|
+ }
|
|
|
if(this.calcPriceDiff(glj,calcOptions)==true){//计取价差
|
|
|
result.basePrice = this.getBasePrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
|
|
|
result.adjustPrice = this.getAdjustPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
|
|
|
@@ -277,6 +302,8 @@ let gljUtil = {
|
|
|
let quantity_decimal = decimalObj.glj.quantity;
|
|
|
let process_decimal = decimalObj.process;
|
|
|
let priceCoe = this.isDef(tenderCoe)?tenderCoe:1;
|
|
|
+ if (priceCoe == '0' || priceCoe == 0) priceCoe = 1; // 这里加个保护
|
|
|
+ if (['GLF', 'LR', 'FXF'].includes(glj.code)) priceCoe = 1; // 类型是“企业管理费”、“利润”、“一般风险费”的,不应调整单价。
|
|
|
if (!this.isConcreteType(glj.unit_price.type)&& this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于机械台班等有组成物的材料,价格需根据组成物计算得出(排除混凝土、配合比、砂浆这几个类型直接为0)。
|
|
|
let p =0;
|
|
|
for(let ratio of glj.ratio_data){
|
|
|
@@ -285,12 +312,15 @@ let gljUtil = {
|
|
|
return rIndex == gljUtil.getIndex(item);
|
|
|
});
|
|
|
if(tem){
|
|
|
- let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
|
|
|
+ let tem_marketPrice = this.getMarketPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
|
|
|
if(ext && ext[tem.id] && this.isDef(ext[tem.id].marketPrice)){//在修改组成物的价格或消耗量时,影响了父工料机的价格,这时以父工料机的价格应当用组成物的新值来记算
|
|
|
- priceData.marketPrice = ext[tem.id].marketPrice;
|
|
|
- }
|
|
|
- let temP = scMathUtil.roundForObj(priceData.marketPrice* priceCoe * scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
|
|
|
- p = scMathUtil.roundForObj(temP + p,process_decimal);
|
|
|
+ tem_marketPrice = ext[tem.id].marketPrice;
|
|
|
+ };
|
|
|
+
|
|
|
+ let temP = scMathUtil.roundForObj(
|
|
|
+ scMathUtil.roundForObj(tem_marketPrice * priceCoe, price_decimal) *
|
|
|
+ scMathUtil.roundForObj(ratio.consumption,quantity_decimal), process_decimal);
|
|
|
+ p = scMathUtil.roundForObj(temP + p, process_decimal);
|
|
|
}
|
|
|
}
|
|
|
return scMathUtil.roundForObj(p,price_hasM_decimal);
|
|
|
@@ -308,22 +338,22 @@ let gljUtil = {
|
|
|
|
|
|
if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
|
|
|
//2018-09-07 需求修改,定额价不按组成物的量和价实时计算出来,直接取单价文件中的定额价
|
|
|
- /* let p =0;
|
|
|
- for(let ratio of glj.ratio_data){
|
|
|
- let tem = _.find( projectGLJDatas.gljList,{
|
|
|
- 'code': ratio.code,
|
|
|
- 'name': ratio.name,
|
|
|
- 'specs':ratio.specs,
|
|
|
- 'type': ratio.type,
|
|
|
- 'unit': ratio.unit
|
|
|
- });
|
|
|
- if(tem){
|
|
|
- let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
|
|
|
- let temP = scMathUtil.roundForObj(priceData.basePrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
|
|
|
- p = scMathUtil.roundForObj(temP + p,process_decimal);
|
|
|
- }
|
|
|
- }
|
|
|
- return scMathUtil.roundForObj(p,price_hasM_decimal);*/
|
|
|
+ /* let p =0;
|
|
|
+ for(let ratio of glj.ratio_data){
|
|
|
+ let tem = _.find( projectGLJDatas.gljList,{
|
|
|
+ 'code': ratio.code,
|
|
|
+ 'name': ratio.name,
|
|
|
+ 'specs':ratio.specs,
|
|
|
+ 'type': ratio.type,
|
|
|
+ 'unit': ratio.unit
|
|
|
+ });
|
|
|
+ if(tem){
|
|
|
+ let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
|
|
|
+ let temP = scMathUtil.roundForObj(priceData.basePrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
|
|
|
+ p = scMathUtil.roundForObj(temP + p,process_decimal);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return scMathUtil.roundForObj(p,price_hasM_decimal);*/
|
|
|
|
|
|
return scMathUtil.roundForObj(glj.unit_price.base_price,price_hasM_decimal);
|
|
|
}else {
|
|
|
@@ -468,6 +498,8 @@ let gljUtil = {
|
|
|
quantity = (quantity == 0 || quantity == undefined || quantity == null || quantity == "") ? 0 : quantity;
|
|
|
quantity = scMathUtil.roundForObj(quantity, rd);//计算前进行4舍5入
|
|
|
glj.quantity = scMathUtil.roundForObj(glj.quantity, gd);
|
|
|
+ glj.tenderQuantity = this.getRationGLJTenderQuantity(glj, ration, gd, scMathUtil);
|
|
|
+
|
|
|
return scMathUtil.roundToString(quantity * glj.quantity, gd);
|
|
|
}
|
|
|
},
|
|
|
@@ -517,6 +549,19 @@ let gljUtil = {
|
|
|
getElecCode:function () {
|
|
|
return '3005002';
|
|
|
},
|
|
|
+ getTenderPriceCoe : function(glj,tproperty){
|
|
|
+ let tenderCoe = 1;
|
|
|
+ let property = tproperty?tproperty:projectObj.project.property;
|
|
|
+ if (!glj.is_adjust_price&&property.tenderSetting && isDef(property.tenderSetting.gljPriceTenderCoe) ){
|
|
|
+ tenderCoe = parseFloat(property.tenderSetting.gljPriceTenderCoe);
|
|
|
+ if (tenderCoe == 0) tenderCoe = 1;
|
|
|
+ }
|
|
|
+ return tenderCoe;
|
|
|
+
|
|
|
+ function isDef (v) {
|
|
|
+ return v !== undefined && v !== null;
|
|
|
+ }
|
|
|
+ },
|
|
|
setProperty:function(Obj,updateData) {
|
|
|
for(let ukey in updateData){
|
|
|
if(_.isObject(updateData[ukey]) && _.isObject(Obj[ukey])&&!_.isArray(updateData[ukey])){
|