xiaoyong931011
2023-04-06 ceb5d9d416cb0ea9bf8736a6f6aeb6281fd3a8c0
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,20 +1,15 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.PerkEnum;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.mall.entity.AgentInfo;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
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 cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import jdk.nashorn.internal.ir.IfNode;
@@ -29,6 +24,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @author wzy
@@ -41,9 +37,11 @@
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallMemberMapper memberMapper;
    private final MallOrderInfoMapper orderInfoMapper;
    private final IApiMallMemberWalletService memberWalletService;
    private final IApiMallMemberService memberService;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallOrderItemMapper mallOrderItemMapper;
    private final IApiMallMemberWalletService iApiMallMemberWalletService;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final MallMemberMapper mallMemberMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -68,11 +66,15 @@
            }
            AgentInfo agentInfo = JSONObject.parseObject(nextLevel.getValue(), AgentInfo.class);
            if (!orderCntFinish(parent, agentInfo)) {
            if (!directMemberCnt(parent, agentInfo)) {
                continue;
            }
            if (!agentCntFinish(parent, agentInfo)) {
                continue;
            }
            if (!teamIncome(parent, agentInfo)) {
                continue;
            }
@@ -82,22 +84,22 @@
    }
    /**
     * 判断用户直推下单数量或团队下单数量是否达标
     * 判断直推人数是否达标
     *
     * @param member
     * @return
     */
    private boolean orderCntFinish(MallMember member, AgentInfo agentInfo) {
        Integer cnt = 0;
        if (AgentInfo.ORDER_TYPE_DIRECT.equals(agentInfo.getOrderType())) {
            cnt = orderInfoMapper.selectCntDirect(member.getInviteId());
        } else {
            cnt = orderInfoMapper.selectCntDirectOrTeam(agentInfo.getOrderType(), member.getInviteId());
    private boolean directMemberCnt(MallMember member, AgentInfo agentInfo) {
        List<MallMember> childs = memberMapper.selectByRefererId(member.getInviteId());
        if (CollUtil.isEmpty(childs)) {
            return false;
        }
        if (cnt >= agentInfo.getOrderCnt()) {
        if (childs.size() >= agentInfo.getDirectCnt()) {
            return true;
        }
        log.info("用户{}订单未达标, 当前数量为:{},要求数量:{}, 当前等级为:{}", member.getPhone(), cnt, agentInfo.getOrderCnt(), member.getLevel());
        log.info("用户:{}直推数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), childs.size(), agentInfo.getLastAgentCnt());
        return false;
    }
@@ -107,7 +109,7 @@
     * @return
     */
    private boolean agentCntFinish(MallMember member, AgentInfo agentInfo) {
        if (agentInfo.getLastCnt() == null || agentInfo.getLastCnt() == 0) {
        if (agentInfo.getLastAgentCnt() == null || agentInfo.getLastAgentCnt() == 0) {
            return true;
        }
@@ -126,119 +128,141 @@
            }
        }
        if (i >= agentInfo.getLastCnt()) {
        if (i >= agentInfo.getLastAgentCnt()) {
            return true;
        }
        log.info("用户:{}代理数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), i, agentInfo.getLastCnt());
        log.info("用户:{}代理数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), i, agentInfo.getLastAgentCnt());
        return false;
    }
    /**
     * 团队业绩是否达标
     *
     * @param
     * @param agentInfo
     * @return
     */
    private boolean teamIncome(MallMember member, AgentInfo agentInfo) {
        BigDecimal totalIncome = memberMapper.selectAchieveByMemberId(member.getInviteId(), 2);
        BigDecimal targetIncome = agentInfo.getTeamIncome().multiply(new BigDecimal("10000"));
        if (totalIncome.compareTo(targetIncome) >= 0) {
            return true;
        }
        log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), totalIncome, targetIncome);
        return false;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void returnMoneyToAgent(Long orderId) {
        MallOrderInfo orderInfo = orderInfoMapper.selectById(orderId);
        MallMember member = memberMapper.selectById(orderInfo.getMemberId());
        if (StrUtil.isBlank(member.getReferrerIds())) {
        /**
         * 1、购买人获得固定比例的积分
         * 2、直推获取8%的现金->余额,4%的积分->积分
         * 3、不同代理级别获取不用的比例的现金和积分
         * 4、董事享受全公司入单分红2%加权(现金)
         * 5、合伙人享全公司入单分红5%加权(现金)
         */
        //获取当前订单子表信息
        List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectbyOrderId(orderId);
        if(CollUtil.isEmpty(mallOrderItemList)){
            return;
        }
        // 直推奖励
        directReturnMoney(member, orderInfo);
        // 团队奖励
        teamReturnMoney(member, orderInfo);
    }
    /**
     * 直推奖励
     * @param member
     */
    private void directReturnMoney(MallMember member, MallOrderInfo orderInfo) {
        MallMember parent = memberMapper.selectInfoByInviteId(member.getReferrerId());
        if (AgentLevelEnum.FIRST_LEVEL.name().equals(parent.getLevel()) || AgentLevelEnum.ZERO_LEVEL.name().equals(parent.getLevel())) {
        //获取订单中套餐的信息
        List<MallOrderItem> mallOrderItemIsTCs = mallOrderItemList.stream().filter(mallOrderItem -> mallOrderItem.getIsNormal() == 2).collect(Collectors.toList());
        if(CollUtil.isEmpty(mallOrderItemIsTCs)){
            return;
        }
        AgentInfo agentInfo = getAgentInfo(parent.getLevel());
        if (agentInfo == null) {
        //获取订单中套餐总数金额
        BigDecimal amountTC = mallOrderItemIsTCs.stream().map(MallOrderItem::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        if(BigDecimal.ZERO.compareTo(amountTC) >= 0){
            return;
        }
        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
        String orderNo = mallOrderInfo.getOrderNo();
        //购买人
        Long memberId = mallOrderInfo.getMemberId();
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        BigDecimal returnMoney = agentInfo.getDirectIncome().divide(BigDecimal.valueOf(100), 2,RoundingMode.DOWN).multiply(orderInfo.getAmount());
        memberWalletService.addBalance(returnMoney, parent.getId());
        memberService.addMoneyFlow(parent.getId(), returnMoney, MoneyFlowTypeEnum.BONUS.getValue(), orderInfo.getOrderNo(), null, null, orderInfo.getMemberId(), null);
    }
    /**
     * 团队奖励
     *
     */
    public void teamReturnMoney(MallMember member, MallOrderInfo orderInfo) {
        List<String> inviteIds = StrUtil.split(member.getReferrerIds(), ',');
        List<MallMember> agentList = memberMapper.selectMemberParentAgentList(inviteIds);
        if (CollUtil.isEmpty(agentList)) {
            return;
        /**
         * 1、购买人获得固定比例的积分
         *      = amountTC * 固定比例
         */
        DataDictionaryCustom buySetMealPerkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                PerkEnum.BUY_SET_MEAL_PERK_PERCENT.getType(),
                PerkEnum.BUY_SET_MEAL_PERK_PERCENT.getCode());
        if(ObjectUtil.isNotEmpty(buySetMealPerkPercentDic)){
            BigDecimal buySetMealPerkPercent = new BigDecimal(buySetMealPerkPercentDic.getValue() == null ? "0" : buySetMealPerkPercentDic.getValue());
            //购买人获得的积分数量
            BigDecimal buySetMealPerk = buySetMealPerkPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
            //增加积分
            iApiMallMemberWalletService.add(buySetMealPerk,memberId,"score");
            //增加一个获得积分的流水记录
            mallMoneyFlowService.addMoneyFlow(
                    memberId,
                    buySetMealPerk,
                    MoneyFlowTypeEnum.BUY_SET_MEAL_PERK.getValue(),
                    orderNo,
                    FlowTypeEnum.SCORE.getValue(),
                    AppContants.IS_RETURN_YES);
        }
        Map<String, Map<Long, BigDecimal>> needReturn = new HashMap<>();
        for (MallMember mallMember : agentList) {
            String level = mallMember.getLevel();
            Map<Long, BigDecimal> amount = needReturn.get(level);
            // 按照代理关系,返到第二级,平级奖
            if (amount == null) {
                amount = new HashMap<>();
                AgentInfo agentInfo = getAgentInfo(level);
                if (agentInfo == null) {
                    continue;
                }
                BigDecimal returnMoney;
                if (AgentInfo.TEAM_INCOME_TYPE_AMOUNT.equals(agentInfo.getTeamIncomeType())) {
                    returnMoney = agentInfo.getTeamIncome();
                } else {
                    returnMoney = agentInfo.getTeamIncome().divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN).multiply(orderInfo.getAmount());
                }
                amount.put(mallMember.getId(), returnMoney);
            } else {
                if (!AgentLevelEnum.SECOND_LEVEL.name().equals(mallMember.getLevel())) {
                    amount.put(mallMember.getId(), BigDecimal.ONE);
                }
        /**
         * 2、直推获取8%的现金->余额,4%的积分->积分
         */
        if(ObjectUtil.isNotEmpty(mallMember.getReferrerId())){
            String referrerId = mallMember.getReferrerId();
            MallMember mallMemberDirect = mallMemberMapper.selectInfoByInviteId(referrerId);
            Long directMemberId = mallMemberDirect.getId();
            DataDictionaryCustom directCashPerkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    PerkEnum.DIRECT_CASH_PERK_PERCENT.getType(),
                    PerkEnum.DIRECT_CASH_PERK_PERCENT.getCode());
            if(ObjectUtil.isNotEmpty(directCashPerkPercentDic)){
                BigDecimal directCashPerkPercent = new BigDecimal(directCashPerkPercentDic.getValue() == null ? "0" : directCashPerkPercentDic.getValue());
                //获得的现金数量
                BigDecimal directCashPerk = directCashPerkPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
                //增加余额
                iApiMallMemberWalletService.add(directCashPerk,directMemberId,"balance");
                //增加一个获得现金的流水记录
                mallMoneyFlowService.addMoneyFlow(
                        directMemberId,
                        directCashPerk,
                        MoneyFlowTypeEnum.DIRECT_CASH_PERK.getValue(),
                        orderNo,
                        FlowTypeEnum.BALANCE.getValue(),
                        AppContants.IS_RETURN_YES);
            }
            // 代理两级
            if (amount.size() > 2) {
                continue;
            }
            needReturn.put(level, amount);
        }
        if(needReturn.isEmpty()) {
           return;
        }
        for (Map.Entry<String, Map<Long, BigDecimal>> entry : needReturn.entrySet()) {
            for (Map.Entry<Long, BigDecimal> amount : entry.getValue().entrySet()) {
                memberWalletService.addBalance(amount.getValue(), amount.getKey());
                memberService.addMoneyFlow(amount.getKey(), amount.getValue(), MoneyFlowTypeEnum.ACHIEVE.getValue(), orderInfo.getOrderNo(), null, null, orderInfo.getMemberId(), null);
            DataDictionaryCustom directScorePerkPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    PerkEnum.DIRECT_SCORE_PERK_PERCENT.getType(),
                    PerkEnum.DIRECT_SCORE_PERK_PERCENT.getCode());
            if(ObjectUtil.isNotEmpty(directScorePerkPercentDic)){
                BigDecimal directScorePerkPercent = new BigDecimal(directScorePerkPercentDic.getValue() == null ? "0" : directScorePerkPercentDic.getValue());
                //获得的积分数量
                BigDecimal directScorePerk = directScorePerkPercent.multiply(AppContants.PERCENTAGE).multiply(amountTC).setScale(2, BigDecimal.ROUND_DOWN);
                //增加余额
                iApiMallMemberWalletService.add(directScorePerk,directMemberId,"score");
                //增加一个获得积分的流水记录
                mallMoneyFlowService.addMoneyFlow(
                        directMemberId,
                        directScorePerk,
                        MoneyFlowTypeEnum.DIRECT_SCORE_PERK.getValue(),
                        orderNo,
                        FlowTypeEnum.SCORE.getValue(),
                        AppContants.IS_RETURN_YES);
            }
        }
        /**
         * 4、董事享受全公司入单分红2%加权(现金)
         */
//        mallMemberMapper.selectMemberWithLevel()
    }
    private AgentInfo getAgentInfo(String level) {
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL_REQUIRE, level);
        if (dic == null) {
            log.info("当前用户父级等级:{}", level);
            return null;
        }
        return JSONObject.parseObject(dic.getValue(), AgentInfo.class);
    }
    @Override
    public void rankReturnMoney(Long orderId) {