Commit 05fc322919d0138d3ff675ead0aafc717e843b09

Authored by 芋道源码
Committed by GitHub
2 parents 0cb7d8a2 3d894ca7

Merge pull request #334 from freesme/fix-master-#320-calculation-error

修复:#320 支付手续费计算不正确,超过付款金额
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 }
... ...