admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderHongBaoMoneyComputeServiceImpl.java
@@ -1,417 +1,456 @@
package com.yeshi.fanli.service.impl.order;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import org.springframework.stereotype.Service;
import com.yeshi.fanli.dto.ConfigParamsDTO;
import com.yeshi.fanli.dto.order.UserTeamLevel;
import com.yeshi.fanli.dto.order.UserTeamRate;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.util.Constant;
import org.yeshi.utils.MoneyBigDecimalUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.VersionUtil;
import com.yeshi.fanli.util.user.UserLevelUtil;
@Service
public class OrderHongBaoMoneyComputeServiceImpl implements OrderHongBaoMoneyComputeService {
    @Resource
    private HongBaoManageService hongBaoManageService;
    @Resource
    private UserInfoService userInfoService;
    @Override
    public BigDecimal computeBaseFanliMoney(CommonOrder order) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        return getBaseCommission(order,system);
    }
    @Override
    public BigDecimal computeBaseShareMoney(CommonOrder order) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        return getBaseCommission(order,system);
    }
    private UserLevelEnum getCommonUserLevel(Date time, UserLevelEnum userLevel) {
        if (userLevel == null)
            return UserLevelEnum.daRen;
        if (time.getTime() < Constant.NEW_ORDER_FANLI_RULE_TIME)
            return UserLevelUtil.getOldLevel(userLevel);
        else
            return userLevel;
    }
    // 获取基础佣金
    private BigDecimal getBaseCommission(CommonOrder order, SystemEnum system) {
        BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime(), system);
        if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
        else if (order.getEstimate() != null)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        else
            return null;
    }
    @Override
    public BigDecimal computeFanliMoney(CommonOrder order, UserLevelEnum userLevel) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime(),system)
                .add(getOfficialSubsidyRate(order.getThirdCreateTime(),
                        getCommonUserLevel(order.getThirdCreateTime(), userLevel), false,system));
        if (userLevel == UserLevelEnum.normalVIP) {
            rate = new BigDecimal("61");
        }
        if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
        else if (order.getEstimate() != null)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        else
            return null;
    }
    @Override
    public BigDecimal computeShareMoney(CommonOrder order, UserLevelEnum userLevel) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime(),system)
                .add(getOfficialSubsidyRate(order.getThirdCreateTime(),
                        getCommonUserLevel(order.getThirdCreateTime(), userLevel), true,system));
        if (userLevel == UserLevelEnum.normalVIP) {
            rate = new BigDecimal("61");
        }
        if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
        else if (order.getEstimate() != null)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        else
            return null;
    }
    @Override
    public BigDecimal computeFirstInviteMoney(CommonOrder order, UserLevelEnum buyer,
                                              List<UserTeamLevel> bossLevelList) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        BigDecimal rate = null;
        if (order.getThirdCreateTime().getTime() >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
            rate = getTeamRewardRate(buyer, bossLevelList, order.getThirdCreateTime(), 1,system).getRate();
            if (rate == null)
                return null;
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        } else {// 老的返利比例
            rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_6", order.getThirdCreateTime().getTime(),system);
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order,system)),
                        new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order,system)),
                        new BigDecimal(100));
        }
        return null;
    }
    @Override
    public BigDecimal computeSecondInviteMoney(CommonOrder order, UserLevelEnum buyer,
                                               List<UserTeamLevel> bossLevelList) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        BigDecimal rate = null;
        if (order.getThirdCreateTime().getTime() >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
            rate = getTeamRewardRate(buyer, bossLevelList, order.getThirdCreateTime(), 2,system).getRate();
            if (rate == null)
                return null;
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        } else {// 老的返利比例
            rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_7", order.getThirdCreateTime().getTime(),system);
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order,system)),
                        new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order,system)),
                        new BigDecimal(100));
        }
        return null;
    }
    /**
     * 获取官方补贴比例
     *
     * @param date
     * @param userLevel
     * @param share
     * @return BigDecimal 返回类型
     * @throws
     * @Title: getOfficialSubsidyRate
     * @Description:
     */
    private BigDecimal getOfficialSubsidyRate(Date date, UserLevelEnum userLevel, boolean share,SystemEnum system) {
        String key = null;
        if (share)
            key = String.format("official_subsidy_share_%s", userLevel.getLevel());
        else
            key = String.format("official_subsidy_zigou_%s", userLevel.getLevel());
        BigDecimal rate = null;
        if (date != null)
            rate = hongBaoManageService.getByKeyAndMaxTimeCache(key, TimeUtil
                    .convertToTimeTemp(TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"),system);
        else
            rate = new BigDecimal(hongBaoManageService.get(key,system));
        return rate;
    }
    private BigDecimal getRateByLevel(UserLevelEnum level, Date date,SystemEnum system) {
        BigDecimal baseRate = hongBaoManageService.getBaseFanliRateCache(
                TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"),system);
        BigDecimal subsidyRate = getOfficialSubsidyRate(date, level, false,system);
        return baseRate.add(subsidyRate);
    }
    @Override
    public UserTeamRate getTeamRewardRate(UserLevelEnum buyerLevel, List<UserTeamLevel> bossLevelList, Date date,
                                          int deep,SystemEnum system) {
        if (deep == 1) {// 直接邀请人奖金
            UserTeamLevel boss = bossLevelList.get(0);
            BigDecimal rate = null;
            if (bossLevelList == null || bossLevelList.size() < 1)
                return null;
            if (buyerLevel == UserLevelEnum.daRen && boss.getLevel() == UserLevelEnum.daRen) {
                rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_6", date.getTime(),system);
            } else if (buyerLevel == UserLevelEnum.normalVIP && boss.getLevel() == UserLevelEnum.normalVIP) {
                rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_6", date.getTime(),system);
            } else {
                BigDecimal bossRate = getRateByLevel(boss.getLevel(), date,system);
                BigDecimal buyerRate = getRateByLevel(buyerLevel, date,system);
                rate = bossRate.subtract(buyerRate);
                if (rate.compareTo(new BigDecimal(0)) < 0)
                    rate = new BigDecimal(0);
            }
            return new UserTeamRate(boss.getUid(), boss.getLevel(), rate);
        } else if (deep == 2) {// 间接邀请人奖金
            if (bossLevelList == null || bossLevelList.size() < 2)
                return null;
            BigDecimal buyerRate = getRateByLevel(buyerLevel, date,system);
            BigDecimal firstRate = getTeamRewardRate(buyerLevel, bossLevelList, date, 1,system).getRate();
            UserTeamLevel boss = bossLevelList.get(1);
            UserTeamLevel firstBoss = bossLevelList.get(0);
            BigDecimal rate = null;
            if (buyerLevel == UserLevelEnum.daRen && firstBoss.getLevel() == UserLevelEnum.daRen) {
                if (boss.getLevel() == UserLevelEnum.daRen)
                    rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_7", date.getTime(),system);
                else {
                    rate = null;
                }
            } else if (buyerLevel == UserLevelEnum.normalVIP && firstBoss.getLevel() == UserLevelEnum.normalVIP) {
                if (boss.getLevel() == UserLevelEnum.normalVIP)
                    rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_7", date.getTime(),system);
                else {
                    rate = null;
                }
            } else if (buyerLevel == UserLevelEnum.daRen && firstBoss.getLevel() == UserLevelEnum.normalVIP) {
                if (boss.getLevel() == UserLevelEnum.normalVIP)
                    rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_7", date.getTime(),system);
                else {
                    rate = null;
                }
            }
            // 极差计算法
            if (rate == null) {
                rate = getRateByLevel(boss.getLevel(), date,system).subtract(buyerRate).subtract(firstRate);
                if (rate.compareTo(new BigDecimal(0)) < 0)
                    rate = new BigDecimal(0);
            }
            return new UserTeamRate(boss.getUid(), boss.getLevel(), rate);
        } else
            return null;
    }
    @Override
    public List<UserTeamRate> getTeamRewardMoreThan2LevelRates(UserLevelEnum buyerLevel,
                                                               List<UserTeamLevel> bossLevelList, Date date,SystemEnum system) {
        if (bossLevelList == null || bossLevelList.size() < 3)
            return null;
        UserTeamRate firstBoss = getTeamRewardRate(buyerLevel, bossLevelList, date, 1,system);
        if (firstBoss == null)
            return null;
        UserTeamRate secondBoss = getTeamRewardRate(buyerLevel, bossLevelList, date, 2,system);
        if (secondBoss == null)
            return null;
        BigDecimal buyerRate = getRateByLevel(buyerLevel, date,system);
        BigDecimal totalRate = firstBoss.getRate().add(secondBoss.getRate()).add(buyerRate);
        List<UserTeamRate> rateList = new ArrayList<>();
        for (int i = 2; i < bossLevelList.size(); i++) {
            BigDecimal rate = getRateByLevel(bossLevelList.get(i).getLevel(), date,system);
            if (rate.compareTo(totalRate) > 0) {
                BigDecimal subRate = rate.subtract(totalRate);
                totalRate = subRate.add(totalRate);// 累计分成比例
                rateList.add(new UserTeamRate(bossLevelList.get(i).getUid(), bossLevelList.get(i).getLevel(), subRate));
            }
        }
        return rateList;
    }
    // 团队分红
    @Override
    public List<UserTeamRate> getTeamDividentsRates(UserLevelEnum buyerLevel, List<UserTeamLevel> bossLevelList,
                                                    Date date,SystemEnum system) {
        List<UserTeamRate> rateList = new ArrayList<>();
        List<UserTeamLevel> levelList = new ArrayList<>();
        levelList.add(new UserTeamLevel(null, buyerLevel));
        levelList.addAll(bossLevelList);
        UserLevelEnum maxLevel = buyerLevel;
        List<UserTeamLevel> vipList = new ArrayList<>();
        List<UserTeamLevel> highList = new ArrayList<>();
        for (int i = 1; i < levelList.size(); i++) {
            if (maxLevel.getLevel() <= levelList.get(i).getLevel().getLevel()) {
                maxLevel = levelList.get(i).getLevel();
                if (levelList.get(i).getLevel() == UserLevelEnum.highVIP)
                    highList.add(levelList.get(i));
                else if (levelList.get(i).getLevel() == UserLevelEnum.superVIP) {
                    vipList.add(levelList.get(i));
                }
            }
        }
        if (vipList.size() >= 4) {// 最多分4级
            vipList = vipList.subList(0, 4);
        }
        if (highList.size() >= 4) {// 最多分4级
            highList = highList.subList(0, 4);
        }
        BigDecimal highTotalRate = hongBaoManageService.getByKeyAndMaxTime("dividents_rate_same_level_high",
                date.getTime(),system);
        BigDecimal vipTotalRate = hongBaoManageService.getByKeyAndMaxTime("dividents_rate_same_level_super",
                date.getTime(),system);
        if (vipList.size() > 0 && highList.size() > 0) {
        } else if (vipList.size() == 0) {
            highTotalRate = highTotalRate.add(vipTotalRate);
        } else {
            vipTotalRate = highTotalRate.add(vipTotalRate);
        }
        // 高级会员分红
        if (highList.size() > 0) {
            int count = 0;
            for (int i = 0; i < highList.size(); i++) {
                count += (4 - i);
            }
            BigDecimal per = MoneyBigDecimalUtil.div(highTotalRate, new BigDecimal(count), 4);
            for (int i = 0; i < highList.size(); i++) {
                BigDecimal rate = MoneyBigDecimalUtil.mul(per, new BigDecimal(4 - i), 4);
                rateList.add(new UserTeamRate(highList.get(i), rate));
            }
        }
        // 超级会员分红
        if (vipList.size() > 0) {
            int count = 0;
            for (int i = 0; i < vipList.size(); i++) {
                count += (4 - i);
            }
            BigDecimal per = MoneyBigDecimalUtil.div(vipTotalRate, new BigDecimal(count), 4);
            for (int i = 0; i < vipList.size(); i++) {
                BigDecimal rate = MoneyBigDecimalUtil.mul(per, new BigDecimal(4 - i), 4);
                rateList.add(new UserTeamRate(vipList.get(i), rate));
            }
        }
        // 导师分红
        for (UserTeamLevel level : bossLevelList) {
            if (level.getLevel() == UserLevelEnum.tearcher) {
                rateList.add(new UserTeamRate(level,
                        hongBaoManageService.getByKeyAndMaxTime("dividents_rate_tearcher", date.getTime(),system)));
                break;
            }
        }
        return rateList;
    }
    @Override
    public UserTeamRate getTearcherSubsidy(UserLevelEnum buyerLevel, BigDecimal money,
                                           List<UserTeamLevel> bossLevelList, Date date,SystemEnum system) {
        // TODO Auto-generated method stub
        return null;
    }
    private BigDecimal getFanliRate(Date time, UserLevelEnum userLevel,SystemEnum system) {
        BigDecimal rate = hongBaoManageService
                .getBaseFanliRateCache(TimeUtil
                        .convertToTimeTemp(TimeUtil.getGernalTime(time.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"),system)
                .add(getOfficialSubsidyRate(time, getCommonUserLevel(time, userLevel), false,system));
        if (userLevel == UserLevelEnum.normalVIP)
            rate = new BigDecimal("61");
        return rate;
    }
    @Override
    public ConfigParamsDTO getShowComputeRate(String platform, String version, UserLevelEnum userLevel,SystemEnum system) {
        BigDecimal fanLiRate = getFanliRate(new Date(), userLevel,system);
        BigDecimal shareRate = fanLiRate;
        ConfigParamsDTO paramsDTO = new ConfigParamsDTO(fanLiRate, shareRate, Constant.MAX_REWARD_RATE,
                getFanliRate(new Date(), UserLevelEnum.superVIP,system));
        if (VersionUtil.greaterThan_2_0_5(platform, version)) {
            paramsDTO.setMaxRewardRate(null);
        }
        return paramsDTO;
    }
    @Override
    public ConfigParamsDTO getShowComputeRate(String platform, String version,SystemEnum system) {
        return getShowComputeRate(platform, version, UserLevelEnum.daRen,system);
    }
    @Override
    public BigDecimal getFanliRate(UserLevelEnum userLevel, Date date,SystemEnum system) {
        BigDecimal rate = hongBaoManageService.getBaseFanliRate(date.getTime(),system)
                .add(getOfficialSubsidyRate(date, getCommonUserLevel(date, userLevel), false,system));
        return rate;
    }
}
package com.yeshi.fanli.service.impl.order;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.lijin.manager.UserLijinMnager;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import org.springframework.stereotype.Service;
import com.yeshi.fanli.dto.GoodsMoneyConfigParamsDTO;
import com.yeshi.fanli.dto.order.UserTeamLevel;
import com.yeshi.fanli.dto.order.UserTeamRate;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.util.Constant;
import org.yeshi.utils.MoneyBigDecimalUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.VersionUtil;
import com.yeshi.fanli.util.user.UserLevelUtil;
@Service
public class OrderHongBaoMoneyComputeServiceImpl implements OrderHongBaoMoneyComputeService {
    @Resource
    private HongBaoManageService hongBaoManageService;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private UserLijinMnager userLijinMnager;
    @Override
    public BigDecimal computeBaseFanliMoney(CommonOrder order) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        return getBaseCommission(order, system);
    }
    @Override
    public BigDecimal computeBaseShareMoney(CommonOrder order) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        return getBaseCommission(order, system);
    }
    private UserLevelEnum getCommonUserLevel(Date time, UserLevelEnum userLevel) {
        if (userLevel == null)
            return UserLevelEnum.daRen;
        if (time.getTime() < Constant.NEW_ORDER_FANLI_RULE_TIME)
            return UserLevelUtil.getOldLevel(userLevel);
        else
            return userLevel;
    }
    // 获取基础佣金
    private BigDecimal getBaseCommission(CommonOrder order, SystemEnum system) {
        BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime(), system);
        if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
        else if (order.getEstimate() != null)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        else
            return null;
    }
    @Override
    public BigDecimal computeFanliMoney(CommonOrder order, UserLevelEnum userLevel) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        BigDecimal rate = null;
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            rate = userLijinMnager.getUserFanliRate(order.getUserInfo().getId(), order.getThirdCreateTime());
        } else {
            rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime(), system)
                    .add(getOfficialSubsidyRate(order.getThirdCreateTime(),
                            getCommonUserLevel(order.getThirdCreateTime(), userLevel), false, system));
            if (userLevel == UserLevelEnum.normalVIP) {
                rate = new BigDecimal("61");
            }
        }
        if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
        else if (order.getEstimate() != null)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        else
            return null;
    }
    @Override
    public BigDecimal computeShareMoney(CommonOrder order, UserLevelEnum userLevel) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return new BigDecimal(0);
        }
        BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime(), system)
                .add(getOfficialSubsidyRate(order.getThirdCreateTime(),
                        getCommonUserLevel(order.getThirdCreateTime(), userLevel), true, system));
        if (userLevel == UserLevelEnum.normalVIP) {
            rate = new BigDecimal("61");
        }
        if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
        else if (order.getEstimate() != null)
            return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        else
            return null;
    }
    @Override
    public BigDecimal computeFirstInviteMoney(CommonOrder order, UserLevelEnum buyer,
                                              List<UserTeamLevel> bossLevelList) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return new BigDecimal(0);
        }
        BigDecimal rate = null;
        if (order.getThirdCreateTime().getTime() >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
            rate = getTeamRewardRate(buyer, bossLevelList, order.getThirdCreateTime(), 1, system).getRate();
            if (rate == null)
                return null;
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        } else {// 老的返利比例
            rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_6", order.getThirdCreateTime().getTime(), system);
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order, system)),
                        new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order, system)),
                        new BigDecimal(100));
        }
        return null;
    }
    @Override
    public BigDecimal computeSecondInviteMoney(CommonOrder order, UserLevelEnum buyer,
                                               List<UserTeamLevel> bossLevelList) {
        SystemEnum system = userInfoService.getUserSystem(order.getUserInfo().getId());
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return new BigDecimal(0);
        }
        BigDecimal rate = null;
        if (order.getThirdCreateTime().getTime() >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
            UserTeamRate teamRate = getTeamRewardRate(buyer, bossLevelList, order.getThirdCreateTime(), 2, system);
            if (teamRate != null) {
                rate = teamRate.getRate();
            }
            if (rate == null)
                return null;
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
        } else {// 老的返利比例
            rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_7", order.getThirdCreateTime().getTime(), system);
            if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order, system)),
                        new BigDecimal(100));
            else if (order.getEstimate() != null)
                return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order, system)),
                        new BigDecimal(100));
        }
        return null;
    }
    /**
     * 获取官方补贴比例
     *
     * @param date
     * @param userLevel
     * @param share
     * @return BigDecimal 返回类型
     * @throws
     * @Title: getOfficialSubsidyRate
     * @Description:
     */
    private BigDecimal getOfficialSubsidyRate(Date date, UserLevelEnum userLevel, boolean share, SystemEnum system) {
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return new BigDecimal(0);
        }
        String key = null;
        if (share)
            key = String.format("official_subsidy_share_%s", userLevel.getLevel());
        else
            key = String.format("official_subsidy_zigou_%s", userLevel.getLevel());
        BigDecimal rate = null;
        if (date != null)
            rate = hongBaoManageService.getByKeyAndMaxTimeCache(key, TimeUtil
                    .convertToTimeTemp(TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"), system);
        else
            rate = new BigDecimal(hongBaoManageService.get(key, system));
        return rate;
    }
    private BigDecimal getRateByLevel(UserLevelEnum level, Date date, SystemEnum system) {
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return new BigDecimal(0);
        }
        BigDecimal baseRate = hongBaoManageService.getBaseFanliRateCache(
                TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"), system);
        BigDecimal subsidyRate = getOfficialSubsidyRate(date, level, false, system);
        return baseRate.add(subsidyRate);
    }
    @Override
    public UserTeamRate getTeamRewardRate(UserLevelEnum buyerLevel, List<UserTeamLevel> bossLevelList, Date date,
                                          int deep, SystemEnum system) {
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return null;
        }
        if (deep == 1) {// 直接邀请人奖金
            UserTeamLevel boss = bossLevelList.get(0);
            BigDecimal rate = null;
            if (bossLevelList == null || bossLevelList.size() < 1)
                return null;
            if (buyerLevel == UserLevelEnum.daRen && boss.getLevel() == UserLevelEnum.daRen) {
                rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_6", date.getTime(), system);
            } else if (buyerLevel == UserLevelEnum.normalVIP && boss.getLevel() == UserLevelEnum.normalVIP) {
                rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_6", date.getTime(), system);
            } else {
                BigDecimal bossRate = getRateByLevel(boss.getLevel(), date, system);
                BigDecimal buyerRate = getRateByLevel(buyerLevel, date, system);
                rate = bossRate.subtract(buyerRate);
                if (rate.compareTo(new BigDecimal(0)) < 0)
                    rate = new BigDecimal(0);
            }
            return new UserTeamRate(boss.getUid(), boss.getLevel(), rate);
        } else if (deep == 2) {// 间接邀请人奖金
            if (bossLevelList == null || bossLevelList.size() < 2)
                return null;
            BigDecimal buyerRate = getRateByLevel(buyerLevel, date, system);
            BigDecimal firstRate = getTeamRewardRate(buyerLevel, bossLevelList, date, 1, system).getRate();
            UserTeamLevel boss = bossLevelList.get(1);
            UserTeamLevel firstBoss = bossLevelList.get(0);
            BigDecimal rate = null;
            if (buyerLevel == UserLevelEnum.daRen && firstBoss.getLevel() == UserLevelEnum.daRen) {
                if (boss.getLevel() == UserLevelEnum.daRen)
                    rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_7", date.getTime(), system);
                else {
                    rate = null;
                }
            } else if (buyerLevel == UserLevelEnum.normalVIP && firstBoss.getLevel() == UserLevelEnum.normalVIP) {
                if (boss.getLevel() == UserLevelEnum.normalVIP)
                    rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_7", date.getTime(), system);
                else {
                    rate = null;
                }
            } else if (buyerLevel == UserLevelEnum.daRen && firstBoss.getLevel() == UserLevelEnum.normalVIP) {
                if (boss.getLevel() == UserLevelEnum.normalVIP)
                    rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_7", date.getTime(), system);
                else {
                    rate = null;
                }
            }
            // 极差计算法
            if (rate == null) {
                rate = getRateByLevel(boss.getLevel(), date, system).subtract(buyerRate).subtract(firstRate);
                if (rate.compareTo(new BigDecimal(0)) < 0)
                    rate = new BigDecimal(0);
            }
            return new UserTeamRate(boss.getUid(), boss.getLevel(), rate);
        } else
            return null;
    }
    @Override
    public List<UserTeamRate> getTeamRewardMoreThan2LevelRates(UserLevelEnum buyerLevel,
                                                               List<UserTeamLevel> bossLevelList, Date date, SystemEnum system) {
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return null;
        }
        if (bossLevelList == null || bossLevelList.size() < 3)
            return null;
        UserTeamRate firstBoss = getTeamRewardRate(buyerLevel, bossLevelList, date, 1, system);
        if (firstBoss == null)
            return null;
        UserTeamRate secondBoss = getTeamRewardRate(buyerLevel, bossLevelList, date, 2, system);
        if (secondBoss == null)
            return null;
        BigDecimal buyerRate = getRateByLevel(buyerLevel, date, system);
        BigDecimal totalRate = firstBoss.getRate().add(secondBoss.getRate()).add(buyerRate);
        List<UserTeamRate> rateList = new ArrayList<>();
        for (int i = 2; i < bossLevelList.size(); i++) {
            BigDecimal rate = getRateByLevel(bossLevelList.get(i).getLevel(), date, system);
            if (rate.compareTo(totalRate) > 0) {
                BigDecimal subRate = rate.subtract(totalRate);
                totalRate = subRate.add(totalRate);// 累计分成比例
                rateList.add(new UserTeamRate(bossLevelList.get(i).getUid(), bossLevelList.get(i).getLevel(), subRate));
            }
        }
        return rateList;
    }
    // 团队分红
    @Override
    public List<UserTeamRate> getTeamDividentsRates(UserLevelEnum buyerLevel, List<UserTeamLevel> bossLevelList,
                                                    Date date, SystemEnum system) {
        if (system == SystemEnum.yhqjx || system == SystemEnum.hsb) {
            return null;
        }
        List<UserTeamRate> rateList = new ArrayList<>();
        List<UserTeamLevel> levelList = new ArrayList<>();
        levelList.add(new UserTeamLevel(null, buyerLevel));
        levelList.addAll(bossLevelList);
        UserLevelEnum maxLevel = buyerLevel;
        List<UserTeamLevel> vipList = new ArrayList<>();
        List<UserTeamLevel> highList = new ArrayList<>();
        for (int i = 1; i < levelList.size(); i++) {
            if (maxLevel.getLevel() <= levelList.get(i).getLevel().getLevel()) {
                maxLevel = levelList.get(i).getLevel();
                if (levelList.get(i).getLevel() == UserLevelEnum.highVIP)
                    highList.add(levelList.get(i));
                else if (levelList.get(i).getLevel() == UserLevelEnum.superVIP) {
                    vipList.add(levelList.get(i));
                }
            }
        }
        if (vipList.size() >= 4) {// 最多分4级
            vipList = vipList.subList(0, 4);
        }
        if (highList.size() >= 4) {// 最多分4级
            highList = highList.subList(0, 4);
        }
        BigDecimal highTotalRate = hongBaoManageService.getByKeyAndMaxTime("dividents_rate_same_level_high",
                date.getTime(), system);
        BigDecimal vipTotalRate = hongBaoManageService.getByKeyAndMaxTime("dividents_rate_same_level_super",
                date.getTime(), system);
        if (vipList.size() > 0 && highList.size() > 0) {
        } else if (vipList.size() == 0) {
            highTotalRate = highTotalRate.add(vipTotalRate);
        } else {
            vipTotalRate = highTotalRate.add(vipTotalRate);
        }
        // 高级会员分红
        if (highList.size() > 0) {
            int count = 0;
            for (int i = 0; i < highList.size(); i++) {
                count += (4 - i);
            }
            BigDecimal per = MoneyBigDecimalUtil.div(highTotalRate, new BigDecimal(count), 4);
            for (int i = 0; i < highList.size(); i++) {
                BigDecimal rate = MoneyBigDecimalUtil.mul(per, new BigDecimal(4 - i), 4);
                rateList.add(new UserTeamRate(highList.get(i), rate));
            }
        }
        // 超级会员分红
        if (vipList.size() > 0) {
            int count = 0;
            for (int i = 0; i < vipList.size(); i++) {
                count += (4 - i);
            }
            BigDecimal per = MoneyBigDecimalUtil.div(vipTotalRate, new BigDecimal(count), 4);
            for (int i = 0; i < vipList.size(); i++) {
                BigDecimal rate = MoneyBigDecimalUtil.mul(per, new BigDecimal(4 - i), 4);
                rateList.add(new UserTeamRate(vipList.get(i), rate));
            }
        }
        // 导师分红
        for (UserTeamLevel level : bossLevelList) {
            if (level.getLevel() == UserLevelEnum.tearcher) {
                rateList.add(new UserTeamRate(level,
                        hongBaoManageService.getByKeyAndMaxTime("dividents_rate_tearcher", date.getTime(), system)));
                break;
            }
        }
        return rateList;
    }
    @Override
    public UserTeamRate getTearcherSubsidy(UserLevelEnum buyerLevel, BigDecimal money,
                                           List<UserTeamLevel> bossLevelList, Date date, SystemEnum system) {
        // TODO Auto-generated method stub
        return null;
    }
    private BigDecimal getFanliRate(Date time, UserLevelEnum userLevel, SystemEnum system) {
        BigDecimal rate = hongBaoManageService
                .getBaseFanliRateCache(TimeUtil
                        .convertToTimeTemp(TimeUtil.getGernalTime(time.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"), system)
                .add(getOfficialSubsidyRate(time, getCommonUserLevel(time, userLevel), false, system));
        if (userLevel == UserLevelEnum.normalVIP)
            rate = new BigDecimal("61");
        return rate;
    }
    @Override
    public GoodsMoneyConfigParamsDTO getShowComputeRate(String platform, String version, UserLevelEnum userLevel, SystemEnum system) {
        BigDecimal fanLiRate = getFanliRate(new Date(), userLevel, system);
        BigDecimal shareRate = fanLiRate;
        GoodsMoneyConfigParamsDTO paramsDTO = new GoodsMoneyConfigParamsDTO(fanLiRate, shareRate, Constant.MAX_REWARD_RATE,
                getFanliRate(new Date(), UserLevelEnum.superVIP, system));
        if (VersionUtil.greaterThan_2_0_5(platform, version)) {
            paramsDTO.setMaxRewardRate(null);
        }
        return paramsDTO;
    }
    @Override
    public GoodsMoneyConfigParamsDTO getShowComputeRate(String platform, String version, SystemEnum system) {
        return getShowComputeRate(platform, version, UserLevelEnum.daRen, system);
    }
    @Override
    public BigDecimal getFanliRate(UserLevelEnum userLevel, Date date, SystemEnum system) {
        BigDecimal rate = hongBaoManageService.getBaseFanliRate(date.getTime(), system)
                .add(getOfficialSubsidyRate(date, getCommonUserLevel(date, userLevel), false, system));
        return rate;
    }
}