From 81b15e722dce6ff4cdf2dc4fba4f211f4dbfadbb Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Tue, 10 Jan 2023 11:42:34 +0800 Subject: [PATCH] 20221227 充值归集 --- src/test/java/cc/mrbird/febs/ProfitTest.java | 509 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 442 insertions(+), 67 deletions(-) diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java index 6d37c66..a702b5b 100644 --- a/src/test/java/cc/mrbird/febs/ProfitTest.java +++ b/src/test/java/cc/mrbird/febs/ProfitTest.java @@ -1,28 +1,45 @@ package cc.mrbird.febs; import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.enumerates.*; +import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.MallUtils; -import cc.mrbird.febs.mall.entity.MallOrderItem; -import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; -import cc.mrbird.febs.mall.mapper.MallOrderItemMapper; +import cc.mrbird.febs.common.utils.RedisUtils; +import cc.mrbird.febs.mall.chain.enums.ChainEnum; +import cc.mrbird.febs.mall.chain.enums.EthService; +import cc.mrbird.febs.mall.chain.service.BaseCoinService; +import cc.mrbird.febs.mall.chain.service.ChainService; +import cc.mrbird.febs.mall.chain.service.ContractEventService; +import cc.mrbird.febs.mall.chain.service.UsdtErc20UpdateService; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.quartz.OrderSettlementJob; -import cc.mrbird.febs.mall.service.IAgentService; -import cc.mrbird.febs.mall.service.IMallAchieveService; -import cc.mrbird.febs.mall.service.IMemberProfitService; +import cc.mrbird.febs.mall.service.*; +import cc.mrbird.febs.mall.vo.ApiMallSubsidyAmountInfoVo; import cc.mrbird.febs.pay.model.*; import cc.mrbird.febs.pay.service.UnipayService; import cc.mrbird.febs.rabbit.consumer.AgentConsumer; +import cc.mrbird.febs.rabbit.producter.AgentProducer; +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 cn.hutool.json.JSON; +import cn.hutool.json.JSONUtil; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.BigInteger; import java.text.DecimalFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ExecutionException; /** * @author wzy @@ -31,61 +48,373 @@ @SpringBootTest public class ProfitTest { -// @Autowired -// private AgentConsumer agentConsumer; -// -// @Autowired -// private IAgentService agentService; -// -// @Autowired -// private IMemberProfitService memberProfitService; -// + @Autowired + private AgentConsumer agentConsumer; + + @Autowired + private IAgentService agentService; + + @Autowired + private IMemberProfitService memberProfitService; + + @Test + public void dynamicProfit() { + memberProfitService.dynamicProfit(21L); + } + @Test + public void agentProfit() { + memberProfitService.agentProfit(null); + } + + // @Test -// public void dynamicProfit() { -// memberProfitService.dynamicProfit(21L); +// public void staticProfit() { +// memberProfitService.staticProfit(new Date()); // } -// @Test -// public void agentProfit() { -// memberProfitService.agentProfit(null); -// } -// -// -//// @Test -//// public void staticProfit() { -//// memberProfitService.staticProfit(new Date()); -//// } -// -// @Test -// public void thankfulProfit() { -// memberProfitService.thankfulProfit(new Date()); -// } -// -// @Test -// public void rankProfit() { -// memberProfitService.rankProfit(); -// } -// -// @Autowired -// private MallOrderInfoMapper mallOrderInfoMapper; -// -// @Test -// public void directorProfitTest() { -// memberProfitService.storeAndDirectorProfit(new Date()); -// } -// -// @Autowired -// private MallOrderItemMapper mallOrderItemMapper; -// -// @Autowired -// private IMallAchieveService mallAchieveService; -// -// @Test -// public void achieveTest() { -// List<MallOrderItem> items = mallOrderItemMapper.selectList(null); -// for (MallOrderItem item : items) { -// mallAchieveService.add(item.getId()); -// } -// } + + @Test + public void thankfulProfit() { + memberProfitService.thankfulProfit(new Date()); + } + + @Test + public void rankProfit() { + memberProfitService.rankProfit(); + } + + @Autowired + private MallOrderInfoMapper mallOrderInfoMapper; + + @Autowired + private MallMemberMapper memberMapper; + + @Autowired + private MallMoneyFlowMapper mallMoneyFlowMapper; + + @Autowired + private IApiMallMemberWalletService memberWalletService; + + @Autowired + private IMallMoneyFlowService mallMoneyFlowService; + + @Autowired + private AgentProducer agentProducer; + + @Autowired + private DataDictionaryCustomMapper dataDictionaryCustomMapper; + + @Test + public void directorProfitTest() { + Long directRewardId = 628L; + MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(directRewardId); + if(ObjectUtil.isEmpty(orderInfo)){ + return; + } + Integer status = orderInfo.getStatus(); + if(OrderStatusEnum.FINISH.getValue() != status){ + return; + } + //下单补贴金额 + BigDecimal subsidyAmount = orderInfo.getSubsidyAmount(); + //下单人 + Long memberId = orderInfo.getMemberId(); + MallMember mallMember = memberMapper.selectById(memberId); + /** + * 生成补贴的流水记录 + * 1、待生效 + * 2、返利对象,下单人 + * 3、金额,补贴金额 + */ + Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + orderInfo.getOrderNo(), + subsidyAmount.setScale(4, BigDecimal.ROUND_DOWN), + MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getCode(), + MallMoneyFlow.STATUS_SUCCESS, + MallMoneyFlow.IS_RETURN_Y, + mallMember.getId(), + FlowTypeEnum.BALANCE.getValue(), + MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getName() + ); + +// memberWalletService.addBalance(subsidyAmount.setScale(4, BigDecimal.ROUND_DOWN),mallMember.getId()); + memberWalletService.add(subsidyAmount.setScale(4, BigDecimal.ROUND_DOWN), mallMember.getId(), "balance"); + + /** + * 生成直推返利的流水记录 + * 1、待生效 + * 2、返利对象:下单人的直推上级 + * 3、金额:返利比例乘以补贴金额 + */ + /** + * 生成分享奖励的流水记录 + * 1、待生效 + * 2、返利对象:下单人的直推上级 10%,直推的直推 5% + * 3、金额:补贴金额乘以分享奖励的比例 + */ + //下单人的直推上级 + MallMember mallMemberOne = memberMapper.selectInfoByInviteId(mallMember.getReferrerId()); + //生成直推返利的流水记录 + if(ObjectUtil.isNotEmpty(mallMemberOne)){ + DataDictionaryCustom rewardPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.REWARD_PERCENT.getType(), + DataDictionaryEnum.REWARD_PERCENT.getCode() + ); + BigDecimal rewardPercent = new BigDecimal(rewardPercentDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN); + BigDecimal directRewardAmount = subsidyAmount.multiply(rewardPercent).setScale(4, BigDecimal.ROUND_DOWN); + + Long marketSubsidyFlowId = mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + orderInfo.getOrderNo(), + directRewardAmount, + MallMoneyFlowTypeEnum.DIRECT_REWARD.getCode(), + MallMoneyFlow.STATUS_SUCCESS, + MallMoneyFlow.IS_RETURN_Y, + mallMemberOne.getId(), + FlowTypeEnum.BALANCE.getValue(), + MallMoneyFlowTypeEnum.DIRECT_REWARD.getName() + ); + +// memberWalletService.addBalance(directRewardAmount,mallMemberOne.getId()); + + memberWalletService.add(directRewardAmount, mallMemberOne.getId(), "balance"); + + DataDictionaryCustom shareOneDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.LEVEL_ONE.getType(), + DataDictionaryEnum.LEVEL_ONE.getCode() + ); + //生成分享奖励的流水记录 + BigDecimal shareOne = new BigDecimal(shareOneDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN); + BigDecimal shareOneAmount = subsidyAmount.multiply(shareOne).setScale(4, BigDecimal.ROUND_DOWN); + Long ShareOneFlowId = mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + orderInfo.getOrderNo(), + shareOneAmount, + MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getCode(), + MallMoneyFlow.STATUS_SUCCESS, + MallMoneyFlow.IS_RETURN_Y, + mallMemberOne.getId(), + FlowTypeEnum.BALANCE.getValue(), + MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getName() + ); +// memberWalletService.addBalance(shareOneAmount,mallMemberOne.getId()); + memberWalletService.add(shareOneAmount, mallMemberOne.getId(), "balance"); + } + //下单人的直推上级的直推 + MallMember mallMemberTwo = memberMapper.selectInfoByInviteId(mallMemberOne.getReferrerId()); + if(ObjectUtil.isNotEmpty(mallMemberTwo)){ + DataDictionaryCustom shareTwoDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.LEVEL_TWO.getType(), + DataDictionaryEnum.LEVEL_TWO.getCode() + ); + BigDecimal shareTwo = new BigDecimal(shareTwoDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN); + BigDecimal shareTwoAmount = subsidyAmount.multiply(shareTwo).setScale(4, BigDecimal.ROUND_DOWN); + Long shareTwoFlowId = mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + orderInfo.getOrderNo(), + shareTwoAmount, + MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getCode(), + MallMoneyFlow.STATUS_SUCCESS, + MallMoneyFlow.IS_RETURN_Y, + mallMemberTwo.getId(), + FlowTypeEnum.BALANCE.getValue(), + MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getName() + ); +// memberWalletService.addBalance(shareTwoAmount,mallMemberTwo.getId()); + memberWalletService.add(shareTwoAmount, mallMemberTwo.getId(), "balance"); + } + /** + * 团队管理补贴 + */ + //下单人所有的上级 + String referrerIds = mallMember.getReferrerIds(); + List<String> refererIdList = StrUtil.split(referrerIds, ",", -1, true, true); + //下单人所有符合条件的上级-邀请码 + ArrayList<String> refererIdListUp = new ArrayList<>(); + //初始级别即当前下单人的级别 + String levelStart = mallMember.getLevel(); + if(CollUtil.isNotEmpty(refererIdList)){ + for(String inviteId : refererIdList){ + MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId); + String levelUp = mallMemberUp.getLevel(); + //团队补贴从区代开始 + if(!MemberAgentLevelEnum.AGENT.getName().equals(levelUp)){ + //比较两个代理级别,同级别或者大于下单人的级别都保留 + int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp,levelStart); + if(0 < compareLevel){ + levelStart = levelUp; + refererIdListUp.add(inviteId); + } + } + } + } + if(CollUtil.isNotEmpty(refererIdListUp)){ + levelStart = mallMember.getLevel(); + for(String inviteId : refererIdList){ + MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId); + String levelUp = mallMemberUp.getLevel(); + //获取团队分享比例 + BigDecimal manageSubsidyPercent = getManageSubsidyPercent(levelStart, levelUp); + if(manageSubsidyPercent.compareTo(BigDecimal.ZERO) > 0){ + BigDecimal teamManageAmount = subsidyAmount.multiply(manageSubsidyPercent).setScale(4, BigDecimal.ROUND_DOWN); + //生成团队分享流水 + Long teamManageFlowId = mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + orderInfo.getOrderNo(), + teamManageAmount, + MallMoneyFlowTypeEnum.TEAM_REWARD.getCode(), + MallMoneyFlow.STATUS_SUCCESS, + MallMoneyFlow.IS_RETURN_Y, + mallMemberUp.getId(), + FlowTypeEnum.BALANCE.getValue(), + MallMoneyFlowTypeEnum.TEAM_REWARD.getName() + ); + +// memberWalletService.addBalance(teamManageAmount,mallMemberUp.getId()); + + memberWalletService.add(teamManageAmount, mallMemberUp.getId(), "balance"); + } + levelStart = levelUp; + } + } + } + + /** + * 根据传入的两个级别,比较之后获取对应的团队管理奖励比例 + * @param levelStart + * @param levelUp + * @return + */ + private BigDecimal getManageSubsidyPercent(String levelStart,String levelUp){ + BigDecimal manageSubsidyPercent = BigDecimal.ZERO; + String agentCodeStart = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelStart); + String agentCodeUp = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelUp); + int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp, levelStart); + //如果是平级 + if(compareLevel == 2){ + manageSubsidyPercent = getDicSubsidyPercent(agentCodeStart); + } + //如果不是平级 + if(compareLevel == 1){ + //1、初始级别不能是会员 + //2、当前级别的上一个级别是否是levelStart, + // 满足,需要减去levelStart的团队管理奖励 + String minLevel = MemberAgentLevelEnum.AGENT_ONE.minLevel(agentCodeUp); + if(levelStart.equals(minLevel) + && !MemberAgentLevelEnum.AGENT.getName().equals(levelStart)){ + BigDecimal dicManageSubsidyPercentUp = getDicManageSubsidyPercent(agentCodeUp); + BigDecimal dicManageSubsidyPercentStart = getDicManageSubsidyPercent(agentCodeStart); + manageSubsidyPercent = dicManageSubsidyPercentUp.subtract(dicManageSubsidyPercentStart); + }else{ + manageSubsidyPercent = getDicManageSubsidyPercent(agentCodeUp); + } + } + return manageSubsidyPercent; + } + + /** + * 获取对应的团队管理奖励比例 + * @param agentCode + * @return + */ + private BigDecimal getDicManageSubsidyPercent(String agentCode){ + BigDecimal manageSubsidyPercent = BigDecimal.ZERO; + DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.AGENT_ONE.getType(), + agentCode + ); + cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue()); + String manageSubsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString(); + manageSubsidyPercent = new BigDecimal(manageSubsidyPercentStr) + .multiply(new BigDecimal(0.01)) + .setScale(2,BigDecimal.ROUND_DOWN); + return manageSubsidyPercent; + } + + /** + * 获取对应的平级团队管理奖励比例 + * @param agentCode + * @return + */ + private BigDecimal getDicSubsidyPercent(String agentCode){ + BigDecimal subsidyPercent = BigDecimal.ZERO; + DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.AGENT_ONE.getType(), + agentCode + ); + cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue()); + String subsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString(); + subsidyPercent = new BigDecimal(subsidyPercentStr) + .multiply(new BigDecimal(0.01)) + .setScale(2,BigDecimal.ROUND_DOWN); + return subsidyPercent; + } + + @Autowired + private MallOrderItemMapper mallOrderItemMapper; + + @Autowired + private IMallAchieveService mallAchieveService; + + @Autowired + private MallMemberStarBuyMapper mallMemberStarBuyMapper; + + @Test + public void achieveTest() { + List<MallMemberStarBuy> mallMemberStarBuys = mallMemberStarBuyMapper.selectByStatus(1); + if(CollUtil.isEmpty(mallMemberStarBuys)){ + return; + } + for(MallMemberStarBuy mallMemberStarBuy : mallMemberStarBuys){ + Long memberId = mallMemberStarBuy.getMemberId(); + MallMember mallMember = memberMapper.selectById(memberId); + //用户不存在跳出本次循环 + if(ObjectUtil.isEmpty(mallMember)){ + continue; + } + //返还总金额 + BigDecimal amount = mallMemberStarBuy.getAmount(); + //剩余返还总金额不足,跳出本次循环 + BigDecimal avaAmount = mallMemberStarBuy.getAvaAmount(); + if(avaAmount.compareTo(BigDecimal.ZERO) <= 0){ + continue; + } + //每次返还比例 + DataDictionaryCustom returnPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.RETURN_PERCENT.getType(), + DataDictionaryEnum.RETURN_PERCENT.getCode() + ); + String returnPercentStr = returnPercentDic.getValue(); + BigDecimal returnPercent = new BigDecimal(returnPercentStr).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN); + //本次返还金额 + BigDecimal returnAmount = amount.multiply(returnPercent).setScale(2,BigDecimal.ROUND_DOWN); + /** + * 如果本次返还金额大于剩余返还总金额 + */ + if(returnAmount.compareTo(avaAmount) >= 0){ + returnAmount = avaAmount; + avaAmount = BigDecimal.ZERO; + }else{ + avaAmount = avaAmount.subtract(returnAmount).setScale(2,BigDecimal.ROUND_DOWN); + } + //增加用户金额 + memberWalletService.addBalance(returnAmount,mallMember.getId()); + //生成流水记录 + Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + mallMemberStarBuy.getBuyCode(), + returnAmount, + MallMoneyFlowTypeEnum.RETURN_MARKET_STAR.getCode(), + MallMoneyFlow.STATUS_SUCCESS, + MallMoneyFlow.IS_RETURN_Y, + mallMember.getId(), + FlowTypeEnum.BALANCE.getValue(), + MallMoneyFlowTypeEnum.RETURN_MARKET_STAR.getName() + ); + //更新记录 + mallMemberStarBuyMapper.updateAvaAmountById(avaAmount,mallMemberStarBuy.getId()); + } + } // // @Test // public void paramTest() { @@ -100,10 +429,56 @@ // amount.put("amount", 2); // } // -// @Test -// public void scorePool(){ -// memberProfitService.scorePool(); -// } + + + @Autowired + private ContractEventService bscUsdtContractEvent; + + + @Autowired + private BaseCoinService baseCoinService; + @Autowired + private RedisUtils redisUtils; + @Resource + private UsdtErc20UpdateService usdtErc20UpdateService; + @Resource + private MemberCoinAddressDao memberCoinAddressDao; + @Test + public void scorePool(){ + + String next = "0xc1be17a02127e5cc1e6b2298436e8b467531f798"; + MemberCoinAddressEntity memberCoinAddressEntity = memberCoinAddressDao.selectCoinAddressByAddressAndSymbolTag(next, "USDT", "ERC20"); + if(ObjectUtil.isEmpty(memberCoinAddressEntity)){ + return; + } + BigDecimal balanceOf = ChainService.getInstance(ChainEnum.BSC_USDT.name()).balanceOf(next); + if (balanceOf == null || balanceOf.compareTo(new BigDecimal("0.05")) < 1) { + return; + } + //查询手续费 + BigDecimal balanceOfBaseToken = ChainService.getInstance(ChainEnum.BSC_USDT.name()).balanceOfBaseToken(next); + + String gas = "5"; + if(balanceOfBaseToken.compareTo(new BigDecimal(gas)) < 0){ + //转手续费 + ChainService.getInstance(ChainEnum.BSC_USDT.name()).transferBaseToken(next, new BigDecimal(gas)); + } + ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(memberCoinAddressEntity.getPrivateKey(), + memberCoinAddressEntity.getAddress(), + AppContants.ERC20_POOL_ADDRESS, + balanceOf.toString()); +// long start = System.currentTimeMillis(); +// Object incrementObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM); +// BigInteger newest = ChainService.getInstance(ChainEnum.BSC_USDT.name()).blockNumber(); +// BigInteger block; +// if (incrementObj == null) { +// block = newest; +// } else { +// block = (BigInteger) incrementObj; +// } +//// ChainService.wssBaseCoinEventListener(BigInteger.valueOf(24317595), baseCoinService); +// ChainService.wssContractEventListener(BigInteger.valueOf(24317595), bscUsdtContractEvent, ChainEnum.BSC_USDT.name()); + } // // @Test // public void staticProfit(){ -- Gitblit v1.9.1