From 76310c8da2f8b562fc01b8513ca5c3eb76fda4cc Mon Sep 17 00:00:00 2001 From: Cui Zhi Feng <7426394+wuxixiaocui@user.noreply.gitee.com> Date: 星期六, 14 九月 2024 13:49:57 +0800 Subject: [PATCH] 订单商品 优惠券退款精度调整 --- src/main/java/com/mzl/flower/service/payment/OrderService.java | 18 ++++++++++++++---- src/main/表设计.xlsx | 0 src/main/java/com/mzl/flower/entity/payment/OrderItem.java | 6 ++++++ src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java | 8 +++++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java index 84c559f..fa2bdd7 100644 --- a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java +++ b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java @@ -93,4 +93,10 @@ @TableField("real_price") private BigDecimal realPrice;//真实成交价格/每扎 + @TableField("coupon_amount_total") + private BigDecimal couponAmountTotal;//优惠券总金额 + + @TableField("real_total") + private BigDecimal realTotal;//真实成交总价格 + } diff --git a/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java b/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java index bbe6730..70688b3 100644 --- a/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java @@ -663,13 +663,19 @@ deduct = oi.getSupplierPrice().multiply(new BigDecimal(dto.getNum())); } else if(Constants.CHECK_TYPE.lack.name().equals(dto.getType())){ deduct = realPrice.multiply(new BigDecimal(dto.getNum())); + //质检退款,按照这个单价扣,如果3扎都缺货,按照总的金额退 + //缺货数量等于商品总数时按真实总价退款 + if(dto.getNum().intValue() == oi.getNum() && oi.getRealTotal() != null){ + deduct = oi.getRealTotal(); + } } else if (Constants.CHECK_TYPE.reduce.name().equals(dto.getType())) { if(deductAmount == null){ throw new ValidationException("降级金额不能为空"); } deduct = deductAmount.multiply(new BigDecimal(dto.getNum())); BigDecimal dt = realPrice.multiply(new BigDecimal(dto.getNum())); - if(deduct.doubleValue() > dt.doubleValue()){ + if(deduct.doubleValue() > dt.doubleValue() + || (oi.getRealTotal() != null && deduct.doubleValue() > oi.getRealTotal().doubleValue())){ throw new ValidationException("降级金额不能大于商品处理数量金额"); } } diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java index 2ef01ff..54dd68e 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java @@ -517,9 +517,15 @@ BigDecimal couponAmount = calculateCoupon(memberCouponAmount, t.getTotal() , flowerAmount, t.getNum(), t.getPrice(), isLastOne, usedCouponAmount); t.setCouponAmount(couponAmount);//每扎平摊的优惠券面值 - t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交价 + t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交单价 - usedCouponAmount = usedCouponAmount.add(couponAmount.multiply(BigDecimal.valueOf(t.getNum()))); + t.setCouponAmountTotal(couponAmount.multiply(BigDecimal.valueOf(t.getNum()))); + if(isLastOne){ + t.setCouponAmountTotal(memberCouponAmount.subtract(usedCouponAmount)); + } else { + usedCouponAmount = usedCouponAmount.add(t.getCouponAmountTotal()); + } + t.setRealTotal(t.getTotal().subtract(t.getCouponAmountTotal())); t.create(userId); orderItemMapper.insert(t); @@ -581,9 +587,13 @@ BigDecimal subCoupon = couponAmount.subtract(usedCouponAmount);//占有的优惠券面值 return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP); } - BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比 + + /*BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比 BigDecimal subCoupon = couponAmount.multiply(radio);//占有的优惠券面值 - return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP); + return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP);*/ + + //不能分步计算,分步计算会有精度问题 + return couponAmount.multiply(itemTotalAmount).divide(totalAmount.multiply(BigDecimal.valueOf(num)), 2, RoundingMode.HALF_UP); } private CouponRecordDO useCouponRecord(String orderId, BigDecimal amount, String couponRecordId){ diff --git "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx" "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx" index 1233e42..3c4cf99 100644 --- "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx" +++ "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx" Binary files differ -- Gitblit v1.9.3