KKSU
2025-01-03 d3b5f1f6ac64af873ba200534d39bd31709a1a28
feat(mall): 增加会员升级权益功能

- 新增会员升级权益判断逻辑
- 实现会员升级金额累计和判断
- 优化会员等级更新流程
- 修复直系会员升级逻辑问题
2 files modified
58 ■■■■ changed files
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 54 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -23,10 +23,8 @@
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -47,6 +45,7 @@
    private final AgentProducer agentProducer;
    private final RunNodeSetMapper runNodeSetMapper;
    private final AsyncService asyncService;
    private final RunVipGrowMapper runVipGrowMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -315,9 +314,54 @@
    @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){
                    runVipGrow = new RunVipGrow();
                    runVipGrow.setMemberId(memberId);
                    runVipGrow.setLevelNow(mallMember.getLevel());
                    runVipGrow.setLevelNext(runVipNext.getVipCode());
                    runVipGrow.setAmountAll(runVipNext.getPresentPrice());
                    runVipGrow.setAmount(amount);
                    runVipGrow.setAmountNow(amount);
                    runVipGrowMapper.insert(runVipGrow);
                }
            }
        }
        //更新会员的等级和会员升级的时间
        mallMemberMapper.updateVipLevelTimeAndLevel(memberId,DateUtil.date(),vipCode);
        agentProducer.sendNodeUpMsg(memberId);
src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java
@@ -661,8 +661,8 @@
                mallCharge.setVipCode(runVipGrow.getLevelNext());
            }
        }else{
            if(runVipGrow.getAmountAll().compareTo(amount) <= 0){
                mallCharge.setVipCode(runVipGrow.getLevelNext());
            if(runVipNext.getPresentPrice().compareTo(amount) <= 0){
                mallCharge.setVipCode(runVipNext.getVipCode());
            }
        }