yujian
2020-04-15 f301c983314494841e54aa0cd87d01a4bdc72d16
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderHongBaoMoneyComputeServiceImpl.java
@@ -11,7 +11,9 @@
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.user.UserLevelUtil;
@Service
public class OrderHongBaoMoneyComputeServiceImpl implements OrderHongBaoMoneyComputeService {
@@ -29,33 +31,58 @@
      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;
      if (order.getThirdCreateTime().getTime() >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
         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;
      } else {
         BigDecimal rate = hongBaoManageService.getFanLiRate(UserLevelEnum.daRen,
               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(), userLevel, false));
            .add(getOfficialSubsidyRate(order.getThirdCreateTime(),
                  getCommonUserLevel(order.getThirdCreateTime(), userLevel), false));
      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(), userLevel, true));
            .add(getOfficialSubsidyRate(order.getThirdCreateTime(),
                  getCommonUserLevel(order.getThirdCreateTime(), userLevel), true));
      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)
@@ -66,32 +93,35 @@
   @Override
   public BigDecimal computeFirstInviteMoney(CommonOrder order, UserLevelEnum buyer) {
      if (buyer == UserLevelEnum.superVIP) {
         BigDecimal rate = hongBaoManageService.getByKeyAndMaxTime("new_share_vip_21",
               order.getThirdCreateTime().getTime());
         BigDecimal fanLiMoney = computeFanliMoney(order, buyer);
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, fanLiMoney), new BigDecimal(100));
      }
      BigDecimal rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_6", order.getThirdCreateTime().getTime());
      if (buyer == UserLevelEnum.superVIP || buyer == UserLevelEnum.tearcher)
         rate = hongBaoManageService.getByKeyAndMaxTime("new_invite_vip_6", order.getThirdCreateTime().getTime());
      if (rate.compareTo(new BigDecimal(0)) == 0)
         return null;
      if (order.getState() == CommonOrder.STATE_JS || order.getState() == CommonOrder.STATE_WQ)
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.geteIncome()), new BigDecimal(100));
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
               new BigDecimal(100));
      else if (order.getEstimate() != null)
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
               new BigDecimal(100));
      else
         return null;
   }
   @Override
   public BigDecimal computeSecondInviteMoney(CommonOrder order, UserLevelEnum buyer) {
      if (buyer == UserLevelEnum.superVIP)
      if (buyer == UserLevelEnum.superVIP || buyer == UserLevelEnum.tearcher)
         return null;
      BigDecimal 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, order.geteIncome()), new BigDecimal(100));
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
               new BigDecimal(100));
      else if (order.getEstimate() != null)
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100));
         return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, getBaseCommission(order)),
               new BigDecimal(100));
      else
         return null;
   }
@@ -100,7 +130,7 @@
   public BigDecimal computeFirstTeamSubsidy(BigDecimal fanLiMoney, Date placeOrderTime, UserLevelEnum buyerUserLevel,
         UserLevelEnum userLevel) {
      BigDecimal rate = getTeamSubsidyRate(placeOrderTime, buyerUserLevel, userLevel, true);
      if (rate == null)
      if (rate == null || rate.compareTo(new BigDecimal(0)) == 0)
         return null;
      BigDecimal baseRate = hongBaoManageService.getBaseFanliRate(placeOrderTime.getTime());
      BigDecimal officialSubsidyRate = getOfficialSubsidyRate(placeOrderTime, buyerUserLevel, false);
@@ -112,51 +142,12 @@
   public BigDecimal computeSecondTeamSubsidy(BigDecimal fanLiMoney, Date placeOrderTime, UserLevelEnum buyerUserLevel,
         UserLevelEnum userLevel) {
      BigDecimal rate = getTeamSubsidyRate(placeOrderTime, buyerUserLevel, userLevel, false);
      if (rate == null)
      if (rate == null || rate.compareTo(new BigDecimal(0)) == 0)
         return null;
      BigDecimal baseRate = hongBaoManageService.getBaseFanliRate(placeOrderTime.getTime());
      BigDecimal officialSubsidyRate = getOfficialSubsidyRate(placeOrderTime, buyerUserLevel, false);
      return MoneyBigDecimalUtil.div(fanLiMoney.multiply(baseRate).multiply(rate),
            baseRate.add(officialSubsidyRate).multiply(new BigDecimal(100)));
   }
   @Override
   public BigDecimal computeFirstTeamReward(BigDecimal money, Date placeOrderTime, UserLevelEnum userLevel) {
      if (userLevel != UserLevelEnum.superVIP)
         return null;
      BigDecimal firstRate = getTeamRewardRate(placeOrderTime, userLevel, true);
      if (firstRate == null)
         return null;
      BigDecimal reward = MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(firstRate, money), new BigDecimal(100));
      return reward;
   }
   /**
    * 计算二级团队奖励
    * @Title: computeSecondTeamReward
    * @Description:
    * @param secondTeamSubsidy 购买者上两级团队补贴
    * @param userLevel 当前用户的等级
    * @return
    * BigDecimal 返回类型
    * @throws
    */
   public BigDecimal computeSecondTeamReward(BigDecimal secondTeamSubsidy, Date placeOrderTime,
         UserLevelEnum userLevel) {
      if (userLevel != UserLevelEnum.superVIP)
         return null;
      // 获取奖励比例
      BigDecimal secondRate = getTeamRewardRate(placeOrderTime, userLevel, false);
      if (secondRate == null)
         return null;
      BigDecimal secondReward = MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(secondRate, secondTeamSubsidy),
            new BigDecimal(100));
      return secondReward;
   }
   /**
@@ -170,10 +161,11 @@
    * BigDecimal 返回类型
    * @throws
    */
   private BigDecimal getTeamSubsidyRate(Date date, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel,
         boolean first) {
   @Override
   public BigDecimal getTeamSubsidyRate(Date date, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel,
         boolean direct) {
      String key = null;
      if (first)
      if (direct)
         key = String.format("team_subsidy_6_pre_%s_%s", buyerUserLevel.getLevel(), userLevel.getLevel());
      else
         key = String.format("team_subsidy_7_pre_%s_%s", buyerUserLevel.getLevel(), userLevel.getLevel());
@@ -202,36 +194,6 @@
         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.getByKeyAndMaxTime(key, date.getTime());
      else
         rate = new BigDecimal(hongBaoManageService.get(key));
      return rate;
   }
   /**
    * 获取团队奖励比例
    * @Title: getTeamRewardRate
    * @Description:
    * @param date
    * @param userLevel
    * @param first
    * @return
    * BigDecimal 返回类型
    * @throws
    */
   private BigDecimal getTeamRewardRate(Date date, UserLevelEnum userLevel, boolean first) {
      if (userLevel == null)
         return null;
      if (userLevel != UserLevelEnum.superVIP)
         return new BigDecimal(0);
      String key = null;
      if (first)
         key = "team_reward_6_10";
      else
         key = "team_reward_7_10";
      BigDecimal rate = null;
      if (date != null)
         rate = hongBaoManageService.getByKeyAndMaxTime(key, date.getTime());