From 2bd2200f209ddb7bcc59b636d9de6f8b3f762958 Mon Sep 17 00:00:00 2001 From: yujian <yujian@163.com> Date: 星期四, 23 四月 2020 10:00:26 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/div' into div --- fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java | 260 +++++++++++++++------------------------------------ 1 files changed, 76 insertions(+), 184 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java b/fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java index dde11fd..bb3638c 100644 --- a/fanli/src/main/java/com/yeshi/fanli/service/manger/order/TeamDividentsManager.java +++ b/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.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.service.manger.money.TeamEincomeManager; -import com.yeshi.fanli.util.Constant; -import com.yeshi.fanli.util.MoneyBigDecimalUtil; import com.yeshi.fanli.util.TimeUtil; -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; @@ -77,25 +76,6 @@ @Resource private TeamEincomeManager teamEincomeManager; - @Transactional(rollbackFor = Exception.class) - public void addDividentsSourceOrder(List<CommonOrder> commonOrderList) throws TeamDividentsSourceOrderException { - if (commonOrderList.get(0).getThirdCreateTime().getTime() < Constant.NEW_ORDER_FANLI_RULE_TIME) - return; - - UserLevelEnum level = UserLevelUtil.getByOrderRank(commonOrderList.get(0).getUrank()); - if (level == null) - level = UserLevelEnum.daRen; - BigDecimal rate = getSourceOrderDividentsRate(level); - TeamDividentsSourceOrder order = TeamDividentsSourceOrderFactory.create(commonOrderList, rate); - if (order == null) - return; - try { - teamDividentsSourceOrderService.addTeamDividentsSourceOrder(order); - } catch (ParamsException e) { - throw new TeamDividentsSourceOrderException(101, "鍙傛暟涓嶅畬鏁�"); - } - } - /** * 寮�濮嬪垎绾� * @Title: startDividents @@ -111,107 +91,38 @@ startDividents(sourceUid, preSendTime); } - // 鏄惁鍙互鍒嗙孩 - private boolean isCanDividents(TeamUserLevelStatistic tus) { -// if (Constant.IS_TEST && tus.getLevel() != UserLevelEnum.daRen && tus.getLevel() != UserLevelEnum.normalVIP) -// return true; - - if (tus != null && (tus.getLevel() == UserLevelEnum.highVIP || tus.getLevel() == UserLevelEnum.superVIP - || tus.getLevel() == UserLevelEnum.tearcher)) { - - if (tus.getLevel() == UserLevelEnum.tearcher) { - int firstCount = tus.getSuperFirstCount() + tus.getTearcherFirstCount(); - int secondCount = tus.getHighSecondCount() + tus.getSuperSecondCount() + tus.getTearcherSecondCount(); - if (firstCount >= 3 && secondCount >= 3) {// 鐩存帴绮変笣瓒呯骇浼氬憳绛夌骇浠ヤ笂鐨勭敤鎴�>=3 - // 闂存帴绮変笣鏅�氫細鍛樹互涓婄瓑绾�>=3 - return true; - } else { - // 濡傛灉瀵煎笀涓嶆弧瓒虫潯浠跺氨闇�瑕侀檷绾т负瓒呯骇浼氬憳 - tus.setLevel(UserLevelEnum.superVIP); - } - } - - 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 { - // 濡傛灉瓒呯骇浼氬憳涓嶆弧瓒虫潯浠跺氨闇�瑕侀檷绾т负楂樼骇浼氬憳 - tus.setLevel(UserLevelEnum.highVIP); - } - } - - if (tus.getLevel() == UserLevelEnum.highVIP) { - int vipFirstCount = tus.getNormalFirstCount() + tus.getHighFirstCount() + tus.getSuperFirstCount() - + tus.getTearcherFirstCount(); - if (vipFirstCount >= 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> uidLevelMap = 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)) { - uidLevelMap.put(tus.getId(), tus.getLevel()); - } - } - } - - // 娌℃湁鍙備笌鍒嗙孩鐨勭敤鎴� - if (uidLevelMap == null || uidLevelMap.size() == 0) { - return; - } - - BigDecimal perDivident = computePerDivident(uidLevelMap, totalMoney); - for (Iterator<Long> its = uidLevelMap.keySet().iterator(); its.hasNext();) { + for (Iterator<Long> its = moneyMap.keySet().iterator(); its.hasNext();) { Long uid = its.next(); - BigDecimal dividents = computeUserDivident(perDivident, uidLevelMap.get(uid)); + BigDecimal dividents = moneyMap.get(uid).setScale(2, BigDecimal.ROUND_DOWN); // 灏嗚祫閲戝垎閰嶅埌鍙備笌鍒嗙孩鐨勭敤鎴� TeamDividentsSourceUser teamDividentsSourceUser = new TeamDividentsSourceUser(); teamDividentsSourceUser.setDay(day); @@ -220,33 +131,6 @@ teamDividentsSourceUser.setTargetUid(uid); teamDividentsSourceUserService.addTeamDividentsSourceUser(teamDividentsSourceUser); } - } - - // 璁$畻骞冲潎鍒嗙孩 - private BigDecimal computePerDivident(Map<Long, UserLevelEnum> uidLevels, BigDecimal totalMoney) { - BigDecimal count = new BigDecimal(0); - for (Iterator<Long> its = uidLevels.keySet().iterator(); its.hasNext();) { - Long uid = its.next(); - if (uidLevels.get(uid) == UserLevelEnum.highVIP) { - count = count.add(new BigDecimal(1)); - } else if (uidLevels.get(uid) == UserLevelEnum.superVIP) { - count = count.add(new BigDecimal(2)); - } else if (uidLevels.get(uid) == UserLevelEnum.tearcher) { - count = count.add(new BigDecimal(2.5)); - } - } - return MoneyBigDecimalUtil.div(totalMoney, 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.5)); - } - return null; } /** @@ -259,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; } @@ -320,57 +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) {// 宸茬粡鍙戦�侊紝闇�瑕佸弬涓庡垎绾㈢殑浜哄垎鎽� + + // 鎸塙ID灏佽缁熻璧勯噾 + 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); } } -- Gitblit v1.8.0