package cc.mrbird.febs.job; import cc.mrbird.febs.common.contants.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.mapper.*; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; /** * @author wzy * @date 2022-03-28 **/ @Slf4j @Component public class MineProfitJob { @Autowired private DappMemberDao dappMemberDao; @Autowired private DappReturnRatioDao dappReturnRatioDao; @Autowired private DappFundFlowDao dappFundFlowDao; @Autowired private DappAccountMoneyChangeDao dappAccountMoneyChangeDao; @Autowired private DappWalletMineDao dappWalletMineDao; @Autowired private RedisUtils redisUtils; @Scheduled(cron = "0 0 1 * * ? ") @Transactional(rollbackFor = Exception.class) public void start() { List members = dappMemberDao.selectAllMemberForInCome(); if (CollUtil.isEmpty(members)) { return; } List returnRatios = dappReturnRatioDao.selectList(null); if (CollUtil.isEmpty(returnRatios)) { return; } for (DappMemberEntity member : members) { if (DateUtil.between(member.getCreateTime(), new Date(), DateUnit.HOUR, true) < 24) { continue; } List exist = dappFundFlowDao.selectListForMemberAndDay(member.getId(), 3); if (CollUtil.isNotEmpty(exist)) { continue; } BigDecimal balance = ChainService.INSTANCE.balanceOf(member.getAddress()); DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId()); for (DappReturnRatioEntity returnRatio : returnRatios) { if (returnRatio.getMinValue().compareTo(balance) < 1 && returnRatio.getMaxValue().compareTo(balance) > -1) { BigDecimal income = balance.multiply(returnRatio.getRatio()); member.setBalance(balance); dappMemberDao.updateById(member); BigDecimal ethNewPrice = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE); BigDecimal ethIncome = income.divide(ethNewPrice, 8, RoundingMode.HALF_DOWN); DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), ethIncome, 3, null, null); dappFundFlowDao.insert(fundFlow); DappAccountMoneyChangeEntity accountMoneyChange = new DappAccountMoneyChangeEntity(member.getId(), walletMine.getAvailableAmount(), ethIncome, walletMine.getAvailableAmount().add(ethIncome), "收益:" + ethIncome, 3); dappAccountMoneyChangeDao.insert(accountMoneyChange); walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(ethIncome)); walletMine.setTotalAmount(walletMine.getTotalAmount().add(ethIncome)); dappWalletMineDao.updateById(walletMine); break; } } } } }