|  |  | 
 |  |  | package cc.mrbird.febs.mall.service.impl; | 
 |  |  |  | 
 |  |  | import cc.mrbird.febs.common.enumerates.*; | 
 |  |  | import cc.mrbird.febs.common.tree.MatrixTree; | 
 |  |  | import cc.mrbird.febs.common.tree.MemberNode; | 
 |  |  | import cc.mrbird.febs.common.utils.AppContants; | 
 |  |  | import cc.mrbird.febs.common.utils.MallUtils; | 
 |  |  | import cc.mrbird.febs.mall.entity.*; | 
 |  |  | import cc.mrbird.febs.mall.mapper.*; | 
 |  |  | 
 |  |  |     private final MallMemberMapper memberMapper; | 
 |  |  |     private final MallOrderInfoMapper mallOrderInfoMapper; | 
 |  |  |  | 
 |  |  |     private final IApiMallMemberWalletService iApiMallMemberWalletService; | 
 |  |  |     private final IMallMoneyFlowService mallMoneyFlowService; | 
 |  |  |     private final MallMemberWalletMapper mallMemberWalletMapper; | 
 |  |  |     private final SqlSessionTemplate sqlSessionTemplate; | 
 |  |  |     private final IApiMallMemberWalletService memberWalletService; | 
 |  |  |     private final MallMoneyFlowMapper mallMoneyFlowMapper; | 
 |  |  |     private final MallMqRecordMapper mallMqRecordMapper; | 
 |  |  |  | 
 |  |  |     private final MatrixTreeNodeMapper matrixTreeNodeMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public void autoUpAgentLevel(Long memberId) { | 
 |  |  |         log.info("###代理自动升级###"); | 
 |  |  |         MallMember member = memberMapper.selectById(memberId); | 
 |  |  |         if(StrUtil.isBlank(member.getReferrerIds())) { | 
 |  |  |  | 
 |  |  |         MatrixTree tree = MatrixTree.getInstance(); | 
 |  |  |         MemberNode node = tree.getNode(member.getInviteId()); | 
 |  |  |         if (node != null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         List<String> ids = StrUtil.split(member.getReferrerIds(), ','); | 
 |  |  |         List<MallMember> parentMembers = memberMapper.selectByInviteIds(ids); | 
 |  |  |         for (MallMember parent : parentMembers) { | 
 |  |  |             // 没有购买套餐无法升级合伙人等级 | 
 |  |  |             if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             //合伙人的下一个层级 | 
 |  |  |             String parentLevel = parent.getLevel(); | 
 |  |  |             String nextLevel = MemberLevelEnum.SECOND_LEVEL.getNextLevel(parentLevel); | 
 |  |  |             if (parentLevel.equals(nextLevel)) { | 
 |  |  |                 log.info("当前层级无下一级:{}", parent.getLevel()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             DataDictionaryCustom nextLevelDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode("AGENT_LEVEL_REQUIRE", nextLevel); | 
 |  |  |             AgentInfo agentInfo = JSONObject.parseObject(nextLevelDic.getValue(), AgentInfo.class); | 
 |  |  |             if (!directMemberCnt(parent, agentInfo)) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (!agentCntFinish(parent, agentInfo)) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (!teamIncome(parent, agentInfo)) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             parent.setLevel(nextLevel); | 
 |  |  |             memberMapper.updateById(parent); | 
 |  |  |         MatrixTreeNode matrixTreeNode = matrixTreeNodeMapper.selectByTreeNode(memberId); | 
 |  |  |         if (matrixTreeNode != null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         node = new MemberNode(); | 
 |  |  |         node.setInviteId(member.getInviteId()); | 
 |  |  |         node.setPhone(member.getPhone()); | 
 |  |  |         node.setRefererId(member.getReferrerId()); | 
 |  |  |         node.setMemberId(member.getId()); | 
 |  |  |         MemberNode parentNode = tree.addNode(node); | 
 |  |  |  | 
 |  |  |         matrixTreeNode = new MatrixTreeNode(); | 
 |  |  |         matrixTreeNode.setTreeNode(memberId); | 
 |  |  |         matrixTreeNode.setParentNode(parentNode.getMemberId()); | 
 |  |  |         matrixTreeNodeMapper.insert(matrixTreeNode); | 
 |  |  |  | 
 |  |  |         List<DataDictionaryCustom> dicList = dataDictionaryCustomMapper.selectDicByType(AppContants.AGENT_LEVEL); | 
 |  |  |         DataDictionaryCustom dic = null; | 
 |  |  |         for (DataDictionaryCustom dataDictionaryCustom : dicList) { | 
 |  |  |             if (Integer.parseInt(dataDictionaryCustom.getValue()) == parentNode.CHILD.size()) { | 
 |  |  |                 dic = dataDictionaryCustom; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (dic == null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         MallMember parentMember = memberMapper.selectById(parentNode.getMemberId()); | 
 |  |  |         parentMember.setChildNodeCnt(parentNode.CHILD.size()); | 
 |  |  |         parentMember.setLevel(dic.getCode()); | 
 |  |  |         memberMapper.updateById(parentMember); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |         if(ObjectUtil.isEmpty(mallOrderInfo)){ | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         if(2 != mallOrderInfo.getStatus()){ | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  | //        if(2 != mallOrderInfo.getStatus()){ | 
 |  |  | //            return; | 
 |  |  | //        } | 
 |  |  |         /** | 
 |  |  |          * 分享补贴 直推消费额10% | 
 |  |  |          */ | 
 |  |  | 
 |  |  |             if(BigDecimal.ZERO.compareTo(sharePerkAmount) < 0){ | 
 |  |  |                 //减少补贴额度 | 
 |  |  |                 mallMemberWalletMapper.reduceTotalScoreById(sharePerkAmount, mallMemberWallet.getId()); | 
 |  |  |  | 
 |  |  |                 reduceStar(mallMemberUp.getId(),sharePerkAmount); | 
 |  |  |  | 
 |  |  |                 mallMemberWalletMapper.addBalanceById(sharePerkAmount, mallMemberWallet.getId()); | 
 |  |  |  | 
 |  |  | 
 |  |  |  | 
 |  |  |         long end = System.currentTimeMillis(); | 
 |  |  |         log.info("============订单:{},时间:{}===========",mallOrderInfo.getOrderNo(),(end - start)/1000); | 
 |  |  |         MallMqRecord mallMqRecord = mallMqRecordMapper.selectByOrderId(orderId); | 
 |  |  |         if(ObjectUtil.isNotEmpty(mallMqRecord)){ | 
 |  |  |             mallMqRecord.setState(1); | 
 |  |  |             mallMqRecordMapper.updateById(mallMqRecord); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |             List<Long> mallMemberStarIds = mallMemberStars.stream().map(MallMember::getId).collect(Collectors.toList()); | 
 |  |  |             //排除掉本身 | 
 |  |  |             mallMemberStarIds.remove(memberId); | 
 |  |  |             if(CollUtil.isEmpty(mallMemberStarIds)){ | 
 |  |  |                 return mallMemberStars; | 
 |  |  |             } | 
 |  |  |             //当前等级的总贡献点 | 
 |  |  |             List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMemberStarIds); | 
 |  |  |             Integer starSum = mallMemberWallets.stream().mapToInt(MallMemberWallet::getStar).sum(); | 
 |  |  |             if(starSum <= 0){ | 
 |  |  |                 return mallMemberStars; | 
 |  |  |             } | 
 |  |  |             //星级补贴比例 | 
 |  |  |             DataDictionaryCustom starPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
 |  |  |                     "AGENT_LEVEL_REQUIRE", | 
 |  |  | 
 |  |  |                         mallMoneyFlow.setRemark("补贴额度:"+mallMemberWallet.getTotalScore()); | 
 |  |  |                         mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue()); | 
 |  |  |                         mallMoneyFlows.add(mallMoneyFlow); | 
 |  |  |  | 
 |  |  |                         reduceStar(mallMemberWallet.getMemberId(),starPerkAmount); | 
 |  |  |                     } | 
 |  |  |                     count = count + 1; | 
 |  |  |                     if (count % 1000 == 0 || count == mallMemberWallets.size()) { | 
 |  |  | 
 |  |  |                 mallMoneyFlow.setRemark("补贴额度:"+mallMemberWallet.getTotalScore()); | 
 |  |  |                 mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue()); | 
 |  |  |                 mallMoneyFlows.add(mallMoneyFlow); | 
 |  |  |  | 
 |  |  |                 reduceStar(mallMemberWallet.getMemberId(),amount); | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             count = count + 1; | 
 |  |  |             if (count % 1000 == 0 || count == mallMemberWallets.size()) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void reduceStar(Long memberId,BigDecimal totalScore) { | 
 |  |  |         /** | 
 |  |  |          *获取用户的全部未用完的补贴额度流水 | 
 |  |  |          */ | 
 |  |  |         MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); | 
 |  |  |         List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectMoneyFlowByMemberIdAndIsRetrun(memberId,2); | 
 |  |  |         //如果补贴额度全部用完则更新用户的贡献点为零 | 
 |  |  |         if(CollUtil.isEmpty(mallMoneyFlows)){ | 
 |  |  |             mallMemberWalletMapper.reduceStarByMemberId(mallMemberWallet.getStar(), memberId); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         for(MallMoneyFlow mallMoneyFlow : mallMoneyFlows){ | 
 |  |  |             String remark = mallMoneyFlow.getRemark(); | 
 |  |  |             BigDecimal remarkNum = new BigDecimal(remark); | 
 |  |  |             //如果补贴额度小于记录的剩余补贴额度 | 
 |  |  |             if(totalScore.compareTo(remarkNum) < 0){ | 
 |  |  |                 remarkNum = remarkNum.subtract(totalScore).setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |                 mallMoneyFlowMapper.updateRemarkById(remarkNum.toString(),mallMoneyFlow.getId()); | 
 |  |  |                 break; | 
 |  |  |             } | 
 |  |  |             //如果补贴额度等于等于记录的剩余补贴额度 | 
 |  |  |             if(totalScore.compareTo(remarkNum) == 0){ | 
 |  |  |                 remarkNum = remarkNum.subtract(totalScore).setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |                 mallMoneyFlowMapper.updateRemarkAndIsReturnById(remarkNum.toString(),mallMoneyFlow.getId()); | 
 |  |  |  | 
 |  |  |                 //减少用户的贡献点 | 
 |  |  |                 String orderNo = mallMoneyFlow.getOrderNo(); | 
 |  |  |                 MallMoneyFlow mallMoneyFlowStar = mallMoneyFlowMapper.selectByOrderNoAndMemberId(orderNo,memberId,2); | 
 |  |  |                 BigDecimal amount = mallMoneyFlowStar.getAmount(); | 
 |  |  |                 mallMemberWalletMapper.reduceStarByMemberId(amount.intValue(), memberId); | 
 |  |  |                 //更新记录的返利状态为已返利 | 
 |  |  |                 mallMoneyFlowMapper.updateRemarkAndIsReturnById("0",mallMoneyFlowStar.getId()); | 
 |  |  |                 break; | 
 |  |  |             } | 
 |  |  |             //如果补贴额度大于记录的剩余补贴额度 | 
 |  |  |             if(totalScore.compareTo(remarkNum) > 0){ | 
 |  |  |                 mallMoneyFlowMapper.updateRemarkAndIsReturnById("0",mallMoneyFlow.getId()); | 
 |  |  |  | 
 |  |  |                 //减少用户的贡献点 | 
 |  |  |                 String orderNo = mallMoneyFlow.getOrderNo(); | 
 |  |  |                 MallMoneyFlow mallMoneyFlowStar = mallMoneyFlowMapper.selectByOrderNoAndMemberId(orderNo,memberId,2); | 
 |  |  |                 BigDecimal amount = mallMoneyFlowStar.getAmount(); | 
 |  |  |                 mallMemberWalletMapper.reduceStarByMemberId(amount.intValue(), memberId); | 
 |  |  |                 //更新记录的返利状态为已返利 | 
 |  |  |                 mallMoneyFlowMapper.updateRemarkAndIsReturnById("0",mallMoneyFlowStar.getId()); | 
 |  |  |                 totalScore = totalScore.subtract(remarkNum); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |