|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @Transactional | 
|---|
|  |  |  | public void directReward(Long directRewardId) { | 
|---|
|  |  |  | log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息,ID:{}", directRewardId); | 
|---|
|  |  |  | //获取订单信息 | 
|---|
|  |  |  | MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(directRewardId); | 
|---|
|  |  |  | if(ObjectUtil.isEmpty(orderInfo)){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | 
|---|
|  |  |  | Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow( | 
|---|
|  |  |  | mallMember.getId(), | 
|---|
|  |  |  | orderInfo.getOrderNo(), | 
|---|
|  |  |  | subsidyAmount.setScale(BigDecimal.ROUND_DOWN, 2), | 
|---|
|  |  |  | subsidyAmount.setScale(4, BigDecimal.ROUND_DOWN), | 
|---|
|  |  |  | MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getCode(), | 
|---|
|  |  |  | MallMoneyFlow.STATUS_SUCCESS, | 
|---|
|  |  |  | MallMoneyFlow.IS_RETURN_Y, | 
|---|
|  |  |  | 
|---|
|  |  |  | MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getName() | 
|---|
|  |  |  | ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | memberWalletService.addBalance(subsidyAmount.setScale(BigDecimal.ROUND_DOWN, 2),mallMember.getId()); | 
|---|
|  |  |  | memberWalletService.addBalance(subsidyAmount.setScale(2, BigDecimal.ROUND_DOWN),mallMember.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 生成直推返利的流水记录 | 
|---|
|  |  |  | 
|---|
|  |  |  | *  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(BigDecimal.ROUND_DOWN,2); | 
|---|
|  |  |  | BigDecimal directRewardAmount = subsidyAmount.multiply(rewardPercent).setScale(BigDecimal.ROUND_DOWN, 2); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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(BigDecimal.ROUND_DOWN,2); | 
|---|
|  |  |  | BigDecimal shareOneAmount = subsidyAmount.multiply(shareOne).setScale(BigDecimal.ROUND_DOWN, 2); | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | if(StrUtil.isEmpty(mallMember.getReferrerId())){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //下单人的直推上级 | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(StrUtil.isEmpty(mallMemberOne.getReferrerId())){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //下单人的直推上级的直推 | 
|---|
|  |  |  | MallMember mallMemberTwo = memberMapper.selectInfoByInviteId(mallMemberOne.getReferrerId()); | 
|---|
|  |  |  | if(ObjectUtil.isNotEmpty(mallMemberTwo)){ | 
|---|
|  |  |  | 
|---|
|  |  |  | DataDictionaryEnum.LEVEL_TWO.getType(), | 
|---|
|  |  |  | DataDictionaryEnum.LEVEL_TWO.getCode() | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | BigDecimal shareTwo = new BigDecimal(shareTwoDic.getValue()).multiply(new BigDecimal(0.01)).setScale(BigDecimal.ROUND_DOWN,2); | 
|---|
|  |  |  | BigDecimal shareTwoAmount = subsidyAmount.multiply(shareTwo).setScale(BigDecimal.ROUND_DOWN, 2); | 
|---|
|  |  |  | 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(), | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 团队管理补贴 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(StrUtil.isEmpty(mallMember.getReferrerIds())){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //下单人所有的上级 | 
|---|
|  |  |  | 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(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(BigDecimal.ROUND_DOWN, 2); | 
|---|
|  |  |  | 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(), | 
|---|
|  |  |  | 
|---|
|  |  |  | // 满足,需要减去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); | 
|---|
|  |  |  | 
|---|
|  |  |  | String manageSubsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString(); | 
|---|
|  |  |  | manageSubsidyPercent =  new BigDecimal(manageSubsidyPercentStr) | 
|---|
|  |  |  | .multiply(new BigDecimal(0.01)) | 
|---|
|  |  |  | .setScale(BigDecimal.ROUND_DOWN,2); | 
|---|
|  |  |  | .setScale(2,BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | return manageSubsidyPercent; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | String subsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString(); | 
|---|
|  |  |  | subsidyPercent =  new BigDecimal(subsidyPercentStr) | 
|---|
|  |  |  | .multiply(new BigDecimal(0.01)) | 
|---|
|  |  |  | .setScale(BigDecimal.ROUND_DOWN,2); | 
|---|
|  |  |  | .setScale(2,BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | return subsidyPercent; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|