From 74315c8cc145e30c33f2c2b3fd9074c446e6699c Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Mon, 03 Mar 2025 15:38:46 +0800 Subject: [PATCH] feat(mall): 添加会员列表页面 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 143 +++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 124 insertions(+), 19 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 a939650..a525983 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,20 +1,11 @@ package cc.mrbird.febs.mall.service.impl; -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.common.enumerates.*; +import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto; -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; -import cc.mrbird.febs.mall.mapper.RunVipMapper; -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.entity.*; +import cc.mrbird.febs.mall.mapper.*; +import cc.mrbird.febs.mall.service.*; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; @@ -28,8 +19,8 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.List; -import java.util.Set; +import java.math.RoundingMode; +import java.util.*; import java.util.stream.Collectors; /** @@ -48,11 +39,15 @@ private final IApiMallMemberWalletService walletService; private final IApiMallMemberService mallMemberService; private final AgentProducer agentProducer; + private final RunNodeSetMapper runNodeSetMapper; + private final AsyncService asyncService; + private final RunVipGrowMapper runVipGrowMapper; + private final IMallMoneyFlowService mallMoneyFlowService; @Override @Transactional(rollbackFor = Exception.class) public void autoUpAgentLevel(Long memberId) { - MallMember member = mallMemberMapper.selectById(memberId); + MallMember member =mallMemberMapper.selectById(memberId); if(StrUtil.isBlank(member.getReferrerIds())) { return; } @@ -211,11 +206,23 @@ // 获取会员信息 MallMember mallMember = mallMemberMapper.selectById(memberId); if (mallMember == null) { - throw new IllegalArgumentException("会员不存在"); + log.info("会员不存在"); + return; } // 已经是节点则跳过 if (YesOrNoEnum.YES.getValue() == mallMember.getDirector()) { + return; + } + + //节点不是最高等级不升级节点 + Optional<RunVip> max = runVipMapper.selectList(null).stream().max(Comparator.comparing(RunVip::getOrderNumber)); + RunVip maxRunVip = max.orElse(null); + if (maxRunVip == null) { + log.info("会员等级不存在"); + return; + } + if (!maxRunVip.getVipCode().equals(mallMember.getLevel())) { return; } @@ -258,6 +265,7 @@ new LambdaQueryWrapper<MallCharge>() .in(MallCharge::getMemberId, memberIds) .eq(MallCharge::getState, YesOrNoEnum.YES.getValue()) + .ge(MallCharge::getCreatedTime, mallMember.getDirectorTime()) ); BigDecimal totalCharge = mallCharges.stream() @@ -271,19 +279,92 @@ mallMember.setDirector(YesOrNoEnum.YES.getValue()); mallMember.setDirectorTime(DateUtil.date()); mallMemberMapper.updateById(mallMember); + + //获取节点设置 + List<RunNodeSet> runNodeSets = runNodeSetMapper.selectList(null); + //获取总业绩 + BigDecimal nodePercent = getNodePercent(runNodeSets, totalCharge); + if(nodePercent.compareTo(BigDecimal.ZERO) >= 0){ + asyncService.releaseNodeCoin(totalCharge,nodePercent,memberId); + } } catch (Exception e) { // 记录日志并处理异常 log.error("会员升级节点失败: {}", memberId, e); throw new RuntimeException("会员升级节点失败", e); } } + + private BigDecimal getNodePercent(List<RunNodeSet> runNodeSets, BigDecimal directAchieve) { + BigDecimal percent = BigDecimal.ZERO; + //获取directAchieve在runNodeSets中哪一个位置 + for(RunNodeSet item : runNodeSets){ + BigDecimal minAchieve = item.getMinAchieve(); + BigDecimal maxAchieve = item.getMaxAchieve(); + BigDecimal nodePercent = new BigDecimal(item.getNodePercent()); + if(directAchieve.compareTo(minAchieve) >= 0 && directAchieve.compareTo(maxAchieve) < 0){ + percent = nodePercent; + break; + } + } + return percent; + } @Override public void buyVipSuccessMsg(Long chargeId) { MallCharge mallCharge = mallChargeMapper.selectById(chargeId); - //更新会员的等级和会员升级的时间 + Long memberId = mallCharge.getMemberId(); String vipCode = mallCharge.getVipCode(); + + //判断mallCharge.getVipName()的最后两个字符是否等于“权益” + if("权益".equals(mallCharge.getVipName().substring(mallCharge.getVipName().length()-2,mallCharge.getVipName().length()))){ + MallMember mallMember = mallMemberMapper.selectById(memberId); + + RunVipGrow runVipGrow = runVipGrowMapper.selectOne( + new LambdaQueryWrapper<RunVipGrow>() + .eq(RunVipGrow::getMemberId, memberId) + .eq(RunVipGrow::getLevelNow, mallMember.getLevel()) + ); + BigDecimal amount = mallCharge.getAmount(); + //有升级权益的记录 + if(runVipGrow != null){ + //判断金额是否满足升级条件 + BigDecimal amountNow = runVipGrow.getAmountNow(); + BigDecimal amountAll = runVipGrow.getAmountAll(); + BigDecimal subtract = amountAll.subtract(amountNow); + + if(subtract.compareTo(amount) <= 0){ + runVipGrow.setAmountNow(amountAll); + }else{ + runVipGrow.setAmountNow(amountNow.add(amount).setScale(2, RoundingMode.DOWN)); + } + runVipGrow.setAmount(amount); + runVipGrowMapper.updateById(runVipGrow); + }else{ + List<RunVip> runVips = runVipMapper.selectList(null); + Map<String, RunVip> runVipMap = runVips.stream() + .collect(Collectors.toMap(RunVip::getVipCode, runVip -> runVip)); + + RunVip runVipNow = runVipMap.get(mallMember.getLevel()); + RunVip runVipNext = runVips.stream().filter(runVip -> runVip.getOrderNumber() == runVipNow.getOrderNumber() + 1).findFirst().orElse(null); + if(null != runVipNext){ + BigDecimal add = runVipNow.getPresentPrice().add(amount); + + runVipGrow = new RunVipGrow(); + runVipGrow.setMemberId(memberId); + runVipGrow.setLevelNow(mallMember.getLevel()); + runVipGrow.setLevelNext(runVipNext.getVipCode()); + runVipGrow.setAmountAll(runVipNext.getPresentPrice()); + runVipGrow.setAmount(add); + runVipGrow.setAmountNow(add); + runVipGrowMapper.insert(runVipGrow); + } + } + } + //更新会员的等级和会员升级的时间 mallMemberMapper.updateVipLevelTimeAndLevel(memberId,DateUtil.date(),vipCode); + + //直推权益 + asyncService.directCoin(mallCharge.getAmount(),memberId); agentProducer.sendNodeUpMsg(memberId); } @@ -318,4 +399,28 @@ MallMember graMember = mallMemberMapper.selectInfoByInviteId(parentMember.getReferrerId()); NodeUp(graMember.getId(),directCnt,teamCnt,achieveCnt); } + + @Override + public void chargeSuccessMsg(Long chargeId) { + + MallCharge mallCharge = mallChargeMapper.selectById(chargeId); + if(null == mallCharge){ + return; + } + Long memberId = mallCharge.getMemberId(); + BigDecimal amount = mallCharge.getAmount(); + + walletService.addCommission(amount, memberId); + String orderNo = MallUtils.getOrderNum("C"); + mallMoneyFlowService.runVipMoneyFlowAdd( + memberId, + memberId, + orderNo, + FlowTypeEnum.COMMISSION.getValue(), + RunVipMoneyFlowTypeEnum.COMMISSION_PAY_CHARGE.getValue(), + amount, + StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_PAY_CHARGE.getDescription(),amount), + YesOrNoEnum.YES.getValue() + ); + } } -- Gitblit v1.9.1