Administrator
2025-05-19 9b51a95fa8bc9b3a86108c6900e17fc55f8db467
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,9 +1,17 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IAgentService;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
/**
 * @author wzy
@@ -14,13 +22,117 @@
@RequiredArgsConstructor
public class AgentServiceImpl implements IAgentService {
    @Override
    public void autoUpAgentLevel() {
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallMemberMapper memberMapper;
    private final HappySaleLevelMapper happySaleLevelMapper;
    /**
     * 自动升级代理等级
     * 根据会员的当前状态和业绩,自动为其升级到下一个代理等级
     * @param memberId 会员ID,用于识别需要升级的会员
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoUpAgentLevel(Long memberId) {
        // 根据会员ID查询会员信息
        MallMember member = memberMapper.selectById(memberId);
        // 检查会员账户状态和类型,只有在启用状态和普通类型时才进行升级操作
        if(MallMember.ACCOUNT_STATUS_ENABLE != member.getAccountStatus()
                || MallMember.ACCOUNT_TYPE_NORMAL != member.getAccountType() ){
            return;
        }
        // 获取会员当前的店铺主人等级
        Integer storeMaster = member.getStoreMaster();
        // 下一个分销等级
        storeMaster =storeMaster +1;
        // 根据新的店铺主人等级查询对应的快乐销售等级信息
        HappySaleLevel happySaleLevel = happySaleLevelMapper.selectOne(
                new LambdaQueryWrapper<HappySaleLevel>()
                        .eq(HappySaleLevel::getCode, storeMaster)
        );
        // 如果没有找到对应的快乐销售等级信息,则记录日志并返回
        if (happySaleLevel == null) {
            log.info("当前等级无下级");
            return;
        }
        // 检查直推会员数量是否达到要求
        if (!directMemberCnt(member, happySaleLevel.getDirectCnt())) {
            return;
        }
        // 检查团队人数是否达到要求
        if (!teamCntFinish(member, happySaleLevel.getTeamCnt())) {
            return;
        }
        // 检查团队业绩是否达到要求
        if (!teamIncome(member, happySaleLevel.getTeamAmount())) {
            return;
        }
        // 更新会员的店铺主人等级
        member.setStoreMaster(storeMaster);
        // 更新会员信息
        memberMapper.updateById(member);
    }
    /**
     * 判断直推人数是否达标
     */
    private boolean directMemberCnt(MallMember member, Integer directCnt) {
        List<MallMember> childList = memberMapper.selectByRefererId(member.getInviteId());
        if (CollUtil.isEmpty(childList)) {
            return false;
        }
        if (childList.size() >= directCnt) {
            return true;
        }
        log.info("用户:{}直推数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getStoreMaster(), childList.size(), directCnt);
        return false;
    }
    /**
     * 判断团队数量是否达标
     */
    private boolean teamCntFinish(MallMember member, Integer teamCnt) {
        // 直推用户
        List<MallMember> teamMember = memberMapper.selectAllChildAgentListByInviteId(member.getInviteId());
        if (CollUtil.isEmpty(teamMember)) {
            return false;
        }
        if (teamMember.size() >= teamCnt) {
            return true;
        }
        log.info("用户:{}团队数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getStoreMaster(), teamMember.size(), teamCnt);
        return false;
    }
    /**
     * 团队业绩是否达标
     */
    private boolean teamIncome(MallMember member, BigDecimal teamAmount) {
        BigDecimal totalIncome = memberMapper.selectAchieveByMemberId(member.getInviteId(), 2);
        if(totalIncome.compareTo(teamAmount) >= 0){
            return true;
        }
        log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前业绩:{}, 目标业绩:{}", member.getPhone(), member.getStoreMaster(), totalIncome, teamAmount);
        return false;
    }
    @Override
    public void returnMoneyToAgent() {
    @Transactional(rollbackFor = Exception.class)
    public void returnMoneyToAgent(Long orderId) {
    }
    @Override
    public void rankReturnMoney(Long orderId) {
    }
}