| | |
| | | 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;
|
| | |
|
| | | /**
|
| | | * 团队分红管理
|
| | |
| | | public class TeamDividentsManager {
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceManager teamDividentsSourceManager;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceOrderService teamDividentsSourceOrderService;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceOrderUserMapService teamDividentsSourceOrderUserMapService;
|
| | |
|
| | | @Resource
|
| | | private TeamDividentsSourceUserService teamDividentsSourceUserService;
|
| | |
| | | @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;
|
| | |
|
| | | /**
|
| | | * 开始分红
|
| | |
| | | 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);
|
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | */
|
| | | 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;
|
| | | }
|
| | |
|
| | |
| | | * @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());
|
| | |
| | |
|
| | | // 有分红才显示资金明细
|
| | | 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);
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | @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);
|
| | | }
|
| | |
|
| | | }
|