From 8d326b853cd3f2d2ca5f9a70b343389da63d9af6 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Mon, 23 Dec 2024 18:00:00 +0800 Subject: [PATCH] feat(mall): 新增节点规则功能 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 171 ++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 110 insertions(+), 61 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 ee71133..9091b6b 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,9 +1,13 @@ package cc.mrbird.febs.mall.service.impl; -import cc.mrbird.febs.common.enumerates.*; -import cc.mrbird.febs.common.utils.MallUtils; +import cc.mrbird.febs.common.enumerates.AgentLevelEnum; +import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum; +import cc.mrbird.febs.common.enumerates.YesOrNoEnum; import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto; -import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.entity.AgentInfo; +import cc.mrbird.febs.mall.entity.DataDictionaryCustom; +import cc.mrbird.febs.mall.entity.MallCharge; +import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.mapper.MallChargeMapper; import cc.mrbird.febs.mall.mapper.MallMemberMapper; @@ -12,7 +16,6 @@ import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; 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; @@ -24,8 +27,9 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * @author wzy @@ -192,73 +196,118 @@ mallChargeMapper.updateById(mallCharge); } + /** + * 购买会员看你的上级和上上级是否满足升级节点的条件 + * 直推 10人 + * 团队 50人 + * 团队总业绩 10000 + * 满足以上三个条件 + * 更新升级节点的时间 + */ + private void NodeUp(Long memberId,Integer directCnt,Integer teamCnt,BigDecimal achieveCnt){ + try { + // 获取会员信息 + MallMember mallMember = mallMemberMapper.selectById(memberId); + if (mallMember == null) { + throw new IllegalArgumentException("会员不存在"); + } + + // 已经是节点则跳过 + if (YesOrNoEnum.YES.getValue() == mallMember.getDirector()) { + return; + } + + // 获取直推成员和团队成员 + List<MallMember> allMembers = mallMemberMapper.selectList( + new LambdaQueryWrapper<MallMember>() + .eq(MallMember::getReferrerId, mallMember.getInviteId()) + .or() + .in(MallMember::getReferrerId, mallMemberMapper.selectList( + new LambdaQueryWrapper<MallMember>() + .eq(MallMember::getReferrerId, mallMember.getInviteId()) + ).stream() + .map(MallMember::getInviteId) + .collect(Collectors.toSet())) + ); + + if (allMembers == null || allMembers.isEmpty()) { + return; + } + + // 检查直推人数 + long directCount = allMembers.stream() + .filter(member -> mallMember.getInviteId().equals(member.getReferrerId())) + .count(); + if (directCount < directCnt) { + return; + } + + // 检查团队人数 + if (allMembers.size() < teamCnt) { + return; + } + + // 获取团队业绩(不包含本人业绩) + Set<Long> memberIds = allMembers.stream() + .map(MallMember::getId) + .collect(Collectors.toSet()); + + List<MallCharge> mallCharges = mallChargeMapper.selectList( + new LambdaQueryWrapper<MallCharge>() + .in(MallCharge::getMemberId, memberIds) + .eq(MallCharge::getState, YesOrNoEnum.YES.getValue()) + ); + + BigDecimal totalCharge = mallCharges.stream() + .map(MallCharge::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + if (totalCharge.compareTo(achieveCnt) < 0) { + return; + } + + mallMember.setDirector(YesOrNoEnum.YES.getValue()); + mallMember.setDirectorTime(DateUtil.date()); + mallMemberMapper.updateById(mallMember); + } catch (Exception e) { + // 记录日志并处理异常 + log.error("会员升级节点失败: {}", memberId, e); + throw new RuntimeException("会员升级节点失败", e); + } + } @Override public void buyVipSuccessMsg(Long chargeId) { MallCharge mallCharge = mallChargeMapper.selectById(chargeId); - //更新会员的等级和过期时间 + //更新会员的等级和会员升级的时间 Long memberId = mallCharge.getMemberId(); String vipCode = mallCharge.getVipCode(); - DateTime dateTime = DateUtil.offsetMonth(DateUtil.date(), 1); - mallMemberMapper.updateVipLevelTimeAndLevel(memberId,dateTime,vipCode); + mallMemberMapper.updateVipLevelTimeAndLevel(memberId,DateUtil.date(),vipCode); + DataDictionaryCustom directCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + RunVipDataDictionaryEnum.NODE_DIRECT_CNT.getType(), + RunVipDataDictionaryEnum.NODE_DIRECT_CNT.getCode()); + Integer directCnt = Integer.parseInt(directCntDic.getValue()); + DataDictionaryCustom teamCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + RunVipDataDictionaryEnum.NODE_TEAM_CNT.getType(), + RunVipDataDictionaryEnum.NODE_TEAM_CNT.getCode()); + Integer teamCnt = Integer.parseInt(teamCntDic.getValue()); + DataDictionaryCustom achieveCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + RunVipDataDictionaryEnum.NODE_ACHIEVE_CNT.getType(), + RunVipDataDictionaryEnum.NODE_ACHIEVE_CNT.getCode()); + BigDecimal achieveCnt = new BigDecimal(achieveCntDic.getValue()); - //购买成功后,是否返利上级 MallMember mallMember = mallMemberMapper.selectById(memberId); - if(null == mallMember.getReferrerId()){ + if(StrUtil.isEmpty(mallMember.getReferrerId())){ return; } + //上级 + MallMember parentMember = mallMemberMapper.selectInfoByInviteId(mallMember.getReferrerId()); + NodeUp(parentMember.getId(),directCnt,teamCnt,achieveCnt); - RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, vipCode)); - BigDecimal rebatePercent = runVip.getRebatePercent(); - BigDecimal amount = mallCharge.getAmount(); - BigDecimal rebateAmount = amount.multiply(rebatePercent).setScale(2, RoundingMode.DOWN); - BigDecimal balanceToCoin = - new BigDecimal( - dataDictionaryCustomMapper.selectDicDataByTypeAndCode( - RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(), - RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode() - ).getValue() - ); - BigDecimal rebateCoin = rebateAmount.divide(balanceToCoin, 2, RoundingMode.DOWN); - if(BigDecimal.ZERO.compareTo(rebateCoin) >= 0){ + if(StrUtil.isEmpty(parentMember.getReferrerId())){ return; } - MallMember parent = mallMemberMapper.selectInfoByInviteId(mallMember.getReferrerId()); - if(null == parent){ - return; - } - String orderNo = MallUtils.getOrderNum("FL"); - if(null != parent.getReferrerId()){ - BigDecimal rebateCoinGrandpa = rebateCoin.multiply(rebatePercent).setScale(2, RoundingMode.DOWN); - MallMember grandpa = mallMemberMapper.selectInfoByInviteId(parent.getReferrerId()); - if(null != grandpa){ - if(BigDecimal.ZERO.compareTo(rebateCoinGrandpa) < 0){ - //返利给上上级 - walletService.addBalance(rebateCoinGrandpa,grandpa.getId()); - mallMemberService.runVipMoneyFlowAdd( - grandpa.getId(), - mallMember.getId(), - orderNo, - FlowTypeEnum.BALANCE.getValue(), - RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getValue(), - rebateCoinGrandpa, - StrUtil.format(RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getDescription(),mallMember.getPhone(),runVip.getVipName(),rebateCoinGrandpa), - YesOrNoEnum.YES.getValue() - ); - rebateCoin = rebateCoin.subtract(rebateCoinGrandpa).setScale(2, RoundingMode.DOWN); - } - } - } - //返利给上级 - walletService.addBalance(rebateCoin,parent.getId()); - mallMemberService.runVipMoneyFlowAdd( - parent.getId(), - mallMember.getId(), - orderNo, - FlowTypeEnum.BALANCE.getValue(), - RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getValue(), - rebateCoin, - StrUtil.format(RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getDescription(),mallMember.getPhone(),runVip.getVipName(),rebateCoin), - YesOrNoEnum.YES.getValue() - ); + //上上级 + MallMember graMember = mallMemberMapper.selectInfoByInviteId(parentMember.getReferrerId()); + NodeUp(graMember.getId(),directCnt,teamCnt,achieveCnt); } } -- Gitblit v1.9.1