admin
2020-05-20 98b1a0affd69bbe63223c21fdd2c404e8bedfccb
fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java
@@ -13,34 +13,27 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.vip.TeamUserLevelStatistic;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsDebt;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsRecord;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrder;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceOrderUserMap;
import com.yeshi.fanli.entity.order.dividents.TeamDividentsSourceUser;
import com.yeshi.fanli.exception.ParamsException;
import com.yeshi.fanli.exception.money.TeamDividentsDebtException;
import com.yeshi.fanli.exception.money.TeamEincomeRecordException;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.exception.order.dividents.TeamDividentsRecordException;
import com.yeshi.fanli.exception.order.dividents.TeamDividentsSourceOrderException;
import com.yeshi.fanli.service.inter.money.TeamDividentsDebtService;
import com.yeshi.fanli.service.inter.money.UserMoneyService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsRecordService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceOrderUserMapService;
import com.yeshi.fanli.service.inter.order.dividents.TeamDividentsSourceUserService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.vip.TeamUserLevelStatisticService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.service.manger.money.TeamEincomeManager;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
import com.yeshi.fanli.util.factory.order.dividents.TeamDividentsSourceOrderFactory;
import com.yeshi.fanli.util.user.UserLevelUtil;
/**
 * 团队分红管理
@@ -51,7 +44,13 @@
public class TeamDividentsManager {
   @Resource
   private TeamDividentsSourceManager teamDividentsSourceManager;
   @Resource
   private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
   @Resource
   private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
   @Resource
   private TeamDividentsSourceUserService teamDividentsSourceUserService;
@@ -74,21 +73,8 @@
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Transactional(rollbackFor = Exception.class)
   public void addDividentsSourceOrder(List<CommonOrder> commonOrderList) throws TeamDividentsSourceOrderException {
      UserLevelEnum level = UserLevelUtil.getByOrderRank(commonOrderList.get(0).getUrank());
      if (level == null)
         level = UserLevelEnum.daRen;
      BigDecimal rate = getSourceOrderDividentsRate(level);
      TeamDividentsSourceOrder order = TeamDividentsSourceOrderFactory.create(commonOrderList, rate);
      try {
         teamDividentsSourceOrderService.addTeamDividentsSourceOrder(order);
      } catch (TeamDividentsSourceOrderException e) {
         e.printStackTrace();
      } catch (ParamsException e) {
         e.printStackTrace();
      }
   }
   @Resource
   private TeamEincomeManager teamEincomeManager;
   /**
    *  开始分红
@@ -105,91 +91,38 @@
      startDividents(sourceUid, preSendTime);
   }
   // 是否可以分红
   private boolean isCanDividents(TeamUserLevelStatistic tus) {
      if (Constant.IS_TEST)
         return true;
      if (tus != null && (tus.getLevel() == UserLevelEnum.highVIP || tus.getLevel() == UserLevelEnum.superVIP
            || tus.getLevel() == UserLevelEnum.tearcher)) {
         if (tus.getLevel() == UserLevelEnum.highVIP) {
            int vipFirstCount = tus.getNormalFirstCount() + tus.getHighFirstCount() + tus.getSuperFirstCount()
                  + tus.getTearcherFirstCount();
            if (vipFirstCount >= 3)// 直接粉丝普通会员等级以上的用户>=3
               return true;
         } else if (tus.getLevel() == UserLevelEnum.superVIP) {
            int firstCount = tus.getSuperFirstCount() + tus.getTearcherFirstCount();
            int secondCount = tus.getNormalSecondCount() + tus.getHighSecondCount() + tus.getSuperSecondCount()
                  + tus.getTearcherSecondCount();
            if (firstCount >= 3 && secondCount >= 3) {// 直接粉丝超级会员等级以上的用户>=3
                                             // 间接粉丝普通会员以上等级>=3
               return true;
            }
         } else {
            int firstCount = tus.getSuperFirstCount() + tus.getTearcherFirstCount();
            int secondCount = tus.getHighSecondCount() + tus.getSuperSecondCount() + tus.getTearcherSecondCount();
            if (firstCount >= 3 && secondCount >= 3) {// 直接粉丝超级会员等级以上的用户>=3
                                             // 间接粉丝高级会员以上等级>=3
               return true;
            }
         }
      }
      return false;
   }
   @Transactional(rollbackFor = Exception.class)
   public void startDividents(Long sourceUid, Date preSendTime) throws ParamsException {
      String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
      // 查询出可用于分红的用户的总金额
      long count = teamDividentsSourceOrderService.countCanSendByUidAndPreSendTime(sourceUid, preSendTime);
      long count = teamDividentsSourceOrderUserMapService.countCanSend(sourceUid, preSendTime);
      int pageSize = 1000;
      int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      List<TeamDividentsSourceOrder> totalList = new ArrayList<>();
      List<TeamDividentsSourceOrderUserMap> totalList = new ArrayList<>();
      for (int p = 0; p < page; p++) {
         List<TeamDividentsSourceOrder> list = teamDividentsSourceOrderService
               .listCanSendByUidAndPreSendTime(sourceUid, preSendTime, p + 1, pageSize);
         List<TeamDividentsSourceOrderUserMap> list = teamDividentsSourceOrderUserMapService.listCanSend(sourceUid,
               preSendTime, p + 1, pageSize);
         if (list != null && list.size() > 0)
            totalList.addAll(list);
      }
      BigDecimal totalMoney = new BigDecimal(0);
      Map<Long, BigDecimal> moneyMap = new HashMap<>();
      for (TeamDividentsSourceOrder order : totalList) {
         TeamDividentsSourceOrder sourceOrder = teamDividentsSourceOrderService
      for (TeamDividentsSourceOrderUserMap order : totalList) {
         TeamDividentsSourceOrderUserMap map = teamDividentsSourceOrderUserMapService
               .selectByPrimaryKeyForUpdate(order.getId());
         if (sourceOrder != null && sourceOrder.getState() == TeamDividentsSourceOrder.STATE_CAN_SEND) {
            totalMoney = totalMoney.add(sourceOrder.getMoney());
            teamDividentsSourceOrderService.send(sourceOrder.getId());
         if (map != null && map.getState() == TeamDividentsSourceOrderUserMap.STATE_JS) {
            // 计算分红对应的资金
            if (moneyMap.get(map.getTargetUid()) == null)
               moneyMap.put(map.getTargetUid(), new BigDecimal(0));
            moneyMap.put(map.getTargetUid(), moneyMap.get(map.getTargetUid()).add(map.getMoney()));
            teamDividentsSourceOrderUserMapService.send(map.getId());
         }
      }
      // 分红金额为0的不参与
      if (totalMoney.compareTo(new BigDecimal(0)) <= 0)
         return;
      // 查询出可以参与分红的用户
      List<ThreeSale> threeSalesList = threeSaleSerivce.getMyBossDeepList(sourceUid);
      if (threeSalesList == null)
         return;
      Map<Long, UserLevelEnum> uidLevel = new HashMap<Long, UserLevelEnum>();
      for (ThreeSale ts : threeSalesList) {
         if (ts.getBoss() != null) {
            TeamUserLevelStatistic tus = teamUserLevelStatisticService.selectByUid(ts.getBoss().getId());
            if (tus == null)
               teamUserLevelStatisticService.initData(ts.getBoss().getId());
            tus = teamUserLevelStatisticService.selectByUid(ts.getBoss().getId());
            if (isCanDividents(tus)) {
               uidLevel.put(tus.getId(), tus.getLevel());
            }
         }
      }
      BigDecimal perDivident = computePerDivident(uidLevel, totalMoney);
      for (Iterator<Long> its = uidLevel.keySet().iterator(); its.hasNext();) {
      for (Iterator<Long> its = moneyMap.keySet().iterator(); its.hasNext();) {
         Long uid = its.next();
         BigDecimal dividents = computeUserDivident(perDivident, uidLevel.get(uid));
         BigDecimal dividents = moneyMap.get(uid).setScale(2, BigDecimal.ROUND_DOWN);
         // 将资金分配到参与分红的用户
         TeamDividentsSourceUser teamDividentsSourceUser = new TeamDividentsSourceUser();
         teamDividentsSourceUser.setDay(day);
@@ -198,33 +131,6 @@
         teamDividentsSourceUser.setTargetUid(uid);
         teamDividentsSourceUserService.addTeamDividentsSourceUser(teamDividentsSourceUser);
      }
      // if (1 / 0 > 0)
      // return;
   }
   // 计算平均分红
   private BigDecimal computePerDivident(Map<Long, UserLevelEnum> uidLevels, BigDecimal totalMoney) {
      int count = 0;
      for (Iterator<Long> its = uidLevels.keySet().iterator(); its.hasNext();) {
         Long uid = its.next();
         if (uidLevels.get(uid) == UserLevelEnum.highVIP) {
            count += 1;
         } else if (uidLevels.get(uid) == UserLevelEnum.superVIP) {
            count += 2;
         }
      }
      return MoneyBigDecimalUtil.div(totalMoney, new BigDecimal(count));
   }
   private BigDecimal computeUserDivident(BigDecimal perDivident, UserLevelEnum userLevel) {
      if (userLevel == UserLevelEnum.highVIP) {
         return perDivident;
      } else if (userLevel == UserLevelEnum.superVIP) {
         return MoneyBigDecimalUtil.mul(perDivident, new BigDecimal(2));
      } else if (userLevel == UserLevelEnum.tearcher) {
         return MoneyBigDecimalUtil.mul(perDivident, new BigDecimal(2));
      }
      return null;
   }
   /**
@@ -237,7 +143,7 @@
    */
   public boolean isSourceUserComupteFinish(String day) {
      Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
      long count = teamDividentsSourceOrderService.countCanSendByUidAndPreSendTime(null, preSendTime);
      long count = teamDividentsSourceOrderUserMapService.countCanSend(null, preSendTime);
      return count == 0;
   }
@@ -253,11 +159,12 @@
    * @throws
    */
   @Transactional(rollbackFor = Exception.class)
   public void addDividents(Long uid, String day)
         throws TeamDividentsRecordException, TeamDividentsDebtException, UserMoneyDetailException, ParamsException {
   public void addToTeamEincome(Long uid, Date preSendTime) throws TeamDividentsRecordException,
         TeamDividentsDebtException, UserMoneyDetailException, ParamsException, TeamEincomeRecordException {
      String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
      BigDecimal money = teamDividentsSourceUserService.sumMoneyByUidAndDay(uid, day);
      // 查询需要扣除的资金
      List<TeamDividentsDebt> list = teamDividentsDebtService.listNeedRepayDebt(uid, 1, 1000);
      List<TeamDividentsDebt> list = teamDividentsDebtService.listNeedRepayDebt(uid, preSendTime, 1, 1000);
      for (TeamDividentsDebt debt : list) {
         if (money.subtract(debt.getLeftMoney()).compareTo(new BigDecimal(0)) >= 0) {// 还有钱还
            money = money.subtract(debt.getLeftMoney());
@@ -279,12 +186,8 @@
      // 有分红才显示资金明细
      if (money.compareTo(new BigDecimal(0)) > 0) {
         UserMoneyDetail detail = UserMoneyDetailFactory.createOrderTeamDividents(uid, money, new Date());
         // 增加资金
         userMoneyService.addUserMoney(uid, money, detail);
         // TODO 加入通知
         teamEincomeManager.addTeamDividents(uid, preSendTime, money);
      }
   }
   /**
@@ -301,58 +204,65 @@
   @Transactional(rollbackFor = Exception.class)
   public void weiQuan(String orderNo, int sourceType) throws TeamDividentsDebtException {
      // 查询订单是否已经分红
      TeamDividentsSourceOrder sourceOrder = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo,
            sourceType);
      if (sourceOrder == null)
         return;
      if (sourceOrder.getState() == TeamDividentsSourceOrder.STATE_INVALID)
      TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
      if (order == null)
         return;
      if (sourceOrder.getState() == TeamDividentsSourceOrder.STATE_ALREADY_SEND) {// 已经发送,需要参与分红的人分摊
         BigDecimal money = sourceOrder.getMoney();
         // 查询参与这一单分红的人
         String day = TimeUtil.getGernalTime(sourceOrder.getSendTime().getTime(), "yyyy-MM-dd");
         if (Constant.IS_TEST)
            day = TimeUtil.getGernalTime(sourceOrder.getPreSendTime().getTime(), "yyyy-MM-dd");
      List<TeamDividentsSourceOrderUserMap> mapList = teamDividentsSourceOrderUserMapService
            .listBySourceOrderId(order.getId());
      if (mapList == null || mapList.size() == 0)
         return;
         List<TeamDividentsSourceUser> list = teamDividentsSourceUserService
               .listBySourceUidAndDay(sourceOrder.getUid(), day);
         // 计算每个人的比例
         BigDecimal total = new BigDecimal(0);
         for (TeamDividentsSourceUser su : list) {
            total = total.add(su.getMoney());
      int state = mapList.get(0).getState();
      if (state == TeamDividentsSourceOrderUserMap.STATE_SX)
         return;
      if (state == TeamDividentsSourceOrderUserMap.STATE_YILINGQU) {// 已经发送,需要参与分红的人分摊
         // 按UID封装统计资金
         Map<Long, TeamDividentsSourceOrderUserMap> orderUserMap = new HashMap<>();
         for (TeamDividentsSourceOrderUserMap map : mapList) {
            if (orderUserMap.get(map.getTargetUid()) == null)
               orderUserMap.put(map.getTargetUid(), map);
            else {
               TeamDividentsSourceOrderUserMap oldMap = orderUserMap.get(map.getTargetUid());
               oldMap.setMoney(map.getMoney().add(oldMap.getMoney()));
               orderUserMap.put(map.getTargetUid(), oldMap);
            }
         }
         for (TeamDividentsSourceUser su : list) {
            BigDecimal debtMoney = MoneyBigDecimalUtil.divUp(money.multiply(su.getMoney()), total);
            // 需要偿还的资金
            TeamDividentsDebt debt = new TeamDividentsDebt();
            debt.setLeftMoney(debtMoney);
            debt.setOriginMoney(debtMoney);
            debt.setOrderNo(orderNo);
            debt.setSourceType(sourceType);
            debt.setUid(su.getTargetUid());
            // 加入待偿还记录
            teamDividentsDebtService.addDebt(debt);
         for (Iterator<Long> its = orderUserMap.keySet().iterator(); its.hasNext();) {
            Long uid = its.next();
            TeamDividentsSourceOrderUserMap map = orderUserMap.get(uid);
            String day = TimeUtil.getGernalTime(map.getPreSendTime().getTime(), "yyyy-MM-dd");
            // 查询本次总共的返利
            TeamDividentsSourceUser sourceUser = teamDividentsSourceUserService
                  .selectBySourceUidAndDayAndUid(map.getSourceUid(), map.getTargetUid(), day);
            if (sourceUser != null) {
               // 不能出现倒欠一分的情况
               BigDecimal debtMoney = map.getMoney().setScale(2, BigDecimal.ROUND_UP);
               if (debtMoney.compareTo(sourceUser.getMoney()) > 0)
                  debtMoney = sourceUser.getMoney();
               // 需要偿还的资金
               TeamDividentsDebt debt = new TeamDividentsDebt();
               debt.setLeftMoney(debtMoney);
               debt.setOriginMoney(debtMoney);
               debt.setOrderNo(orderNo);
               debt.setSourceType(sourceType);
               debt.setUid(map.getTargetUid());
               // 加入待偿还记录
               teamDividentsDebtService.addDebt(debt);
            }
         }
      } else if (sourceOrder.getState() == TeamDividentsSourceOrder.STATE_CAN_SEND) {
         teamDividentsSourceOrderService.invalidOrder(orderNo, sourceType, "订单维权");
      } else if (order.getState() == TeamDividentsSourceOrderUserMap.STATE_JS
            || order.getState() == TeamDividentsSourceOrderUserMap.STATE_FK) {
         teamDividentsSourceManager.invalidByOrder(orderNo, sourceType, "订单维权");
      }
   }
   /**
    * 获取源订单需要参与分红的比例
    * @Title: getSourceOrderDividentsRate
    * @Description:
    * @param level
    * @return
    * BigDecimal 返回类型
    * @throws
    */
   public BigDecimal getSourceOrderDividentsRate(UserLevelEnum level) {
      String rate = hongBaoManageService.get("team_source_order_dividents_" + level.getLevel());
      return new BigDecimal(rate);
   }
}