From 7f7a1b01527843ffb178d015a044380acbde4fe2 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Tue, 02 Jul 2024 16:23:25 +0800
Subject: [PATCH] 逻辑

---
 src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java |  384 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 319 insertions(+), 65 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java b/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java
index 750f64e..b612a14 100644
--- a/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java
+++ b/src/main/java/cc/mrbird/febs/job/ProfitDailyJob.java
@@ -1,77 +1,331 @@
 package cc.mrbird.febs.job;
 
 
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import cc.mrbird.febs.dapp.entity.DappStorage;
+import cc.mrbird.febs.dapp.entity.DataDictionaryCustom;
+import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum;
+import cc.mrbird.febs.dapp.enumerate.MoneyFlowEnum;
+import cc.mrbird.febs.dapp.mapper.DappMemberDao;
+import cc.mrbird.febs.dapp.mapper.DappStorageMapper;
+import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper;
+import cc.mrbird.febs.dapp.service.DappSystemService;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+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.extern.slf4j.Slf4j;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Component
-@ConditionalOnProperty(prefix = "system", name = "quartz-job", havingValue = "true")
+@ConditionalOnProperty(prefix = "system", name = "charge-transfer", havingValue = "true")
 public class ProfitDailyJob {
 
-//    @Autowired
-//    private DappMemberDao dappMemberDao;
-//    @Autowired
-//    private DappFundFlowDao dappFundFlowDao;
-//    @Autowired
-//    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
-//    @Autowired
-//    private DappWalletService dappWalletService;
-//
-//    @Scheduled(cron = "0 0 0 * * ?")
-//    public void profitDailyJob() {
-//        log.info("每日产矿任务执行");
-//        DataDictionaryCustom symbolPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SYMBOL_PRICE.getType(), DataDictionaryEnum.SYMBOL_PRICE.getCode());
-//        if (symbolPriceDic == null) {
-//            log.info("未设置币种价格");
-//            return;
-//        }
-//
-//        DataDictionaryCustom rebateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.REBATE_PERCENT.getType(), DataDictionaryEnum.REBATE_PERCENT.getCode());
-//        if (rebateDic == null) {
-//            log.info("未设置每日产矿比例");
-//            return;
-//        }
-//
-//        BigDecimal symbolPrice = new BigDecimal(symbolPriceDic.getValue());
-//        BigDecimal rebateRatio = new BigDecimal(rebateDic.getValue());
-//
-//        QueryWrapper<DappMemberEntity> query = new QueryWrapper<>();
-//        query.eq("active_status", 1);
-//        List<DappMemberEntity> members = dappMemberDao.selectList(query);
-//        if (CollUtil.isEmpty(members)) {
-//            return;
-//        }
-//
-//        members.forEach(item -> {
-//            QueryWrapper<DappFundFlowEntity> fundFlowQuery = new QueryWrapper<>();
-//            fundFlowQuery.eq("member_id", item.getId());
-//            fundFlowQuery.eq("type", 11);
-//            List<DappFundFlowEntity> flows = dappFundFlowDao.selectList(fundFlowQuery);
-//
-//            BigDecimal sum = BigDecimal.ZERO;
-//            if (CollUtil.isNotEmpty(flows)) {
-//                double symbolSum = flows.stream().mapToDouble(flow -> flow.getAmount().doubleValue()).sum();
-//                sum = symbolPrice.multiply(new BigDecimal(symbolSum));
-//            }
-//
-//            if (CollUtil.isEmpty(flows) || TreeConstants.PUT_IN_AMOUNT.compareTo(sum) > 0) {
-//                BigDecimal profitU = TreeConstants.PUT_IN_AMOUNT.multiply(rebateRatio.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_DOWN));
-//
-//                BigDecimal remain = TreeConstants.PUT_IN_AMOUNT.subtract(sum);
-//                if (remain.compareTo(profitU) < 0) {
-//                    profitU = remain;
-//                }
-//
-//                BigDecimal profitSymbol = profitU.divide(symbolPrice, 8, RoundingMode.HALF_DOWN);
-//
-//                dappWalletService.updateWalletMineWithLock(profitSymbol, item.getId(), 1);
-//                DappFundFlowEntity fundFlow = new DappFundFlowEntity(item.getId(), profitSymbol, 11, 2, null, null);
-//                dappFundFlowDao.insert(fundFlow);
-//            }
-//        });
-//
-//
-//    }
+    @Resource
+    private DappSystemService dappSystemService;
+    @Resource
+    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
+    @Resource
+    private DappStorageMapper dappStorageMapper;
+    @Resource
+    private DappMemberDao dappMemberDao;
+
+    /**
+     * 每天释放1%的静态释放
+     */
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void profitDailyJobThree() {
+        QueryWrapper<DappStorage> objectQueryWrapper = new QueryWrapper<>();
+        objectQueryWrapper.eq("state",1);
+        List<DappStorage> dappStorages = dappStorageMapper.selectList(objectQueryWrapper);
+        if(CollUtil.isEmpty(dappStorages)){
+            return;
+        }
+
+        for(DappStorage storage : dappStorages){
+            Long memberId = storage.getMemberId();
+            BigDecimal releaseAmount = storage.getReleaseAmount();
+            dappSystemService.updateBalanceInsertFlow(
+                    releaseAmount,
+                    memberId,
+                    MoneyFlowEnum.STATIC_PERK.getValue(),
+                    StrUtil.format(MoneyFlowEnum.STATIC_PERK.getDescrition(),releaseAmount));
+        }
+    }
+
+    /**
+     * 六、永动补偿池2%
+     * 24小时内最后一名拿走池子50%
+     * 倒数2-100名拿走池子50%平分(根据时间)
+     *
+     *
+     * 五、DAO永动激励池:6%
+     *  循环激励50%(每天下午17:00结算)
+     * (其中50%给予当天大单排名激励前4名,40%、30%、20、10%;
+     * 另外50% 给予当天直推总业绩排名激励前10名,第1名40%,2-4名30%,5-10名30%)
+     */
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void profitDailyJobOne() {
+        DataDictionaryCustom buChangChiDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.BUCAHNG_CHI.getType(),
+                DataDictionaryEnum.BUCAHNG_CHI.getCode()
+        );
+        //永动补偿池2%
+        BigDecimal buChangAmountTotal = new BigDecimal(buChangChiDic.getValue()).setScale(2, BigDecimal.ROUND_DOWN);
+        if(BigDecimal.ZERO.compareTo(buChangAmountTotal) >= 0){
+            return;
+        }
+        //剩余金额
+        BigDecimal surplusAmount = BigDecimal.ZERO;
+        /**
+         * 最后一名拿走池子50%
+         */
+        BigDecimal oneAmount = buChangAmountTotal.multiply(new BigDecimal("0.5")).setScale(2,BigDecimal.ROUND_DOWN);
+
+        DateTime dateTime = DateUtil.offsetHour(new Date(), -24);
+        DappStorage dappStorage = dappStorageMapper.selectOneByDateDesc(dateTime);
+        if(ObjectUtil.isNotEmpty(dappStorage)){
+            Long memberId = dappStorage.getMemberId();
+            dappSystemService.updateBalanceInsertFlow(
+                    oneAmount,
+                    memberId,
+                    MoneyFlowEnum.BU_CHANG_PERK.getValue(),
+                    StrUtil.format(MoneyFlowEnum.BU_CHANG_PERK.getDescrition(),buChangAmountTotal,oneAmount));
+
+            surplusAmount = surplusAmount.add(oneAmount);
+        }
+        /**
+         * 倒数2-100名拿走池子50%平分(根据时间)
+         */
+        BigDecimal otherAmount = buChangAmountTotal.subtract(oneAmount);
+        List<DappStorage> dappStorages = dappStorageMapper.selectListByDateDesc(dateTime);
+        if(CollUtil.isNotEmpty(dappStorages)){
+
+            BigDecimal otherAmountReal = otherAmount.divide(new BigDecimal(dappStorages.size())).setScale(2, BigDecimal.ROUND_DOWN);
+            surplusAmount = surplusAmount.add(otherAmount);
+            for(DappStorage storage : dappStorages){
+                Long memberId = storage.getMemberId();
+                dappSystemService.updateBalanceInsertFlow(
+                        otherAmountReal,
+                        memberId,
+                        MoneyFlowEnum.BU_CHANG_PERK.getValue(),
+                        StrUtil.format(MoneyFlowEnum.BU_CHANG_PERK.getDescrition(),buChangAmountTotal,oneAmount));
+            }
+        }
+        buChangChiDic.setValue(buChangAmountTotal.subtract(surplusAmount).setScale(2,BigDecimal.ROUND_DOWN).toString());
+        dataDictionaryCustomMapper.updateById(buChangChiDic);
+    }
+
+    /**
+     * 五、DAO永动激励池:6%
+     *  循环激励50%(每天下午17:00结算)
+     * (其中50%给予当天大单排名激励前4名,40%、30%、20、10%;
+     * 另外50% 给予当天直推总业绩排名激励前10名,第1名40%,2-4名30%,5-10名30%)
+     */
+    @Scheduled(cron = "0 0 17 * * ?")
+    public void profitDailyJobTwo() {
+
+        DataDictionaryCustom jiliChiDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.JILI_CHI.getType(),
+                DataDictionaryEnum.JILI_CHI.getCode()
+        );
+
+        BigDecimal realAmount = BigDecimal.ZERO;
+        //DAO永动激励池50%
+        BigDecimal jiLiTotal = new BigDecimal(jiliChiDic.getValue()).multiply(new BigDecimal("0.5")).setScale(2, BigDecimal.ROUND_DOWN);
+        if(BigDecimal.ZERO.compareTo(jiLiTotal) >= 0){
+            return;
+        }
+
+
+        /**
+         * 其中50%给予当天大单排名激励前4名,40%、30%、20、10%
+         */
+        BigDecimal daDanTotal = jiLiTotal.multiply(new BigDecimal("0.5")).setScale(2, BigDecimal.ROUND_DOWN);
+        if(daDanTotal.compareTo(BigDecimal.ZERO) > 0){
+
+            int oneCount = 4;
+            int twoCount = 3;
+            int threeCount = 2;
+            int fourCount = 1;
+            int count = oneCount + twoCount + threeCount + fourCount;
+            //每一份的奖励数量
+            BigDecimal everyAmount = daDanTotal.divide(new BigDecimal(count));
+
+            if(everyAmount.compareTo(BigDecimal.ZERO) > 0){
+                DappStorage dappStorageOne = dappStorageMapper.selectAmountByDesc(new Date(),0,1);
+                if(ObjectUtil.isNotEmpty(dappStorageOne)){
+                    BigDecimal multiply = everyAmount.multiply(new BigDecimal(oneCount));
+                    dappSystemService.updateBalanceInsertFlow(
+                            multiply,
+                            dappStorageOne.getMemberId(),
+                            MoneyFlowEnum.DA_DAN_JI_LI_PERK.getValue(),
+                            StrUtil.format(MoneyFlowEnum.DA_DAN_JI_LI_PERK.getDescrition(),daDanTotal,multiply));
+
+                    realAmount = realAmount.add(multiply);
+                }
+                DappStorage dappStorageTwo = dappStorageMapper.selectAmountByDesc(new Date(),1,1);
+                if(ObjectUtil.isNotEmpty(dappStorageTwo)){
+                    BigDecimal multiply = everyAmount.multiply(new BigDecimal(twoCount));
+                    dappSystemService.updateBalanceInsertFlow(
+                            multiply,
+                            dappStorageTwo.getMemberId(),
+                            MoneyFlowEnum.DA_DAN_JI_LI_PERK.getValue(),
+                            StrUtil.format(MoneyFlowEnum.DA_DAN_JI_LI_PERK.getDescrition(),daDanTotal,multiply));
+
+                    realAmount = realAmount.add(multiply);
+                }
+                DappStorage dappStorageThree = dappStorageMapper.selectAmountByDesc(new Date(),2,1);
+                if(ObjectUtil.isNotEmpty(dappStorageThree)){
+                    BigDecimal multiply = everyAmount.multiply(new BigDecimal(threeCount));
+                    dappSystemService.updateBalanceInsertFlow(
+                            multiply,
+                            dappStorageThree.getMemberId(),
+                            MoneyFlowEnum.DA_DAN_JI_LI_PERK.getValue(),
+                            StrUtil.format(MoneyFlowEnum.DA_DAN_JI_LI_PERK.getDescrition(),daDanTotal,multiply));
+
+                    realAmount = realAmount.add(multiply);
+                }
+                DappStorage dappStorageFour = dappStorageMapper.selectAmountByDesc(new Date(),3,1);
+                if(ObjectUtil.isNotEmpty(dappStorageFour)){
+                    BigDecimal multiply = everyAmount.multiply(new BigDecimal(fourCount));
+                    dappSystemService.updateBalanceInsertFlow(
+                            multiply,
+                            dappStorageFour.getMemberId(),
+                            MoneyFlowEnum.DA_DAN_JI_LI_PERK.getValue(),
+                            StrUtil.format(MoneyFlowEnum.DA_DAN_JI_LI_PERK.getDescrition(),daDanTotal,multiply));
+
+                    realAmount = realAmount.add(multiply);
+                }
+            }
+        }
+
+        /**
+         * 另外50% 给予当天直推总业绩排名激励前10名,第1名40%,2-4名30%,5-10名30%
+         */
+        BigDecimal directTotal = jiLiTotal.multiply(new BigDecimal("0.5")).setScale(2, BigDecimal.ROUND_DOWN);
+        /**
+         * 存放直推业绩<上级的memberId,直推总业绩>
+         */
+        HashMap<Long, BigDecimal> map = new HashMap<>();
+
+        List<DappStorage> dappStorages = dappStorageMapper.selectListByDate(new Date());
+        if(CollUtil.isNotEmpty(dappStorages)){
+            for(DappStorage dappStorage : dappStorages){
+                DappMemberEntity member = dappMemberDao.selectById(dappStorage.getMemberId());
+                if(StrUtil.isEmpty(member.getRefererId())){
+                    continue;
+                }
+                DappMemberEntity memberRef = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId());
+                if(ObjectUtil.isEmpty(memberRef)){
+                    continue;
+                }
+                Long id = memberRef.getId();
+                if(map.containsKey(id)){
+                    BigDecimal bigDecimal = map.get(id);
+                    BigDecimal add = bigDecimal.add(dappStorage.getAmount());
+                    map.put(id,add);
+                }else{
+                    map.put(id,dappStorage.getAmount());
+                }
+            }
+        }
+        /**
+         * 获取这个map的直推总业绩前十,分发奖励
+         */
+        if(!map.isEmpty()){
+            // 使用Stream API按照BigDecimal从大到小排序
+            List<Map.Entry<Long, BigDecimal>> topTenEntries = map.entrySet().stream()
+                    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
+                    .limit(10)
+                    .collect(Collectors.toList());
+
+            int startNum = 1;
+            for (Map.Entry<Long, BigDecimal> entry : topTenEntries) {
+
+                Long memberId = entry.getKey();
+                BigDecimal directAchieve = entry.getValue();
+                //第一名
+                if(startNum == 1){
+                    BigDecimal bigDecimal = directTotal.multiply(new BigDecimal("0.4")).setScale(2, BigDecimal.ROUND_DOWN);
+                    dappSystemService.updateBalanceInsertFlow(
+                            bigDecimal,
+                            memberId,
+                            MoneyFlowEnum.ZHI_TUI_JI_LI_PERK.getValue(),
+                            StrUtil.format(MoneyFlowEnum.ZHI_TUI_JI_LI_PERK.getDescrition(),directAchieve,startNum,bigDecimal));
+
+                    realAmount = realAmount.add(bigDecimal);
+                }else if(startNum > 1 && startNum <=4){
+                    BigDecimal bigDecimal = directTotal.multiply(new BigDecimal("0.3")).setScale(2, BigDecimal.ROUND_DOWN);
+                    BigDecimal divide = bigDecimal.divide(new BigDecimal("3"), 2, BigDecimal.ROUND_DOWN);
+
+                    dappSystemService.updateBalanceInsertFlow(
+                            divide,
+                            memberId,
+                            MoneyFlowEnum.ZHI_TUI_JI_LI_PERK.getValue(),
+                            StrUtil.format(MoneyFlowEnum.ZHI_TUI_JI_LI_PERK.getDescrition(),directAchieve,startNum,divide));
+
+                    realAmount = realAmount.add(divide);
+                }else{
+                    BigDecimal bigDecimal = directTotal.multiply(new BigDecimal("0.3")).setScale(2, BigDecimal.ROUND_DOWN);
+                    BigDecimal divide = bigDecimal.divide(new BigDecimal("6"), 2, BigDecimal.ROUND_DOWN);
+
+                    dappSystemService.updateBalanceInsertFlow(
+                            divide,
+                            memberId,
+                            MoneyFlowEnum.ZHI_TUI_JI_LI_PERK.getValue(),
+                            StrUtil.format(MoneyFlowEnum.ZHI_TUI_JI_LI_PERK.getDescrition(),directAchieve,startNum,divide));
+
+                    realAmount = realAmount.add(divide);
+                }
+                startNum = startNum + 1;
+            }
+        }
+
+        BigDecimal subtract = new BigDecimal(jiliChiDic.getValue()).subtract(realAmount);
+        jiliChiDic.setValue(subtract.toString());
+        dataDictionaryCustomMapper.updateById(jiliChiDic);
+    }
+
+    public static void main(String[] args) {
+        DateTime dateTime = DateUtil.offsetHour(new Date(), -24);
+        System.out.println(dateTime);
+
+
+        // 创建一个HashMap示例
+        HashMap<Long, BigDecimal> map = new HashMap<>();
+        map.put(1L, new BigDecimal("100.00"));
+        map.put(2L, new BigDecimal("200.00"));
+        map.put(3L, new BigDecimal("50.00"));
+        map.put(4L, new BigDecimal("300.00"));
+        map.put(5L, new BigDecimal("150.00"));
+        map.put(6L, new BigDecimal("150.00"));
+        map.put(7L, new BigDecimal("150.00"));
+        map.put(8L, new BigDecimal("150.00"));
+        map.put(9L, new BigDecimal("150.00"));
+        map.put(10L, new BigDecimal("150.00"));
+        map.put(11L, new BigDecimal("150.00"));
+        // ... 可以继续添加元素
+
+        // 使用Stream API按照BigDecimal从大到小排序,并获取前十个元素
+        List<Map.Entry<Long, BigDecimal>> topTenEntries = map.entrySet().stream()
+                .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
+                .limit(10)
+                .collect(Collectors.toList());
+
+        // 打印结果
+        for (Map.Entry<Long, BigDecimal> entry : topTenEntries) {
+            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
+        }
+    }
 }

--
Gitblit v1.9.1