| | |
| | | package cc.mrbird.febs.dapp.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.contants.AppContants; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.common.utils.LoginUserUtil; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | import cc.mrbird.febs.common.utils.SpringContextUtil; |
| | |
| | | import cn.hutool.core.date.DateUnit; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.date.Week; |
| | | import cn.hutool.core.thread.ThreadUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | |
| | | import java.math.BigInteger; |
| | | import java.math.RoundingMode; |
| | | import java.util.*; |
| | | import java.util.concurrent.locks.Lock; |
| | | import java.util.concurrent.locks.ReentrantLock; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | private final DappSystemProfitDao dappSystemProfitDao; |
| | | private final ChainProducer chainProducer; |
| | | private final ContractMain contractMain; |
| | | |
| | | private final DappMemberNodeMapper dappMemberNodeMapper; |
| | | private final DappChargeUsdtMapper dappChargeUsdtMapper; |
| | |
| | | /** |
| | | * 20%全网加权平分,按照个人投资占比全网的比例去平分 |
| | | */ |
| | | BigDecimal poolAllMemberAPercentCntAva = allMemberPerk(poolAllMemberAPercentCnt, FundFlowEnum.POOL_MEMBER_A_CNT.getCode()); |
| | | DappFundFlowEntity poolAllMemberAFundFlowAva = new DappFundFlowEntity( |
| | | 294L, |
| | | poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva), |
| | | FundFlowEnum.POOL_MEMBER_A_CNT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(poolAllMemberAFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva), |
| | | 294L,1); |
| | | chainProducer.sendAllMemberPerkAvaMsg(poolAllMemberAFundFlow.getId()); |
| | | // BigDecimal poolAllMemberAPercentCntAva = allMemberPerk(poolAllMemberAPercentCnt, FundFlowEnum.POOL_MEMBER_A_CNT.getCode()); |
| | | // DappFundFlowEntity poolAllMemberAFundFlowAva = new DappFundFlowEntity( |
| | | // 1L, |
| | | // poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva), |
| | | // FundFlowEnum.POOL_MEMBER_A_CNT.getCode(), |
| | | // 2, |
| | | // BigDecimal.ZERO, |
| | | // null, |
| | | // chergeRecordId); |
| | | // dappFundFlowDao.insert(poolAllMemberAFundFlowAva); |
| | | // dappWalletService.updateWalletMineWithLock(poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva), |
| | | // 1L,1); |
| | | |
| | | /** |
| | | * 10%直推 |
| | |
| | | } |
| | | if(directAPercentCnt.compareTo(directAPercentFundFlowToMemberFlag) > 0){ |
| | | DappFundFlowEntity directAPercentFundFlowToMemberAva = new DappFundFlowEntity( |
| | | 294L, |
| | | 1L, |
| | | directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag), |
| | | FundFlowEnum.DIRECT_A_PERCENT.getCode(), |
| | | 2, |
| | |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(directAPercentFundFlowToMemberAva); |
| | | dappWalletService.updateWalletMineWithLock(directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag), |
| | | 294L,1); |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | } |
| | | /** |
| | |
| | | |
| | | if(nodeAPercentCnt.compareTo(nodeAPercentCntAva) > 0){ |
| | | DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | 294L, |
| | | 1L, |
| | | nodeAPercentCnt.subtract(nodeAPercentCntAva), |
| | | FundFlowEnum.NODE_A_PERCENT_TO_MEMBER.getCode(), |
| | | 2, |
| | |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(nodeAPercentCnt.subtract(nodeAPercentCntAva), |
| | | 294L,1); |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | /** |
| | | * 5%基金会 |
| | |
| | | } |
| | | |
| | | // public static void main(String[] args) { |
| | | // String address = AppContants.ADDRESS_A_POOL_PEOJECT; |
| | | // String address = "0x7a9bfE048d110EF90a467803653f9B8666f9096C"; |
| | | // /** |
| | | // * 发起USDT转账 |
| | | // */ |
| | | // String hash = ChainService.getInstance(ChainEnum.BSC_USDT_A_POOL.name()).transfer(address, new BigDecimal("0.01")); |
| | | // String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL_CONTRACT.name()).transferUSDT(address, new BigDecimal("0.99")); |
| | | // System.out.println(hash); |
| | | // } |
| | | |
| | | @Override |
| | |
| | | dappFundFlowDao.updateById(dappFundFlowEntity); |
| | | BigDecimal subtract = amountTC.subtract(teamIncomePerkTotal); |
| | | //用户的A币账户增加divide数量 |
| | | if(amountTC.compareTo(teamIncomePerkTotal) > 0){ |
| | | DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | 294L, |
| | | subtract, |
| | | FundFlowEnum.LEVEL_A_PERCENT_CNT_MEMBER.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | systemProfitId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(subtract, |
| | | 294L,1); |
| | | } |
| | | // if(amountTC.compareTo(teamIncomePerkTotal) > 0){ |
| | | // DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | // 1L, |
| | | // subtract, |
| | | // FundFlowEnum.LEVEL_A_PERCENT_CNT_MEMBER.getCode(), |
| | | // 2, |
| | | // BigDecimal.ZERO, |
| | | // null, |
| | | // systemProfitId); |
| | | // dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | // dappWalletService.updateWalletMineWithLock(subtract, |
| | | // 1L,1); |
| | | // } |
| | | } |
| | | } |
| | | } |
| | |
| | | //用户的A币账户增加divide数量 |
| | | if(averagePerkCnt.compareTo(averagePerkCntAva) > 0){ |
| | | DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | 294L, |
| | | 1L, |
| | | averagePerkCnt.subtract(averagePerkCntAva), |
| | | FundFlowEnum.DAO_3_NODE_PERK.getCode(), |
| | | 2, |
| | |
| | | systemProfitId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(averagePerkCnt.subtract(averagePerkCntAva), |
| | | 294L,1); |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | //生成流水记录 |
| | | DappFundFlowEntity nodeThreeFundFlow = new DappFundFlowEntity( |
| | |
| | | //用户的A币账户增加divide数量 |
| | | if(averagePerkFourCnt.compareTo(averagePerkFourCntAva) > 0){ |
| | | DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | 294L, |
| | | 1L, |
| | | averagePerkFourCnt.subtract(averagePerkFourCntAva), |
| | | FundFlowEnum.DAO_4_NODE_PERK.getCode(), |
| | | 2, |
| | |
| | | systemProfitId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(averagePerkFourCnt.subtract(averagePerkFourCntAva), |
| | | 294L,1); |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | DappFundFlowEntity nodeFourFundFlow = new DappFundFlowEntity( |
| | | 1L, |
| | |
| | | //用户的A币账户增加divide数量 |
| | | if(averagePerkFiveCnt.compareTo(averagePerkFiveCntAva) > 0){ |
| | | DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | 294L, |
| | | 1L, |
| | | averagePerkFiveCnt.subtract(averagePerkFiveCntAva), |
| | | FundFlowEnum.DAO_5_NODE_PERK.getCode(), |
| | | 2, |
| | |
| | | systemProfitId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(averagePerkFiveCnt.subtract(averagePerkFiveCntAva), |
| | | 294L,1); |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | DappFundFlowEntity nodeFiveFundFlow = new DappFundFlowEntity( |
| | | 1L, |
| | |
| | | //用户的A币账户增加divide数量 |
| | | if(nodeFiveEqualsCnt.compareTo(nodeFiveEqualsCntAva) > 0){ |
| | | DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | 294L, |
| | | 1L, |
| | | nodeFiveEqualsCnt.subtract(nodeFiveEqualsCntAva), |
| | | FundFlowEnum.DAO_5_NODE_EQUALS_PERK.getCode(), |
| | | 2, |
| | |
| | | systemProfitId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(nodeFiveEqualsCnt.subtract(nodeFiveEqualsCntAva), |
| | | 294L,1); |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | DappFundFlowEntity nodeFiveEqualsFundFlow = new DappFundFlowEntity( |
| | | 1L, |
| | |
| | | * 发起USDT转账 |
| | | */ |
| | | log.info("amount:{},address:{}",amount,address); |
| | | String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL.name()).transfer(address, amount); |
| | | ThreadUtil.sleep(5000); |
| | | // String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL_CONTRACT.name()).transferUSDT(address, amount); |
| | | String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL.name()).transferUSDT(address, amount); |
| | | if(StrUtil.isEmpty(hash)){ |
| | | // hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL.name()).transfer(address, amount); |
| | | return; |
| | | } |
| | | // if(StrUtil.isEmpty(hash)){ |
| | | // return; |
| | | // } |
| | | log.info("{},{}",id,hash); |
| | | dappFundFlowEntity.setFromHash(hash); |
| | | dappFundFlowEntity.setStatus(2); |
| | | dappFundFlowDao.updateById(dappFundFlowEntity); |
| | | } |
| | | |
| | | /** |
| | | * 紧急提现方法 |
| | | */ |
| | | // public static void main(String[] args) { |
| | | // BigDecimal amount = new BigDecimal("0.01"); |
| | | // String address = "0xB3cF9669F398f444DfCAebbAd2A49bF32ba41fE3"; |
| | | // |
| | | // String hash = ChainService.getInstance(ChainEnum.BSC_USDT_W_POOL_CONTRACT.name()).transferUSDT(address, amount); |
| | | // |
| | | // System.out.println(hash); |
| | | // |
| | | // |
| | | //// int i = ChainService.getInstance(ChainEnum.BSC_TFC.name()).allowanceCnt("0x80098f854950f9327C4F4E747d285Fd2d41fbf3e"); |
| | | // } |
| | | |
| | | @Override |
| | | public void aCoinFire() { |
| | |
| | | PoolEnum.COIN_A_CNT.getType(), |
| | | PoolEnum.COIN_A_CNT.getCode()); |
| | | BigDecimal coinACnt = new BigDecimal(coinACntDic.getValue()); |
| | | coinACnt = coinACnt.subtract(totalCnt); |
| | | coinACnt = coinACnt.subtract(totalCnt.multiply(new BigDecimal(0.65))); |
| | | coinACntDic.setValue(coinACnt.toString()); |
| | | dataDictionaryCustomMapper.updateById(coinACntDic); |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | System.out.println(ChainEnum.BSC_USDT_W_POOL.getAddress()); |
| | | // public static void main(String[] args) { |
| | | // for(int i = 0; i < 100; i++){ |
| | | // ChainService.getInstance(ChainEnum.BSC_USDT_A_POOL.name()).transfer(AppContants.ADDRESS_A_POOL_PEOJECT, new BigDecimal(70)); |
| | | // try { |
| | | // Thread.sleep(20000); |
| | | // } catch (InterruptedException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // |
| | | // ChainService.getInstance(ChainEnum.BSC_USDT_A_POOL.name()).transfer(AppContants.ADDRESS_B_POOL_PEOJECT, new BigDecimal(20)); |
| | | // |
| | | // try { |
| | | // Thread.sleep(20000); |
| | | // } catch (InterruptedException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // |
| | | // ChainService.getInstance(ChainEnum.BSC_USDT_A_POOL.name()).transfer(ChainEnum.BSC_USDT_W_POOL.getAddress(), new BigDecimal(10)); |
| | | // try { |
| | | // Thread.sleep(20000); |
| | | // } catch (InterruptedException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | @Override |
| | | public void allMemberPerkAvaMsg(Long id) { |
| | | DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(id); |
| | | if(ObjectUtil.isEmpty(dappFundFlowEntity)){ |
| | | return; |
| | | } |
| | | |
| | | BigDecimal poolAllMemberAPercentCnt = dappFundFlowEntity.getAmount(); |
| | | BigDecimal poolAllMemberAPercentCntAva = allMemberPerk(poolAllMemberAPercentCnt, FundFlowEnum.POOL_MEMBER_A_CNT.getCode()); |
| | | DappFundFlowEntity poolAllMemberAFundFlowAva = new DappFundFlowEntity( |
| | | 1L, |
| | | poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva), |
| | | FundFlowEnum.POOL_MEMBER_A_CNT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | dappFundFlowEntity.getSystemProfitId()); |
| | | dappFundFlowDao.insert(poolAllMemberAFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(poolAllMemberAPercentCnt.subtract(poolAllMemberAPercentCntAva), |
| | | AppContants.YL_MEMBER_ID,1); |
| | | |
| | | } |
| | | @Override |
| | | public void contractAnDaoMsg(Long flowId) { |
| | | DappFundFlowEntity flow = dappFundFlowDao.selectById(flowId); |
| | | if(ObjectUtil.isEmpty(flow)){ |
| | | return; |
| | | } |
| | | Long memberId = flow.getMemberId(); |
| | | if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE == flow.getStatus()){ |
| | | return; |
| | | } |
| | | if(FundFlowEnum.BUY_A_COIN.getCode() != flow.getType()){ |
| | | return; |
| | | } |
| | | DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); |
| | | if(ObjectUtil.isEmpty(dappMemberEntity)){ |
| | | return; |
| | | } |
| | | /** |
| | | * 生成会员入金买A币的记录 |
| | | */ |
| | | DappChargeUsdtEntity dappChargeUsdtEntity = new DappChargeUsdtEntity( |
| | | memberId, |
| | | dappMemberEntity.getAddress(), |
| | | null, |
| | | 2, |
| | | flow.getAmount(), |
| | | BigDecimal.ZERO, |
| | | BigDecimal.ZERO); |
| | | dappChargeUsdtMapper.insert(dappChargeUsdtEntity); |
| | | /** |
| | | * 减少用户的AUSD数量 |
| | | */ |
| | | DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(memberId); |
| | | BigDecimal ausdAmount = dappUsdtPerkEntity.getAusdAmount(); |
| | | ausdAmount = ausdAmount.subtract(flow.getFee()).setScale(4,BigDecimal.ROUND_DOWN); |
| | | dappUsdtPerkEntity.setAusdAmount(ausdAmount); |
| | | dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity); |
| | | /** |
| | | * 流水关联用户购买记录 |
| | | */ |
| | | flow.setSystemProfitId(dappChargeUsdtEntity.getId()); |
| | | /** |
| | | * 链上转账的hash值 |
| | | */ |
| | | // flow.setFromHash(null); |
| | | flow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE); |
| | | dappFundFlowDao.updateById(flow); |
| | | |
| | | |
| | | BigDecimal amount = flow.getAmount(); |
| | | /** |
| | | * 90%进入A币底池 10%进入B币LP薄饼底池 |
| | | */ |
| | | DataDictionaryCustom usdtAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.USDT_A_PERCENT.getType(), |
| | | PoolEnum.USDT_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal usdtAPercent = new BigDecimal(StrUtil.isEmpty(usdtAPercentDic.getValue()) ? "0.7" : usdtAPercentDic.getValue()); |
| | | BigDecimal usdtAAmount = amount.multiply(usdtAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | |
| | | //生成一条进行中的70%进入A币底池的资金流水记录 |
| | | DappFundFlowEntity fundFlowToA = new DappFundFlowEntity( |
| | | 1L, |
| | | usdtAAmount, |
| | | FundFlowEnum.USDT_IN_A_POOL.getCode(), |
| | | 1, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | dappChargeUsdtEntity.getId()); |
| | | dappFundFlowDao.insert(fundFlowToA); |
| | | |
| | | BigDecimal usdtWAmount = amount.multiply(new BigDecimal(0.2)).setScale(4, BigDecimal.ROUND_DOWN); |
| | | // //生成一条进行中的20%进入A币底池的资金流水记录 |
| | | // DappFundFlowEntity fundFlowToW = new DappFundFlowEntity( |
| | | // 1L, |
| | | // usdtWAmount, |
| | | // FundFlowEnum.USDT_IN_W_POOL.getCode(), |
| | | // 1, |
| | | // BigDecimal.ZERO, |
| | | // null, |
| | | // dappChargeUsdtEntity.getId()); |
| | | // dappFundFlowDao.insert(fundFlowToW); |
| | | |
| | | DataDictionaryCustom usdtBPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.USDT_B_PERCENT.getType(), |
| | | PoolEnum.USDT_B_PERCENT.getCode() |
| | | ); |
| | | BigDecimal usdtBPercent = new BigDecimal(StrUtil.isEmpty(usdtBPercentDic.getValue()) ? "0.1" : usdtBPercentDic.getValue()); |
| | | BigDecimal usdtBAmount = amount.multiply(usdtBPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | //生成一条进行中的10%进入B币底池的资金流水记录 |
| | | DappFundFlowEntity fundFlowToB = new DappFundFlowEntity( |
| | | 1L, |
| | | usdtBAmount, |
| | | FundFlowEnum.USDT_IN_B_POOL.getCode(), |
| | | 1, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | dappChargeUsdtEntity.getId()); |
| | | dappFundFlowDao.insert(fundFlowToB); |
| | | |
| | | /** |
| | | * 发送消息处理返利逻辑 |
| | | */ |
| | | chainProducer.sendAntACoinInContractMsg(flow.getId()); |
| | | /** |
| | | * 发送消息处理代理升级 |
| | | */ |
| | | chainProducer.sendAntMemberLevelMsg(memberId); |
| | | //90%进入A币底池 |
| | | chainProducer.sendAntACoinInAPoolMsg(fundFlowToA.getId()); |
| | | ThreadUtil.sleep(5000); |
| | | //10%进入B币LP薄饼底池 |
| | | chainProducer.sendAntACoinInBPoolMsg(fundFlowToB.getId()); |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | |
| | | System.out.print(1); |
| | | System.out.print(2); |
| | | // ThreadUtil.execute(() -> { |
| | | // //90%进入A币底池 |
| | | // System.out.print(1); |
| | | // ThreadUtil.sleep(5000); |
| | | // //10%进入B币LP薄饼底池 |
| | | // System.out.print(2); |
| | | // }); |
| | | } |
| | | |
| | | @Override |
| | | public void contractAnDaoInMsg(Long flowId) { |
| | | /** |
| | | * 获取对应的流水记录 |
| | | */ |
| | | DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectInfoById(flowId); |
| | | if(ObjectUtil.isEmpty(dappFundFlowEntity)){ |
| | | return; |
| | | } |
| | | if(DappFundFlowEntity.WITHDRAW_STATUS_AGREE != dappFundFlowEntity.getStatus()){ |
| | | return; |
| | | } |
| | | |
| | | if(FundFlowEnum.BUY_A_COIN.getCode() != dappFundFlowEntity.getType()){ |
| | | return; |
| | | } |
| | | Long memberId = dappFundFlowEntity.getMemberId(); |
| | | DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); |
| | | if(ObjectUtil.isEmpty(dappMemberEntity)){ |
| | | return; |
| | | } |
| | | /** |
| | | * 会员充值金额 |
| | | */ |
| | | BigDecimal amount = dappFundFlowEntity.getAmount(); |
| | | /** |
| | | * A币的当前价格 |
| | | */ |
| | | DataDictionaryCustom coinAPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.COIN_A_PRICE.getType(), |
| | | PoolEnum.COIN_A_PRICE.getCode() |
| | | ); |
| | | BigDecimal coinAPrice = new BigDecimal(StrUtil.isEmpty(coinAPriceDic.getValue()) ? "0" : coinAPriceDic.getValue()).setScale(12,BigDecimal.ROUND_DOWN); |
| | | /** |
| | | * 会员充值USDT买入A币记录的ID |
| | | */ |
| | | Long chergeRecordId = dappFundFlowEntity.getSystemProfitId() == null ? 0L : dappFundFlowEntity.getSystemProfitId(); |
| | | DappChargeUsdtEntity dappChargeUsdtEntity = dappChargeUsdtMapper.selectById(chergeRecordId); |
| | | if(ObjectUtil.isEmpty(dappChargeUsdtEntity)){ |
| | | return; |
| | | } |
| | | if(2 != dappChargeUsdtEntity.getStatus()){ |
| | | return; |
| | | } |
| | | // if(StrUtil.isEmpty(dappChargeUsdtEntity.getMemberHash())){ |
| | | // return; |
| | | // } |
| | | /** |
| | | * 金本位的三倍额度,增加业绩,增加对应的NFT的值 |
| | | */ |
| | | DappUsdtPerkEntity dappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(memberId); |
| | | if(ObjectUtil.isEmpty(dappUsdtPerkEntity)){ |
| | | dappUsdtPerkEntity = new DappUsdtPerkEntity(); |
| | | dappUsdtPerkEntity.setAmount(amount.multiply(new BigDecimal(3))); |
| | | dappUsdtPerkEntity.setNftDevote(amount); |
| | | dappUsdtPerkEntity.setMemberId(memberId); |
| | | dappUsdtPerkEntityMapper.insert(dappUsdtPerkEntity); |
| | | } |
| | | //金本位的三倍额度 |
| | | BigDecimal amountPerk = dappUsdtPerkEntity.getAmount(); |
| | | amountPerk = amountPerk.add(amount.multiply(new BigDecimal(3))); |
| | | dappUsdtPerkEntity.setAmount(amountPerk); |
| | | //生成一条金本位的三倍额度的资金流水记录 |
| | | DappFundFlowEntity amountPerkFundFlow = new DappFundFlowEntity( |
| | | memberId, |
| | | amount.multiply(new BigDecimal(3)), |
| | | FundFlowEnum.MEMBER_AMOUNT_PERK_TOTAL.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(amountPerkFundFlow); |
| | | |
| | | //增加业绩 |
| | | BigDecimal achieveAmount = dappUsdtPerkEntity.getAchieveAmount(); |
| | | achieveAmount = achieveAmount.add(amount); |
| | | dappUsdtPerkEntity.setAchieveAmount(achieveAmount); |
| | | //增加对应的NFT的值 |
| | | BigDecimal nftDevote = dappUsdtPerkEntity.getNftDevote(); |
| | | nftDevote = nftDevote.add(amount); |
| | | dappUsdtPerkEntity.setNftDevote(nftDevote); |
| | | dappUsdtPerkEntityMapper.updateById(dappUsdtPerkEntity); |
| | | /** |
| | | * 1.90%底池的USDT做成100%溢价,铸造出70%金本位价值的A币。 |
| | | */ |
| | | DataDictionaryCustom produceAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.PRODUCE_A_PERCENT.getType(), |
| | | PoolEnum.PRODUCE_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal produceAPercent = new BigDecimal(StrUtil.isEmpty(produceAPercentDic.getValue()) ? "0.7" : produceAPercentDic.getValue()); |
| | | //购买数量 |
| | | BigDecimal totalCnt = amount.divide(coinAPrice, 4, BigDecimal.ROUND_DOWN); |
| | | /** |
| | | * 铸造出70%金本位价值的A币。实际产生数量 |
| | | */ |
| | | BigDecimal realCnt = totalCnt.multiply(produceAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | dappChargeUsdtEntity.setTotalCnt(totalCnt); |
| | | dappChargeUsdtEntity.setRealCnt(realCnt); |
| | | dappChargeUsdtMapper.updateById(dappChargeUsdtEntity); |
| | | /** |
| | | * 重新计算A币的价格 |
| | | */ |
| | | DataDictionaryCustom coinACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.COIN_A_CNT.getType(), |
| | | PoolEnum.COIN_A_CNT.getCode() |
| | | ); |
| | | //A币币本位底池-A币的数量 |
| | | BigDecimal coinACntDicCnt = new BigDecimal(coinACntDic.getValue()); |
| | | coinACntDicCnt = coinACntDicCnt.add(realCnt); |
| | | coinACntDic.setValue(coinACntDicCnt.toString()); |
| | | dataDictionaryCustomMapper.updateById(coinACntDic); |
| | | |
| | | DataDictionaryCustom coinAUsdtPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.COIN_A_USDT_PRICE.getType(), |
| | | PoolEnum.COIN_A_USDT_PRICE.getCode() |
| | | ); |
| | | //A币金本位底池-usdt数量 |
| | | BigDecimal coinAUsdtPriceDicCnt = new BigDecimal(coinAUsdtPriceDic.getValue()); |
| | | coinAUsdtPriceDicCnt = coinAUsdtPriceDicCnt.add(amount.multiply(new BigDecimal(0.8))); |
| | | coinAUsdtPriceDic.setValue(coinAUsdtPriceDicCnt.toString()); |
| | | dataDictionaryCustomMapper.updateById(coinAUsdtPriceDic); |
| | | |
| | | BigDecimal divide = coinAUsdtPriceDicCnt.divide(coinACntDicCnt, 12, BigDecimal.ROUND_DOWN); |
| | | coinAPriceDic.setValue(divide.toString()); |
| | | dataDictionaryCustomMapper.updateById(coinAPriceDic); |
| | | |
| | | chainProducer.sendAntKLineMsg(0); |
| | | /** |
| | | * A币的分配 walletMine |
| | | * 【70%换算100%分配】 |
| | | * 50%客户秒到 |
| | | * 20%全网加权分红(按20%释放递减) |
| | | * 10%直推 |
| | | * 5%节点 |
| | | * 5%基金会 |
| | | * 10%级差奖 |
| | | */ |
| | | /** |
| | | * 50%客户秒到 |
| | | */ |
| | | DataDictionaryCustom memberGetAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.MEMBER_GET_A_PERCENT.getType(), |
| | | PoolEnum.MEMBER_GET_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal memberGetAPercent = new BigDecimal(StrUtil.isEmpty(memberGetAPercentDic.getValue()) ? "0.5" : memberGetAPercentDic.getValue()); |
| | | BigDecimal memberGetACnt = realCnt.multiply(memberGetAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | |
| | | BigDecimal fundFlowToMemberFlag = this.getAndUpdateMemberPerk(dappFundFlowEntity.getMemberId(), memberGetACnt); |
| | | if(fundFlowToMemberFlag.compareTo(BigDecimal.ZERO) > 0){ |
| | | //生成一条50%客户秒到的资金流水记录 |
| | | DappFundFlowEntity fundFlowToMember = new DappFundFlowEntity( |
| | | dappFundFlowEntity.getMemberId(), |
| | | fundFlowToMemberFlag, |
| | | FundFlowEnum.MEMBER_GET_A_CNT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(fundFlowToMember); |
| | | //用户的A币账户增加memberGetACnt数量 |
| | | dappWalletService.updateWalletMineWithLock(fundFlowToMemberFlag,dappFundFlowEntity.getMemberId(),1); |
| | | } |
| | | /** |
| | | * 20%全网加权分红(按20%释放递减)进入加权分红底池 |
| | | */ |
| | | DataDictionaryCustom poolAllMemberAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.POOL_ALL_MEMBER_A_PERCENT.getType(), |
| | | PoolEnum.POOL_ALL_MEMBER_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal poolAllMemberAPercent = new BigDecimal(StrUtil.isEmpty(poolAllMemberAPercentDic.getValue()) ? "0.2" : poolAllMemberAPercentDic.getValue()); |
| | | BigDecimal poolAllMemberAPercentCnt = realCnt.multiply(poolAllMemberAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | |
| | | DataDictionaryCustom poolAllMemberACntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.POOL_ALL_MEMBER_A_CNT.getType(), |
| | | PoolEnum.POOL_ALL_MEMBER_A_CNT.getCode() |
| | | ); |
| | | BigDecimal poolAllMemberACnt = new BigDecimal(StrUtil.isEmpty(poolAllMemberACntDic.getValue()) ? "0" : poolAllMemberACntDic.getValue()); |
| | | poolAllMemberACnt = poolAllMemberACnt.add(poolAllMemberAPercentCnt); |
| | | poolAllMemberACntDic.setValue(poolAllMemberACnt.toString()); |
| | | dataDictionaryCustomMapper.updateById(poolAllMemberACntDic); |
| | | //生成一条20%全网加权分红(按20%释放递减)进入加权分红底池的资金流水记录 |
| | | DappFundFlowEntity poolAllMemberAFundFlow = new DappFundFlowEntity( |
| | | 1L, |
| | | poolAllMemberAPercentCnt, |
| | | FundFlowEnum.POOL_ALL_MEMBER_A_CNT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(poolAllMemberAFundFlow); |
| | | |
| | | /** |
| | | * 20%全网加权平分,按照个人投资占比全网的比例去平分 |
| | | */ |
| | | chainProducer.sendAllMemberPerkAvaMsg(poolAllMemberAFundFlow.getId()); |
| | | /** |
| | | * 10%直推 |
| | | */ |
| | | DataDictionaryCustom directAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.DIRECT_A_PERCENT.getType(), |
| | | PoolEnum.DIRECT_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal directAPercent = new BigDecimal(StrUtil.isEmpty(directAPercentDic.getValue()) ? "0.1" : directAPercentDic.getValue()); |
| | | BigDecimal directAPercentCnt = realCnt.multiply(directAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | |
| | | String refererId = dappMemberEntity.getRefererId(); |
| | | DappMemberEntity directMemberEntity = dappMemberDao.selectMemberInfoByInviteId(refererId); |
| | | if(ObjectUtil.isNotEmpty(directMemberEntity)){ |
| | | /** |
| | | *推荐用户入单可享有贡献值.例.推荐100获得100贡献值 |
| | | */ |
| | | DappUsdtPerkEntity directDappUsdtPerkEntity = dappUsdtPerkEntityMapper.selectByMemberId(directMemberEntity.getId()); |
| | | if(ObjectUtil.isEmpty(directDappUsdtPerkEntity)){ |
| | | directDappUsdtPerkEntity = new DappUsdtPerkEntity(); |
| | | directDappUsdtPerkEntity.setNftDevote(amount); |
| | | directDappUsdtPerkEntity.setMemberId(directMemberEntity.getId()); |
| | | dappUsdtPerkEntityMapper.insert(directDappUsdtPerkEntity); |
| | | } |
| | | |
| | | BigDecimal directNftDevote = directDappUsdtPerkEntity.getNftDevote(); |
| | | directNftDevote = directNftDevote.add(amount); |
| | | directDappUsdtPerkEntity.setNftDevote(directNftDevote); |
| | | dappUsdtPerkEntityMapper.updateById(directDappUsdtPerkEntity); |
| | | |
| | | BigDecimal directAPercentFundFlowToMemberFlag = this.getAndUpdateMemberPerk(directMemberEntity.getId(), directAPercentCnt); |
| | | if(directAPercentFundFlowToMemberFlag.compareTo(BigDecimal.ZERO) > 0){ |
| | | //生成一条10%直推的资金流水记录 |
| | | DappFundFlowEntity directAPercentFundFlowToMember = new DappFundFlowEntity( |
| | | directMemberEntity.getId(), |
| | | directAPercentFundFlowToMemberFlag, |
| | | FundFlowEnum.DIRECT_A_PERCENT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(directAPercentFundFlowToMember); |
| | | //用户的A币账户增加directAPercentCnt数量 |
| | | dappWalletService.updateWalletMineWithLock(directAPercentFundFlowToMemberFlag,directMemberEntity.getId(),1); |
| | | } |
| | | if(directAPercentCnt.compareTo(directAPercentFundFlowToMemberFlag) > 0){ |
| | | DappFundFlowEntity directAPercentFundFlowToMemberAva = new DappFundFlowEntity( |
| | | 1L, |
| | | directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag), |
| | | FundFlowEnum.DIRECT_A_PERCENT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(directAPercentFundFlowToMemberAva); |
| | | dappWalletService.updateWalletMineWithLock(directAPercentCnt.subtract(directAPercentFundFlowToMemberFlag), |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | } |
| | | /** |
| | | * 5%节点 |
| | | */ |
| | | DataDictionaryCustom nodeAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.NODE_A_PERCENT.getType(), |
| | | PoolEnum.NODE_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal nodeAPercent = new BigDecimal(StrUtil.isEmpty(nodeAPercentDic.getValue()) ? "0.05" : nodeAPercentDic.getValue()); |
| | | BigDecimal nodeAPercentCnt = realCnt.multiply(nodeAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | //生成一条5%节点的资金流水记录 |
| | | DappFundFlowEntity nodeAPercentFundFlow = new DappFundFlowEntity( |
| | | 1L, |
| | | nodeAPercentCnt, |
| | | FundFlowEnum.NODE_A_PERCENT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlow); |
| | | // chainProducer.sendAntACoinInNodeMsg(nodeAPercentFundFlow.getId()); |
| | | DataDictionaryCustom nodeAPercentPoolDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.NODE_A_PERCENT_POOL.getType(), |
| | | PoolEnum.NODE_A_PERCENT_POOL.getCode() |
| | | ); |
| | | BigDecimal nodeAPercentPoolDicCnt = new BigDecimal(StrUtil.isEmpty(nodeAPercentPoolDic.getValue()) ? "0" : nodeAPercentPoolDic.getValue()); |
| | | nodeAPercentPoolDicCnt = nodeAPercentPoolDicCnt.add(nodeAPercentCnt); |
| | | nodeAPercentPoolDic.setValue(nodeAPercentPoolDicCnt.toString()); |
| | | dataDictionaryCustomMapper.updateById(nodeAPercentPoolDic); |
| | | |
| | | BigDecimal nodeAPercentCntAva = superNodePoolPerk(nodeAPercentCnt, NodeCodeEnum.SUPER_NODE.getCode(), FundFlowEnum.NODE_A_PERCENT_TO_MEMBER.getCode()); |
| | | |
| | | if(nodeAPercentCnt.compareTo(nodeAPercentCntAva) > 0){ |
| | | DappFundFlowEntity nodeAPercentFundFlowAva = new DappFundFlowEntity( |
| | | 1L, |
| | | nodeAPercentCnt.subtract(nodeAPercentCntAva), |
| | | FundFlowEnum.NODE_A_PERCENT_TO_MEMBER.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(nodeAPercentFundFlowAva); |
| | | dappWalletService.updateWalletMineWithLock(nodeAPercentCnt.subtract(nodeAPercentCntAva), |
| | | AppContants.YL_MEMBER_ID,1); |
| | | } |
| | | /** |
| | | * 5%基金会 |
| | | */ |
| | | DataDictionaryCustom foundationAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.FOUNDATION_A_PERCENT.getType(), |
| | | PoolEnum.FOUNDATION_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal foundationAPercent = new BigDecimal(StrUtil.isEmpty(foundationAPercentDic.getValue()) ? "0.05" : foundationAPercentDic.getValue()); |
| | | BigDecimal foundationAPercentCnt = realCnt.multiply(foundationAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | |
| | | //生成一条5%基金会的资金流水记录 |
| | | DappFundFlowEntity foundationAPercentFundFlow = new DappFundFlowEntity( |
| | | 295L, |
| | | foundationAPercentCnt, |
| | | FundFlowEnum.FOUNDATION_A_PERCENT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(foundationAPercentFundFlow); |
| | | //用户的A币账户增加memberGetACnt数量 |
| | | dappWalletService.updateWalletMineWithLock(foundationAPercentCnt,295L,1); |
| | | /** |
| | | * 10%级差奖 |
| | | */ |
| | | DataDictionaryCustom levelAPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | PoolEnum.LEVEL_A_PERCENT.getType(), |
| | | PoolEnum.LEVEL_A_PERCENT.getCode() |
| | | ); |
| | | BigDecimal levelAPercent = new BigDecimal(StrUtil.isEmpty(levelAPercentDic.getValue()) ? "0.1" : levelAPercentDic.getValue()); |
| | | BigDecimal levelAPercentCnt = realCnt.multiply(levelAPercent).setScale(4, BigDecimal.ROUND_DOWN); |
| | | |
| | | //生成一条10%级差奖进入10%级差奖底池的资金流水记录 |
| | | DappFundFlowEntity levelAPercentCntFundFlow = new DappFundFlowEntity( |
| | | 1L, |
| | | levelAPercentCnt, |
| | | FundFlowEnum.LEVEL_A_PERCENT_CNT.getCode(), |
| | | 2, |
| | | BigDecimal.ZERO, |
| | | null, |
| | | chergeRecordId); |
| | | dappFundFlowDao.insert(levelAPercentCntFundFlow); |
| | | chainProducer.sendAntACoinInLevelMsg(levelAPercentCntFundFlow.getId()); |
| | | |
| | | /** |
| | | * 更新用户为有效用户 |
| | | */ |
| | | dappMemberDao.updateMemberActiveStatus(1,memberId); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 测试转账 |
| | | * @param args |
| | | */ |
| | | // public static void main(String[] args) { |
| | | // String transfer = ChainService.getInstance(ChainEnum.BSC_USDT_A_POOL.name()).transfer("0x74fC0e035f315F7BD8b7686e22581AB1afC45e97", new BigDecimal(1)); |
| | | // System.out.println(transfer); |
| | | // |
| | | // } |
| | | |
| | | /** |
| | | * 生成当前分钟的k线数据,type为0 |