| | |
| | | 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())) { |
| | | if (MemberLevelEnum.ZERO_LEVEL.getType().equals(member.getLevel())) { |
| | | 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; |
| | | } |
| | | MatrixTree tree = MatrixTree.getInstance(); |
| | | MemberNode node = tree.getNode(member.getInviteId()); |
| | | if (node != null) { |
| | | return; |
| | | } |
| | | |
| | | DataDictionaryCustom nextLevelDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode("AGENT_LEVEL_REQUIRE", nextLevel); |
| | | AgentInfo agentInfo = JSONObject.parseObject(nextLevelDic.getValue(), AgentInfo.class); |
| | | if (!directMemberCnt(parent, agentInfo)) { |
| | | continue; |
| | | } |
| | | MatrixTreeNode matrixTreeNode = matrixTreeNodeMapper.selectByTreeNode(memberId); |
| | | if (matrixTreeNode != null) { |
| | | return; |
| | | } |
| | | |
| | | if (!agentCntFinish(parent, agentInfo)) { |
| | | continue; |
| | | } |
| | | node = new MemberNode(); |
| | | node.setInviteId(member.getInviteId()); |
| | | node.setPhone(member.getPhone()); |
| | | node.setRefererId(member.getReferrerId()); |
| | | node.setMemberId(member.getId()); |
| | | MemberNode parentNode = tree.addNode(node); |
| | | |
| | | if (!teamIncome(parent, agentInfo)) { |
| | | continue; |
| | | } |
| | | matrixTreeNode = new MatrixTreeNode(); |
| | | matrixTreeNode.setTreeNode(memberId); |
| | | matrixTreeNode.setParentNode(parentNode == null ? null : parentNode.getMemberId()); |
| | | matrixTreeNodeMapper.insert(matrixTreeNode); |
| | | |
| | | parent.setLevel(nextLevel); |
| | | memberMapper.updateById(parent); |
| | | if (parentNode == null) { |
| | | return; |
| | | } |
| | | |
| | | 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()); |
| | | int levelCode = MemberLevelEnum.getLevelCode(parentMember.getLevel()); |
| | | if (Integer.parseInt(dic.getValue()) > levelCode) { |
| | | parentMember.setChildNodeCnt(parentNode.CHILD.size()); |
| | | parentMember.setLevel(dic.getCode()); |
| | | memberMapper.updateById(parentMember); |
| | | } |
| | | } |
| | | |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void perkMoneyConsumer(long orderId) { |
| | | long start = System.currentTimeMillis(); |
| | | MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId); |
| | | if(ObjectUtil.isEmpty(mallOrderInfo)){ |
| | | return; |
| | | } |
| | | if(2 != mallOrderInfo.getStatus()){ |
| | | return; |
| | | } |
| | | /** |
| | | * 分享补贴 直推消费额10% |
| | | */ |
| | | BigDecimal amount = mallOrderInfo.getAmount().subtract(mallOrderInfo.getScoreAmount()); |
| | | |
| | | Long memberId = mallOrderInfo.getMemberId(); |
| | | MallMember mallMember = memberMapper.selectById(memberId); |
| | | //补贴对象 直属上级 |
| | | MallMember mallMemberUp = memberMapper.selectInfoByInviteId(mallMember.getReferrerId()); |
| | | if(ObjectUtil.isNotEmpty(mallMemberUp)){ |
| | | //分享补贴百分比 |
| | | DataDictionaryCustom sharePerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.SHARE_PERK.getType(), |
| | | DataDictionaryEnum.SHARE_PERK.getCode()); |
| | | String sharePerk = ObjectUtil.isEmpty(sharePerkDic.getValue()) ? "0" : sharePerkDic.getValue(); |
| | | BigDecimal sharePerkPercent = new BigDecimal(sharePerk).abs().divide(new BigDecimal(100)); |
| | | //分享补贴金额 |
| | | BigDecimal sharePerkAmount = amount.multiply(sharePerkPercent).setScale(2, BigDecimal.ROUND_DOWN);; |
| | | |
| | | //所有合伙人补贴至消费礼包的三倍额度需要复购一次。 |
| | | MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberUp.getId()); |
| | | BigDecimal totalScore = mallMemberWallet.getTotalScore(); |
| | | if(totalScore.compareTo(sharePerkAmount) < 0){ |
| | | sharePerkAmount = totalScore; |
| | | } |
| | | if(BigDecimal.ZERO.compareTo(sharePerkAmount) < 0){ |
| | | //减少补贴额度 |
| | | mallMemberWalletMapper.reduceTotalScoreById(sharePerkAmount, mallMemberWallet.getId()); |
| | | |
| | | reduceStar(mallMemberUp.getId(),sharePerkAmount); |
| | | |
| | | mallMemberWalletMapper.addBalanceById(sharePerkAmount, mallMemberWallet.getId()); |
| | | |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | mallMemberUp.getId(), |
| | | sharePerkAmount, |
| | | MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), |
| | | mallOrderInfo.getOrderNo(), |
| | | "直推奖", |
| | | "补贴额度:"+totalScore, |
| | | memberId, |
| | | 2, |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | 1); |
| | | } |
| | | } |
| | | /** |
| | | * 星级奖励 |
| | | * 从最顶级级别的合伙人开始补贴 |
| | | * 补贴完,把已经补贴的合伙人加入下一个级别 |
| | | */ |
| | | List<MallMember> sevenLevelRecord = getStarRecord(null, MemberLevelEnum.SEVEN_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SEVEN.getValue()); |
| | | List<MallMember> sixLevelRecord = getStarRecord(sevenLevelRecord, MemberLevelEnum.SIX_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_SIX.getValue()); |
| | | List<MallMember> fifthLevelRecord = getStarRecord(sixLevelRecord, MemberLevelEnum.FIFTH_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FIVE.getValue()); |
| | | List<MallMember> fourLevelRecord = getStarRecord(fifthLevelRecord, MemberLevelEnum.FOUR_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_FOUR.getValue()); |
| | | List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord, MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue()); |
| | | List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord, MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue()); |
| | | |
| | | /** |
| | | * 团队补贴 |
| | | */ |
| | | //团队补贴百分比 |
| | | DataDictionaryCustom teamPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.TEAM_PERK.getType(), |
| | | DataDictionaryEnum.TEAM_PERK.getCode()); |
| | | String teamPerk = ObjectUtil.isEmpty(teamPerkDic.getValue()) ? "0" : teamPerkDic.getValue(); |
| | | BigDecimal teamPerkPercent = new BigDecimal(teamPerk).abs().divide(new BigDecimal(100)); |
| | | //分享补贴金额 |
| | | BigDecimal teamPerkAmount = amount.multiply(teamPerkPercent); |
| | | //团队补贴对象 |
| | | List<MallMember> mallMemberTeamPerkList = mallMemberTeamPerkListInfo(memberId); |
| | | if(CollUtil.isNotEmpty(mallMemberTeamPerkList)){ |
| | | List<Long> mallMemberTeamPerkIds = mallMemberTeamPerkList.stream().map(MallMember::getId).collect(Collectors.toList()); |
| | | List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMemberTeamPerkIds); |
| | | flowTotalScoreBalance( |
| | | mallMemberWallets, |
| | | teamPerkAmount, |
| | | MoneyFlowTypeEnum.TEAM_PERK.getValue(), |
| | | mallOrderInfo.getOrderNo(), |
| | | memberId |
| | | ); |
| | | } |
| | | |
| | | 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(); |