admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java
@@ -1,280 +1,280 @@
package com.yeshi.fanli.service.manger.order;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
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.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.service.manger.money.TeamEincomeManager;
import org.yeshi.utils.TimeUtil;
/**
 * 团队分红管理
 * @author Administrator
 *
 */
@Component
public class TeamDividentsManager {
   @Resource
   private TeamDividentsSourceManager teamDividentsSourceManager;
   @Resource
   private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
   @Resource
   private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
   @Resource
   private TeamDividentsSourceUserService teamDividentsSourceUserService;
   @Resource
   private TeamDividentsRecordService teamDividentsRecordService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   @Resource
   private TeamUserLevelStatisticService teamUserLevelStatisticService;
   @Resource
   private TeamDividentsDebtService teamDividentsDebtService;
   @Resource
   private UserMoneyService userMoneyService;
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private TeamEincomeManager teamEincomeManager;
   /**
    *  开始分红
    * @Title: startDividents
    * @Description:
    * @param sourceUid -源用户
    * void 返回类型
    * @throws
    */
   @Transactional(rollbackFor = Exception.class)
   public void startDividents(Long sourceUid) throws ParamsException {
      String day = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyy-MM-dd");
      Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
      startDividents(sourceUid, preSendTime);
   }
   @Transactional(rollbackFor = Exception.class)
   public void startDividents(Long sourceUid, Date preSendTime) throws ParamsException {
      String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
      // 查询出可用于分红的用户的总金额
      long count = teamDividentsSourceOrderUserMapService.countCanSend(sourceUid, preSendTime);
      int pageSize = 1000;
      int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      List<TeamDividentsSourceOrderUserMap> totalList = new ArrayList<>();
      for (int p = 0; p < page; p++) {
         List<TeamDividentsSourceOrderUserMap> list = teamDividentsSourceOrderUserMapService.listCanSend(sourceUid,
               preSendTime, p + 1, pageSize);
         if (list != null && list.size() > 0)
            totalList.addAll(list);
      }
      Map<String, BigDecimal> moneyMap = new HashMap<>();
      for (TeamDividentsSourceOrderUserMap order : totalList) {
         TeamDividentsSourceOrderUserMap map = teamDividentsSourceOrderUserMapService
               .selectByPrimaryKeyForUpdate(order.getId());
         if (map != null && map.getState() == TeamDividentsSourceOrderUserMap.STATE_JS) {
            String key = map.getTargetUid() + "#" + map.getType();
            // 计算分红对应的资金
            if (moneyMap.get(key) == null)
               moneyMap.put(key, new BigDecimal(0));
            moneyMap.put(key, moneyMap.get(key).add(map.getMoney()));
            teamDividentsSourceOrderUserMapService.send(map.getId());
         }
      }
      for (Iterator<String> its = moneyMap.keySet().iterator(); its.hasNext();) {
         String key = its.next();
         Long uid = Long.parseLong(key.split("#")[0]);
         Integer type = Integer.parseInt(key.split("#")[1]);
         BigDecimal dividents = moneyMap.get(key).setScale(2, BigDecimal.ROUND_DOWN);
         // 将资金分配到参与分红的用户
         TeamDividentsSourceUser teamDividentsSourceUser = new TeamDividentsSourceUser();
         teamDividentsSourceUser.setDay(day);
         teamDividentsSourceUser.setMoney(dividents);
         teamDividentsSourceUser.setSourceUid(sourceUid);
         teamDividentsSourceUser.setTargetUid(uid);
         teamDividentsSourceUser.setType(type);
         teamDividentsSourceUserService.addTeamDividentsSourceUser(teamDividentsSourceUser);
      }
   }
   /**
    * 分红计算是否完成
    * @Title: isSourceUserComupteFinish
    * @Description:
    * @return
    * boolean 返回类型
    * @throws
    */
   public boolean isSourceUserComupteFinish(String day) {
      Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
      long count = teamDividentsSourceOrderUserMapService.countCanSend(null, preSendTime);
      return count == 0;
   }
   private void addToTeamEincome(Long uid, Date preSendTime, int type) throws TeamDividentsRecordException,
         TeamDividentsDebtException, UserMoneyDetailException, ParamsException, TeamEincomeRecordException {
      String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
      BigDecimal money = teamDividentsSourceUserService.sumMoneyByUidAndDay(uid, day, type);
      // 查询需要扣除的资金
      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());
            teamDividentsDebtService.repayDebt(debt.getId(), debt.getLeftMoney());
         } else if (money.compareTo(new BigDecimal(0)) > 0) {
            teamDividentsDebtService.repayDebt(debt.getId(), money);
            money = new BigDecimal(0);
         } else// 没有钱还了
            break;
      }
      // 统计资金
      TeamDividentsRecord record = new TeamDividentsRecord();
      record.setDay(day);
      record.setMoney(money);
      record.setState(TeamDividentsRecord.STATE_VALID);
      record.setUid(uid);
      record.setType(type);
      teamDividentsRecordService.addTeamDividentsRecord(record);
      // 有分红才显示资金明细
      if (money.compareTo(new BigDecimal(0)) > 0) {
         teamEincomeManager.addTeamDividents(uid, preSendTime, money, type);
      }
   }
   /**
    * @throws TeamDividentsDebtException
    * 添加分红记录
    * @Title: addDividentsRecord
    * @Description:
    * @param uid -用户ID
    * @param money -分红金额
    * @param day -分红日期
    * void 返回类型
    * @throws
    */
   @Transactional(rollbackFor = Exception.class)
   public void addToTeamEincome(Long uid, Date preSendTime) throws TeamDividentsRecordException,
         TeamDividentsDebtException, UserMoneyDetailException, ParamsException, TeamEincomeRecordException {
      addToTeamEincome(uid, preSendTime, TeamDividentsSourceOrderUserMap.TYPE_MORE_THAN_2);
      addToTeamEincome(uid, preSendTime, TeamDividentsSourceOrderUserMap.TYPE_TEAM_DIVIDENTS);
   }
   /**
    * @throws TeamDividentsDebtException
    * 订单维权
    * @Title: weiQuan
    * @Description:
    * @param orderNo
    * @param tradeId
    * @param sourceType
    * void 返回类型
    * @throws
    */
   @Transactional(rollbackFor = Exception.class)
   public void weiQuan(String orderNo, int sourceType) throws TeamDividentsDebtException {
      // 查询订单是否已经分红
      TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
      if (order == null)
         return;
      List<TeamDividentsSourceOrderUserMap> mapList = teamDividentsSourceOrderUserMapService
            .listBySourceOrderId(order.getId());
      if (mapList == null || mapList.size() == 0)
         return;
      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 (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 (order.getState() == TeamDividentsSourceOrderUserMap.STATE_JS
            || order.getState() == TeamDividentsSourceOrderUserMap.STATE_FK) {
         teamDividentsSourceManager.invalidByOrder(orderNo, sourceType, "订单维权");
      }
   }
}
package com.yeshi.fanli.service.manger.order;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
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.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.service.manger.money.TeamEincomeManager;
import org.yeshi.utils.TimeUtil;
/**
 * 团队分红管理
 * @author Administrator
 *
 */
@Component
public class TeamDividentsManager {
   @Resource
   private TeamDividentsSourceManager teamDividentsSourceManager;
   @Resource
   private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
   @Resource
   private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
   @Resource
   private TeamDividentsSourceUserService teamDividentsSourceUserService;
   @Resource
   private TeamDividentsRecordService teamDividentsRecordService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   @Resource
   private TeamUserLevelStatisticService teamUserLevelStatisticService;
   @Resource
   private TeamDividentsDebtService teamDividentsDebtService;
   @Resource
   private UserMoneyService userMoneyService;
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private TeamEincomeManager teamEincomeManager;
   /**
    *  开始分红
    * @Title: startDividents
    * @Description:
    * @param sourceUid -源用户
    * void 返回类型
    * @throws
    */
   @Transactional(rollbackFor = Exception.class)
   public void startDividents(Long sourceUid) throws ParamsException {
      String day = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyy-MM-dd");
      Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
      startDividents(sourceUid, preSendTime);
   }
   @Transactional(rollbackFor = Exception.class)
   public void startDividents(Long sourceUid, Date preSendTime) throws ParamsException {
      String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
      // 查询出可用于分红的用户的总金额
      long count = teamDividentsSourceOrderUserMapService.countCanSend(sourceUid, preSendTime);
      int pageSize = 1000;
      int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      List<TeamDividentsSourceOrderUserMap> totalList = new ArrayList<>();
      for (int p = 0; p < page; p++) {
         List<TeamDividentsSourceOrderUserMap> list = teamDividentsSourceOrderUserMapService.listCanSend(sourceUid,
               preSendTime, p + 1, pageSize);
         if (list != null && list.size() > 0)
            totalList.addAll(list);
      }
      Map<String, BigDecimal> moneyMap = new HashMap<>();
      for (TeamDividentsSourceOrderUserMap order : totalList) {
         TeamDividentsSourceOrderUserMap map = teamDividentsSourceOrderUserMapService
               .selectByPrimaryKeyForUpdate(order.getId());
         if (map != null && map.getState() == TeamDividentsSourceOrderUserMap.STATE_JS) {
            String key = map.getTargetUid() + "#" + map.getType();
            // 计算分红对应的资金
            if (moneyMap.get(key) == null)
               moneyMap.put(key, new BigDecimal(0));
            moneyMap.put(key, moneyMap.get(key).add(map.getMoney()));
            teamDividentsSourceOrderUserMapService.send(map.getId());
         }
      }
      for (Iterator<String> its = moneyMap.keySet().iterator(); its.hasNext();) {
         String key = its.next();
         Long uid = Long.parseLong(key.split("#")[0]);
         Integer type = Integer.parseInt(key.split("#")[1]);
         BigDecimal dividents = moneyMap.get(key).setScale(2, BigDecimal.ROUND_DOWN);
         // 将资金分配到参与分红的用户
         TeamDividentsSourceUser teamDividentsSourceUser = new TeamDividentsSourceUser();
         teamDividentsSourceUser.setDay(day);
         teamDividentsSourceUser.setMoney(dividents);
         teamDividentsSourceUser.setSourceUid(sourceUid);
         teamDividentsSourceUser.setTargetUid(uid);
         teamDividentsSourceUser.setType(type);
         teamDividentsSourceUserService.addTeamDividentsSourceUser(teamDividentsSourceUser);
      }
   }
   /**
    * 分红计算是否完成
    * @Title: isSourceUserComupteFinish
    * @Description:
    * @return
    * boolean 返回类型
    * @throws
    */
   public boolean isSourceUserComupteFinish(String day) {
      Date preSendTime = new Date(TimeUtil.convertToTimeTemp(day, "yyyy-MM-dd"));
      long count = teamDividentsSourceOrderUserMapService.countCanSend(null, preSendTime);
      return count == 0;
   }
   private void addToTeamEincome(Long uid, Date preSendTime, int type) throws TeamDividentsRecordException,
         TeamDividentsDebtException, UserMoneyDetailException, ParamsException, TeamEincomeRecordException {
      String day = TimeUtil.getGernalTime(preSendTime.getTime(), "yyyy-MM-dd");
      BigDecimal money = teamDividentsSourceUserService.sumMoneyByUidAndDay(uid, day, type);
      // 查询需要扣除的资金
      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());
            teamDividentsDebtService.repayDebt(debt.getId(), debt.getLeftMoney());
         } else if (money.compareTo(new BigDecimal(0)) > 0) {
            teamDividentsDebtService.repayDebt(debt.getId(), money);
            money = new BigDecimal(0);
         } else// 没有钱还了
            break;
      }
      // 统计资金
      TeamDividentsRecord record = new TeamDividentsRecord();
      record.setDay(day);
      record.setMoney(money);
      record.setState(TeamDividentsRecord.STATE_VALID);
      record.setUid(uid);
      record.setType(type);
      teamDividentsRecordService.addTeamDividentsRecord(record);
      // 有分红才显示资金明细
      if (money.compareTo(new BigDecimal(0)) > 0) {
         teamEincomeManager.addTeamDividents(uid, preSendTime, money, type);
      }
   }
   /**
    * @throws TeamDividentsDebtException
    * 添加分红记录
    * @Title: addDividentsRecord
    * @Description:
    * @param uid -用户ID
    * @param money -分红金额
    * @param day -分红日期
    * void 返回类型
    * @throws
    */
   @Transactional(rollbackFor = Exception.class)
   public void addToTeamEincome(Long uid, Date preSendTime) throws TeamDividentsRecordException,
         TeamDividentsDebtException, UserMoneyDetailException, ParamsException, TeamEincomeRecordException {
      addToTeamEincome(uid, preSendTime, TeamDividentsSourceOrderUserMap.TYPE_MORE_THAN_2);
      addToTeamEincome(uid, preSendTime, TeamDividentsSourceOrderUserMap.TYPE_TEAM_DIVIDENTS);
   }
   /**
    * @throws TeamDividentsDebtException
    * 订单维权
    * @Title: weiQuan
    * @Description:
    * @param orderNo
    * @param tradeId
    * @param sourceType
    * void 返回类型
    * @throws
    */
   @Transactional(rollbackFor = Exception.class)
   public void weiQuan(String orderNo, int sourceType) throws TeamDividentsDebtException {
      // 查询订单是否已经分红
      TeamDividentsSourceOrder order = teamDividentsSourceOrderService.selectByOrderNoSourceType(orderNo, sourceType);
      if (order == null)
         return;
      List<TeamDividentsSourceOrderUserMap> mapList = teamDividentsSourceOrderUserMapService
            .listBySourceOrderId(order.getId());
      if (mapList == null || mapList.size() == 0)
         return;
      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 (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 (order.getState() == TeamDividentsSourceOrderUserMap.STATE_JS
            || order.getState() == TeamDividentsSourceOrderUserMap.STATE_FK) {
         teamDividentsSourceManager.invalidByOrder(orderNo, sourceType, "订单维权");
      }
   }
}