4.1 需求分析
主订单的应付金额【origin_total_amount】一般是由所有订单明细的商品单价*数量
汇总【order_price*sku_num】组成。
但是由于优惠、运费等都是
以订单为单位
进行计算的,所以减掉优惠、加上运费会得到
一个最终实付金额【
final_total_amount】。
但问题在于如果是
以商品进行交易额分析
,就需要把优惠、运费分摊到购买的每个商品
中。
4.2 如何分摊
一般是由订单明细每种商品的消费占总订单的比重进行分摊,比如总价 1000 元的商品,
由 600 元和 400 元的 A、B 两种商品组成,
但是经过打折和加运费后,实际付款金额变为
810,那么 A 的分摊实付金额为 486 元和 B 的分摊实付金额为 324 元。
4.3 麻烦的情况
由于明细的分摊是由占比而得,那就会进行除法,除法就有可能出现除不尽的情况。
比如:原价 90 元 ,三种商品每件 30 元。没有优惠但有 10 元运费,总实付金额为 100
元。按占比分摊各三分之一,就会出现三个 33.33 元。加起来就会出现 99.99 元。就会出
现差一分钱的情况。
而我们要求所有订单明细的实付分摊加总必须和订单的总实付相等。
所以我们要的是 100=33.33+33.33+33.34
4.4 解决思路
➢
核心思路:就是需要用两种算法来计算金额
◼
算法一:如果计算时该明细不是最后一笔
使用乘除法公式:实付分摊金额 / 实付总金额 = (数量*单价)/原始总金额
调整移项可得 实付分摊金额 = 实付总金额 * (数量 * 单价) / 原始总金额
◼
算法二:
如果计算时该明细是最后一笔
使用减法公式:
实付分摊金额= 实付总金额 - (其他明细已经计算好的【实付分摊金额】的合计)
➢
判断是否是最后一笔
判断公式:
如果 该条明细 (数量*单价) == 原始总金额 -(其他明细
【数量*单价】的合计)
➢
整个计算中需要的两个合计值:
◼
其他明细已经计算好的【实付分摊金额】的合计
◼
订单的已经计算完的明细的【数量*单价】的合计
如何保存这两个合计?保存在 redis 中。

4.5 代码实现
