From 03f330eaed9ae6666e6fbe72b12d0ce279bf56e6 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Wed, 30 Nov 2022 10:10:34 +0800
Subject: [PATCH] 20221124

---
 src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java                      |    2 
 src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSystemServiceImpl.java |   71 +++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |   46 +++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/entity/DappSystemProfit.java            |    4 
 src/main/resources/mapper/dapp/DappMemberDao.xml                          |    6 ++
 src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java       |    4 +
 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java               |    2 
 src/main/resources/application-dev.yml                                    |    2 
 src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java                    |    3 +
 src/main/java/cc/mrbird/febs/dapp/mapper/DappSystemProfitDao.java         |    5 +
 src/main/resources/mapper/dapp/DappSystemProfitDao.xml                    |   22 +++++++
 13 files changed, 164 insertions(+), 7 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java
index 24a4133..f1c18b1 100644
--- a/src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/TransferDto.java
@@ -39,4 +39,7 @@
 
     @ApiModelProperty(value = "1-余额 2-钱包")
     private Integer buyType;
+
+    @ApiModelProperty(hidden = true)
+    private Long memberId;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
index a37e420..2d3288f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -67,7 +67,7 @@
 
     /**
      * 类型 1-买入 2-矩阵收益 3-直推收益 4-保险池 5-提现 6-手续费充值 7-手续费扣除 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利
-     * 类型 1-加入动能 2-技术方收益 3-直推收益 4-层级收益 5-剩余层级收益 6-手续费充值 7-手续费扣除 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利
+     * 类型 1-加入动能 2-技术方收益 3-直推收益 4-层级收益 5-剩余层级收益给系统 6-复投动能 7-动能收益 8-结算 9-冻结 10-冻结释放 11-产矿 12-手续费返利
      */
     private Integer type;
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappSystemProfit.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappSystemProfit.java
index a1b5556..d885a7a 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappSystemProfit.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappSystemProfit.java
@@ -15,8 +15,8 @@
     private BigDecimal amount;
     //1:入列 2:出列
     private Integer state;
-
-    public DappSystemProfit() {}
+    public static final int STATE_IN = 1;
+    public static final int STATE_OUT = 2;
 
     public DappSystemProfit(Long memberId, BigDecimal amount) {
         this.memberId = memberId;
diff --git a/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
index 52e9366..919e077 100644
--- a/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
+++ b/src/main/java/cc/mrbird/febs/dapp/enumerate/DataDictionaryEnum.java
@@ -4,6 +4,10 @@
 
 @Getter
 public enum DataDictionaryEnum {
+    // 投资金额
+    INVEST_AMOUNT("SYSTEM_SETTING","INVEST_AMOUNT"),
+    // 当前轮数
+    QUEUE_COUNT("SYSTEM_SETTING","QUEUE_COUNT"),
     // 会员代理等级
     BIG_BOSS("MEMBER_LEVEL","BIG_BOSS"),
     BOSS("MEMBER_LEVEL","BOSS"),
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
index 8d31cec..bd45b11 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
@@ -44,4 +44,6 @@
     DappMemberEntity selectNewestDirectMember(@Param("inviteId") String inviteId);
 
     List<DappMemberEntity> selectMemberListNeedProfit();
+
+    void updateMemberAccountType(@Param("accountType")String code, @Param("id")Long id);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappSystemProfitDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappSystemProfitDao.java
index 8e86bb4..f3f65c8 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappSystemProfitDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappSystemProfitDao.java
@@ -2,6 +2,11 @@
 
 import cc.mrbird.febs.dapp.entity.DappSystemProfit;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 public interface DappSystemProfitDao extends BaseMapper<DappSystemProfit> {
+
+    DappSystemProfit selectSystemProfitByState(@Param("state") int stateOut);
+
+    DappSystemProfit selectByIdForUpdate(@Param("id") Long id,@Param("state") int stateOut);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
index beb9060..25cd784 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -45,4 +45,6 @@
 
     DappWalletCoinEntity findByMemberId(Long memberId);
 
+    void transferAgain(TransferDto transferDto);
+
 }
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 2509a14..4b8702d 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
@@ -7,6 +7,7 @@
 import cc.mrbird.febs.dapp.chain.ChainEnum;
 import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.dto.SystemDto;
+import cc.mrbird.febs.dapp.dto.TransferDto;
 import cc.mrbird.febs.dapp.entity.*;
 import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
 import cc.mrbird.febs.dapp.enumerate.LevelProfitEnum;
@@ -330,7 +331,12 @@
                 }
                 //获取对应层级奖励
                 BigDecimal profit = LevelProfitEnum.YI.getProfit(i);
-                BigDecimal memberLevelProfit = levelProfitTotal.multiply(profit);
+                String accountType = refererMember.getAccountType();
+                //根据会员的等级类型,获取对应的百分比收益
+                DataDictionaryCustom memberLevelSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode("MEMBER_LEVEL", accountType);
+                BigDecimal memberLevel = new BigDecimal(memberLevelSet.getValue());
+
+                BigDecimal memberLevelProfit = levelProfitTotal.multiply(profit).multiply(memberLevel);
 
                 DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), memberLevelProfit, 4, 2, BigDecimal.ZERO,null,dappSystemProfit.getId());
                 dappFundFlowDao.insert(fundFlow);
@@ -347,9 +353,72 @@
 
     @Override
     public void memberOut(Long id) {
+        //验证是否已经加入动能队列
+        DappSystemProfit systemProfit = dappSystemProfitDao.selectById(id);
+        if(ObjectUtil.isEmpty(systemProfit)){
+            return;
+        }
         //获取当前是第几轮队列
+        String redisKey = "QUEUE_COUNT";
+        String memberOutCount = redisUtils.getString(redisKey);
+        DataDictionaryCustom queueCountSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.QUEUE_COUNT.getType(), DataDictionaryEnum.QUEUE_COUNT.getCode());
+        String queueCount = queueCountSet.getValue();
+        if(StrUtil.isBlank(memberOutCount)){
+            redisUtils.set(redisKey,queueCount,0L);
+            memberOutCount = queueCount;
+        }
+        //出局条件的人数
+        /**
+         * 初始大小 5+4*0
+         * 1  1,2,3,4,5  1出局 5+4*0
+         * 2  2,3,4,5,1(复投),7,8,9,10  2出局 5+4*1
+         * 3  3,4,5,1(复投),7,8,9,10,2(复投),12,13,14,15 3出局 5+4*2
+         * 4  4,5,1(复投),7,8,9,10,2(复投),12,13,14,15,3(复投),17,18,19,20  4出局 5+4*3
+         */
+        Integer memberCount = Integer.parseInt(memberOutCount) * 4 + 5;
         //判断当前是否符合出局条件
+        QueryWrapper<DappSystemProfit> objectQueryWrapper = new QueryWrapper<>();
+        objectQueryWrapper.eq("state",DappSystemProfit.STATE_IN);
+        //实际投资人数
+        Integer selectCount = dappSystemProfitDao.selectCount(objectQueryWrapper);
+        //实际投资人数小于出局条件人数
+        if(selectCount < memberCount){
+            return;
+        }
+        //符合则出局 实际投资人数等于出局条件人数
+        DappSystemProfit dappSystemProfit = dappSystemProfitDao.selectSystemProfitByState(DappSystemProfit.STATE_IN);
+        if(ObjectUtil.isEmpty(dappSystemProfit)){
+            return;
+        }
         //符合则出局,轮数+1
+        Integer realCount = (Integer.parseInt(queueCount) + 1);
+        queueCountSet.setValue(realCount.toString());
+        dataDictionaryCustomMapper.updateById(queueCountSet);
+        redisUtils.set(redisKey,realCount,0L);
+
+        DappSystemProfit dappSystemProfitNow = dappSystemProfitDao.selectByIdForUpdate(dappSystemProfit.getId(),DappSystemProfit.STATE_IN);
+        dappSystemProfitNow.setState(DappSystemProfit.STATE_OUT);
+        dappSystemProfitDao.updateById(dappSystemProfitNow);
+
+        //todo 直接拿走0.95ge
+        DappFundFlowEntity fundFlowOut = new DappFundFlowEntity(dappSystemProfitNow.getMemberId(), new BigDecimal(0.95), 7, 2, BigDecimal.ZERO, null,dappSystemProfitNow.getId());
+        dappFundFlowDao.insert(fundFlowOut);
+        //复投 成功{type: 1, txHash: result.transactionHash, id: res.data, flag: 'success', buyType: 2}
+        DataDictionaryCustom investAmountSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.INVEST_AMOUNT.getType(), DataDictionaryEnum.INVEST_AMOUNT.getCode());
+        BigDecimal investAmount = new BigDecimal(investAmountSet.getValue());
+        //todo 直接运行转账
+        String txHash = "复投";
+        DappFundFlowEntity fundFlow = new DappFundFlowEntity(dappSystemProfitNow.getMemberId(), investAmount, 6, 2, BigDecimal.ZERO, txHash);
+        dappFundFlowDao.insert(fundFlow);
+
+        TransferDto transferDto = new TransferDto();
+        transferDto.setType(1);
+        transferDto.setTxHash(txHash);
+        transferDto.setBuyType(2);
+        transferDto.setId(fundFlow.getId());
+        transferDto.setFlag("success");
+        transferDto.setMemberId(dappSystemProfitNow.getMemberId());
+        dappWalletService.transferAgain(transferDto);
     }
 
     public static void main(String[] args) {
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
index 341b391..136444d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -174,6 +174,9 @@
                 //插入一条会员入列记录,即加入动能队列
                 DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), transferDto.getAmount());
                 dappSystemProfitDao.insert(dappSystemProfit);
+                //升级成为Agent
+                dappMemberDao.updateMemberAccountType(DataDictionaryEnum.AGENT.getCode(),member.getId());
+
                 DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                 flow.setFromHash(transferDto.getTxHash());
                 flow.setSystemProfitId(dappSystemProfit.getId());
@@ -198,7 +201,7 @@
                 //层级奖励30%
                 chainProducer.sendLevelProfitMsg(dappSystemProfit.getId());
                 //发送一个消息,计算当前是否有人可以出局
-
+                chainProducer.sendMemberOutMsg(dappSystemProfit.getId());
             } else {
                 DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
                 if (flow.getStatus() == 1) {
@@ -369,4 +372,45 @@
     public DappWalletCoinEntity findByMemberId(Long memberId) {
         return dappWalletCoinDao.selectByMemberId(memberId);
     }
+
+    @Override
+    public void transferAgain(TransferDto transferDto) {
+        Long memberId = transferDto.getMemberId();
+        DappMemberEntity member = dappMemberDao.selectById(memberId);
+        String upgrade = redisUtils.getString("APP_UPGRADE");
+        if ("upgrade".equals(upgrade)) {
+            throw new FebsException("功能升级中");
+        }
+        if ("success".equals(transferDto.getFlag())) {
+            //插入一条会员入列记录,即加入动能队列
+            DappSystemProfit dappSystemProfit = new DappSystemProfit(member.getId(), transferDto.getAmount());
+            dappSystemProfitDao.insert(dappSystemProfit);
+            DappFundFlowEntity flow = dappFundFlowDao.selectById(transferDto.getId());
+            flow.setFromHash(transferDto.getTxHash());
+            flow.setSystemProfitId(dappSystemProfit.getId());
+            dappFundFlowDao.updateById(flow);
+
+            //直接拿走0.05个BNB放入技术方
+            DataDictionaryCustom systemProfit = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYSTEM_PROFIT.getType(), DataDictionaryEnum.SYSTEM_PROFIT.getCode());
+            String systemProfitStr = StrUtil.isEmpty(systemProfit.getValue()) ? "0.05" : systemProfit.getValue();
+            DappFundFlowEntity systemProfitFlow = new DappFundFlowEntity(member.getId(), new BigDecimal(systemProfitStr), 2, 2, BigDecimal.ZERO, transferDto.getTxHash(),dappSystemProfit.getId());
+            dappFundFlowDao.insert(systemProfitFlow);
+            //直接返利30%给直接上级
+            DappMemberEntity dappMemberEntity = dappMemberDao.selectById(member.getId());
+            String refererId = dappMemberEntity.getRefererId();
+            DappMemberEntity refererMember = dappMemberDao.selectMemberInfoByInviteId(refererId);
+
+            DataDictionaryCustom directProfitSet = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DIRECT_PROFIT.getType(), DataDictionaryEnum.DIRECT_PROFIT.getCode());
+            BigDecimal directProfitStr = new BigDecimal(StrUtil.isEmpty(directProfitSet.getValue()) ? "0.3" : directProfitSet.getValue());
+            BigDecimal directProfit = (transferDto.getAmount().subtract(new BigDecimal(systemProfitStr))).multiply(directProfitStr).setScale(BigDecimal.ROUND_DOWN, 2);
+
+            DappFundFlowEntity fundFlow = new DappFundFlowEntity(refererMember.getId(), directProfit, 3, 2, BigDecimal.ZERO, transferDto.getTxHash(),dappSystemProfit.getId());
+            dappFundFlowDao.insert(fundFlow);
+            //层级奖励30%
+            chainProducer.sendLevelProfitMsg(dappSystemProfit.getId());
+            //发送一个消息,计算当前是否有人可以出局
+            chainProducer.sendMemberOutMsg(dappSystemProfit.getId());
+
+        }
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java b/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java
index f4774f5..252b8b0 100644
--- a/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java
+++ b/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java
@@ -36,7 +36,7 @@
     private DataDictionaryCustomMapper dataDictionaryCustomMapper;
     @Autowired
     private DappWalletService dappWalletService;
-
+    //todo -- 升级会员等级
     @Scheduled(cron = "0 0 0 * * ?")
     public void profitDailyJob() {
         log.info("每日产矿任务执行");
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 4f91410..9c5f218 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -23,7 +23,7 @@
           username: ct_test
           password: 123456
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://120.27.238.55:3306/db_sdm?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://120.27.238.55:3306/db_bnbweb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     database: 8
diff --git a/src/main/resources/mapper/dapp/DappMemberDao.xml b/src/main/resources/mapper/dapp/DappMemberDao.xml
index d4c663f..1c2e814 100644
--- a/src/main/resources/mapper/dapp/DappMemberDao.xml
+++ b/src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -146,4 +146,10 @@
             group by referer_id having count(1) > 3
         ) b on a.invite_id=b.referer_id
     </select>
+
+    <update id="updateMemberAccountType">
+        update dapp_member
+        set account_type = #{accountType}
+        where id = #{id}
+    </update>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/dapp/DappSystemProfitDao.xml b/src/main/resources/mapper/dapp/DappSystemProfitDao.xml
new file mode 100644
index 0000000..a584bc4
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappSystemProfitDao.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cc.mrbird.febs.dapp.mapper.DappSystemProfitDao">
+
+    <select id="selectSystemProfitByState" resultType="cc.mrbird.febs.dapp.entity.DappSystemProfit">
+        select a.*
+        from dapp_system_profit a
+        where state = #{state}
+        order by id ASC
+        limit 1
+        for update
+    </select>
+
+    <select id="selectByIdForUpdate" resultType="cc.mrbird.febs.dapp.entity.DappSystemProfit">
+        select a.*
+        from dapp_system_profit a
+        where a.id = #{id}
+        and a.state = #{state}
+        for update
+    </select>
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1