diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java index 0c35e4e7d1..1df5089eed 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java @@ -673,9 +673,21 @@ private void handleCouponAmount(List orderItemList, SmsCouponHisto */ private void calcPerCouponAmount(List orderItemList, SmsCoupon coupon) { BigDecimal totalAmount = calcTotalAmount(orderItemList); - for (OmsOrderItem orderItem : orderItemList) { - //(商品价格/可用商品总价)*优惠券面额 - BigDecimal couponAmount = orderItem.getProductPrice().divide(totalAmount, 3, RoundingMode.HALF_EVEN).multiply(coupon.getAmount()); + BigDecimal couponAmountTotal = coupon.getAmount(); + BigDecimal remainingAmount = couponAmountTotal; + int size = orderItemList.size(); + for (int i = 0; i < size; i++) { + OmsOrderItem orderItem = orderItemList.get(i); + BigDecimal couponAmount; + if (i < size - 1) { + //(商品价格/可用商品总价)*优惠券面额 + couponAmount = orderItem.getProductPrice().divide(totalAmount, 3, RoundingMode.HALF_EVEN).multiply(couponAmountTotal); + remainingAmount = remainingAmount.subtract(couponAmount); + } else { + // last item gets the remainder to ensure total equals coupon amount + couponAmount = remainingAmount; + } + couponAmount = couponAmount.setScale(2, RoundingMode.HALF_UP); orderItem.setCouponAmount(couponAmount); } } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java index 73a3351cb0..bbec4267c2 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java @@ -88,10 +88,10 @@ public List calcCartPromotion(List cartItemList) BeanUtils.copyProperties(item,cartPromotionItem); String message = getFullReductionPromotionMessage(fullReduction); cartPromotionItem.setPromotionMessage(message); - //(商品原价/总价)*满减金额 + //(商品原价/总价)*满减金额,使用 multiply-divide 顺序避免 divide 精度损失 PmsSkuStock skuStock= getOriginalPrice(promotionProduct, item.getProductSkuId()); BigDecimal originalPrice = skuStock.getPrice(); - BigDecimal reduceAmount = originalPrice.divide(totalAmount,RoundingMode.HALF_EVEN).multiply(fullReduction.getReducePrice()); + BigDecimal reduceAmount = originalPrice.multiply(fullReduction.getReducePrice()).divide(totalAmount, 2, RoundingMode.HALF_EVEN); cartPromotionItem.setReduceAmount(reduceAmount); cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock()); cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());