From 53cbc2537b9b0f13a572cf7d78964ab4d884b129 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 21 Dec 2022 11:17:25 +0800 Subject: [PATCH] 20221221 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 253 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 242 insertions(+), 11 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 eb14dd2..e5448c6 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 @@ -1,19 +1,14 @@ package cc.mrbird.febs.mall.service.impl; -import cc.mrbird.febs.common.enumerates.AgentLevelEnum; -import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; +import cc.mrbird.febs.common.enumerates.*; import cc.mrbird.febs.common.utils.AppContants; -import cc.mrbird.febs.mall.entity.AgentInfo; -import cc.mrbird.febs.mall.entity.DataDictionaryCustom; -import cc.mrbird.febs.mall.entity.MallMember; -import cc.mrbird.febs.mall.entity.MallOrderInfo; +import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; -import cc.mrbird.febs.mall.service.IAgentService; -import cc.mrbird.febs.mall.service.IApiMallMemberService; -import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; -import cc.mrbird.febs.mall.service.IMallAchieveService; +import cc.mrbird.febs.mall.service.*; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import jdk.nashorn.internal.ir.IfNode; import lombok.RequiredArgsConstructor; @@ -39,6 +34,9 @@ private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallMemberMapper memberMapper; + private final MallOrderInfoMapper mallOrderInfoMapper; + private final IMallMoneyFlowService mallMoneyFlowService; + private final IApiMallMemberWalletService memberWalletService; @Override @Transactional(rollbackFor = Exception.class) @@ -136,7 +134,6 @@ /** * 团队业绩是否达标 * - * @param mallMember * @param agentInfo * @return */ @@ -161,4 +158,238 @@ public void rankReturnMoney(Long orderId) { } + + @Override + @Transactional + public void directReward(Long directRewardId) { + log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息,ID:{}", directRewardId); + //获取订单信息 + 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、金额:返利比例乘以补贴金额 + */ + //下单人的直推上级 + MallMember mallMemberOne = memberMapper.selectInfoByInviteId(mallMember.getReferrerId()); + 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()); + /** + * 生成分享奖励的流水记录 + * 1、待生效 + * 2、返利对象:下单人的直推上级 10%,直推的直推 5% + * 3、金额:补贴金额乘以分享奖励的比例 + */ + 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(2, 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(); + 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)){ + 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); + //生成团队分享流水 + Long teamManageFlowId = mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + orderInfo.getOrderNo(), + teamManageAmount, + MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.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() != 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; + } + } -- Gitblit v1.9.1