端午节,祝大家端午安康!
前两篇谈到了网约车开发的基本掌握的信息,本章节主要讲解网约车出发地和目的地两点间的费用计算!
两点间的费用计算有两种方式
1、使用地图行程规划计算费用,这种的方式就不讲解,完全利用地图的出行解决方案,一年的费用几十万,如果是小微企业没有必要话费这笔钱
1、自建收费标准,高峰费用阶梯价格,使用地图的规划最优距离和用时最优,得到距离和用时后结合自建收费标准计算当前的收费
代码如下:
计算距离:
@Override
public NewDistanceVo getNewDistance(String s_x, String s_y, String e_x, String e_y) {
String parms = “key=” + getWebKey() + “&plugin=AMap.Driving&origin=” + s_y + “,” + s_x + “&destination=” + e_y
+ “,” + e_x + “&extensions=all&output=json”;
// origin=116.481028,39.989643&destination=116.465302,40.004717&extensions=all&output=xml&key=<用户的key>
String res = HttpClientUtil.doGet(url.replace("{key}", getWebKey()), parms);
log.info(“driving 计算距离:”, res);
if (res == null) {
throw new BusinessException(“计算距离错误,请重试”);
}
JSONObject json = JSONObject.parseObject(res);
int status = json.getInteger("status");
if (status == 0) {
throw new BusinessException("计算请求失败,请重试");
}
NewDistanceVo vo = new NewDistanceVo();
// 驾车路径规划信息列表
String route = json.getString("route");
JSONObject routeJson = JSONObject.parseObject(route);
String paths = routeJson.getString("paths");
JSONArray array = JSONArray.parseArray(paths);
String distance = "";
String duration = "";
if (array.size() > 0) {
JSONObject path = (JSONObject) array.get(0);
distance = path.getString("distance");
duration = path.getString("duration");
vo.setDistance(distance);
vo.setDuration(duration);
} else {
throw new BusinessException("获取距离失败,请重试");
}
return vo;
}
计算费用:
@Transactional
@Override
public CalculateMoneyRespVo calculateMoney2(CalculateMoney2ReqVo vo) {
if (vo == null) {
throw new BusinessException(“请求对象不能为空”);
}
// 车型查询
YxCarStand stand = yxCarStandMapper.selectYxCarStandById(vo.getCateStandId());
if (stand == null) {
throw new BusinessException(“车型不存在,请重新选择”);
}
NewDistanceVo dvo = mapService.getNewDistance(vo.getStartLat(), vo.getStartLng(), vo.getEndLat(),
vo.getEndLng());
if (dvo == null) {
throw new BusinessException(“计算行驶预估费用失败,请重试”);
}
// 预估距离,公里数
BigDecimal kiloDistance = dvo.getDistance() == null ? new BigDecimal(1)
: new BigDecimal(Double.valueOf(dvo.getDistance()) / 1000).setScale(1, BigDecimal.ROUND_HALF_UP);
// 不足一公里算1公里
kiloDistance = kiloDistance.compareTo(new BigDecimal(1)) <= 0 ? new BigDecimal(1) : kiloDistance;
// 预估时间分钟数
BigDecimal minDistance = dvo.getDuration() == null ? new BigDecimal(1)
: new BigDecimal(Double.valueOf(dvo.getDuration()) / 60).setScale(1, BigDecimal.ROUND_HALF_UP);
// 计算费用
BigDecimal price = new BigDecimal(0);
// 计算司机等待费用 waitPrice
BigDecimal waitPrice = new BigDecimal(0);
BigDecimal kilo = (kiloDistance == null || kiloDistance.compareTo(new BigDecimal(0)) <= 0) ? new BigDecimal(1)
: kiloDistance;
// 按照公里计费
if (stand.getPayType() == 1) {
price = stand.getStepPrice();
// 一、先判断当前是白天还是夜晚,夜晚则在起步价上加一定费用
String white_black_06_00_21_00 = CommonConstants.white_black_06_00_21_00;
String price_06_00_21_00 = CommonConstants.price_06_00_21_00;
String price_21_00_01_00 = CommonConstants.price_21_00_01_00;
String price_01_00_06_00 = CommonConstants.price_01_00_06_00;
String[] wbArr = white_black_06_00_21_00.split(",");
String[] time0 = price_06_00_21_00.split(",");
String[] time1 = price_21_00_01_00.split(",");
String[] time2 = price_01_00_06_00.split(",");
boolean checkIn = DateUtils.checkIsBetweenTime(wbArr[0], wbArr[1]);
if (!checkIn) {
}
// 二、再判断处在哪个时间段,再来获取相对应的计费标准
BigDecimal pricePerKilo = new BigDecimal(1);
if (DateUtils.checkIsBetweenTime(time0[0], time0[1])) {
pricePerKilo = stand.getTime0().divide(new BigDecimal(stand.getTime0Unit())).setScale(2,
RoundingMode.HALF_UP);
} else if (DateUtils.checkIsBetweenTimeAddDay(time1[0], time1[1])) {
pricePerKilo = stand.getTime1().divide(new BigDecimal(stand.getTime1Unit())).setScale(2,
RoundingMode.HALF_UP);
} else if (DateUtils.checkIsBetweenTime(time2[0], time2[1])) {
pricePerKilo = stand.getTime2().divide(new BigDecimal(stand.getTime2Unit())).setScale(2,
RoundingMode.HALF_UP);
}
BigDecimal remainKiloTemp = kilo.subtract(new BigDecimal(stand.getStepLength()));
double remainKilo = remainKiloTemp.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// 判断是否超出公里数
if (remainKilo > 0) {
remainKilo = DateUtils.getValueSmallNumber(remainKilo);
} else {
remainKilo = 0d;
}
// 每分钟费用
BigDecimal waitPricePer = stand.getWaitPrice().divide(new BigDecimal(stand.getWaitPriceUnit()), 2,
BigDecimal.ROUND_HALF_UP);
// 等待费
waitPrice = waitPricePer.multiply(minDistance);
price = price.add(pricePerKilo.multiply(new BigDecimal(remainKilo))).add(waitPrice);
} else {
// 按一口价计费
price = stand.getStepPrice();
}
CalculateMoneyRespVo respVo = new CalculateMoneyRespVo();
respVo.setAllLengthKilo(kilo);
respVo.setAllPrice(price);
respVo.setCateTypeId(vo.getCateStandId());
respVo.setMin(minDistance);
return respVo;
}