From 7f7a1b01527843ffb178d015a044380acbde4fe2 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Tue, 02 Jul 2024 16:23:25 +0800 Subject: [PATCH] 逻辑 --- src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java | 325 ++++++++++++----------------------------------------- 1 files changed, 77 insertions(+), 248 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java index 1f0f35f..508c04b 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java @@ -1,22 +1,19 @@ package cc.mrbird.febs.dapp.service.impl; -import cc.mrbird.febs.common.utils.RedisUtils; -import cc.mrbird.febs.dapp.chain.*; +import cc.mrbird.febs.dapp.chain.ChainEnum; +import cc.mrbird.febs.dapp.chain.ChainService; +import cc.mrbird.febs.dapp.chain.ContractEventService; +import cc.mrbird.febs.dapp.chain.EthUsdtContract; import cc.mrbird.febs.dapp.entity.DappFundFlowEntity; import cc.mrbird.febs.dapp.entity.DappMemberEntity; -import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity; +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.mapper.DappFundFlowDao; -import cc.mrbird.febs.dapp.mapper.DappMemberDao; -import cc.mrbird.febs.dapp.mapper.DappWalletCoinDao; +import cc.mrbird.febs.dapp.mapper.DappStorageMapper; import cc.mrbird.febs.dapp.mapper.DataDictionaryCustomMapper; -import cc.mrbird.febs.dapp.service.DappWalletService; -import cc.mrbird.febs.dapp.utils.OnlineTransferUtil; +import cc.mrbird.febs.dapp.service.DappMemberService; import cc.mrbird.febs.rabbit.producer.ChainProducer; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -24,273 +21,105 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; -import java.util.List; @Slf4j @Service public class BscUsdtContractEvent implements ContractEventService { @Resource - private RedisUtils redisUtils; + private DappMemberService dappMemberService; @Resource private DappFundFlowDao dappFundFlowDao; @Resource - private DappMemberDao dappMemberDao; - @Resource private DataDictionaryCustomMapper dataDictionaryCustomMapper; @Resource - private DappWalletService dappWalletService; - @Resource - private DappWalletCoinDao dappWalletCoinDao; + private DappStorageMapper dappStorageMapper; @Resource private ChainProducer chainProducer; - @Override public void compile(EthUsdtContract.TransferEventResponse e) { return; -// if (e.to == null) { -// return; -// } -// -// redisUtils.set(AppContants.REDIS_KEY_BLOCK_USDT_NUM, e.log.getBlockNumber()); -// // 判断对方打款地址是否为源池地址 -// if (ChainEnum.BSC_USDT.getAddress().toLowerCase().equals(e.to)) { -// -// redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, e.log.getBlockNumber()); -// -// // 如果得到触发,则休眠10秒。 因为此处监听器触发可能优先于前端调用transfer接口 -//// try { -//// Thread.sleep(10000); -//// } catch (InterruptedException ex) { -//// ex.printStackTrace(); -//// } -// -// ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name()); -// int decimals = sourceUsdtInstance.decimals(); -// if (e.from.equals("0xaa25aa7a19f9c426e07dee59b12f944f4d9f1dd3")) { -// return; -// } -// -// BigInteger tokens = e.tokens; -// BigDecimal amount = new BigDecimal(tokens.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN); -// -// DappFundFlowEntity fundFlow = dappFundFlowDao.selectByFromHash(e.log.getTransactionHash(), null); -// if(ObjectUtil.isNotEmpty(fundFlow) && 1 == fundFlow.getStatus()){ -// log.info("触发USDT合约监听事件-买入贡献值,金额:{}",amount); -// if(1 == fundFlow.getType()){//认购贡献值 1 -// if (fundFlow == null) { -// List<DappFundFlowEntity> flows = dappFundFlowDao.selectFundFlowListByAddress(e.from, 1); -// if (CollUtil.isEmpty(flows)) { -// OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_ONLINE, "USDT"); -// log.info("本地无交易:{}", e.log.getTransactionHash()); -// return; -// } -// -// for (DappFundFlowEntity flow : flows) { -// if (flow.getStatus() == 1) { -// if (amount.compareTo(flow.getAmount().multiply(flow.getNewestPrice()).setScale(4, RoundingMode.HALF_UP)) == 0) { -// fundFlow = flow; -// fundFlow.setFromHash(e.log.getTransactionHash()); -// break; -// } -// } -// } -// } -// -// if (fundFlow == null) { -// return; -// } -// -// fundFlow.setAmount(fundFlow.getAmount().negate()); -// // 更改状态为已同步 -// fundFlow.setStatus(2); -// dappFundFlowDao.updateById(fundFlow); -// //生成业绩数 -// chainProducer.sendAchieveTreeMsg(fundFlow.getMemberId()); -// //分发手续费给节点 -// buyNodePerk(amount); -// -// }else if(13 == fundFlow.getType()){//认购节点 13 -// -// log.info("触发USDT合约监听事件-认购节点,金额:{}",amount); -// fundFlow.setAmount(fundFlow.getAmount().negate()); -// // 更改状态为已同步 -// fundFlow.setStatus(2); -// dappFundFlowDao.updateById(fundFlow); -// -// Long memberId = fundFlow.getMemberId(); -// DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); -// dappMemberEntity.setBuyNode(1); -// dappMemberDao.updateById(dappMemberEntity); -// } -// }else{ -// return; -// } -// } } @Override public void sdmUSDT(EthUsdtContract.TransferEventResponse e) { - if (e.to == null) { + return; + } + + @Override + public void receivePeopleEvent(EthUsdtContract.ReceivePeopleEventResponse e) { + if (e.from == null) { return; } -// redisUtils.set(AppContants.REDIS_KEY_BLOCK_USDT_NUM, e.log.getBlockNumber()); - // 判断对方打款地址是否为源池地址 - if ("0x0Ba249b2FAC0061dd9c388Bd607418E16490A3fd".toLowerCase().equals(e.to)) { - -// redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, e.log.getBlockNumber()); - - // 如果得到触发,则休眠10秒。 因为此处监听器触发可能优先于前端调用transfer接口 -// try { -// Thread.sleep(10000); -// } catch (InterruptedException ex) { -// ex.printStackTrace(); -// } - - ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name()); - int decimals = sourceUsdtInstance.decimals(); - if (e.from.equals("0x0Ba249b2FAC0061dd9c388Bd607418E16490A3fd")) { - return; - } - String fromAddress = e.from; - DappMemberEntity fromMember = dappMemberDao.selectByAddress(fromAddress, null); - if(ObjectUtil.isEmpty(fromMember)){ - return; - } - - BigInteger tokens = e.tokens; - BigDecimal amount = new BigDecimal(tokens.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN); - - DappFundFlowEntity fundFlow = dappFundFlowDao.selectByFromHashAndAndMemberId(e.log.getTransactionHash(), null,fromMember.getId()); - if(ObjectUtil.isNotEmpty(fundFlow) && 1 == fundFlow.getStatus()){ - if(18 == fundFlow.getType()){//认购贡献值 18 - log.info("买入贡献值,{},金额:{}",fromAddress,amount); - if (fundFlow == null) { - List<DappFundFlowEntity> flows = dappFundFlowDao.selectFundFlowListByAddress(e.from, 1); - if (CollUtil.isEmpty(flows)) { - OnlineTransferUtil.addTransferRecord(e.from, e.to, amount, e.log.getTransactionHash(), DappTransferRecordEntity.TRANSFER_SOURCE_FLAG_ONLINE, "USDT"); - log.info("本地无交易:{}", e.log.getTransactionHash()); - return; - } - - for (DappFundFlowEntity flow : flows) { - if (flow.getStatus() == 1) { - if (amount.compareTo(flow.getAmount().multiply(flow.getNewestPrice()).setScale(4, RoundingMode.HALF_UP)) == 0) { - fundFlow = flow; - fundFlow.setFromHash(e.log.getTransactionHash()); - break; - } - } - } - } - - if (fundFlow == null) { - return; - } - -// fundFlow.setAmount(fundFlow.getAmount().negate()); - // 更改状态为已同步 - fundFlow.setStatus(2); - dappFundFlowDao.updateById(fundFlow); - //激活用户 - fromMember.setActiveStatus(1); - dappMemberDao.updateById(fromMember); - //给上级直推奖励 -// DappMemberEntity member = dappMemberDao.selectById(fromMember.getId()); -// DappMemberEntity parent = dappMemberDao.selectMemberInfoByInviteId(member.getRefererId()); -// -// if (ObjectUtil.isNotEmpty(parent)) { -// BigDecimal directProfit = TreeConstants.PUT_IN_AMOUNT.multiply(new BigDecimal("0.1")); -// dappWalletService.updateWalletCoinWithLock(directProfit, parent.getId(), 1); -// -// DappFundFlowEntity fundFlowPerk = new DappFundFlowEntity(parent.getId(), directProfit, 3, 2, null, null); -// dappFundFlowDao.insert(fundFlowPerk); -// } - //复投 -// chainProducer.sendAchieveTreeMsg(fundFlow.getMemberId()); -// if(ObjectUtil.isNotEmpty(fromMember.getRefererId())){ -// DappMemberEntity dappMemberEntity = dappMemberDao.selectMemberInfoByInviteId(fromMember.getRefererId()); -// if(ObjectUtil.isNotEmpty(dappMemberEntity)){ -// chainProducer.sendNodeMsgLong(dappMemberEntity.getId()); -// } -// } - chainProducer.sendNodeMsg(fundFlow.getId()); - //发送推荐规则奖励 - chainProducer.sendInvitePerkMsg(fundFlow.getId()); - //发送节点投资 - chainProducer.sendNodePerkMsg(fundFlow.getId()); -// buyNodePerk(amount); - - }else if(13 == fundFlow.getType()){//认购节点 13 - - log.info("认购节点,{},金额:{}",fromAddress,amount); -// fundFlow.setAmount(fundFlow.getAmount().negate()); - // 更改状态为已同步 - fundFlow.setStatus(2); - dappFundFlowDao.updateById(fundFlow); - - Long memberId = fundFlow.getMemberId(); - DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); - Integer buyNode = dappMemberEntity.getBuyNode(); - buyNode = buyNode + 1; - dappMemberEntity.setBuyNode(buyNode); - dappMemberDao.updateById(dappMemberEntity); - } - }else{ - return; - } + if (e.regFlow == null) { + return; } - } - public void buyNodePerk(BigDecimal amount){ - log.info("买入贡献值-平分总金额-{}",amount); + Long flowId = Long.parseLong(e.regFlow); + + int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(); + BigInteger tokens = e.tokens; + BigDecimal amount = new BigDecimal(tokens.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN); + log.info("触发用户存储:{},金额:{},流水ID:{}",e.from,amount,flowId); + // 账户是否已经注册 + DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null); + if (fromMember == null) { + return; + } + // 判断是否已经同步过了 + DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(flowId); + if (fundFlow != null && fundFlow.getStatus() != 1) { + return; + } + // 更改状态为已同步 + fundFlow.setStatus(2); + dappFundFlowDao.updateById(fundFlow); + + log.info("触发用户存储:{},金额:{},流水ID:{}",e.from,amount,flowId); + /** - * 获取节点平分百分比 perkPercent - * 获取平分的份数 perKNum - * 获取每一份的金额 perkAmount - * 获取节点总数 buyNodeNum - * 如果perKNum大于buyNodeNum,则每个人获得(amount * perkPercent)/ perKNum = perkAmount - * 如果超出,再超出的人没有奖励 + * 新增一条记录 */ - DataDictionaryCustom perkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( - DataDictionaryEnum.PERK_PERCENT.getType(), - DataDictionaryEnum.PERK_PERCENT.getCode() + DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.RELEASE_PERCENT.getType(), + DataDictionaryEnum.RELEASE_PERCENT.getCode() ); - BigDecimal perkPercent = new BigDecimal(ObjectUtil.isEmpty(perkPercentDic) ? "10" : perkPercentDic.getValue()).multiply(new BigDecimal("0.01")); + BigDecimal releasePercent = new BigDecimal(dataDictionaryCustom.getValue()); + DappStorage dappStorage = new DappStorage(); + dappStorage.setState(1); + dappStorage.setAmount(amount); + dappStorage.setReleasePercent(releasePercent); + BigDecimal releaseAmount = amount.multiply(releasePercent).setScale(2, BigDecimal.ROUND_DOWN); + dappStorage.setReleaseAmount(releaseAmount); + dappStorageMapper.insert(dappStorage); - DataDictionaryCustom perKNumDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( - DataDictionaryEnum.PERK_NUM.getType(), - DataDictionaryEnum.PERK_NUM.getCode() - ); - BigDecimal perKNum = new BigDecimal(ObjectUtil.isEmpty(perkPercentDic) ? "1000" : perKNumDic.getValue()); - - BigDecimal perkAmount = amount.multiply(perkPercent).divide(perKNum, 8, BigDecimal.ROUND_DOWN); - if(BigDecimal.ZERO.compareTo(perkAmount) >= 0){ - return; - } - - QueryWrapper<DappMemberEntity> objectQueryWrapper = new QueryWrapper<>(); - objectQueryWrapper.eq("buy_node",1); - List<DappMemberEntity> dappMemberEntities = dappMemberDao.selectList(objectQueryWrapper); - if(CollUtil.isEmpty(dappMemberEntities)){ - return; - } - - for(DappMemberEntity dappMemberEntity : dappMemberEntities){ - dappWalletService.updateWalletCoinWithLock(perkAmount, dappMemberEntity.getId(), 1); - - DappFundFlowEntity fundFlow = new DappFundFlowEntity( - dappMemberEntity.getId(), - perkAmount, - 14, - 2, - BigDecimal.ZERO, - null); - dappFundFlowDao.insert(fundFlow); - } - - log.info("买入贡献值-总人数{},-每人金额{}",dappMemberEntities.size(),perkAmount); + Long id = fundFlow.getId(); + Long memberId = fromMember.getId(); + /** + * 发送直推8% + */ + chainProducer.sendDirectPerkMsg(id); + /** + * DAO成员动态: + * * 1.直推1个拿2代,直推10个拿20代,直推15个拿30代,最高30代 + */ + chainProducer.sendMemberDynamicPerkMsg(id); + /** + * + * * 六、永动补偿池2% + * * 五、DAO永动激励池:6% + * * 四、DAO联盟委员会 : 5% (50名全球DAO委员) + */ + chainProducer.sendNodePerkMsg(id); + /** + *3. 成员升级 + * * DAO1:小区业绩30万/币 加权分红50% + * * DAO2:小区业绩100万/币 加权分红30% + * * DAO3:小区业绩500万/币加权分红20% + */ + chainProducer.sendMemberLevel(memberId); } + } -- Gitblit v1.9.1