飞滴出行网约车2022-service-price价格计算优化

master
yh 3 years ago
parent 8658e53565
commit 5a0b1540d4

@ -0,0 +1,59 @@
package com.mashibing.internalcommon.util;
import java.math.BigDecimal;
public class BigDecimalUtils {
/**
*
* @param v1
* @param v2
* @return
*/
public static double add(double v1 , double v2){
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.add(b2).doubleValue();
}
/**
*
* @param v1
* @param v2
* @return
*/
public static double substract(double v1,double v2){
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.subtract(b2).doubleValue();
}
/**
*
* @param v1
* @param v2
* @return
*/
public static double multiply(double v1,double v2){
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).doubleValue();
}
/**
*
* @param v1
* @param v2
* @return
*/
public static double divide(int v1, int v2){
if (v2 <= 0){
throw new IllegalArgumentException("除数非法");
}
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}

@ -6,6 +6,7 @@ import com.mashibing.internalcommon.dto.ResponseResult;
import com.mashibing.internalcommon.request.ForecastPriceDTO; import com.mashibing.internalcommon.request.ForecastPriceDTO;
import com.mashibing.internalcommon.response.DirectionResponse; import com.mashibing.internalcommon.response.DirectionResponse;
import com.mashibing.internalcommon.response.ForecastPriceResponse; import com.mashibing.internalcommon.response.ForecastPriceResponse;
import com.mashibing.internalcommon.util.BigDecimalUtils;
import com.mashibing.serviceprice.mapper.PriceRuleMapper; import com.mashibing.serviceprice.mapper.PriceRuleMapper;
import com.mashibing.serviceprice.remote.ServiceMapClient; import com.mashibing.serviceprice.remote.ServiceMapClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -81,44 +82,40 @@ public class ForecastPriceService {
* @param priceRule * @param priceRule
*@return *@return
*/ */
private Double getPriceByRule (Integer distance,Integer duration,PriceRule priceRule) { private static Double getPriceByRule (Integer distance,Integer duration,PriceRule priceRule) {
// BigDecimal // BigDecimal
BigDecimal sumPriceDecimal = new BigDecimal(0); double sumPrice = 0;
// 起步价 // 起步价
Double startFare = priceRule.getStartFare(); Double startFare = priceRule.getStartFare();
BigDecimal startFareDecimal = new BigDecimal(startFare); sumPrice = BigDecimalUtils.add(sumPrice,startFare);
sumPriceDecimal = sumPriceDecimal.add(startFareDecimal);
//里程费 //里程费
// 总里程 m => km // 总里程 m => km
BigDecimal distanceDecimal = new BigDecimal(distance); double distanceMile = BigDecimalUtils.divide(distance,1000);
BigDecimal distanceMileDecimal = distanceDecimal.divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP);
// 起步里程 // 起步里程
Integer startMile = priceRule.getStartMile(); Integer startMile = priceRule.getStartMile();
BigDecimal startMileDecimal = new BigDecimal(startMile);
// 需收费的里程数 // 需收费的里程数
double mileTmp = distanceMileDecimal.subtract(startMileDecimal).doubleValue(); double subMile = BigDecimalUtils.substract(distanceMile, startMile);
if(mileTmp < 0){ subMile = subMile<0 ? 0:subMile;
mileTmp = 0;
}
BigDecimal subMileDecimal = new BigDecimal(mileTmp);
// 获取计费规则-每公里收费 // 获取计费规则-每公里收费
Double unitPricePerMile = priceRule.getUnitPricePerMile(); Double unitPricePerMile = priceRule.getUnitPricePerMile();
BigDecimal unitPricePerMileDecimal = new BigDecimal(unitPricePerMile);
// 计算最终里程费用 // 计算最终里程费用
BigDecimal finalMileFareDecimal = subMileDecimal.multiply(unitPricePerMileDecimal).setScale(2, BigDecimal.ROUND_HALF_UP); double mileFare = BigDecimalUtils.multiply(subMile,unitPricePerMile);
sumPriceDecimal = sumPriceDecimal.add(finalMileFareDecimal); sumPrice = BigDecimalUtils.add(sumPrice,mileFare);
//时长费 //时长费
// 时长的分钟数 s => min // 时长的分钟数 s => min
BigDecimal durationDecimal = new BigDecimal(duration); double timeMinute = BigDecimalUtils.divide(duration, 60);
BigDecimal durationMinDecimal = durationDecimal.divide(new BigDecimal(60), 2, BigDecimal.ROUND_HALF_UP);
// 获取计费规则-每分钟收费 // 获取计费规则-每分钟收费
Double unitPricePerMinute = priceRule.getUnitPricePerMinute(); Double unitPricePerMinute = priceRule.getUnitPricePerMinute();
BigDecimal unitPricePerMinuteDecimal = new BigDecimal(unitPricePerMinute);
// 计算最终时长费用 // 计算最终时长费用
BigDecimal finalTimeFareDecimal = durationMinDecimal.multiply(unitPricePerMinuteDecimal.setScale(2, BigDecimal.ROUND_HALF_UP)); double timeFare = BigDecimalUtils.multiply(timeMinute, unitPricePerMinute);
sumPriceDecimal = sumPriceDecimal.add(finalTimeFareDecimal); sumPrice = BigDecimalUtils.add(sumPrice,timeFare);
// 过滤 最终计算值
BigDecimal sumPriceDecimal = new BigDecimal(sumPrice);
sumPriceDecimal = sumPriceDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
return sumPriceDecimal.doubleValue(); return sumPriceDecimal.doubleValue();
} }

Loading…
Cancel
Save