KKSU
2024-12-19 eddc5253fd590be82fe689fb6eceea3f6c4fbb6b
fix(mall): 修复跑路会员返利计算逻辑

- 使用 RoundingMode.DOWN 替代 BigDecimal.ROUND_DOWN 以提高代码可读性
- 修复返利计算过程中的精度问题,确保结果向下取整
- 优化返利给上上级的逻辑,避免负数计算
- 调整权限检查,将 'user:update' 替换为 'charge:update'
2 files modified
15 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 11 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/runVip/buyVipList.html 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -24,6 +24,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
/**
@@ -209,7 +210,7 @@
        RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, vipCode));
        BigDecimal rebatePercent = runVip.getRebatePercent();
        BigDecimal amount = mallCharge.getAmount();
        BigDecimal rebateAmount = amount.multiply(rebatePercent).setScale(2, BigDecimal.ROUND_DOWN);
        BigDecimal rebateAmount = amount.multiply(rebatePercent).setScale(2, RoundingMode.DOWN);
        BigDecimal balanceToCoin =
                new BigDecimal(
                        dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
@@ -217,7 +218,7 @@
                                RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode()
                        ).getValue()
                );
        BigDecimal rebateCoin = rebateAmount.divide(balanceToCoin, 2, BigDecimal.ROUND_DOWN);
        BigDecimal rebateCoin = rebateAmount.divide(balanceToCoin, 2, RoundingMode.DOWN);
        if(BigDecimal.ZERO.compareTo(rebateCoin) >= 0){
            return;
        }
@@ -227,9 +228,10 @@
        }
        String orderNo = MallUtils.getOrderNum("FL");
        if(null != parent.getReferrerId()){
            BigDecimal rebateCoinGrandpa = rebateCoin.multiply(rebatePercent);
            BigDecimal rebateCoinGrandpa = rebateCoin.multiply(rebatePercent).setScale(2, RoundingMode.DOWN);
            MallMember grandpa = mallMemberMapper.selectInfoByInviteId(parent.getReferrerId());
            if(null != grandpa){
                if(BigDecimal.ZERO.compareTo(rebateCoinGrandpa) < 0){
                //返利给上上级
                walletService.addBalance(rebateCoinGrandpa,grandpa.getId());
                mallMemberService.runVipMoneyFlowAdd(
@@ -242,7 +244,8 @@
                        StrUtil.format(RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getDescription(),mallMember.getPhone(),runVip.getVipName(),rebateCoinGrandpa),
                        YesOrNoEnum.YES.getValue()
                );
                rebateCoin = rebateCoin.subtract(rebateCoinGrandpa);
                    rebateCoin = rebateCoin.subtract(rebateCoinGrandpa).setScale(2, RoundingMode.DOWN);
                }
            }
        }
        //返利给上级
src/main/resources/templates/febs/views/modules/runVip/buyVipList.html
@@ -61,8 +61,8 @@
<script type="text/html" id="commissionOption">
    {{#  if(d.state == 2){ }}
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="user:update" lay-event="chargeAgreeEvent">确认</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="user:update" lay-event="chargeDisAgreeEvent">取消</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="charge:update" lay-event="chargeAgreeEvent">确认</button>
        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="charge:update" lay-event="chargeDisAgreeEvent">取消</button>
    {{#  } }}
</script>
<script data-th-inline="none" type="text/javascript">