KKSU
2025-02-21 877b982710ab433610c8c220f7da592f1ea51e66
feat(mall): 添加直推奖励功能

- 在 AgentServiceImpl 中调用 asyncService.directCoin 方法处理直推奖励
- 在 AsyncService接口中添加 directCoin 方法
- 在 AsyncServiceImpl 中实现直推奖励的逻辑
- 在 RunVipDataDictionaryEnum 中添加 CHARGE_SYS_DIRECT 枚举项
- 在 RunVipMoneyFlowTypeEnum 中添加 DIRECT_USDT 枚举项
5 files modified
83 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/AsyncService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java 68 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java
@@ -5,6 +5,10 @@
@Getter
public enum RunVipDataDictionaryEnum {
    //直推奖励
    CHARGE_SYS_DIRECT("CHARGE_TYPE", "CHARGE_SYS_DIRECT"),
    //节点升级-直推人数
    NODE_DIRECT_CNT("CHARGE_TYPE", "NODE_DIRECT_CNT"),
    //节点升级-团队人数
src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java
@@ -6,6 +6,11 @@
public enum RunVipMoneyFlowTypeEnum {
    /**
     * 推荐权益
     */
    DIRECT_USDT(19,"推荐权益:{}","推荐权益"),
    /**
     * 碳币兑换USDT
     */
    COMMISSION_PAY_CHARGE(18,"USDT充值:{}","USDT充值"),
src/main/java/cc/mrbird/febs/mall/service/AsyncService.java
@@ -10,6 +10,9 @@
public interface AsyncService extends IService<MallMember> {
    @Async(FebsConstant.ASYNC_POOL)
    void directCoin(BigDecimal amount,Long memberId);
    @Async(FebsConstant.ASYNC_POOL)
    void releaseScore(BigDecimal amount,Long memberId);
    @Async(FebsConstant.ASYNC_POOL)
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -363,6 +363,9 @@
        //更新会员的等级和会员升级的时间
        mallMemberMapper.updateVipLevelTimeAndLevel(memberId,DateUtil.date(),vipCode);
        //直推权益
        asyncService.directCoin(mallCharge.getAmount(),memberId);
        agentProducer.sendNodeUpMsg(memberId);
    }
src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java
@@ -1,10 +1,13 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.RunVipMoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.YesOrNoEnum;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.service.AsyncService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
@@ -25,6 +28,71 @@
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final IApiMallMemberWalletService walletService;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    /**
     * 执行直推奖励的逻辑
     * 当一个会员进行操作时,此方法会根据直推关系给予推荐人一定的奖励
     * 奖励金额计算基于操作金额和系统设定的直推奖励比例
     *
     * @param amount      操作金额,用于计算直推奖励
     * @param memberId    会员ID,用于查找会员及其推荐人信息
     */
    @Override
    public void directCoin(BigDecimal amount, Long memberId) {
        // 根据会员ID查询会员信息
        MallMember mallMember = this.baseMapper.selectById(memberId);
        // 如果会员不存在或没有推荐人,则直接返回
        if (null == mallMember || StrUtil.isBlank(mallMember.getReferrerId())){
            return;
        }
        // 根据推荐人ID查询推荐人信息
        MallMember mallRef = this.baseMapper.selectInfoByInviteId(mallMember.getReferrerId());
        // 如果推荐人不存在,则直接返回
        if(mallRef == null){
            return;
        }
        // 查询直推奖励的比例设置
        DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getType(),
                RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getCode()
        );
        // 如果未设置直推奖励比例,则初始化一个默认值(0.1代表10%,设置成0,则不返直推)
        if(null == dataDictionaryCustom){
            dataDictionaryCustom = new DataDictionaryCustom();
            dataDictionaryCustom.setType(RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getType());
            dataDictionaryCustom.setCode(RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getCode());
            dataDictionaryCustom.setValue("0");
            dataDictionaryCustom.setDescription("直推奖励(0.1代表10%,设置成0,则不返直推)");
            dataDictionaryCustomMapper.insert(dataDictionaryCustom);
        }
        // 解析直推奖励比例
        BigDecimal directPercent = new BigDecimal(dataDictionaryCustom.getValue());
        // 计算直推奖励金额
        BigDecimal directAmount = amount.multiply(directPercent).setScale(2, RoundingMode.DOWN);
        // 如果直推奖励金额小于等于0,则直接返回
        if(BigDecimal.ZERO.compareTo(directAmount) >=0){
            return;
        }
        // 调用服务增加推荐人的佣金
        walletService.addCommission(directAmount,mallRef.getId());
        // 生成订单号
        String orderNo = MallUtils.getOrderNum("DPE");
        // 记录推荐人的资金流水
        mallMoneyFlowService.runVipMoneyFlowAdd(
                mallRef.getId(),
                memberId,
                orderNo,
                FlowTypeEnum.COMMISSION.getValue(),
                RunVipMoneyFlowTypeEnum.DIRECT_USDT.getValue(),
                directAmount,
                StrUtil.format(RunVipMoneyFlowTypeEnum.DIRECT_USDT.getDescription(),directAmount),
                YesOrNoEnum.YES.getValue()
        );
    }
    @Override
    public void releaseScore(BigDecimal V3, Long memberId) {
        walletService.addScore(V3,memberId);