代驾小程序搭建一键呼叫与费用计算设计代驾小程序一键呼叫是用户入口核心费用计算直接影响用户感知与纠纷量需要兼顾下单体验、阶梯计价、附加费叠加、预估价快照、动态调价等能力。一键呼叫完成地址解析、定位纠偏、订单初始化计价模块根据里程、时长、时段溢价、附加项算出预估金额下单后锁定计价规则快照后续结算以快照为准和调度、订单跟踪模块联动。本文基于SpringBoot讲解一键呼叫流程、计价模型、风控规则落地实现。后端技术栈SpringBoot MyBatis-Plus Redis RabbitMQ计价服务独立封装。Redis缓存计价模板、时段溢价配置MQ接收下单事件推送调度地图服务用于地址逆解析、路线里程估算报价快照持久入库用于对账和客诉复核。整体业务流程用户打开小程序一键呼叫自动获取当前定位支持手动修改起点、填写终点后端调用地图接口规划路线获取预估里程读取计价模板叠加基础起步价、里程费、时长费、夜间溢价、等候费等返回预估费用明细用户确认下单生成订单并保存计价快照推送订单给调度服务司机接单后开始计费行程中实时累计等候时长行程结束后以实际里程、实际时长重新核算最终费用对比预估快照展示差额。下面是一键下单初始化、费用计算核心Java示例代码Service public class DrivePriceService { Autowired private PriceRuleMapper priceRuleMapper; private OrderSnapshotMapper orderSnapshotMapper; private MapApiHelper mapApiHelper; Autowired private RedisTemplateString, Object redisTemplate; /** * 代驾费用预计算 */ public ResultDTOPriceVO calcPrePrice(PriceQueryDTO dto) { // 读取计价规则缓存 String ruleKey price:rule:default; PriceRule rule (PriceRule) redisTemplate.opsForValue().get(ruleKey); if (rule null) { rule priceRuleMapper.selectById(1L); redisTemplate.opsForValue().set(ruleKey, rule, 60, TimeUnit.MINUTES); } // 地图获取预估里程公里、预估时长分钟 RouteVO route mapApiHelper.getRouteInfo(dto.getStartLng(), dto.getStartLat(), dto.getEndLng(), dto.getEndLat()); BigDecimal preMileage route.getMileage(); BigDecimal preTime route.getDurationMinute(); BigDecimal totalPrice rule.getStartPrice(); // 超出起步里程后累加里程费 if (preMileage.compareTo(rule.getStartMileage()) 0) { BigDecimal extraMile preMileage.subtract(rule.getStartMileage()); totalPrice totalPrice.add(extraMile.multiply(rule.getMilePrice())); } // 时段溢价判断夜间加价 if (isNightTime()) { totalPrice totalPrice.add(rule.getNightFee()); } // 等候费、附加费 BigDecimal waitFee dto.getWaitMinute() null ? BigDecimal.ZERO : new BigDecimal(dto.getWaitMinute()).multiply(rule.getWaitUnitPrice()); totalPrice totalPrice.add(waitFee); PriceVO vo new PriceVO(); vo.setStartPrice(rule.getStartPrice()); vo.setMileageFee(totalPrice.subtract(rule.getStartPrice()).subtract(waitFee)); vo.setWaitFee(waitFee); vo.setNightFee(isNightTime() ? rule.getNightFee() : BigDecimal.ZERO); vo.setTotalPrice(totalPrice); vo.setPreMileage(preMileage); vo.setPreTime(preTime); return ResultDTO.success(vo); } /** * 下单保存计价快照 */ Transactional(rollbackFor Exception.class) public ResultDTOLong createOrderAndSnapshot(OrderCreateDTO dto, PriceVO priceVo) { OrderInfo order new OrderInfo(); order.setUserId(dto.getUserId()); order.setStartAddress(dto.getStartAddress()); order.setEndAddress(dto.getEndAddress()); order.setStartLng(dto.getStartLng()); order.setStartLat(dto.getStartLat()); order.setEndLng(dto.getEndLng()); order.setEndLat(dto.getEndLat()); order.setPreAmount(priceVo.getTotalPrice()); order.setOrderStatus(1); orderMapper.insert(order); // 保存计价快照 PriceSnapshot snapshot new PriceSnapshot(); snapshot.setOrderId(order.getId()); snapshot.setPriceJson(JSONUtil.toJsonStr(priceVo)); snapshot.setRuleId(priceRule.getId()); snapshot.setCreateTime(LocalDateTime.now()); orderSnapshotMapper.insert(snapshot); // 推送调度事件 rabbitTemplate.convertAndSend(order.dispatch.exchange, order.create, order); return ResultDTO.success(order.getId()); } private boolean isNightTime() { LocalTime now LocalTime.now(); return now.isAfter(LocalTime.of(22, 0)) || now.isBefore(LocalTime.of(6, 0)); } }一键呼叫交互与定位纠偏设计小程序端优先获取GPS定位作为起点同时接入地图POI检索支持用户手动修改起点、输入终点地址。定位环节增加纠偏逻辑过滤明显漂移点位起点地址自动填充终点支持收藏地址快速选择。一键呼叫按钮做防抖处理防止重复下单。地址解析失败时友好提示用户手动填写位置信息下单前展示预估费用明细明确告知预估价仅供参考最终以行程结束实际里程为准减少用户预期偏差。计价规则模型设计计价规则支持后台可视化配置包含起步价、起步里程、超里程单价、基础时长单价、夜间加价时段和金额、等候费单价、长途附加费。支持多套计价模板区分普通代驾、商务代驾等不同服务类型。附加项可动态开关比如过桥费、高速费、停车费实报实销不计入基础计价公式行程结束后司机上传凭证单独添加。预估价和结算价分离机制预估价是基于地图规划路线的估算值只用于下单前展示行程结束后基于轨迹回放得到真实行驶里程、实际等候时长重新核算最终金额。预估价和结算价分开存储计价快照锁定下单时刻的规则配置后续运营修改计价模板不会影响已经下单的历史订单避免规则迭代引发结算错乱。等候费实时计费逻辑司机到达起点后点击“已到达”等候计时开始用户上车后停止等候计时。小程序和司机端实时展示等候时长等候费按单位时间累加上限可配置防止长时间等候产生高额费用。等候记录作为独立节点存入订单跟踪链路客诉时可核对等候起止时间。时段与区域动态调价除固定夜间加价外后台可配置热点商圈、暴雨雨雪天气的临时溢价溢价系数作用于基础费用。动态调价配置存放在Redis实时生效。溢价标签在小程序下单页明确展示不做隐性加价溢价开关支持定时自动启停比如晚间高峰自动开启凌晨运力充足自动关闭。并发与缓存优化计价规则属于高频读取、低频修改数据全部缓存至Redis后台修改配置后主动清理缓存。一键呼叫、费用预估属于高频接口做接口限流防止短时间大量请求调用地图路线接口产生高额地图调用成本。地图路线结果做短时缓存同一起止点短时间重复预估复用路线数据。权限与明细展示用户端可以查看订单费用明细区分起步价、里程费、等候费、溢价、实报费用司机端可以查看计费明细和快照管理员后台可以查看完整计价日志、快照信息支持按时间段统计客单价、溢价订单占比。费用明细字段支持按需隐藏实报票据附件上传后关联订单快照。上下游模块联动一键下单生成订单后推送调度模块开始司机匹配计价快照同步给订单跟踪模块在订单进度页面展示费用行程轨迹模块提供真实里程数据作为结算计费依据支付模块读取最终结算金额唤起支付订单评价、客诉模块可以直接调取计价快照、轨迹记录复核费用争议。异常场景处理地图接口超时降级只展示起步价提示用户行程结束后按实际里程结算定位失效时禁止自动填充起点强制用户手动填写中途用户变更目的地重新拉取路线、重新计价并生成新的计价快照弹窗让用户确认变更后的费用司机误操作提前结束行程后台支持复核轨迹重新修正结算金额保留修改日志。一键呼叫和费用计算模块的核心是平衡下单便捷性和计价透明度。通过定位纠偏、预估价明细、计价快照机制降低用户下单门槛同时把计价规则固化为后续结算、客诉举证提供依据和司机调度、行程跟踪、支付模块共同组成代驾小程序交易闭环。