电商平台之运费分摊算法

Posted yelanggu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电商平台之运费分摊算法相关的知识,希望对你有一定的参考价值。

下单的过程中我们会根据配送方式的不同来计算相应的运费,并将每个商品分摊到的运费金额放到订单的items表里,如果按照相应的比例进行分摊,就会存在四舍五入的小数分摊不均,比如10元运费3件商品,每个就会分摊到3.33,这样就会有0.01的误差存在,为了避免这样的误差存在,我们会记录下前几次分摊到的金额值总和,最后一个用总运费金额减去之前的总和,这样减避免了误差的存在。订单发生退货的时候就会根据退货数量不同来决定退还给用户多少金额。逻辑代码如下,假设订单总运费100元,所有商品的价格均取两位小数:

actualShippingFee:运费
goodsTotalAmount:商品总金额
for (int i = 0; i < orderItems.size(); i++) {
OrderItem item = orderItems.get(i);
//定义每次分摊后的总运费
BigDecimal fareAmount = BigDecimal.ZERO;
// 计算运费应该分摊的百分比:当前sku售价*购买数量 /商品总金额
BigDecimal scale = item.getSettledPrice().multiply(new BigDecimal(item.getBuyerCount() + ""))
.divide(goodsTotalAmount, 6, BigDecimal.ROUND_HALF_UP);
//当前商品分摊到的运费
fareAmount = actualShippingFee.multiply(scale);
// 乘以数量再除以数量,保留两位小数,减少误差
BigDecimal finalFreight = fareAmount.divide(new BigDecimal(item.getBuyerCount()), 2, BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(item.getBuyerCount())).setScale(2, BigDecimal.ROUND_HALF_DOWN);
  // 记录总分摊到的运费
totalFareAmount = totalFareAmount.add(finalFreight);
// 最后一次分摊到的运费 = 总运费-前(n-1)个商品分摊到的运费
if (i == orderItems.size() - 1) {
finalFreight = finalFreight.add(actualShippingFee.subtract(totalFareAmount).setScale(2, BigDecimal.ROUND_HALF_DOWN));
}
// 当前商品分摊到的最终运费
item.setFare(finalFreight);
}
 

以上是关于电商平台之运费分摊算法的主要内容,如果未能解决你的问题,请参考以下文章

大数据(8l)运费分摊

电商平台 lnmp 架构之 nginx 优化

电商财务做账流程

Java电商平台 - API 接口设计之 tokentimestampsign 具体架构与实现

分布式架构设计之电商平台

电商平台 lnmp 架构之 nginx+tomcat