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<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();
|
|
/**
|
* 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<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){
|
List<DappStorage> 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<DappStorage> 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<DappStorage> 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<DappStorage> 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<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());
|
// }
|
// }
|
// }
|
|
/**
|
* 存放直推人数<上级的memberId,直推人数>
|
*/
|
HashMap<Long, BigDecimal> map = new HashMap<>();
|
|
DateTime startTime = DateUtil.offsetHour(new Date(), -24);
|
// DateTime startTime = DateUtil.parseDateTime(startTimeStr);
|
// List<DappMemberEntity> dappMemberEntityList = dappMemberDao.selectListByDateFiveToFiver(startTime);
|
|
List<DappStorage> dappStorages = dappStorageMapper.selectListByDateFiveToFiver(startTime);
|
Set<Long> collect = dappStorages.stream().map(DappStorage::getMemberId).collect(Collectors.toSet());
|
|
// List<DappMemberEntity> 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<Map.Entry<Long, BigDecimal>> topTenEntries = map.entrySet().stream()
|
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
|
.limit(10)
|
.collect(Collectors.toList());
|
|
List<ApidirectNumVo> apiDirectInfoVos = new ArrayList<>();
|
for (Map.Entry<Long, BigDecimal> 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<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());
|
}
|
}
|
}
|