From ca4cfb6e80c47be9fcb3a3e1d4575cf2ed9f1f62 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Fri, 03 Jan 2025 22:38:36 +0800 Subject: [PATCH] fix(mall): 修复余额不足时的支付异常 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 107 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 94 insertions(+), 13 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..78135e0 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 @@ -4,14 +4,9 @@ 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.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.entity.*; +import cc.mrbird.febs.mall.mapper.*; +import cc.mrbird.febs.mall.service.AsyncService; import cc.mrbird.febs.mall.service.IAgentService; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; @@ -28,8 +23,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 +43,14 @@ private final IApiMallMemberWalletService walletService; private final IApiMallMemberService mallMemberService; private final AgentProducer agentProducer; + private final RunNodeSetMapper runNodeSetMapper; + private final AsyncService asyncService; + private final RunVipGrowMapper runVipGrowMapper; @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 +209,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 +268,7 @@ new LambdaQueryWrapper<MallCharge>() .in(MallCharge::getMemberId, memberIds) .eq(MallCharge::getState, YesOrNoEnum.YES.getValue()) + .ge(MallCharge::getCreatedTime, mallMember.getDirectorTime()) ); BigDecimal totalCharge = mallCharges.stream() @@ -271,18 +282,88 @@ 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); agentProducer.sendNodeUpMsg(memberId); -- Gitblit v1.9.1