一、需求分析与业务场景梳理
1. 费用构成要素
- 基础运费:按订单重量/体积、配送距离、时段(如高峰期加价)动态计算。
- 附加费:夜间配送、大件商品、特殊区域(如偏远地区)等。
- 优惠减免:会员免运费、满减券、新用户首单优惠等。
- 动态调整:根据天气、交通状况实时调整费用(如暴雨天加价)。
2. 用户场景覆盖
- C端用户:下单时实时显示配送费,支持优惠券叠加。
- B端商家:按合作协议结算配送成本,支持批量订单费用核算。
- 平台运营:监控配送成本占比,优化配送网络。
二、系统架构设计
1. 模块划分
- 费用规则引擎:配置运费模板(如“3公里内5元,每增加1公里+2元”)。
- 实时计算服务:调用地图API获取距离,结合订单数据计算费用。
- 优惠系统:对接优惠券、会员权益等减免规则。
- 结算系统:生成对账单,支持T+1日结算或实时扣款。
2. 技术选型
- 规则引擎:Drools或自定义规则库,支持灵活调整运费策略。
- 地图服务:高德/百度地图API,获取精准距离和预计时间。
- 分布式计算:使用Redis缓存运费模板,Spark处理批量订单结算。
- 微服务架构:将费用核算拆分为独立服务,与订单、支付系统解耦。
三、核心功能实现
1. 动态运费计算
- 输入参数:用户地址、商品重量/体积、配送时段、天气数据。
- 计算逻辑:
```python
def calculate_delivery_fee(distance, weight, is_peak, is_remote):
base_fee = 5 if distance <= 3 else 5 + (distance - 3) * 2
weight_surcharge = max(0, weight - 10) * 0.5 超过10kg部分加价
peak_surcharge = 3 if is_peak else 0
remote_surcharge = 10 if is_remote else 0
return base_fee + weight_surcharge + peak_surcharge + remote_surcharge
```
2. 优惠叠加与优先级
- 定义规则:会员免运费 > 满减券 > 新用户优惠。
- 示例:订单金额100元,会员免运费,则最终费用=0(忽略其他优惠)。
3. 实时更新与缓存
- 使用Redis缓存运费模板,设置TTL(如5分钟)避免频繁查询数据库。
- 监听配置中心(如Apollo),动态更新运费规则无需重启服务。
四、数据流与接口设计
1. 数据流
- 用户下单 → 调用费用服务 → 查询地图API → 计算运费 → 返回前端显示 → 支付时扣减优惠。
2. 关键接口
- `/api/delivery/calculate`:接收订单参数,返回运费详情。
- `/api/coupon/apply`:验证优惠券并返回减免金额。
- `/api/order/settle`:生成最终订单金额(含运费和优惠)。
五、测试与优化
1. 测试用例
- 边界值测试:距离=3km、重量=10kg时的费用是否正确。
- 并发测试:模拟1000用户同时下单,检查费用计算延迟。
- 异常测试:地图API超时、优惠券无效等场景。
2. 性能优化
- 异步计算:非实时场景(如商家批量导入订单)使用消息队列异步处理。
- 数据分片:按城市分区存储运费模板,减少查询范围。
六、用户体验与运营支持
1. 前端展示
- 下单页显示运费明细(如“基础运费8元,夜间加价3元,共11元”)。
- 支持修改地址后实时重新计算运费。
2. 后台管理
- 运费模板配置界面,支持按区域、时段、商品类型设置规则。
- 配送成本分析报表,按日期、区域统计运费收入与支出。
七、合规与风控
1. 数据安全
- 用户地址脱敏存储,仅传递经纬度给地图API。
- 运费计算日志保留6个月,满足审计需求。
2. 反作弊机制
- 检测异常地址(如频繁修改地址套取优惠)。
- 限制同一设备/账号的优惠使用频率。
八、案例参考与扩展
- 美团优选:通过“网格化”运费模板,实现不同社区差异化定价。
- 扩展功能:
- 预估运费:用户选择商品后提前显示运费范围。
- 拼单优惠:多人拼单共享运费减免。
- 绿色配送:选择环保包装可减免部分运费。
通过以上设计,美团买菜系统可实现配送费用的精准核算,同时兼顾灵活性和用户体验,为平台运营提供数据支持。