Cui Zhi Feng
2024-09-14 76310c8da2f8b562fc01b8513ca5c3eb76fda4cc
订单商品 优惠券退款精度调整
已修改4个文件
32 ■■■■ 文件已修改
src/main/java/com/mzl/flower/entity/payment/OrderItem.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/payment/OrderService.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/表设计.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
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;//真实成交总价格
}
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("降级金额不能大于商品处理数量金额");
            }
        }
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){
src/main/表设计.xlsx
Binary files differ