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.DappFundFlowDao; 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 cc.mrbird.febs.dapp.vo.ApidirectNumVo; import cc.mrbird.febs.rabbit.producer.ChainProducer; 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; @Resource private ChainProducer chainProducer; @Resource private DappFundFlowDao dappFundFlowDao; /** * 每天释放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(); /** * DAO成员动态: * * 1.直推1个拿2代,直推10个拿20代,直推15个拿30代,最高30代 */ chainProducer.sendMemberDynamicPerkMsg(storage.getId()); 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/1 0 * * ?") public void profitDailyJobOne() { Date date = new Date(); DappStorage dappStorageLast = dappStorageMapper.selectOneByCreateTimeDesc(0, 1); DateTime dateTime1 = DateUtil.offsetHour(dappStorageLast.getCreateTime(), 24); int compare = DateUtil.compare(dateTime1, date); if(compare > 0){ return; } DataDictionaryCustom symbolDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BUCHANG_SYMBOL.getType(), DataDictionaryEnum.BUCHANG_SYMBOL.getCode() ); if(2 == Integer.parseInt(symbolDic.getValue())){ return; } symbolDic.setValue("2"); dataDictionaryCustomMapper.updateById(symbolDic); 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){ List dappStorageOne = dappStorageMapper.selectSumByAmountDescFiveToFive(DateUtil.offsetHour(new Date(),-24),0,1); if(CollUtil.isNotEmpty(dappStorageOne)){ BigDecimal multiply = everyAmount.multiply(new BigDecimal(oneCount)); dappSystemService.updateBalanceInsertFlow( multiply, dappStorageOne.get(0).getMemberId(), MoneyFlowEnum.DA_DAN_JI_LI_PERK.getValue(), StrUtil.format(MoneyFlowEnum.DA_DAN_JI_LI_PERK.getDescrition(),daDanTotal,multiply)); realAmount = realAmount.add(multiply); } List dappStorageTwo = dappStorageMapper.selectSumByAmountDescFiveToFive(DateUtil.offsetHour(new Date(),-24),1,1); if(CollUtil.isNotEmpty(dappStorageTwo)){ BigDecimal multiply = everyAmount.multiply(new BigDecimal(twoCount)); dappSystemService.updateBalanceInsertFlow( multiply, dappStorageTwo.get(0).getMemberId(), MoneyFlowEnum.DA_DAN_JI_LI_PERK.getValue(), StrUtil.format(MoneyFlowEnum.DA_DAN_JI_LI_PERK.getDescrition(),daDanTotal,multiply)); realAmount = realAmount.add(multiply); } List dappStorageThree = dappStorageMapper.selectSumByAmountDescFiveToFive(DateUtil.offsetHour(new Date(),-24),2,1); if(CollUtil.isNotEmpty(dappStorageThree)){ BigDecimal multiply = everyAmount.multiply(new BigDecimal(threeCount)); dappSystemService.updateBalanceInsertFlow( multiply, dappStorageThree.get(0).getMemberId(), MoneyFlowEnum.DA_DAN_JI_LI_PERK.getValue(), StrUtil.format(MoneyFlowEnum.DA_DAN_JI_LI_PERK.getDescrition(),daDanTotal,multiply)); realAmount = realAmount.add(multiply); } List dappStorageFour = dappStorageMapper.selectSumByAmountDescFiveToFive(DateUtil.offsetHour(new Date(),-24),3,1); if(CollUtil.isNotEmpty(dappStorageFour)){ BigDecimal multiply = everyAmount.multiply(new BigDecimal(fourCount)); dappSystemService.updateBalanceInsertFlow( multiply, dappStorageFour.get(0).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()); // } // } // } /** * 存放直推人数<上级的memberId,直推人数> */ HashMap map = new HashMap<>(); DateTime startTime = DateUtil.offsetHour(new Date(), -24); // DateTime startTime = DateUtil.parseDateTime(startTimeStr); // List dappMemberEntityList = dappMemberDao.selectListByDateFiveToFiver(startTime); List dappStorages = dappStorageMapper.selectListByDateFiveToFiver(startTime); Set collect = dappStorages.stream().map(DappStorage::getMemberId).collect(Collectors.toSet()); // List dappMemberEntityList = dappMemberDao.selectListByDate(new Date()); if(CollUtil.isNotEmpty(collect)){ for(Long memberId : collect){ DappMemberEntity member = dappMemberDao.selectById(memberId); if(StrUtil.isEmpty(member.getRefererId())){ continue; } if(2 == member.getActiveStatus()){ 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(new BigDecimal("1")); map.put(id,add); }else{ map.put(id,new BigDecimal("1")); } } } /** * 获取这个map的直推总业绩前十,分发奖励 */ if(!map.isEmpty()){ // 使用Stream API按照BigDecimal从大到小排序 List> topTenEntries = map.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(10) .collect(Collectors.toList()); List apiDirectInfoVos = new ArrayList<>(); for (Map.Entry entry : topTenEntries) { Long memberId = entry.getKey(); BigDecimal directCnt = entry.getValue(); ApidirectNumVo apiDirectInfoVo = new ApidirectNumVo(); apiDirectInfoVo.setMemberId(memberId); apiDirectInfoVo.setDirectCnt(directCnt); DappStorage dappStorage = dappStorageMapper.selectNewRecordByRefMemberId(memberId); apiDirectInfoVo.setCreateTime(dappStorage.getCreateTime()); apiDirectInfoVos.add(apiDirectInfoVo); } if(CollUtil.isNotEmpty(apiDirectInfoVos)){ apiDirectInfoVos = apiDirectInfoVos.stream() .sorted((a, b) -> { // 先按照amount从大到小排序 int compare = b.getDirectCnt().compareTo(a.getDirectCnt()); if (compare != 0) { return compare; } // 如果amount相同,则按照createTime从小到大排序 return a.getCreateTime().compareTo(b.getCreateTime()); }) .collect(Collectors.toList()); } int startNum = 1; for (ApidirectNumVo numVo : apiDirectInfoVos) { Long memberId = numVo.getMemberId(); BigDecimal directAchieve = numVo.getDirectCnt(); //第一名 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) { Date date = new Date(); System.out.println(date); DateTime dateTime1 = DateUtil.offsetHour(date, 24); System.out.println(dateTime1); int compare = DateUtil.compare(date, dateTime1); System.out.println(compare); DateTime dateTime = DateUtil.offsetHour(new Date(), -24); System.out.println(dateTime); DateTime nowTime = DateUtil.parseTime(DateUtil.formatTime(new Date())); DateTime perkTime = DateUtil.parseTime("17:00:00"); String startTimeStr = null; if(DateUtil.compare(nowTime,perkTime) >= 0){ startTimeStr = DateUtil.formatDate(DateUtil.offsetDay(new Date(), 0)) + " 17:00:00"; }else{ startTimeStr = DateUtil.formatDate(DateUtil.offsetDay(new Date(), -1)) + " 17:00:00"; } DateTime startTime = DateUtil.parseDateTime(startTimeStr); // 创建一个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()); } } }