From 37f13de311a35f45569397422708dd47dab72178 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Tue, 11 Jun 2024 17:08:49 +0800
Subject: [PATCH] 增加节点买卖规则 增加推荐规则奖励

---
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |  231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 231 insertions(+), 0 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
index a22b602..fc43a7c 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java
@@ -5,6 +5,8 @@
 import cc.mrbird.febs.dapp.dto.SystemDto;
 import cc.mrbird.febs.dapp.entity.*;
 import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
+import cc.mrbird.febs.dapp.enumerate.InviteRule;
+import cc.mrbird.febs.dapp.enumerate.NodeType;
 import cc.mrbird.febs.dapp.mapper.*;
 import cc.mrbird.febs.dapp.service.DappSystemService;
 import cc.mrbird.febs.dapp.service.DappWalletService;
@@ -16,6 +18,7 @@
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -44,6 +47,8 @@
     private final DappAchieveMemberTreeDao dappAchieveMemberTreeDao;
     private final DappWalletService dappWalletService;
     private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
+
+    private final DbMemberNodeMapper dbMemberNodeMapper;
 
 
     @Override
@@ -147,6 +152,97 @@
             }
         }
     }
+
+    @Override
+    public void achieveTreeV2(Long fundId) {
+        DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(fundId);
+        if(ObjectUtil.isEmpty(dappFundFlowEntity)){
+            return;
+        }
+        Integer status = dappFundFlowEntity.getStatus();
+        if(2 != status){
+            return;
+        }
+        Long memberId = dappFundFlowEntity.getMemberId();
+        DappMemberEntity member = dappMemberDao.selectById(memberId);
+        if(ObjectUtil.isEmpty(member)){
+            return;
+        }
+        BigDecimal amount = dappFundFlowEntity.getAmount();
+        //根据金额判断属于属于购买的哪一个节点
+        NodeType nodeType = NodeType.NODE_1.getNodeByAmount(amount);
+        /**
+         * 获取一条最老的左右节点未满的记录
+         * 然后生成一条新的记录
+         * 如果添加的为左节点,那么没人出局
+         * 如果添加的为右节点,那么进入判断
+         *      1、父节点为左节点,那么没人出局
+         *      2、父节点为右节点,那么进入判断,父节点是否有上级节点
+         *          1、有,则上级节点出局复投,轮数加1,复投逻辑
+         *
+         */
+        //获取一条最老的左右节点未满且生效中的记录
+        DbMemberNode dbMemberNodeOld = dbMemberNodeMapper.selectOneByWorkStateAndLeftNodeNullOrRightNodeNull(DbMemberNode.STATE_ONE);
+        if(ObjectUtil.isEmpty(dbMemberNodeOld)){
+            //生成ROOT节点
+            DbMemberNode root = new DbMemberNode();
+            root.setMemberId(memberId);
+            root.setFundId(fundId);
+            root.setAmount(new BigDecimal(nodeType.getNodeAmount()));
+            root.setType(nodeType.getNodeType());
+            root.setCountFund(1);
+            root.setPerkState(1);
+            root.setWorkState(1);
+            dbMemberNodeMapper.insert(root);
+
+            return;
+        }
+
+        //然后生成一条新的记录
+        DbMemberNode dbMemberNode = new DbMemberNode();
+        dbMemberNode.setMemberId(memberId);
+        dbMemberNode.setFundId(fundId);
+        dbMemberNode.setAmount(new BigDecimal(nodeType.getNodeAmount()));
+        dbMemberNode.setCountFund(1);
+        dbMemberNode.setPerkState(1);
+        dbMemberNode.setLeftRight(ObjectUtil.isEmpty(dbMemberNodeOld.getLeftNode()) ? 1 : 2);
+        dbMemberNode.setParentNode(dbMemberNodeOld.getId());
+        dbMemberNode.setWorkState(1);
+        dbMemberNodeMapper.insert(dbMemberNode);
+
+        //如果添加的为右节点,那么进入判断
+        if(DbMemberNode.STATE_TWO == dbMemberNode.getLeftRight()){
+            //父节点为右节点,那么进入判断,父节点是否有上级节点
+            int leftRight = ObjectUtil.isEmpty(dbMemberNodeOld.getLeftNode()) ? 1 : 2;
+            if(DbMemberNode.STATE_TWO == leftRight){
+                if(ObjectUtil.isEmpty(dbMemberNodeOld.getParentNode())){
+                    return;
+                }
+                Long parentNode = dbMemberNodeOld.getParentNode();
+                DbMemberNode dbMemberNodeRoot = dbMemberNodeMapper.selectById(parentNode);
+                if(ObjectUtil.isEmpty(dbMemberNodeRoot)){
+                    return;
+                }
+                //有,则上级节点出局复投,轮数加1,复投逻辑
+                memberNodeNext(dbMemberNodeRoot);
+            }else{//父节点为左节点,那么没人出局
+                return;
+            }
+        }else{
+            //如果添加的为左节点,那么没人出局
+            return;
+        }
+    }
+
+    /**
+     * 有,则上级节点出局复投,轮数加1,复投逻辑
+     * @param dbMemberNodeRoot
+     */
+    public void memberNodeNext(DbMemberNode dbMemberNodeRoot) {
+        log.info("进入复投");
+    }
+
+
 
     // 完成矩阵树,并重置矩阵且重入
     public void finishMatrixTree(Long memberId) {
@@ -283,4 +379,139 @@
             dappFundFlowDao.insert(profitFlow);
         });
     }
+
+    @Override
+    public void invitePerkMsg(Long id) {
+        /**
+         * 推荐规则:
+         * 无直推奖励,推2个3层,3个6层,4个10层。1%见点奖(有效层级内,每个每1%),共10层,共%10。
+         */
+        DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(id);
+        if(ObjectUtil.isEmpty(dappFundFlowEntity)){
+            return;
+        }
+        BigDecimal amount = dappFundFlowEntity.getAmount().abs();
+        /**
+         * 往上循环十层,判断每一层是否有见点奖
+         */
+        Long memberId = dappFundFlowEntity.getMemberId();
+        for(int i = 1;i <= 10;i++){
+            DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId);
+            String refererId = dappMemberEntity.getRefererId();
+            //上级不存在,则停止循环。
+            QueryWrapper<DappMemberEntity> objectQueryWrapper = new QueryWrapper<>();
+            objectQueryWrapper.eq("invite_id",refererId);
+            DappMemberEntity dappMemberEntityRef = dappMemberDao.selectOne(objectQueryWrapper);
+            if(ObjectUtil.isEmpty(dappMemberEntityRef)){
+                return;
+            }
+            //如果为购买星级激活用户,则跳过
+            Integer activeStatus = dappMemberEntityRef.getActiveStatus();
+            if(1 != activeStatus){
+                memberId = dappMemberEntityRef.getId();
+                continue;
+            }
+            //获取上级全部的直推
+            String inviteId = dappMemberEntityRef.getInviteId();
+            QueryWrapper<DappMemberEntity> memberInviteQuery = new QueryWrapper<>();
+            memberInviteQuery.eq("referer_id",inviteId);
+            List<DappMemberEntity> memberInviteList = dappMemberDao.selectList(memberInviteQuery);
+
+            //如果没有直推,则跳过
+            if(CollUtil.isEmpty(memberInviteList)){
+                memberId = dappMemberEntityRef.getId();
+                continue;
+            }
+
+            InviteRule rule = InviteRule.LEVEL_1.getRule(i);
+            if(ObjectUtil.isEmpty(rule)){
+                return;
+            }
+            //如果直推不满足当前规则需要的人数,则跳过
+            if(memberInviteList.size() < rule.getInviteNum()){
+                memberId = dappMemberEntityRef.getId();
+                continue;
+            }
+            BigDecimal perkPercent = new BigDecimal(rule.getPerkPercent());
+            BigDecimal perkAmount = perkPercent.multiply(amount);
+            Long perkMemberId = dappMemberEntityRef.getId();
+            //生成一条流水
+            DappFundFlowEntity rePutInFlow = new DappFundFlowEntity(
+                    perkMemberId,
+                    perkAmount,
+                    15,
+                    2,
+                    null,
+                    null);
+            dappFundFlowDao.insert(rePutInFlow);
+            //更新用户的金额
+            dappWalletService.updateWalletCoinWithLock(perkAmount, perkMemberId, 1);
+        }
+    }
+
+    @Override
+    public void nodePerkMsg(Long id) {
+        DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(id);
+        if(ObjectUtil.isEmpty(dappFundFlowEntity)){
+            return;
+        }
+        BigDecimal amount = dappFundFlowEntity.getAmount().abs();
+        log.info("买入贡献值-平分总金额-{}",amount);
+        /**
+         * 获取节点平分百分比 perkPercent
+         * 获取平分的份数 perKNum
+         * 获取每一份的金额 perkAmount
+         * 获取节点总数 buyNodeNum
+         * 如果perKNum大于buyNodeNum,则每个人获得(amount * perkPercent)/ perKNum = perkAmount
+         * 如果超出,再超出的人没有奖励
+         */
+        DataDictionaryCustom perkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.PERK_PERCENT.getType(),
+                DataDictionaryEnum.PERK_PERCENT.getCode()
+        );
+        BigDecimal perkPercent = new BigDecimal(ObjectUtil.isEmpty(perkPercentDic) ? "10" : perkPercentDic.getValue()).multiply(new BigDecimal("0.01"));
+
+        DataDictionaryCustom perKNumDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.PERK_NUM.getType(),
+                DataDictionaryEnum.PERK_NUM.getCode()
+        );
+        BigDecimal perKNum = new BigDecimal(ObjectUtil.isEmpty(perkPercentDic) ? "1000" : perKNumDic.getValue());
+
+        BigDecimal perkAmount = amount.multiply(perkPercent).divide(perKNum, 8, BigDecimal.ROUND_DOWN);
+        if(BigDecimal.ZERO.compareTo(perkAmount) >= 0){
+            return;
+        }
+
+        QueryWrapper<DappMemberEntity> objectQueryWrapper = new QueryWrapper<>();
+        objectQueryWrapper.ge("buy_node",0);
+        List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectList(objectQueryWrapper);
+        if(CollUtil.isEmpty(dappMemberEntities)){
+            return;
+        }
+
+        //奖励总份数
+        BigDecimal totalPerkNum = BigDecimal.ZERO;
+        for(DappMemberEntity dappMemberEntity : dappMemberEntities){
+            BigDecimal buyNode = new BigDecimal(dappMemberEntity.getBuyNode());
+            totalPerkNum = totalPerkNum.add(buyNode);
+            if(perKNum.compareTo(totalPerkNum) < 0){
+                return;
+            }
+            //奖励金额
+            BigDecimal memberPerk = perkPercent.multiply(buyNode);
+            dappWalletService.updateWalletCoinWithLock(memberPerk, dappMemberEntity.getId(), 1);
+
+            DappFundFlowEntity fundFlow = new DappFundFlowEntity(
+                    dappMemberEntity.getId(),
+                    memberPerk,
+                    14,
+                    2,
+                    BigDecimal.ZERO,
+                    null);
+            dappFundFlowDao.insert(fundFlow);
+        }
+
+        log.info("买入贡献值-总人数{},-每人金额{}",dappMemberEntities.size(),perkAmount);
+    }
+
 }

--
Gitblit v1.9.1