Commit 05fc322919d0138d3ff675ead0aafc717e843b09
Committed by
GitHub
Merge pull request #334 from freesme/fix-master-#320-calculation-error
修复:#320 支付手续费计算不正确,超过付款金额
Showing
2 changed files
with
17 additions
and
15 deletions
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java
| ... | ... | @@ -39,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional; |
| 39 | 39 | import org.springframework.validation.annotation.Validated; |
| 40 | 40 | |
| 41 | 41 | import javax.annotation.Resource; |
| 42 | +import java.math.RoundingMode; | |
| 42 | 43 | import java.time.LocalDateTime; |
| 43 | 44 | import java.util.List; |
| 44 | 45 | import java.util.Objects; |
| ... | ... | @@ -345,7 +346,8 @@ public class PayOrderServiceImpl implements PayOrderService { |
| 345 | 346 | .channelId(channel.getId()).channelCode(channel.getCode()) |
| 346 | 347 | .successTime(notify.getSuccessTime()).extensionId(orderExtension.getId()).no(orderExtension.getNo()) |
| 347 | 348 | .channelOrderNo(notify.getChannelOrderNo()).channelUserId(notify.getChannelUserId()) |
| 348 | - .channelFeeRate(channel.getFeeRate()).channelFeePrice(MoneyUtils.calculateRatePrice(order.getPrice(), channel.getFeeRate())) | |
| 349 | + .channelFeeRate(channel.getFeeRate()) | |
| 350 | + .channelFeePrice(MoneyUtils.calculateRatePrice(order.getPrice(), channel.getFeeRate(), 0, RoundingMode.HALF_UP).intValue()) | |
| 349 | 351 | .build()); |
| 350 | 352 | if (updateCounts == 0) { // 校验状态,必须是待支付 |
| 351 | 353 | throw exception(ORDER_STATUS_IS_NOT_WAITING); | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/util/MoneyUtils.java
| ... | ... | @@ -3,25 +3,25 @@ package cn.iocoder.yudao.module.pay.util; |
| 3 | 3 | import java.math.BigDecimal; |
| 4 | 4 | import java.math.RoundingMode; |
| 5 | 5 | |
| 6 | +import cn.hutool.core.util.NumberUtil; | |
| 7 | + | |
| 6 | 8 | /** |
| 7 | 9 | * 金额工具类 |
| 8 | 10 | * |
| 9 | 11 | * @author 芋道源码 |
| 10 | 12 | */ |
| 11 | 13 | public class MoneyUtils { |
| 12 | - | |
| 13 | - /** | |
| 14 | - * 计算百分比金额,四舍五入 | |
| 15 | - * | |
| 16 | - * @param price 金额 | |
| 17 | - * @param rate 百分比,例如说 56.77% 则传入 56.77 | |
| 18 | - * @return 百分比金额 | |
| 19 | - */ | |
| 20 | - public static Integer calculateRatePrice(Integer price, Double rate) { | |
| 21 | - return new BigDecimal(price) | |
| 22 | - .multiply(BigDecimal.valueOf(rate)) // 乘以 | |
| 23 | - .setScale(0, RoundingMode.HALF_UP) // 四舍五入 | |
| 24 | - .intValue(); | |
| 25 | - } | |
| 14 | + /** | |
| 15 | + * 计算百分比金额 | |
| 16 | + * | |
| 17 | + * @param price 金额 | |
| 18 | + * @param rate 百分比,例如说 56.77% 则传入 56.77 | |
| 19 | + * @param scale 保留小数位数 | |
| 20 | + * @param roundingMode 舍入模式 | |
| 21 | + */ | |
| 22 | + public static BigDecimal calculateRatePrice(Number price, Number rate, int scale, RoundingMode roundingMode) { | |
| 23 | + return NumberUtil.toBigDecimal(price).multiply(NumberUtil.toBigDecimal(rate)) // 乘以 | |
| 24 | + .divide(BigDecimal.valueOf(100), scale, roundingMode); // 除以100 | |
| 25 | + } | |
| 26 | 26 | |
| 27 | 27 | } | ... | ... |