diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java index 5bdc5a10..6f98aac9 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java @@ -2736,41 +2736,46 @@ public class TbShopTableServiceImpl implements TbShopTableService { } BigDecimal returnPackFee = packFee.multiply(returnNum); - orderDetail.setNum(returnNum); - orderDetail.setPriceAmount(returnNum.multiply(orderDetail.getPrice()) - .add(returnPackFee)); - orderDetail.setPackAmount(returnPackFee); - orderDetail.setRefundNumber(returnNum); -// orderDetail.setStatus(isOnline ? "refunding" : "refund"); - orderDetail.setStatus("refund"); + BigDecimal currentDetailAMount = BigDecimal.ZERO; // 优惠券抵扣商品直接退券 if (StrUtil.isNotBlank(orderDetail.getUseCouponInfo())) { data.put("isCouponDiscount", true); TbActivateOutRecord outRecord = JSONObject.parseObject(orderDetail.getUseCouponInfo(), TbActivateOutRecord.class); outRecord.setRefNum(returnNum.intValue()); shopCouponService.refund(CollUtil.newArrayList(outRecord)); + currentDetailAMount = returnNum.multiply(orderDetail.getPrice()) + .add(returnPackFee); // 使用了满减或积分,获取普通付款商品计算退款比例,退部分现金 }else if (oldOrderInfo.getFullCouponDiscountAmount().compareTo(BigDecimal.ZERO) > 0 || oldOrderInfo.getPointsDiscountAmount().compareTo(BigDecimal.ZERO) > 0){ // 计算当前商品占比 BigDecimal ratio = calcDetailRatio(orderDetail); BigDecimal realAmount = orderDetail.getPriceAmount().multiply(ratio); - returnAmount = returnAmount.add(realAmount - .divide(orderDetail.getNum(), 2, RoundingMode.DOWN) - .multiply(returnNum)); + currentDetailAMount = realAmount + .divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP) + .multiply(returnNum).setScale(2, RoundingMode.HALF_UP); + returnAmount = returnAmount.add(currentDetailAMount); saleAmount = saleAmount.add(orderDetail.getPrice()); packAMount = packAMount.add(orderDetail.getPackAmount() - .divide(orderDetail.getNum(), 2, RoundingMode.DOWN) - .multiply(returnNum)); + .divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP) + .multiply(returnNum)).setScale(2, RoundingMode.HALF_UP); }else { - returnAmount = returnAmount.add(orderDetail.getPriceAmount() - .divide(orderDetail.getNum(), 2, RoundingMode.DOWN) - .multiply(returnNum)); + currentDetailAMount = orderDetail.getPriceAmount() + .divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP) + .multiply(returnNum).setScale(2, RoundingMode.HALF_UP); + returnAmount = returnAmount.add(currentDetailAMount); saleAmount = saleAmount.add(orderDetail.getPrice()); packAMount = packAMount.add(orderDetail.getPackAmount() - .divide(orderDetail.getNum(), 2, RoundingMode.DOWN) - .multiply(returnNum)); + .divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP) + .multiply(returnNum)).setScale(2, RoundingMode.HALF_UP); } + + orderDetail.setNum(returnNum); + orderDetail.setPriceAmount(currentDetailAMount); + orderDetail.setPackAmount(returnPackFee); + orderDetail.setRefundNumber(returnNum); +// orderDetail.setStatus(isOnline ? "refunding" : "refund"); + orderDetail.setStatus("refund"); } if (returnAmount.compareTo(BigDecimal.ZERO) <= 0) {