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 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 com.yeshi.fanli.util.MoneyBigDecimalUtil;
|
import com.yeshi.fanli.util.TimeUtil;
|
import com.yeshi.fanli.util.VersionUtil;
|
import com.yeshi.fanli.util.user.UserLevelUtil;
|
|
@Service
|
public class OrderHongBaoMoneyComputeServiceImpl implements OrderHongBaoMoneyComputeService {
|
|
@Resource
|
private HongBaoManageService hongBaoManageService;
|
|
@Override
|
public BigDecimal computeBaseFanliMoney(CommonOrder order) {
|
return getBaseCommission(order);
|
}
|
|
@Override
|
public BigDecimal computeBaseShareMoney(CommonOrder order) {
|
return getBaseCommission(order);
|
}
|
|
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) {
|
BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime());
|
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) {
|
|
BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime())
|
.add(getOfficialSubsidyRate(order.getThirdCreateTime(),
|
getCommonUserLevel(order.getThirdCreateTime(), userLevel), false));
|
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) {
|
BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime())
|
.add(getOfficialSubsidyRate(order.getThirdCreateTime(),
|
getCommonUserLevel(order.getThirdCreateTime(), userLevel), true));
|
|
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) {
|
BigDecimal rate = null;
|
if (order.getThirdCreateTime().getTime() >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
|
rate = getTeamRewardRate(buyer, bossLevelList, order.getThirdCreateTime(), 1).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());
|
if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
|
return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
|
new BigDecimal(100));
|
else if (order.getEstimate() != null)
|
return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
|
new BigDecimal(100));
|
}
|
|
return null;
|
}
|
|
@Override
|
public BigDecimal computeSecondInviteMoney(CommonOrder order, UserLevelEnum buyer,
|
List<UserTeamLevel> bossLevelList) {
|
BigDecimal rate = null;
|
if (order.getThirdCreateTime().getTime() >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
|
rate = getTeamRewardRate(buyer, bossLevelList, order.getThirdCreateTime(), 2).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());
|
if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
|
return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
|
new BigDecimal(100));
|
else if (order.getEstimate() != null)
|
return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
|
new BigDecimal(100));
|
}
|
|
return null;
|
}
|
|
/**
|
* 获取官方补贴比例
|
* @Title: getOfficialSubsidyRate
|
* @Description:
|
* @param date
|
* @param userLevel
|
* @param share
|
* @return
|
* BigDecimal 返回类型
|
* @throws
|
*/
|
private BigDecimal getOfficialSubsidyRate(Date date, UserLevelEnum userLevel, boolean share) {
|
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"));
|
else
|
rate = new BigDecimal(hongBaoManageService.get(key));
|
return rate;
|
}
|
|
private BigDecimal getRateByLevel(UserLevelEnum level, Date date) {
|
BigDecimal baseRate = hongBaoManageService.getBaseFanliRateCache(
|
TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"));
|
|
BigDecimal subsidyRate = getOfficialSubsidyRate(date, level, false);
|
|
return baseRate.add(subsidyRate);
|
}
|
|
@Override
|
public UserTeamRate getTeamRewardRate(UserLevelEnum buyerLevel, List<UserTeamLevel> bossLevelList, Date date,
|
int deep) {
|
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());
|
} else if (buyerLevel == UserLevelEnum.normalVIP && boss.getLevel() == UserLevelEnum.normalVIP) {
|
rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_daren_6", date.getTime());
|
} else {
|
BigDecimal bossRate = getRateByLevel(boss.getLevel(), date);
|
BigDecimal buyerRate = getRateByLevel(buyerLevel, date);
|
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);
|
BigDecimal firstRate = getTeamRewardRate(buyerLevel, bossLevelList, date, 1).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());
|
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());
|
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());
|
else {
|
rate = null;
|
}
|
}
|
// 极差计算法
|
if (rate == null) {
|
rate = getRateByLevel(boss.getLevel(), date).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) {
|
if (bossLevelList == null || bossLevelList.size() < 3)
|
return null;
|
|
UserTeamRate firstBoss = getTeamRewardRate(buyerLevel, bossLevelList, date, 1);
|
if (firstBoss == null)
|
return null;
|
UserTeamRate secondBoss = getTeamRewardRate(buyerLevel, bossLevelList, date, 2);
|
if (secondBoss == null)
|
return null;
|
|
BigDecimal buyerRate = getRateByLevel(buyerLevel, date);
|
|
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);
|
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) {
|
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());
|
BigDecimal vipTotalRate = hongBaoManageService.getByKeyAndMaxTime("dividents_rate_same_level_super",
|
date.getTime());
|
|
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())));
|
break;
|
}
|
}
|
|
return rateList;
|
}
|
|
@Override
|
public UserTeamRate getTearcherSubsidy(UserLevelEnum buyerLevel, BigDecimal money,
|
List<UserTeamLevel> bossLevelList, Date date) {
|
// TODO Auto-generated method stub
|
return null;
|
}
|
|
private BigDecimal getFanliRate(Date time, UserLevelEnum userLevel) {
|
BigDecimal rate = hongBaoManageService
|
.getBaseFanliRateCache(TimeUtil
|
.convertToTimeTemp(TimeUtil.getGernalTime(time.getTime(), "yyyy-MM-dd HH"), "yyyy-MM-dd HH"))
|
.add(getOfficialSubsidyRate(time, getCommonUserLevel(time, userLevel), false));
|
|
if (userLevel == UserLevelEnum.normalVIP)
|
rate = new BigDecimal("61");
|
return rate;
|
}
|
|
@Override
|
public ConfigParamsDTO getShowComputeRate(String platform, String version, UserLevelEnum userLevel) {
|
BigDecimal fanLiRate = getFanliRate(new Date(), userLevel);
|
BigDecimal shareRate = fanLiRate;
|
ConfigParamsDTO paramsDTO = new ConfigParamsDTO(fanLiRate, shareRate, Constant.MAX_REWARD_RATE,
|
getFanliRate(new Date(), UserLevelEnum.superVIP));
|
if (VersionUtil.greaterThan_2_0_5(platform, version)) {
|
paramsDTO.setMaxRewardRate(null);
|
}
|
return paramsDTO;
|
}
|
|
@Override
|
public ConfigParamsDTO getShowComputeRate(String platform, String version) {
|
return getShowComputeRate(platform, version, UserLevelEnum.daRen);
|
}
|
|
@Override
|
public BigDecimal getFanliRate(UserLevelEnum userLevel, Date date) {
|
BigDecimal rate = hongBaoManageService.getBaseFanliRate(date.getTime())
|
.add(getOfficialSubsidyRate(date, getCommonUserLevel(date, userLevel), false));
|
return rate;
|
}
|
|
}
|