From 1f2aca9f117c2a00d7ef7a705f8dd1128cd021c0 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Thu, 22 Dec 2022 17:58:42 +0800 Subject: [PATCH] 20221221 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 17 +- src/test/java/cc/mrbird/febs/ProfitTest.java | 291 +++++++++++++++++++++++++++++++++++++++++------- src/main/java/cc/mrbird/febs/mall/vo/ApiStarMarketMoneyFlowVo.java | 4 3 files changed, 261 insertions(+), 51 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java index 2fea264..9451987 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java @@ -163,7 +163,6 @@ @Transactional public void directReward(Long directRewardId) { log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息,ID:{}", directRewardId); - //获取订单信息 MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(directRewardId); if(ObjectUtil.isEmpty(orderInfo)){ return; @@ -186,7 +185,7 @@ Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow( mallMember.getId(), orderInfo.getOrderNo(), - subsidyAmount.setScale(2, BigDecimal.ROUND_DOWN), + subsidyAmount.setScale(4, BigDecimal.ROUND_DOWN), MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getCode(), MallMoneyFlow.STATUS_SUCCESS, MallMoneyFlow.IS_RETURN_Y, @@ -218,7 +217,7 @@ 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(2, BigDecimal.ROUND_DOWN); + BigDecimal directRewardAmount = subsidyAmount.multiply(rewardPercent).setScale(4, BigDecimal.ROUND_DOWN); Long marketSubsidyFlowId = mallMoneyFlowService.addMoneyFlow( mallMember.getId(), @@ -238,7 +237,7 @@ ); //生成分享奖励的流水记录 BigDecimal shareOne = new BigDecimal(shareOneDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN); - BigDecimal shareOneAmount = subsidyAmount.multiply(shareOne).setScale(2, BigDecimal.ROUND_DOWN); + BigDecimal shareOneAmount = subsidyAmount.multiply(shareOne).setScale(4, BigDecimal.ROUND_DOWN); Long ShareOneFlowId = mallMoneyFlowService.addMoneyFlow( mallMember.getId(), orderInfo.getOrderNo(), @@ -260,7 +259,7 @@ 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(2, BigDecimal.ROUND_DOWN); + BigDecimal shareTwoAmount = subsidyAmount.multiply(shareTwo).setScale(4, BigDecimal.ROUND_DOWN); Long shareTwoFlowId = mallMoneyFlowService.addMoneyFlow( mallMember.getId(), orderInfo.getOrderNo(), @@ -300,19 +299,20 @@ } } 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(2, BigDecimal.ROUND_DOWN); + BigDecimal teamManageAmount = subsidyAmount.multiply(manageSubsidyPercent).setScale(4, BigDecimal.ROUND_DOWN); //生成团队分享流水 Long teamManageFlowId = mallMoneyFlowService.addMoneyFlow( mallMember.getId(), orderInfo.getOrderNo(), teamManageAmount, - MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getCode(), + MallMoneyFlowTypeEnum.TEAM_REWARD.getCode(), MallMoneyFlow.STATUS_SUCCESS, MallMoneyFlow.IS_RETURN_Y, mallMemberUp.getId(), @@ -349,7 +349,8 @@ // 满足,需要减去levelStart的团队管理奖励 String minLevel = MemberAgentLevelEnum.AGENT_ONE.minLevel(agentCodeUp); if(levelStart.equals(minLevel) - && MemberAgentLevelEnum.AGENT.getName() != levelStart){ + && !MemberAgentLevelEnum.AGENT.getName().equals(levelStart)){ +// && MemberAgentLevelEnum.AGENT.getName()levelStart){ BigDecimal dicManageSubsidyPercentUp = getDicManageSubsidyPercent(agentCodeUp); BigDecimal dicManageSubsidyPercentStart = getDicManageSubsidyPercent(agentCodeStart); manageSubsidyPercent = dicManageSubsidyPercentUp.subtract(dicManageSubsidyPercentStart); diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiStarMarketMoneyFlowVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiStarMarketMoneyFlowVo.java new file mode 100644 index 0000000..d34a90f --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiStarMarketMoneyFlowVo.java @@ -0,0 +1,4 @@ +package cc.mrbird.febs.mall.vo; + +public class ApiStarMarketMoneyFlowVo { +} diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java index b47bba1..a988c2e 100644 --- a/src/test/java/cc/mrbird/febs/ProfitTest.java +++ b/src/test/java/cc/mrbird/febs/ProfitTest.java @@ -1,33 +1,25 @@ package cc.mrbird.febs; import cc.mrbird.febs.common.entity.FebsResponse; -import cc.mrbird.febs.common.enumerates.MallMoneyFlowTypeEnum; -import cc.mrbird.febs.common.enumerates.OrderStatusEnum; +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.MallMember; -import cc.mrbird.febs.mall.entity.MallMoneyFlow; -import cc.mrbird.febs.mall.entity.MallOrderInfo; -import cc.mrbird.febs.mall.entity.MallOrderItem; -import cc.mrbird.febs.mall.mapper.MallMemberMapper; -import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper; -import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; -import cc.mrbird.febs.mall.mapper.MallOrderItemMapper; +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.IApiMallMemberWalletService; -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; @@ -37,10 +29,7 @@ import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author wzy @@ -87,7 +76,7 @@ private MallOrderInfoMapper mallOrderInfoMapper; @Autowired - private MallMemberMapper mallMemberMapper; + private MallMemberMapper memberMapper; @Autowired private MallMoneyFlowMapper mallMoneyFlowMapper; @@ -96,34 +85,250 @@ private IApiMallMemberWalletService memberWalletService; @Autowired + private IMallMoneyFlowService mallMoneyFlowService; + + @Autowired private AgentProducer agentProducer; + + @Autowired + private DataDictionaryCustomMapper dataDictionaryCustomMapper; @Test public void directorProfitTest() { - MallMember member = mallMemberMapper.selectById(633L); - ApiMallSubsidyAmountInfoVo apiMallSubsidyAmountInfoVo = new ApiMallSubsidyAmountInfoVo(); - DateTime today = DateUtil.date(); - DateTime yesterday = DateUtil.yesterday(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - String yyyyMMddToday = sdf.format(today); - String yyyyMMddYesterday = sdf.format(yesterday); - //今日补贴 - BigDecimal todayAmount = mallOrderInfoMapper.selectTodayAmountByCreateTimeAndMemberId(yyyyMMddToday,member.getId()); - apiMallSubsidyAmountInfoVo.setTodayAmount(todayAmount); - //今日累计接单 - Integer todayTotalCnt = mallOrderInfoMapper.selectCountByCreateTimeAndMemberId(yyyyMMddToday,member.getId()); - apiMallSubsidyAmountInfoVo.setTodayTotalCnt(todayTotalCnt); - //昨日补贴 - BigDecimal yesterdayAmount = mallOrderInfoMapper.selectTodayAmountByCreateTimeAndMemberId(yyyyMMddYesterday,member.getId()); - apiMallSubsidyAmountInfoVo.setYesterdayAmount(yesterdayAmount); - //昨日累计接单 - Integer totalYesterdayCnt = mallOrderInfoMapper.selectCountByCreateTimeAndMemberId(yyyyMMddYesterday,member.getId()); - apiMallSubsidyAmountInfoVo.setTotalYesterdayCnt(totalYesterdayCnt); - //获得总额 - BigDecimal totalAmount = mallOrderInfoMapper.selectTodayAmountByCreateTimeAndMemberId(null,member.getId()); - apiMallSubsidyAmountInfoVo.setTotalAmount(totalAmount); - JSON parse = JSONUtil.parse(apiMallSubsidyAmountInfoVo); - System.out.println(parse.toString()); + Long directRewardId = 587L; + 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(2, 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(2, BigDecimal.ROUND_DOWN),mallMember.getId()); + + /** + * 生成直推返利的流水记录 + * 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(2, 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()); + 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(2, 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()); + } + //下单人的直推上级的直推 + 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()); + } + /** + * 团队管理补贴 + */ + //下单人所有的上级 + 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()); + } + 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 -- Gitblit v1.9.1