xiaoyong931011
2022-12-21 53cbc2537b9b0f13a572cf7d78964ab4d884b129
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,19 +1,14 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.*;
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.entity.*;
import cc.mrbird.febs.mall.mapper.*;
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.service.IMallAchieveService;
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 cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import jdk.nashorn.internal.ir.IfNode;
import lombok.RequiredArgsConstructor;
@@ -39,6 +34,9 @@
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallMemberMapper memberMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final IApiMallMemberWalletService memberWalletService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -136,7 +134,6 @@
    /**
     * 团队业绩是否达标
     *
     * @param mallMember
     * @param agentInfo
     * @return
     */
@@ -161,4 +158,238 @@
    public void rankReturnMoney(Long orderId) {
    }
    @Override
    @Transactional
    public void directReward(Long directRewardId) {
        log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息,ID:{}", directRewardId);
        //获取订单信息
        MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(directRewardId);
        if(ObjectUtil.isEmpty(orderInfo)){
            return;
        }
        Integer status = orderInfo.getStatus();
        if(OrderStatusEnum.FINISH.getValue() != status){
            return;
        }
        //下单补贴金额
        BigDecimal subsidyAmount = orderInfo.getSubsidyAmount();
        //下单人
        Long memberId = orderInfo.getMemberId();
        MallMember mallMember = memberMapper.selectById(memberId);
        /**
         * 生成补贴的流水记录
         *  1、待生效
         *  2、返利对象,下单人
         *  3、金额,补贴金额
         */
        Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow(
                mallMember.getId(),
                orderInfo.getOrderNo(),
                subsidyAmount.setScale(2, BigDecimal.ROUND_DOWN),
                MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getCode(),
                MallMoneyFlow.STATUS_SUCCESS,
                MallMoneyFlow.IS_RETURN_Y,
                mallMember.getId(),
                FlowTypeEnum.BALANCE.getValue(),
                MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getName()
        );
        memberWalletService.addBalance(subsidyAmount.setScale(2, BigDecimal.ROUND_DOWN),mallMember.getId());
        /**
         * 生成直推返利的流水记录
         *  1、待生效
         *  2、返利对象:下单人的直推上级
         *  3、金额:返利比例乘以补贴金额
         */
        //下单人的直推上级
        MallMember mallMemberOne = memberMapper.selectInfoByInviteId(mallMember.getReferrerId());
        DataDictionaryCustom rewardPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.REWARD_PERCENT.getType(),
                DataDictionaryEnum.REWARD_PERCENT.getCode()
        );
        BigDecimal rewardPercent = new BigDecimal(rewardPercentDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN);
        BigDecimal directRewardAmount = subsidyAmount.multiply(rewardPercent).setScale(2, BigDecimal.ROUND_DOWN);
        Long marketSubsidyFlowId = mallMoneyFlowService.addMoneyFlow(
                mallMember.getId(),
                orderInfo.getOrderNo(),
                directRewardAmount,
                MallMoneyFlowTypeEnum.DIRECT_REWARD.getCode(),
                MallMoneyFlow.STATUS_SUCCESS,
                MallMoneyFlow.IS_RETURN_Y,
                mallMemberOne.getId(),
                FlowTypeEnum.BALANCE.getValue(),
                MallMoneyFlowTypeEnum.DIRECT_REWARD.getName()
        );
        memberWalletService.addBalance(directRewardAmount,mallMemberOne.getId());
        /**
         * 生成分享奖励的流水记录
         *  1、待生效
         *  2、返利对象:下单人的直推上级 10%,直推的直推 5%
         *  3、金额:补贴金额乘以分享奖励的比例
         */
        DataDictionaryCustom shareOneDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.LEVEL_ONE.getType(),
                DataDictionaryEnum.LEVEL_ONE.getCode()
        );
        BigDecimal shareOne = new BigDecimal(shareOneDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN);
        BigDecimal shareOneAmount = subsidyAmount.multiply(shareOne).setScale(2, BigDecimal.ROUND_DOWN);
        Long ShareOneFlowId = mallMoneyFlowService.addMoneyFlow(
                mallMember.getId(),
                orderInfo.getOrderNo(),
                shareOneAmount,
                MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getCode(),
                MallMoneyFlow.STATUS_SUCCESS,
                MallMoneyFlow.IS_RETURN_Y,
                mallMemberOne.getId(),
                FlowTypeEnum.BALANCE.getValue(),
                MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getName()
        );
        memberWalletService.addBalance(shareOneAmount,mallMemberOne.getId());
        //下单人的直推上级的直推
        MallMember mallMemberTwo = memberMapper.selectInfoByInviteId(mallMemberOne.getReferrerId());
        if(ObjectUtil.isNotEmpty(mallMemberTwo)){
            DataDictionaryCustom shareTwoDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.LEVEL_TWO.getType(),
                    DataDictionaryEnum.LEVEL_TWO.getCode()
            );
            BigDecimal shareTwo = new BigDecimal(shareTwoDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN);
            BigDecimal shareTwoAmount = subsidyAmount.multiply(shareTwo).setScale(2, BigDecimal.ROUND_DOWN);
            Long shareTwoFlowId = mallMoneyFlowService.addMoneyFlow(
                    mallMember.getId(),
                    orderInfo.getOrderNo(),
                    shareTwoAmount,
                    MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getCode(),
                    MallMoneyFlow.STATUS_SUCCESS,
                    MallMoneyFlow.IS_RETURN_Y,
                    mallMemberTwo.getId(),
                    FlowTypeEnum.BALANCE.getValue(),
                    MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getName()
            );
            memberWalletService.addBalance(shareTwoAmount,mallMemberTwo.getId());
        }
        /**
         * 团队管理补贴
         */
        //下单人所有的上级
        String referrerIds = mallMember.getReferrerIds();
        List<String> refererIdList = StrUtil.split(referrerIds, ",", -1, true, true);
        //下单人所有符合条件的上级-邀请码
        ArrayList<String> refererIdListUp = new ArrayList<>();
        //初始级别即当前下单人的级别
        String levelStart = mallMember.getLevel();
        for(String inviteId : refererIdList){
            MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId);
            String levelUp = mallMemberUp.getLevel();
            //团队补贴从区代开始
            if(!MemberAgentLevelEnum.AGENT.getName().equals(levelUp)){
                //比较两个代理级别,同级别或者大于下单人的级别都保留
                int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp,levelStart);
                if(0 < compareLevel){
                    levelStart = levelUp;
                    refererIdListUp.add(inviteId);
                }
            }
        }
        if(CollUtil.isNotEmpty(refererIdListUp)){
            for(String inviteId : refererIdList){
                MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId);
                String levelUp = mallMemberUp.getLevel();
                //获取团队分享比例
                BigDecimal manageSubsidyPercent = getManageSubsidyPercent(levelStart, levelUp);
                if(manageSubsidyPercent.compareTo(BigDecimal.ZERO) > 0){
                    BigDecimal teamManageAmount = subsidyAmount.multiply(manageSubsidyPercent).setScale(2, BigDecimal.ROUND_DOWN);
                    //生成团队分享流水
                    Long teamManageFlowId = mallMoneyFlowService.addMoneyFlow(
                            mallMember.getId(),
                            orderInfo.getOrderNo(),
                            teamManageAmount,
                            MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getCode(),
                            MallMoneyFlow.STATUS_SUCCESS,
                            MallMoneyFlow.IS_RETURN_Y,
                            mallMemberUp.getId(),
                            FlowTypeEnum.BALANCE.getValue(),
                            MallMoneyFlowTypeEnum.TEAM_REWARD.getName()
                    );
                    memberWalletService.addBalance(teamManageAmount,mallMemberUp.getId());
                }
                levelStart = levelUp;
            }
        }
    }
    /**
     * 根据传入的两个级别,比较之后获取对应的团队管理奖励比例
     * @param levelStart
     * @param levelUp
     * @return
     */
    private BigDecimal getManageSubsidyPercent(String levelStart,String levelUp){
        BigDecimal manageSubsidyPercent = BigDecimal.ZERO;
        String agentCodeStart = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelStart);
        String agentCodeUp = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelUp);
        int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp, levelStart);
        //如果是平级
        if(compareLevel == 2){
            manageSubsidyPercent = getDicSubsidyPercent(agentCodeStart);
        }
        //如果不是平级
        if(compareLevel == 1){
            //1、初始级别不能是会员
            //2、当前级别的上一个级别是否是levelStart,
            // 满足,需要减去levelStart的团队管理奖励
            String minLevel = MemberAgentLevelEnum.AGENT_ONE.minLevel(agentCodeUp);
            if(levelStart.equals(minLevel)
                    && MemberAgentLevelEnum.AGENT.getName() != levelStart){
                BigDecimal dicManageSubsidyPercentUp = getDicManageSubsidyPercent(agentCodeUp);
                BigDecimal dicManageSubsidyPercentStart = getDicManageSubsidyPercent(agentCodeStart);
                manageSubsidyPercent = dicManageSubsidyPercentUp.subtract(dicManageSubsidyPercentStart);
            }else{
                manageSubsidyPercent = getDicManageSubsidyPercent(agentCodeUp);
            }
        }
        return manageSubsidyPercent;
    }
    /**
     * 获取对应的团队管理奖励比例
     * @param agentCode
     * @return
     */
    private BigDecimal getDicManageSubsidyPercent(String agentCode){
        BigDecimal manageSubsidyPercent = BigDecimal.ZERO;
        DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.AGENT_ONE.getType(),
                agentCode
        );
        cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue());
        String manageSubsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString();
        manageSubsidyPercent =  new BigDecimal(manageSubsidyPercentStr)
                .multiply(new BigDecimal(0.01))
                .setScale(2,BigDecimal.ROUND_DOWN);
        return manageSubsidyPercent;
    }
    /**
     * 获取对应的平级团队管理奖励比例
     * @param agentCode
     * @return
     */
    private BigDecimal getDicSubsidyPercent(String agentCode){
        BigDecimal subsidyPercent = BigDecimal.ZERO;
        DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.AGENT_ONE.getType(),
                agentCode
        );
        cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue());
        String subsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString();
        subsidyPercent =  new BigDecimal(subsidyPercentStr)
                .multiply(new BigDecimal(0.01))
                .setScale(2,BigDecimal.ROUND_DOWN);
        return subsidyPercent;
    }
}