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