package cn.wisenergy.service.app.impl;

import cn.wisenergy.mapper.*;
import cn.wisenergy.model.app.*;
import cn.wisenergy.model.enums.TradeRecordEnum;
import cn.wisenergy.service.app.UserLevelService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author zw
 * @ Description: 用户升级功能业务实现
 * @ Author     : zw
 * @ Date       : 2021/2/24 17:06
 */
@Service
@Slf4j
public class UserLevelServiceImpl extends ServiceImpl<UsersMapper, User> implements UserLevelService {

    @Autowired
    private UsersMapper usersMapper;

    @Autowired
    private RecommendUserMapper recommendUserMapper;

    @Autowired
    private TeamUserInfoMapper teamUserInfoMapper;

    @Autowired
    private TradeRecordMapper tradeRecordMapper;

    @Autowired
    private AccountMapper accountMapper;

    @Autowired
    private TeamPerformanceMapper teamPerformanceMapper;

    @Autowired
    private CultivatingPrizeMapper cultivatingPrizeMapper;

    @Autowired
    private CultivatingPrizeInfoMapper cultivatingPrizeInfoMapper;

    @Autowired
    private OrderMapper orderMapper;

    //系统推荐人邀请码
    private static final String SYSINVITECODE1 = "1";
    private static final String SYSINVITECODE2 = "88888888";

    @Override
    @Transactional
    public void userLevelUpgrade(String userId) {
        log.info("--------------------当前用户id:" + userId);
        //当前用户对象
        User user = usersMapper.getByUserId(userId);

        //当前用户直推表对象
        RecommendUser recommendUser = recommendUserMapper.getByUserId(userId);
        //当前用户团队信息表对象
        TeamUserInfo teamUserInfoMapperByUserId = teamUserInfoMapper.getByUserId(userId);
        //当前用户等级
        int userLevel = user.getUserLevel();
        log.info("---------------当前用户等级:" + userLevel);
        //当前用户的累计消费
        BigDecimal performanceByUserid = new BigDecimal(0);
        if (userLevel == 0) {
            //计算当前用户业绩
            performanceByUserid = orderMapper.getPerformanceByUserid(userId);
            if (null == performanceByUserid) {
                performanceByUserid = new BigDecimal(0);
            }
        }
        //当前用户的推荐人邀请码
        String beInvitedCode = user.getBeInvitedCode();
        log.info("--------------------当前用户的邀请码:" + beInvitedCode);

        String inviteUserId = "";
        RecommendUser inviteRecommendUser = new RecommendUser();
        //若当前用户的推荐人邀请码是  “1” 时 则当前用户没有邀请人
        if (!SYSINVITECODE1.equals(beInvitedCode) && !SYSINVITECODE2.equals(beInvitedCode)) {
            //通过当前用户推荐人邀请码获取邀请人的userId
            User byBeInvitedCode = usersMapper.getByBeInvitedCode(beInvitedCode);
            if (null != byBeInvitedCode) {
                inviteUserId = byBeInvitedCode.getUserId();
                log.info("-------------------推荐人userid" + inviteUserId);
                //邀请人的直推用户信息
                inviteRecommendUser = recommendUserMapper.getByUserId(inviteUserId);
            }
        }
        //用户等级升级为幼苗 1
        //若当前用户等级为0(普通用户)且跨境额度(业绩消费金额)>= 3980 进行升级0-->1
        //todo:根据业绩去计算  查一次表获取业绩
        if (userLevel == 0 && performanceByUserid.intValue() >= 3980) {
            user.setUserLevel(1);
            usersMapper.updateById(user);
            //同步accountInfo 和TeamPerformance 的用户等级
            accountAndTeamPerformanceUserLevelUpdate(userId);
            //用户的推荐人邀请码为1或者88888888时  没有上级用户
            if (SYSINVITECODE1.equals(beInvitedCode) || SYSINVITECODE2.equals(beInvitedCode)) {
                return;
            } else {
                //推荐人直推信息表数据维护
                //若邀请人直推用户信息中的普通用户数量为0是则不用变化,否则普通用户数量-1
                if (inviteRecommendUser.getNormalUserNum() == 0) {
                    inviteRecommendUser.setNormalUserNum(inviteRecommendUser.getNormalUserNum());
                } else {
                    //普通用户-1
                    inviteRecommendUser.setNormalUserNum(inviteRecommendUser.getNormalUserNum() - 1);
                }
                //邀请人直推用户信息中的幼苗用户数量为+1
                inviteRecommendUser.setSeedlingNum(inviteRecommendUser.getSeedlingNum() + 1);
                recommendUserMapper.updateById(inviteRecommendUser);
                //团队用户表数据维护
                teamUserInfoNormalToSeed(inviteUserId);
                //上级用户获得幼苗等级的培育奖
                int level = 1;
                cultivatingPrizeToInvitedUser(userId, inviteUserId, level);
                //用户升级成功时,进行邀请人等级自查是否达到升级条件
                userLevelUpgrade(inviteUserId);
            }

        }
        //用户等级升级为青铜树 2
        //当前用户等级为幼苗用户(1)时 且当前用户直推人数中幼苗等级>=5人<20人时
        if (userLevel == 1 && recommendUser.getSeedlingNum() >= 3
                && recommendUser.getSeedlingNum() < 15) {
            //用户升级成功
            user.setUserLevel(2);
            usersMapper.updateById(user);
            //同步accountInfo 和TeamPerformance 的用户等级
            accountAndTeamPerformanceUserLevelUpdate(userId);
            //用户的推荐人邀请码为1或者88888888时  没有上级用户
            if (SYSINVITECODE1.equals(beInvitedCode) || SYSINVITECODE2.equals(beInvitedCode)) {
                return;
            } else {
                //若邀请人直推用户信息中的幼苗用户数量为0是则不用变化,否则幼苗用户数量-1
                if (inviteRecommendUser.getSeedlingNum() == 0) {
                    inviteRecommendUser.setSeedlingNum(inviteRecommendUser.getSeedlingNum());
                } else {
                    //幼苗用户-1
                    inviteRecommendUser.setSeedlingNum(inviteRecommendUser.getSeedlingNum() - 1);
                }
                //邀请人直推用户信息中的青铜树用户数量为+1
                inviteRecommendUser.setBronzeTreeNum(inviteRecommendUser.getBronzeTreeNum() + 1);
                recommendUserMapper.updateById(inviteRecommendUser);
                //团队用户表数据维护
                teamUserInfoSeedToBronze(inviteUserId);
                //上级用户获得幼苗等级的培育奖
                int level = 2;
                cultivatingPrizeToInvitedUser(userId, inviteUserId, level);
                //用户升级成功时,进行邀请人等级自查是否达到升级条件
                userLevelUpgrade(inviteUserId);
            }
        }
        //用户等级升级为白银树 3
        if (userLevel == 2 && recommendUser.getSeedlingNum() >= 15
                && recommendUser.getSeedlingNum() < 20) {
            user.setUserLevel(3);
            usersMapper.updateById(user);
            //同步accountInfo 和TeamPerformance 的用户等级
            accountAndTeamPerformanceUserLevelUpdate(userId);
            ////用户的推荐人邀请码为1或者88888888时  没有上级用户
            if (SYSINVITECODE1.equals(beInvitedCode) || SYSINVITECODE2.equals(beInvitedCode)) {
                return;
            } else {
                //推荐人直推信息表数据维护
                //若邀请人直推用户信息中的青铜树用户数量为0是则不用变化,否则青铜树用户数量-1
                if (inviteRecommendUser.getBronzeTreeNum() == 0) {
                    inviteRecommendUser.setBronzeTreeNum(inviteRecommendUser.getBronzeTreeNum());
                } else {
                    //青铜树用户-1
                    inviteRecommendUser.setBronzeTreeNum(inviteRecommendUser.getBronzeTreeNum() - 1);
                }
                //邀请人直推用户信息中的白银用户数量 + 1
                inviteRecommendUser.setSilverTreeNum(inviteRecommendUser.getSilverTreeNum() + 1);
                recommendUserMapper.updateById(inviteRecommendUser);
                //团队用户表数据维护
                teamUserInfoBronzeToSilver(inviteUserId);
                //上级用户获得幼苗等级的培育奖
                int level = 3;
                cultivatingPrizeToInvitedUser(userId, inviteUserId, level);
                //用户升级成功时,进行邀请人等级自查是否达到升级条件
                userLevelUpgrade(inviteUserId);
            }

        }
        //用户等级升级为黄金树 4
        //:todo 条件:团队中青铜树数量>=20
        if (userLevel == 3 && recommendUser.getSeedlingNum() >= 20
                && recommendUser.getSilverTreeNum() >= 2
                && teamUserInfoMapperByUserId.getSeedlingNum() >= 30
                && teamUserInfoMapperByUserId.getBronzeTreeNum() >= 20) {
            user.setUserLevel(4);
            usersMapper.updateById(user);
            //同步accountInfo 和TeamPerformance 的用户等级
            accountAndTeamPerformanceUserLevelUpdate(userId);
            //用户的推荐人邀请码为1或者88888888时  没有上级用户
            if (SYSINVITECODE1.equals(beInvitedCode) || SYSINVITECODE2.equals(beInvitedCode)) {
                return;
            } else {
                //推荐人直推信息表数据维护
                //若邀请人直推用户信息中的白银树用户数量为0是则不用变化,否则白银树用户数量-1
                if (inviteRecommendUser.getSilverTreeNum() == 0) {
                    inviteRecommendUser.setSilverTreeNum(inviteRecommendUser.getSilverTreeNum());
                } else {
                    //白银树用户-1
                    inviteRecommendUser.setSilverTreeNum(inviteRecommendUser.getSilverTreeNum() - 1);
                }
                //邀请人直推用户信息中的黄金用户数量 + 1
                inviteRecommendUser.setGoldTreeNum(inviteRecommendUser.getGoldTreeNum() + 1);
                recommendUserMapper.updateById(inviteRecommendUser);
                //团队用户表数据维护
                teamUserInfoSilverToGoldTree(inviteUserId);
                //上级用户获得幼苗等级的培育奖
                int level = 4;
                cultivatingPrizeToInvitedUser(userId, inviteUserId, level);
                //用户升级成功时,进行邀请人等级自查是否达到升级条件
                userLevelUpgrade(inviteUserId);
            }
        }
        //用户等级级升级为农场主 5
        //:todo 条件:团队中白银树数量>=40
        if (userLevel == 4 && recommendUser.getSeedlingNum() >= 30
                && recommendUser.getGoldTreeNum() >= 2
                && teamUserInfoMapperByUserId.getSeedlingNum() >= 70
                && teamUserInfoMapperByUserId.getSilverTreeNum() >= 40) {
            user.setUserLevel(5);
            usersMapper.updateById(user);
            //同步accountInfo 和TeamPerformance 的用户等级
            accountAndTeamPerformanceUserLevelUpdate(userId);
            ////用户的推荐人邀请码为1或者88888888时  没有上级用户
            if (SYSINVITECODE1.equals(beInvitedCode) || SYSINVITECODE2.equals(beInvitedCode)) {
                return;
            } else {
                //推荐人直推信息表数据维护
                //若邀请人直推用户信息中的黄金树用户数量为0是则不用变化,否则黄金树用户数量-1
                if (inviteRecommendUser.getGoldTreeNum() == 0) {
                    inviteRecommendUser.setGoldTreeNum(inviteRecommendUser.getGoldTreeNum());
                } else {
                    //黄金树用户-1
                    inviteRecommendUser.setGoldTreeNum(inviteRecommendUser.getGoldTreeNum() - 1);
                }
                //邀请人直推用户信息中的农场主用户数量 + 1
                inviteRecommendUser.setGoldTreeNum(inviteRecommendUser.getFarmerNum() + 1);
                recommendUserMapper.updateById(inviteRecommendUser);
                //团队用户表数据维护
                teamUserInfoGoldTreeToFarmer(inviteUserId);
                //上级用户获得幼苗等级的培育奖
                int level = 5;
                cultivatingPrizeToInvitedUser(userId, inviteUserId, level);
                //用户升级成功时,进行邀请人等级自查是否达到升级条件
                userLevelUpgrade(inviteUserId);
            }
        }

        //用户等级升级为森林之星 6
        if (userLevel == 5 && recommendUser.getSeedlingNum() >= 40
                && recommendUser.getFarmerNum() >= 2
                && teamUserInfoMapperByUserId.getSeedlingNum() >= 80
                && teamUserInfoMapperByUserId.getSilverTreeNum() >= 70
                && teamUserInfoMapperByUserId.getGoldTreeNum() >= 30) {
            user.setUserLevel(6);
            usersMapper.updateById(user);
            //同步accountInfo 和TeamPerformance 的用户等级
            accountAndTeamPerformanceUserLevelUpdate(userId);
            //用户的推荐人邀请码为1或者88888888时  没有上级用户
            if (SYSINVITECODE1.equals(beInvitedCode) || SYSINVITECODE2.equals(beInvitedCode)) {
                return;
            } else {
                //推荐人直推信息表数据维护
                //若邀请人直推用户信息中的农场主用户数量为0是则不用变化,否则农场主用户数量-1
                if (inviteRecommendUser.getFarmerNum() == 0) {
                    inviteRecommendUser.setFarmerNum(inviteRecommendUser.getFarmerNum());
                } else {
                    //农场主用户-1
                    inviteRecommendUser.setFarmerNum(inviteRecommendUser.getFarmerNum() - 1);
                }
                //邀请人直推用户信息中的森林之星用户数量 + 1
                inviteRecommendUser.setForestStartNum(inviteRecommendUser.getForestStartNum() + 1);
                recommendUserMapper.updateById(inviteRecommendUser);
                //团队用户表数据维护
                teamUserInfoFarmerToForestStart(inviteUserId);
                //上级用户获得幼苗等级的培育奖
                int level = 6;
                cultivatingPrizeToInvitedUser(userId, inviteUserId, level);
                //用户升级成功时,进行邀请人等级自查是否达到升级条件
                userLevelUpgrade(inviteUserId);
            }
        }
        //用户等级升级为西田森合伙人 7
        //:todo 条件:团队中白银树数量>=90 && 条件:团队中黄金树数量>=50 条件:团队中农场主数量>=30
        if (userLevel == 6 && recommendUser.getSeedlingNum() >= 50
                && recommendUser.getForestStartNum() >= 2
                && teamUserInfoMapperByUserId.getSeedlingNum() >= 100
                && teamUserInfoMapperByUserId.getSilverTreeNum() >= 90
                && teamUserInfoMapperByUserId.getGoldTreeNum() >= 50
                && teamUserInfoMapperByUserId.getFarmerNum() >= 30) {
            user.setUserLevel(7);
            usersMapper.updateById(user);
            //同步accountInfo 和TeamPerformance 的用户等级
            accountAndTeamPerformanceUserLevelUpdate(userId);
            //用户的推荐人邀请码为1或者88888888时  没有上级用户
            if (SYSINVITECODE1.equals(beInvitedCode) || SYSINVITECODE2.equals(beInvitedCode)) {
                return;
            } else {
                //推荐人直推信息表数据维护
                //若邀请人直推用户信息中的森林之星用户数量为0是则不用变化,否则森林之星用户数量-1
                if (inviteRecommendUser.getForestStartNum() == 0) {
                    inviteRecommendUser.setForestStartNum(inviteRecommendUser.getForestStartNum());
                } else {
                    //森林之星用户-1
                    inviteRecommendUser.setForestStartNum(inviteRecommendUser.getForestStartNum() - 1);
                }
                //邀请人直推用户信息中的西田森合伙人用户数量 + 1
                inviteRecommendUser.setPartnerNum(inviteRecommendUser.getPartnerNum() + 1);
                recommendUserMapper.updateById(inviteRecommendUser);
                //团队用户表数据维护
                teamUserInfoForestStartToPartner(inviteUserId);
                //上级用户获得幼苗等级的培育奖
                int level = 7;
                cultivatingPrizeToInvitedUser(userId, inviteUserId, level);
                //用户升级成功时,进行邀请人等级自查是否达到升级条件
                userLevelUpgrade(inviteUserId);
            }
        }
    }

    /**
     * 团队用户表数据维护(森林之星用户升级至西田森合伙人用户时)
     *
     * @param inviteUserId 邀请人userid
     */
    private void teamUserInfoForestStartToPartner(String inviteUserId) {
        if (!"".equals(inviteUserId)) {

            //邀请人的团队信息表对象
            TeamUserInfo teamNumInfoBuyId = teamUserInfoMapper.getByUserId(inviteUserId);
            //邀请人的用户表对象
            User byUserId = usersMapper.getByUserId(teamNumInfoBuyId.getUserId());

            String beinvitedCodeUserId = "";
            String inviteCode = byUserId.getBeInvitedCode();
            if (!SYSINVITECODE1.equals(inviteUserId) && !SYSINVITECODE2.equals(inviteUserId)) {
                //通过邀请人的用户信息获取邀请人的推荐人邀请码
                beinvitedCodeUserId = usersMapper.getByBeInvitedCode(inviteCode).getUserId();
            }
            //通过邀请人的用户信息获取邀请人的推荐人邀请码
            //String beinvitedCodeUserId = usersMapper.getByBeInvitedCode(byUserId.getBeInvitedCode()).getUserId();
            //邀请人团队信息表中森林之星用户数量 = 0 时,森林之星用户数量不用变化,否则森林之星用户数量 - 1
            if (teamNumInfoBuyId.getForestStartNum() == 0) {
                teamNumInfoBuyId.setForestStartNum(teamNumInfoBuyId.getForestStartNum());
            } else {
                //森林之星用户数量 - 1
                teamNumInfoBuyId.setForestStartNum(teamNumInfoBuyId.getForestStartNum() - 1);
            }
            //西田森合伙人用户数量 + 1
            teamNumInfoBuyId.setPartnerNum(teamNumInfoBuyId.getPartnerNum() + 1);
            teamUserInfoMapper.updateById(teamNumInfoBuyId);
            if (SYSINVITECODE1.equals(inviteUserId) || SYSINVITECODE2.equals(inviteUserId)) {
                return;
            }
            if ("".equals(beinvitedCodeUserId)) {

                teamUserInfoForestStartToPartner(beinvitedCodeUserId);
            }
        }
    }

    /**
     * 团队用户表数据维护(农场主用户升级至森林之星用户时)
     *
     * @param inviteUserId 邀请人userid
     */
    private void teamUserInfoFarmerToForestStart(String inviteUserId) {
        if (!"".equals(inviteUserId)) {

            //邀请人的团队信息表对象
            TeamUserInfo teamNumInfoBuyId = teamUserInfoMapper.getByUserId(inviteUserId);
            //邀请人的用户表对象
            User byUserId = usersMapper.getByUserId(teamNumInfoBuyId.getUserId());

            String beinvitedCodeUserId = "";
            String inviteCode = byUserId.getBeInvitedCode();
            if (!SYSINVITECODE1.equals(inviteUserId) && !SYSINVITECODE2.equals(inviteUserId)) {
                //通过邀请人的用户信息获取邀请人的推荐人邀请码
                beinvitedCodeUserId = usersMapper.getByBeInvitedCode(inviteCode).getUserId();
            }
            //通过邀请人的用户信息获取邀请人的推荐人邀请码
            //String beinvitedCodeUserId = usersMapper.getByBeInvitedCode(byUserId.getBeInvitedCode()).getUserId();
            //邀请人团队信息表中农场主用户数量 = 0 时,农场主用户数量不用变化,否则农场主用户数量 - 1
            if (teamNumInfoBuyId.getFarmerNum() == 0) {
                teamNumInfoBuyId.setFarmerNum(teamNumInfoBuyId.getFarmerNum());
            } else {
                //农场主用户数量 - 1
                teamNumInfoBuyId.setFarmerNum(teamNumInfoBuyId.getFarmerNum() - 1);
            }
            //森林之星用户数量 + 1
            teamNumInfoBuyId.setForestStartNum(teamNumInfoBuyId.getForestStartNum() + 1);
            teamUserInfoMapper.updateById(teamNumInfoBuyId);
            if (SYSINVITECODE1.equals(inviteUserId) || SYSINVITECODE2.equals(inviteUserId)) {
                return;
            }
            //递归向上修改团队用户信息表
            if ("".equals(beinvitedCodeUserId)) {

                teamUserInfoFarmerToForestStart(beinvitedCodeUserId);
            }
        }
    }

    /**
     * 团队用户表数据维护(黄金树用户升级至农场主用户时)
     *
     * @param inviteUserId 邀请人userid
     */
    private void teamUserInfoGoldTreeToFarmer(String inviteUserId) {
        if (!"".equals(inviteUserId)) {

            //邀请人的团队信息表对象
            TeamUserInfo teamNumInfoBuyId = teamUserInfoMapper.getByUserId(inviteUserId);
            //邀请人的用户表对象
            User byUserId = usersMapper.getByUserId(teamNumInfoBuyId.getUserId());

            String beinvitedCodeUserId = "";
            String inviteCode = byUserId.getBeInvitedCode();
            if (!SYSINVITECODE1.equals(inviteUserId) && !SYSINVITECODE2.equals(inviteUserId)) {
                //通过邀请人的用户信息获取邀请人的推荐人邀请码
                beinvitedCodeUserId = usersMapper.getByBeInvitedCode(inviteCode).getUserId();
            }
            //通过邀请人的用户信息获取邀请人的推荐人邀请码
            // String beinvitedCodeUserId = usersMapper.getByBeInvitedCode(byUserId.getBeInvitedCode()).getUserId();
            //邀请人团队信息表中黄金树用户数量 = 0 时,黄金树用户数量不用变化,否则黄金树用户数量 - 1
            if (teamNumInfoBuyId.getGoldTreeNum() == 0) {
                teamNumInfoBuyId.setGoldTreeNum(teamNumInfoBuyId.getGoldTreeNum());
            } else {
                //黄金树用户数量 - 1
                teamNumInfoBuyId.setGoldTreeNum(teamNumInfoBuyId.getGoldTreeNum() - 1);
            }
            //农场主数量 + 1
            teamNumInfoBuyId.setFarmerNum(teamNumInfoBuyId.getFarmerNum() + 1);
            teamUserInfoMapper.updateById(teamNumInfoBuyId);
            if (SYSINVITECODE1.equals(inviteUserId) || SYSINVITECODE2.equals(inviteUserId)) {
                return;
            }
            //递归向上修改团队用户信息表
            if ("".equals(beinvitedCodeUserId)) {

                teamUserInfoGoldTreeToFarmer(beinvitedCodeUserId);
            }
        }
    }

    /**
     * 团队用户表数据维护(白银树用户升级至黄金树用户时)
     *
     * @param inviteUserId 邀请人userid
     */
    private void teamUserInfoSilverToGoldTree(String inviteUserId) {
        if (!"".equals(inviteUserId)) {

            //邀请人的团队信息表对象
            TeamUserInfo teamNumInfoBuyId = teamUserInfoMapper.getByUserId(inviteUserId);
            //邀请人的用户表对象
            User byUserId = usersMapper.getByUserId(teamNumInfoBuyId.getUserId());

            String beinvitedCodeUserId = "";
            String inviteCode = byUserId.getBeInvitedCode();
            if (!SYSINVITECODE1.equals(inviteUserId) && !SYSINVITECODE2.equals(inviteUserId)) {
                //通过邀请人的用户信息获取邀请人的推荐人邀请码
                beinvitedCodeUserId = usersMapper.getByBeInvitedCode(inviteCode).getUserId();
            }
            //通过邀请人的用户信息获取邀请人的推荐人邀请码
            //String beinvitedCodeUserId = usersMapper.getByBeInvitedCode(byUserId.getBeInvitedCode()).getUserId();
            //邀请人团队信息表中白银树用户数量 = 0 时,白银树用户数量不用变化,否则白银树用户数量 - 1
            if (teamNumInfoBuyId.getSilverTreeNum() == 0) {
                teamNumInfoBuyId.setSilverTreeNum(teamNumInfoBuyId.getSilverTreeNum());
            } else {
                //白银树用户数量 - 1
                teamNumInfoBuyId.setSilverTreeNum(teamNumInfoBuyId.getSilverTreeNum() - 1);
            }
            //黄金树用户数量 - 1
            teamNumInfoBuyId.setGoldTreeNum(teamNumInfoBuyId.getGoldTreeNum() + 1);
            teamUserInfoMapper.updateById(teamNumInfoBuyId);
            if (SYSINVITECODE1.equals(inviteUserId) || SYSINVITECODE2.equals(inviteUserId)) {
                return;
            }
            //递归向上修改团队用户信息表
            if ("".equals(beinvitedCodeUserId)) {

                teamUserInfoSilverToGoldTree(beinvitedCodeUserId);
            }
        }
    }

    /**
     * 团队用户表数据维护(青铜树用户升级至白银树用户时)
     *
     * @param inviteUserId 邀请人userid
     */
    private void teamUserInfoBronzeToSilver(String inviteUserId) {
        if (!"".equals(inviteUserId)) {

            //邀请人的团队信息表对象
            TeamUserInfo teamNumInfoBuyId = teamUserInfoMapper.getByUserId(inviteUserId);
            //邀请人的用户表对象
            User byUserId = usersMapper.getByUserId(teamNumInfoBuyId.getUserId());

            String beinvitedCodeUserId = "";
            String inviteCode = byUserId.getBeInvitedCode();
            if (!SYSINVITECODE1.equals(inviteUserId) && !SYSINVITECODE2.equals(inviteUserId)) {
                //通过邀请人的用户信息获取邀请人的推荐人邀请码
                beinvitedCodeUserId = usersMapper.getByBeInvitedCode(inviteCode).getUserId();
            }
            //通过邀请人的用户信息获取邀请人的推荐人邀请码
            //String beinvitedCodeUserId = usersMapper.getByBeInvitedCode(byUserId.getBeInvitedCode()).getUserId();
            //邀请人团队信息表中青铜树用户数量 = 0 时,青铜树用户数量不用变化,否则青铜树用户数量 - 1
            if (teamNumInfoBuyId.getBronzeTreeNum() == 0) {
                teamNumInfoBuyId.setBronzeTreeNum(teamNumInfoBuyId.getBronzeTreeNum());
            } else {
                //青铜树用户数量 - 1
                teamNumInfoBuyId.setBronzeTreeNum(teamNumInfoBuyId.getBronzeTreeNum() - 1);
            }
            //白银树用户数量+1
            teamNumInfoBuyId.setSilverTreeNum(teamNumInfoBuyId.getSilverTreeNum() + 1);
            teamUserInfoMapper.updateById(teamNumInfoBuyId);
            if (SYSINVITECODE1.equals(inviteUserId) || SYSINVITECODE2.equals(inviteUserId)) {
                return;
            }
            //递归向上修改团队用户信息表
            if ("".equals(beinvitedCodeUserId)) {

                teamUserInfoBronzeToSilver(beinvitedCodeUserId);
            }
        }
    }

    /**
     * 团队用户表数据维护(幼苗用户升级至青铜用户时)
     *
     * @param inviteUserId 邀请人userid
     */
    private void teamUserInfoSeedToBronze(String inviteUserId) {
        if (!"".equals(inviteUserId)) {

            //邀请人的团队信息表对象
            TeamUserInfo teamNumInfoBuyId = teamUserInfoMapper.getByUserId(inviteUserId);
            //邀请人的用户表对象
            User byUserId = usersMapper.getByUserId(teamNumInfoBuyId.getUserId());

            String beinvitedCodeUserId = "";
            String inviteCode = byUserId.getBeInvitedCode();
            if (!SYSINVITECODE1.equals(inviteUserId) && !SYSINVITECODE2.equals(inviteUserId)) {
                //通过邀请人的用户信息获取邀请人的推荐人邀请码
                beinvitedCodeUserId = usersMapper.getByBeInvitedCode(inviteCode).getUserId();
            }
            //通过邀请人的用户信息获取邀请人的推荐人邀请码
            //String beinvitedCodeUserId = usersMapper.getByBeInvitedCode(byUserId.getBeInvitedCode()).getUserId();
            //邀请人团队信息表中幼苗用户数量 = 0 时,幼苗用户数量不用变化,否则幼苗用户数量 - 1
            if (teamNumInfoBuyId.getSeedlingNum() == 0) {
                teamNumInfoBuyId.setSeedlingNum(teamNumInfoBuyId.getSeedlingNum());
            } else {
                //幼苗用户数量-1
                teamNumInfoBuyId.setSeedlingNum(teamNumInfoBuyId.getSeedlingNum() - 1);
            }
            //邀请人的团队用户信息表中青铜树数量 + 1
            teamNumInfoBuyId.setBronzeTreeNum(teamNumInfoBuyId.getBronzeTreeNum() + 1);
            teamUserInfoMapper.updateById(teamNumInfoBuyId);
            if (SYSINVITECODE1.equals(inviteUserId) || SYSINVITECODE2.equals(inviteUserId)) {
                return;
            }
            //递归向上修改团队用户信息表
            if ("".equals(beinvitedCodeUserId)) {

                teamUserInfoSeedToBronze(beinvitedCodeUserId);
            }
        }
    }

    /**
     * 团队用户表数据维护(普通用户升级至幼苗用户时)
     *
     * @param inviteUserId 邀请人userid
     */
    private void teamUserInfoNormalToSeed(String inviteUserId) {
        if (!"".equals(inviteUserId)) {

            //邀请人的团队信息表对象
            TeamUserInfo teamNumInfoBuyId = teamUserInfoMapper.getByUserId(inviteUserId);
            //邀请人的用户表对象
            User intiveUserByUserId = usersMapper.getByUserId(teamNumInfoBuyId.getUserId());

            String beinvitedCodeUserId = "";
            //邀请人的推荐人邀请码
            String inviteCode = intiveUserByUserId.getBeInvitedCode();
            if (!SYSINVITECODE1.equals(inviteUserId) && !SYSINVITECODE2.equals(inviteUserId)) {
                //通过邀请人的用户信息获取邀请人的推荐人邀请码
                User byBeInvitedCode = usersMapper.getByBeInvitedCode(inviteCode);
                if (null != byBeInvitedCode) {
                    beinvitedCodeUserId = byBeInvitedCode.getUserId();
                }
            }
            if (teamNumInfoBuyId.getNormalUserNum() == 0) {
                teamNumInfoBuyId.setNormalUserNum(teamNumInfoBuyId.getNormalUserNum());
            } else {
                //普通用户数量-1
                teamNumInfoBuyId.setNormalUserNum(teamNumInfoBuyId.getNormalUserNum() - 1);
            }
            //邀请人的团队用户信息表中幼苗数量 + 1
            //第一波用户是谁邀请的
            teamNumInfoBuyId.setSeedlingNum(teamNumInfoBuyId.getSeedlingNum() + 1);
            teamUserInfoMapper.updateById(teamNumInfoBuyId);
            if (SYSINVITECODE1.equals(inviteUserId) || SYSINVITECODE2.equals(inviteUserId)) {
                return;
            }
            //递归向上修改团队用户信息表
            if (!"".equals(beinvitedCodeUserId)) {
                teamUserInfoNormalToSeed(beinvitedCodeUserId);
            }
        }
    }

    /**
     * 培育奖给到上级用户
     *
     * @param userId       当前用户id
     * @param inviteUserId 上级用户id
     * @param level        当前用户升级后的等级
     */
    public void cultivatingPrizeToInvitedUser(String userId, String inviteUserId, int level) {
        //当前用户的培育奖记录
        CultivatingPrizeInfo cultivatingPrizeInfo = cultivatingPrizeInfoMapper.getOneByUserId(userId);
        //判断当前用户等级
        if (1 == level) {
            //获取等级对应的培育奖记录状态
            int seedling = cultivatingPrizeInfo.getSeedling();
            //用户等级对应的培育奖金额
            BigDecimal cultivatingPrize = cultivatingPrizeMapper.getcultivatingPrizeByUserLevel(level).getCultivatingPrize();
            if (0 == seedling) {
                //1、判断推荐人的等级是否大与当前用户等级
                User inviteUser = usersMapper.getByUserId(inviteUserId);
                int inviteUserLevel = inviteUser.getUserLevel();
                if (null != inviteUser) {
                    if (inviteUserLevel >= level) {
                        //2.交易流水新增一条数据
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(inviteUserId);
                        tradeRecord.setMoney(cultivatingPrize);
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(0);
                        tradeRecord.setTradeType(TradeRecordEnum.CULTIVATING_PRIZE.getCode());
                        tradeRecordMapper.add(tradeRecord);

                        //3.修改培育奖记录状态 ==1
                        seedling = 1;
                        cultivatingPrizeInfo.setSeedling(seedling);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        //账户表中累计收益和当月收益累加
                        accountAddEarningsTotalAndEarningsMonth(inviteUserId, cultivatingPrize);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + seedling);
                    } else {
                        //3.修改培育奖记录状态 ==2
                        seedling = 2;
                        cultivatingPrizeInfo.setSeedling(seedling);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        log.info("用户" + inviteUserId + "获得" + "培育奖来自---用户id" + userId + "userlevel" + level + "status:" + seedling);
                    }

                }
            }
        } else if (2 == level) {
            //培育奖记录状态
            int bronzeTree = cultivatingPrizeInfo.getBronzeTree();
            //用户等级对应的培育奖金额
            BigDecimal cultivatingPrize = cultivatingPrizeMapper.getcultivatingPrizeByUserLevel(level).getCultivatingPrize();

            if (0 == bronzeTree) {
                //1、判断推荐人的等级是否大与当前用户等级
                User inviteUser = usersMapper.getByUserId(inviteUserId);
                if (null != inviteUser) {
                    int inviteUserLevel = inviteUser.getUserLevel();
                    if (inviteUserLevel >= level) {
                        //2.交易流水新增一条数据
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(inviteUserId);
                        tradeRecord.setMoney(cultivatingPrize);
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(0);
                        tradeRecord.setTradeType(TradeRecordEnum.CULTIVATING_PRIZE.getCode());
                        tradeRecordMapper.add(tradeRecord);

                        //3.修改培育奖记录状态 ==1
                        bronzeTree = 1;
                        cultivatingPrizeInfo.setBronzeTree(bronzeTree);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        //账户表中累计收益和当月收益累加
                        accountAddEarningsTotalAndEarningsMonth(inviteUserId, cultivatingPrize);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + bronzeTree);
                    } else {
                        //3.修改培育奖记录状态 ==2
                        bronzeTree = 2;
                        cultivatingPrizeInfo.setBronzeTree(bronzeTree);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + bronzeTree);
                    }

                }
            }
        } else if (3 == level) {
            //获取当前等级的培育奖状态
            int silverTree = cultivatingPrizeInfo.getSilverTree();
            //用户等级对应的培育奖金额
            BigDecimal cultivatingPrize = cultivatingPrizeMapper.getcultivatingPrizeByUserLevel(level).getCultivatingPrize();

            if (0 == silverTree) {
                //1、判断推荐人的等级是否大与当前用户等级
                User inviteUser = usersMapper.getByUserId(inviteUserId);
                if (null != inviteUser) {
                    int inviteUserLevel = inviteUser.getUserLevel();
                    if (inviteUserLevel >= level) {
                        //2.交易流水新增一条数据
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(inviteUserId);
                        tradeRecord.setMoney(cultivatingPrize);
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(0);
                        tradeRecord.setTradeType(TradeRecordEnum.CULTIVATING_PRIZE.getCode());
                        tradeRecordMapper.add(tradeRecord);

                        //3.修改培育奖记录状态 ==1
                        silverTree = 1;
                        cultivatingPrizeInfo.setBronzeTree(silverTree);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        //账户表中累计收益和当月收益累加
                        accountAddEarningsTotalAndEarningsMonth(inviteUserId, cultivatingPrize);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + silverTree);
                    } else {
                        //3.修改培育奖记录状态 ==2
                        silverTree = 2;
                        cultivatingPrizeInfo.setBronzeTree(silverTree);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + silverTree);
                    }
                }
            }
        } else if (4 == level) {
            int goldTree = cultivatingPrizeInfo.getGoldTree();
            //用户等级对应的培育奖金额
            BigDecimal cultivatingPrize = cultivatingPrizeMapper.getcultivatingPrizeByUserLevel(level).getCultivatingPrize();

            if (0 == goldTree) {
                //1、判断推荐人的等级是否大与当前用户等级
                User inviteUser = usersMapper.getByUserId(inviteUserId);
                if (null != inviteUser) {
                    int userLevel = inviteUser.getUserLevel();
                    if (userLevel >= level) {

                        //2.交易流水新增一条数据
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(inviteUserId);
                        tradeRecord.setMoney(cultivatingPrize);
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(0);
                        tradeRecord.setTradeType(TradeRecordEnum.CULTIVATING_PRIZE.getCode());
                        tradeRecordMapper.add(tradeRecord);

                        //3.修改培育奖记录状态 ==1
                        goldTree = 1;
                        cultivatingPrizeInfo.setGoldTree(goldTree);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        //账户表中累计收益和当月收益累加
                        accountAddEarningsTotalAndEarningsMonth(inviteUserId, cultivatingPrize);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + goldTree);
                    } else {
                        //3.修改培育奖记录状态 ==2
                        goldTree = 2;
                        cultivatingPrizeInfo.setGoldTree(goldTree);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + goldTree);
                    }
                }
            }
        } else if (5 == level) {
            int farmer = cultivatingPrizeInfo.getFarmer();
            //用户等级对应的培育奖金额
            BigDecimal cultivatingPrize = cultivatingPrizeMapper.getcultivatingPrizeByUserLevel(level).getCultivatingPrize();

            if (0 == farmer) {
                //上级用户
                User inviteUser = usersMapper.getByUserId(inviteUserId);
                if (null != inviteUser) {
                    int userLevel = inviteUser.getUserLevel();
                    if (userLevel >= level) {

                        //2.交易流水新增一条数据
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(inviteUserId);
                        tradeRecord.setMoney(cultivatingPrize);
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(0);
                        tradeRecord.setTradeType(TradeRecordEnum.CULTIVATING_PRIZE.getCode());
                        tradeRecordMapper.add(tradeRecord);

                        //3.修改培育奖记录状态 ==1
                        farmer = 1;
                        cultivatingPrizeInfo.setGoldTree(farmer);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        //账户表中累计收益和当月收益累加
                        accountAddEarningsTotalAndEarningsMonth(inviteUserId, cultivatingPrize);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + farmer);
                    } else {
                        //3.修改培育奖记录状态 ==2
                        farmer = 2;
                        cultivatingPrizeInfo.setGoldTree(farmer);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + farmer);
                    }
                }
            }
        } else if (6 == level) {
            int forestStart = cultivatingPrizeInfo.getForestStart();
            //用户等级对应的培育奖金额
            BigDecimal cultivatingPrize = cultivatingPrizeMapper.getcultivatingPrizeByUserLevel(level).getCultivatingPrize();

            if (0 == forestStart) {
                //上级用户
                User inviteUser = usersMapper.getByUserId(inviteUserId);
                if (null != inviteUser) {
                    int userLevel = inviteUser.getUserLevel();
                    if (userLevel >= level) {

                        //2.交易流水新增一条数据
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(inviteUserId);
                        tradeRecord.setMoney(cultivatingPrize);
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(0);
                        tradeRecord.setTradeType(TradeRecordEnum.CULTIVATING_PRIZE.getCode());
                        tradeRecordMapper.add(tradeRecord);

                        //3.修改培育奖记录状态 ==1
                        forestStart = 1;
                        cultivatingPrizeInfo.setGoldTree(forestStart);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        //账户表中累计收益和当月收益累加
                        accountAddEarningsTotalAndEarningsMonth(inviteUserId, cultivatingPrize);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + forestStart);
                    } else {
                        //3.修改培育奖记录状态 ==2
                        forestStart = 2;
                        cultivatingPrizeInfo.setGoldTree(forestStart);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + forestStart);
                    }
                }
            }
        } else if (7 == level) {
            int partner = cultivatingPrizeInfo.getPartner();
            //用户等级对应的培育奖金额
            BigDecimal cultivatingPrize = cultivatingPrizeMapper.getcultivatingPrizeByUserLevel(level).getCultivatingPrize();

            if (0 == partner) {
                //上级用户
                User inviteUser = usersMapper.getByUserId(inviteUserId);
                if (null != inviteUser) {
                    int userLevel = inviteUser.getUserLevel();
                    if (userLevel >= level) {

                        //2.交易流水新增一条数据
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(inviteUserId);
                        tradeRecord.setMoney(cultivatingPrize);
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(0);
                        tradeRecord.setTradeType(TradeRecordEnum.CULTIVATING_PRIZE.getCode());
                        tradeRecordMapper.add(tradeRecord);

                        //3.修改培育奖记录状态 ==1
                        partner = 1;
                        cultivatingPrizeInfo.setGoldTree(partner);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        //账户表中累计收益和当月收益累加
                        accountAddEarningsTotalAndEarningsMonth(inviteUserId, cultivatingPrize);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + partner);
                    } else {
                        //3.修改培育奖记录状态 ==2
                        partner = 2;
                        cultivatingPrizeInfo.setGoldTree(partner);
                        cultivatingPrizeInfoMapper.updateById(cultivatingPrizeInfo);
                        log.info("用户:" + inviteUserId + "获得" + "培育奖来自---用户id:" + userId + "userlevel:" + level + "status:" + partner);
                    }
                }
            }
        }
    }

    //同步accountInfo 和TeamPerformance 的用户等级
    @Override
    public void accountAndTeamPerformanceUserLevelUpdate(String userId) {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
        String format = dateFormat.format(new Date());

        User userByUserId = usersMapper.getUserByUserId(userId);

        if (null != userByUserId) {
            int userLevel = userByUserId.getUserLevel();
            AccountInfo accountInfoByUserId = accountMapper.getByUserId(userId);
            accountInfoByUserId.setUserLevel(userLevel);
            TeamPerformance teamPerformanceByUserId = teamPerformanceMapper.getByUserIdAndTime(userId, format);
            if (null == teamPerformanceByUserId) {
                TeamPerformance teamPerformance = new TeamPerformance();
                teamPerformance.setUserId(userId);
                teamPerformance.setUserLevel(userLevel);
                teamPerformance.setYearMonth(format);
                teamPerformance.setMonthTeamPerformance(new BigDecimal(0));
                teamPerformanceMapper.add(teamPerformance);
            } else {
                teamPerformanceByUserId.setUserLevel(userLevel);
                teamPerformanceMapper.edit(teamPerformanceByUserId);
            }
            accountMapper.edit(accountInfoByUserId);

        }
    }

    /**
     * 用户获得培育奖之后
     * 进行账户表累加操作
     * 当月收益和累计收益
     *
     * @param userId
     */
    public void accountAddEarningsTotalAndEarningsMonth(String userId, BigDecimal cultivatingPrize) {
        AccountInfo accountMapperByUserId = accountMapper.getByUserId(userId);
        BigDecimal earningsMonth = accountMapperByUserId.getEarningsMonth();
        BigDecimal earningsTotal = accountMapperByUserId.getEarningsTotal();
        accountMapperByUserId.setEarningsMonth(earningsMonth.add(cultivatingPrize));
        accountMapperByUserId.setEarningsTotal(earningsTotal.add(cultivatingPrize));
        accountMapper.edit(accountMapperByUserId);

    }
}