xiaoyong931011
2023-01-09 615b4cba39cc01756d7c0299204cc6ecaf172be5
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,254 @@
    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(4, 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(4, BigDecimal.ROUND_DOWN),mallMember.getId());
        memberWalletService.add(subsidyAmount.setScale(4, BigDecimal.ROUND_DOWN), mallMember.getId(), "balance");
        /**
         * 生成直推返利的流水记录
         *  1、待生效
         *  2、返利对象:下单人的直推上级
         *  3、金额:返利比例乘以补贴金额
         */
        /**
         * 生成分享奖励的流水记录
         *  1、待生效
         *  2、返利对象:下单人的直推上级 10%,直推的直推 5%
         *  3、金额:补贴金额乘以分享奖励的比例
         */
        //下单人的直推上级
        MallMember mallMemberOne = memberMapper.selectInfoByInviteId(mallMember.getReferrerId());
        //生成直推返利的流水记录
        if(ObjectUtil.isNotEmpty(mallMemberOne)){
            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(4, 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());
            memberWalletService.add(directRewardAmount, mallMemberOne.getId(), "balance");
            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(4, 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());
            memberWalletService.add(shareOneAmount, mallMemberOne.getId(), "balance");
        }
        //下单人的直推上级的直推
        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(4, 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());
            memberWalletService.add(shareTwoAmount, mallMemberTwo.getId(), "balance");
        }
        /**
         * 团队管理补贴
         */
        //下单人所有的上级
        String referrerIds = mallMember.getReferrerIds();
        List<String> refererIdList = StrUtil.split(referrerIds, ",", -1, true, true);
        //下单人所有符合条件的上级-邀请码
        ArrayList<String> refererIdListUp = new ArrayList<>();
        //初始级别即当前下单人的级别
        String levelStart = mallMember.getLevel();
        if(CollUtil.isNotEmpty(refererIdList)){
            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)){
            levelStart = mallMember.getLevel();
            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(4, BigDecimal.ROUND_DOWN);
                    //生成团队分享流水
                    Long teamManageFlowId = mallMoneyFlowService.addMoneyFlow(
                            mallMember.getId(),
                            orderInfo.getOrderNo(),
                            teamManageAmount,
                            MallMoneyFlowTypeEnum.TEAM_REWARD.getCode(),
                            MallMoneyFlow.STATUS_SUCCESS,
                            MallMoneyFlow.IS_RETURN_Y,
                            mallMemberUp.getId(),
                            FlowTypeEnum.BALANCE.getValue(),
                            MallMoneyFlowTypeEnum.TEAM_REWARD.getName()
                    );
//                    memberWalletService.addBalance(teamManageAmount,mallMemberUp.getId());
                    memberWalletService.add(teamManageAmount, mallMemberUp.getId(), "balance");
                }
                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().equals(levelStart)){
//                    && 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;
    }
}