From 877b982710ab433610c8c220f7da592f1ea51e66 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Fri, 21 Feb 2025 16:39:01 +0800 Subject: [PATCH] feat(mall): 添加直推奖励功能 --- src/main/java/cc/mrbird/febs/mall/service/AsyncService.java | 3 + src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java | 4 ++ src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 3 + src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java | 5 ++ src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java | 68 ++++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 0 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java index 5b44448..bbda047 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java +++ b/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"), //节点升级-团队人数 diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java index ce22cc5..c69c60a 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java +++ b/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充值"), diff --git a/src/main/java/cc/mrbird/febs/mall/service/AsyncService.java b/src/main/java/cc/mrbird/febs/mall/service/AsyncService.java index a8e517b..5c66758 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/AsyncService.java +++ b/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) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java index 866d039..a525983 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java +++ b/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); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java index 9063f79..c19c643 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java +++ b/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); -- Gitblit v1.9.1