网约车如何搭建(第三篇)

端午节,祝大家端午安康!
前两篇谈到了网约车开发的基本掌握的信息,本章节主要讲解网约车出发地和目的地两点间的费用计算!

两点间的费用计算有两种方式
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;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件技术员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值