|
|
|
@ -5,12 +5,15 @@ import com.internal.dto.PriceRule;
|
|
|
|
|
import com.internal.dto.ResponseResult;
|
|
|
|
|
import com.internal.request.ForecastPriceDTO;
|
|
|
|
|
import com.internal.response.DirectionResponse;
|
|
|
|
|
import com.internal.response.ForecastPriceResponse;
|
|
|
|
|
import com.taxi.serviceprice.mapper.PriceRuleMapper;
|
|
|
|
|
import com.taxi.serviceprice.remote.ServiceMapClient;
|
|
|
|
|
import javafx.scene.effect.Light;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
@ -41,7 +44,7 @@ public class ForecastPriceService {
|
|
|
|
|
log.info("目的地纬度," + destLatitude);
|
|
|
|
|
|
|
|
|
|
log.info("调用地图服务,查询地图和时长");
|
|
|
|
|
|
|
|
|
|
Double price = 0.0;
|
|
|
|
|
|
|
|
|
|
ForecastPriceDTO forecastPriceDTO = new ForecastPriceDTO();
|
|
|
|
|
forecastPriceDTO.setDepLongitude(depLongitude);
|
|
|
|
@ -60,9 +63,65 @@ public class ForecastPriceService {
|
|
|
|
|
if(pricetRules.size() < 1){
|
|
|
|
|
ResponseResult.fail(CommonStatusEnum.PRICE_RULE_EMPTY);
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
|
|
price = getPrice(directionResponse.getData().getDistance(),
|
|
|
|
|
directionResponse.getData().getDuration(),pricetRules.get(0));
|
|
|
|
|
}
|
|
|
|
|
log.info("根据距离、时长,计价规则;计算价格");
|
|
|
|
|
return ResponseResult.success();
|
|
|
|
|
ForecastPriceResponse forecastPriceResponse = new ForecastPriceResponse();
|
|
|
|
|
forecastPriceResponse.setPrice(price);
|
|
|
|
|
return ResponseResult.success(forecastPriceResponse);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
* 根据距离、时长和计价规则,计算最终价格
|
|
|
|
|
* @param distance
|
|
|
|
|
* @param duration
|
|
|
|
|
* @param priceRule
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private double getPrice(Integer distance,Integer duration,PriceRule priceRule){
|
|
|
|
|
BigDecimal price = new BigDecimal(0);
|
|
|
|
|
//BigDecimal //起步价
|
|
|
|
|
Double startFare = priceRule.getStartFare();
|
|
|
|
|
BigDecimal startFareDecimal = new BigDecimal(startFare);
|
|
|
|
|
price = price.add(startFareDecimal);
|
|
|
|
|
//里程碑 m
|
|
|
|
|
BigDecimal distanceBigDecimal = new BigDecimal(distance);
|
|
|
|
|
//总里程 km
|
|
|
|
|
BigDecimal distanceMileDecimal = distanceBigDecimal.divide(new BigDecimal(1000),2,BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
//起步里程
|
|
|
|
|
Integer startMile = priceRule.getStartMile();
|
|
|
|
|
BigDecimal startMileDecimal = new BigDecimal(startMile);
|
|
|
|
|
double distanceSubtract = distanceMileDecimal.subtract(startMileDecimal).doubleValue();
|
|
|
|
|
//最终收费里程数 km
|
|
|
|
|
Double mile = distanceSubtract < 0 ? 0:distanceSubtract;
|
|
|
|
|
BigDecimal mileDecimal = new BigDecimal(mile);
|
|
|
|
|
//计程单价 元/km
|
|
|
|
|
Double unitPricePerMile = priceRule.getUnitPricePerMile();
|
|
|
|
|
BigDecimal unitPricePerMilDecimal = new BigDecimal(unitPricePerMile);
|
|
|
|
|
//里程价格
|
|
|
|
|
BigDecimal mileFare = mileDecimal.multiply(unitPricePerMilDecimal).setScale(2,BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
price = price.add(mileFare);
|
|
|
|
|
//时长费用
|
|
|
|
|
BigDecimal time = new BigDecimal(duration);
|
|
|
|
|
//时长的分钟数
|
|
|
|
|
BigDecimal timeDecimal = time.divide(new BigDecimal(60),2,BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
//计时单价
|
|
|
|
|
Double unitPricePerMinute = priceRule.getUnitPricePerMinute();
|
|
|
|
|
BigDecimal unitPricePerMinuteDecimal = new BigDecimal(unitPricePerMinute);
|
|
|
|
|
BigDecimal timeFare = timeDecimal.multiply(unitPricePerMinuteDecimal);
|
|
|
|
|
price = price.add(timeFare).setScale(2,BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
|
|
|
|
return price.doubleValue();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// public static void main(String[] args) {
|
|
|
|
|
// PriceRule priceRule = new PriceRule();
|
|
|
|
|
// priceRule.setUnitPricePerMile(1.8);
|
|
|
|
|
// priceRule.setUnitPricePerMinute(0.5);
|
|
|
|
|
// priceRule.setStartFare(10.0);
|
|
|
|
|
// priceRule.setStartMile(3);
|
|
|
|
|
// System.out.println(getPrice(6500,1800,priceRule));
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|