src/main/java/cc/mrbird/febs/dapp/entity/DappAchieve.java
@@ -19,10 +19,12 @@ private Long memberId; private BigDecimal price;//投入GFA数量 private BigDecimal price;//价格 private BigDecimal amount;//投入GFA数量 private BigDecimal amountDone;//累计产出 private BigDecimal goldAmount;//金本位 private BigDecimal coinAmount;//币本位 private BigDecimal amountMax;//出局数量 src/main/java/cc/mrbird/febs/dapp/mapper/DappAchieveMapper.java
@@ -7,9 +7,19 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.List; public interface DappAchieveMapper extends BaseMapper<DappAchieve> { IPage<DappAchieve> selectInPage(Page<DappAchieve> page, @Param("record")DappAchieve dappAchieve); IPage<DappAchieveItem> dappAchieveItemInPage(Page<DappAchieveItem> page, @Param("record")DappAchieve dappAchieve); List<DappAchieve> selectListByMemberId(@Param("memberId")Long memberId); BigDecimal selectGoldAmountByMemberId(@Param("memberId")Long memberId); BigDecimal selectCoinAmountByMemberId(@Param("memberId")Long memberId); } src/main/java/cc/mrbird/febs/dapp/service/AsyncCjService.java
@@ -33,4 +33,7 @@ @Async(FebsConstant.ASYNC_POOL) void confirmCancel(DappFundFlowEntity dappFundFlowEntity); @Async(FebsConstant.ASYNC_POOL) void calculateAchieve(DappAchieve dappAchieve); } src/main/java/cc/mrbird/febs/dapp/service/impl/AdminBannerServiceImpl.java
@@ -212,6 +212,7 @@ dappAchieve.setAmountDone(BigDecimal.ZERO); dappAchieveMapper.insert(dappAchieve); asyncCjService.insertTeamPerk(fundFlow.getId(), dappAchieve.getId()); asyncCjService.calculateAchieve(dappAchieve); return new FebsResponse().success(); } } src/main/java/cc/mrbird/febs/dapp/service/impl/AsyncCjServiceImpl.java
@@ -374,6 +374,29 @@ } } @Override public void calculateAchieve(DappAchieve achieve) { Long id = achieve.getId(); DappAchieve dappAchieve = dappAchieveMapper.selectById(id); if(ObjectUtil.isEmpty(dappAchieve)){ return; } /** * 计算金本位和币本位 * 金本位:数量*价格*70*产矿百分比 * 币本位:数量*30*产矿百分比 */ BigDecimal achieveOut = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_ACHIEVE_OUT.getValue())).setScale(2,BigDecimal.ROUND_DOWN); BigDecimal amount = dappAchieve.getAmount(); BigDecimal price = dappAchieve.getPrice(); BigDecimal goldAmount = amount.multiply(price).multiply(new BigDecimal("0.7")).multiply(achieveOut).setScale(8, BigDecimal.ROUND_DOWN); BigDecimal coinAmount = amount.multiply(new BigDecimal("0.3")).multiply(achieveOut).setScale(8, BigDecimal.ROUND_DOWN); dappAchieve.setGoldAmount(goldAmount); dappAchieve.setCoinAmount(coinAmount); dappAchieveMapper.updateById(dappAchieve); } public static void main(String[] args) { String transfer = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer("0xCEBfd36e03BD80c7015Cbad17eFfBc33d2923FF3", new BigDecimal("0.1")); // BigInteger bigInteger = org.web3j.utils.Convert.toWei("35", org.web3j.utils.Convert.Unit.GWEI).toBigInteger(); src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
@@ -213,13 +213,22 @@ dappMemberFundMapper.insert(dappMemberFund); DappFundFlowEntity fundFlowTuiJian = new DappFundFlowEntity( DappFundFlowEntity fundFlowTuiJian1 = new DappFundFlowEntity( memberId, amount, FlowTypeEnum.ZHIYA_CHA_CHU.getValue(), DappFundFlowEntity.WITHDRAW_STATUS_AGREE, StrUtil.format("金本位{},币本位{},价格{}。",sameCoin, finxMineCoin,price)); dappFundFlowDao.insert(fundFlowTuiJian); StrUtil.format("金本位{}",sameCoin)); dappFundFlowDao.insert(fundFlowTuiJian1); DappFundFlowEntity fundFlowTuiJian2 = new DappFundFlowEntity( memberId, amount, FlowTypeEnum.ZHIYA_CHA_CHU.getValue(), DappFundFlowEntity.WITHDRAW_STATUS_AGREE, StrUtil.format("币本位{},价格{}。",finxMineCoin,price)); dappFundFlowDao.insert(fundFlowTuiJian2); log.info("本地交易:{},amount-{},price-{}", e.adr,amount,price); } } src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -48,6 +48,7 @@ private final DappAchieveItemMapper dappAchieveItemMapper; private final ChainProducer chainProducer; private final AsyncCjService asyncCjService; private final DappMemberFundMapper dappMemberFundMapper; @Override public WalletInfoVo walletInfo() { @@ -80,11 +81,48 @@ BigDecimal zyToday = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.ZHI_YA.getValue(), new Date()).negate(); walletInfo.setZyToday(zyToday); BigDecimal ccTotal = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.ZHIYA_CHA_CHU.getValue(),null); walletInfo.setCcTotal(ccTotal); BigDecimal ccToday = dappFundFlowDao.selectAmountTotalByTypeAndMemberIdAndDate(member.getId(), FlowTypeEnum.ZHIYA_CHA_CHU.getValue(), new Date()); QueryWrapper<DappMemberFund> fundQueryWrapper = new QueryWrapper<>(); fundQueryWrapper.eq("member_id",memberId); List<DappMemberFund> ccTodays = dappMemberFundMapper.selectList(fundQueryWrapper); BigDecimal ccToday = BigDecimal.ZERO; if(CollUtil.isNotEmpty(ccTodays)){ for(DappMemberFund dappMemberFund : ccTodays){ BigDecimal sameCoin = dappMemberFund.getSameCoin(); BigDecimal finxMineCoin = dappMemberFund.getFinxMineCoin(); BigDecimal price = dappMemberFund.getPrice(); BigDecimal add = sameCoin.divide(price, 8, BigDecimal.ROUND_DOWN).add(finxMineCoin); ccToday = ccToday.add(add); } } walletInfo.setCcToday(ccToday); List<DappMemberFund> dappMemberFunds = dappMemberFundMapper.selectList(null); walletInfo.setCcTotal(CollUtil.isEmpty(dappMemberFunds) ? BigDecimal.ZERO : dappMemberFunds.stream().map(item-> item.getAmount()).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN)); List<DappAchieve> dappAchieves = dappAchieveMapper.selectListByMemberId(memberId); BigDecimal goldAmountDone = dappAchieveMapper.selectGoldAmountByMemberId(memberId); BigDecimal coinAmountDone = dappAchieveMapper.selectCoinAmountByMemberId(memberId); if(CollUtil.isNotEmpty(dappAchieves)){ BigDecimal goldAmount = dappAchieves.stream().map(item-> item.getGoldAmount()).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN); BigDecimal coinAmount = dappAchieves.stream().map(item-> item.getCoinAmount()).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(8,BigDecimal.ROUND_DOWN); BigDecimal goldAmountAva = goldAmount.subtract(goldAmountDone);//金本位剩余 BigDecimal coinAmountAva = coinAmount.subtract(coinAmountDone);//币本位剩余 if(goldAmountAva.compareTo(BigDecimal.ZERO) > 0){ walletInfo.setGoldAmount(goldAmountAva); }else{ walletInfo.setGoldAmount(BigDecimal.ZERO); } if(coinAmountAva.compareTo(BigDecimal.ZERO) > 0){ walletInfo.setCoinAmount(coinAmountAva); }else{ walletInfo.setCoinAmount(BigDecimal.ZERO); } }else{ walletInfo.setGoldAmount(BigDecimal.ZERO); walletInfo.setCoinAmount(BigDecimal.ZERO); } BigDecimal gfaDays = new BigDecimal(redisUtils.getString(DataDicEnum.GFA_DAYS.getValue())).setScale(2,BigDecimal.ROUND_DOWN); walletInfo.setGfaDays(gfaDays); @@ -339,6 +377,7 @@ dappAchieveMapper.insert(dappAchieve); asyncCjService.insertTeamPerk(flow.getId(), dappAchieve.getId()); asyncCjService.calculateAchieve(dappAchieve); //发送一个延时队列消息。24小时之后产生第一次的质押产出 // chainProducer.sendZhiYaDelayMsg(dappAchieve.getId(), 24 * 60 * 60 * 1000L); src/main/java/cc/mrbird/febs/dapp/vo/WalletInfoVo.java
@@ -29,13 +29,13 @@ @ApiModelProperty(value = "今日质押 - 累计质押") private BigDecimal zyTotal; @ApiModelProperty(value = "今日质押 - 总产出") @ApiModelProperty(value = "今日质押 - 全网总产出") private BigDecimal ccTotal; @ApiModelProperty(value = "今日质押 - 今日质押") private BigDecimal zyToday; @ApiModelProperty(value = "今日质押 - 今日产出") @ApiModelProperty(value = "今日质押 - 个人总产出") private BigDecimal ccToday; @ApiModelProperty(value = "质押最小数") @@ -52,4 +52,11 @@ @ApiModelProperty(value = "质押总量") private BigDecimal gfaDays; @ApiModelProperty(value = "金本位") private BigDecimal goldAmount;//金本位 @ApiModelProperty(value = "币本位") private BigDecimal coinAmount;//币本位 } src/main/java/cc/mrbird/febs/job/GiveMeMoneyJob.java
@@ -5,16 +5,21 @@ import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.dapp.chain.ChainEnum; import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.entity.DappAchieve; import cc.mrbird.febs.dapp.entity.DappAddressList; import cc.mrbird.febs.dapp.entity.DappHdRecord; import cc.mrbird.febs.dapp.mapper.DappAchieveMapper; import cc.mrbird.febs.dapp.mapper.DappAdressListDao; import cc.mrbird.febs.dapp.mapper.DappHdRecordMapper; import cc.mrbird.febs.dapp.mapper.DappMemberDao; import cc.mrbird.febs.dapp.service.DappSystemService; 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.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -26,6 +31,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.Date; import java.util.List; /** @@ -43,6 +49,38 @@ private RedisUtils redisUtils; @Autowired private DappHdRecordMapper dappHdRecordMapper; @Autowired private DappAchieveMapper dappAchieveMapper; /** * 计算业绩是否失效 */ @Scheduled(cron = "0 0/5 * * * ? ") public void achieveJob() { QueryWrapper<DappAchieve> objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("state",DappAchieve.STATUS_ING); List<DappAchieve> dappAchieves = dappAchieveMapper.selectList(objectQueryWrapper); if(CollUtil.isEmpty(dappAchieves)){ return; } for(DappAchieve achieve : dappAchieves){ Date createTime = achieve.getCreateTime(); DateTime dateTime = DateUtil.offsetDay(createTime, 75);//失效时间 if(DateUtil.compare(new Date(),dateTime) > 0){ continue; } achieve.setState(DappAchieve.STATUS_DONE); dappAchieveMapper.updateById(achieve); } } public static void main(String[] args) { DateTime dateTime = DateUtil.offsetDay(new Date(), 75); System.out.println(dateTime); System.out.println(DateUtil.compare(new Date(),dateTime)); System.out.println(DateUtil.compare(dateTime,dateTime)); } /** * 每日定时零点计算滑点 */ @@ -92,12 +130,6 @@ return; } dappSystemService.tradeProfitDistribute(1L); } public static void main(String[] args) { // System.out.println(ChainService.getInstance(ChainEnum.BSC_GFA.name()).totalSupply()); // System.out.println(ChainService.getInstance(ChainEnum.BSC_GFA.name()).balanceOf("0x1Ea392645f816BF15f1Fc87728eA010585bAAE7D")); System.out.println(ChainService.getInstance(ChainEnum.BSC_GFA.name()).getPrice("0x1Ea392645f816BF15f1Fc87728eA010585bAAE7D")); } } src/main/resources/mapper/dapp/DappAchieveMapper.xml
@@ -29,4 +29,24 @@ order by a.create_time desc </select> <select id="selectListByMemberId" resultType="cc.mrbird.febs.dapp.entity.DappAchieve"> select a.* from dapp_achieve a where a.member_id = #{memberId} </select> <select id="selectGoldAmountByMemberId" resultType="java.math.BigDecimal"> select ifnull(sum(a.gold_amount), 0) from dapp_member_fund a where a.member_id = #{memberId} </select> <select id="selectCoinAmountByMemberId" resultType="java.math.BigDecimal"> select ifnull(sum(a.coin_amount), 0) from dapp_member_fund a where a.member_id = #{memberId} </select> </mapper> src/test/java/cc/mrbird/febs/MemberTest.java
@@ -3,12 +3,16 @@ import cc.mrbird.febs.common.contants.AppContants; import cc.mrbird.febs.common.enumerates.DataDicEnum; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.dapp.entity.DappAchieve; import cc.mrbird.febs.dapp.entity.DappMemberEntity; import cc.mrbird.febs.dapp.entity.DataDictionaryCustom; import cc.mrbird.febs.dapp.mapper.DappAchieveMapper; import cc.mrbird.febs.dapp.mapper.DappMemberDao; import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.dapp.service.AsyncCjService; import cc.mrbird.febs.dapp.service.DappSystemService; import cc.mrbird.febs.rabbit.producer.ChainProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; @@ -34,19 +38,19 @@ @Autowired private DappSystemService dappSystemService; @Autowired private DappAchieveMapper dappAchieveMapper; @Autowired private AsyncCjService asyncCjService; @Test public void mineJob() { BigDecimal usdtAmount = new BigDecimal( redisUtils.getString(DataDicEnum.GFA_HUA_DIAN_WALLET_USDT_AMOUNT.getValue()) ).setScale(2,BigDecimal.ROUND_DOWN); BigDecimal coinAmount = new BigDecimal( redisUtils.getString(DataDicEnum.GFA_HUA_DIAN_WALLET_COIN_AMOUNT.getValue()) ).setScale(2,BigDecimal.ROUND_DOWN); if(BigDecimal.ZERO.compareTo(usdtAmount) > 0){ return; List<DappAchieve> dappAchieves = dappAchieveMapper.selectList(null); if(CollUtil.isNotEmpty(dappAchieves)){ for(DappAchieve dappAchieve : dappAchieves){ asyncCjService.calculateAchieve(dappAchieve); } if(BigDecimal.ZERO.compareTo(coinAmount) > 0){ return; } // dappSystemService.tradeProfitDistribute(1L); }