From 1bb96bab1185f2e1aa2f468266512ee0beb83286 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Wed, 12 Feb 2025 10:10:21 +0800 Subject: [PATCH] feat(mall): 实现 USDT 充值功能 --- src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 148 +++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 129 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 9091b6b..866d039 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,12 @@ 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; import cn.hutool.core.util.ObjectUtil; @@ -27,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; /** @@ -46,11 +38,16 @@ private final RunVipMapper runVipMapper; 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; } @@ -209,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; } @@ -256,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() @@ -269,19 +279,95 @@ 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); + } + + @Override + public void nodeUpMsg(Long memberId) { DataDictionaryCustom directCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.NODE_DIRECT_CNT.getType(), RunVipDataDictionaryEnum.NODE_DIRECT_CNT.getCode()); @@ -310,4 +396,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