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 = "daily-job", havingValue = "true") public class ProfitDailyJob { @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 objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("state",1); List 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 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 map = new HashMap<>(); List 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> topTenEntries = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(10) .collect(Collectors.toList()); int startNum = 1; for (Map.Entry 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 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> topTenEntries = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(10) .collect(Collectors.toList()); // 打印结果 for (Map.Entry entry : topTenEntries) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } } }