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,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional;
39 import org.springframework.validation.annotation.Validated; 39 import org.springframework.validation.annotation.Validated;
40 40
41 import javax.annotation.Resource; 41 import javax.annotation.Resource;
  42 +import java.math.RoundingMode;
42 import java.time.LocalDateTime; 43 import java.time.LocalDateTime;
43 import java.util.List; 44 import java.util.List;
44 import java.util.Objects; 45 import java.util.Objects;
@@ -345,7 +346,8 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -345,7 +346,8 @@ public class PayOrderServiceImpl implements PayOrderService {
345 .channelId(channel.getId()).channelCode(channel.getCode()) 346 .channelId(channel.getId()).channelCode(channel.getCode())
346 .successTime(notify.getSuccessTime()).extensionId(orderExtension.getId()).no(orderExtension.getNo()) 347 .successTime(notify.getSuccessTime()).extensionId(orderExtension.getId()).no(orderExtension.getNo())
347 .channelOrderNo(notify.getChannelOrderNo()).channelUserId(notify.getChannelUserId()) 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 .build()); 351 .build());
350 if (updateCounts == 0) { // 校验状态,必须是待支付 352 if (updateCounts == 0) { // 校验状态,必须是待支付
351 throw exception(ORDER_STATUS_IS_NOT_WAITING); 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,25 +3,25 @@ package cn.iocoder.yudao.module.pay.util;
3 import java.math.BigDecimal; 3 import java.math.BigDecimal;
4 import java.math.RoundingMode; 4 import java.math.RoundingMode;
5 5
  6 +import cn.hutool.core.util.NumberUtil;
  7 +
6 /** 8 /**
7 * 金额工具类 9 * 金额工具类
8 * 10 *
9 * @author 芋道源码 11 * @author 芋道源码
10 */ 12 */
11 public class MoneyUtils { 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 }