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