fanli/src/main/java/com/yeshi/fanli/entity/bus/user/vip/UserLevelEnum.java
New file @@ -0,0 +1,29 @@ package com.yeshi.fanli.entity.bus.user.vip; public enum UserLevelEnum { daRen(0, 0, "快省达人"), normalVIP(3, 30, "普通会员"), highVIP(7, 70, "高级会员"), superVIP(10, 100, "超级会员"); private int level; private int orderRank; private String name; private UserLevelEnum(int level, int orderRank, String name) { this.level = level; this.orderRank = orderRank; this.name = name; } public int getLevel() { return level; } public int getOrderRank() { return orderRank; } public String getName() { return name; } } fanli/src/main/java/com/yeshi/fanli/entity/money/OrderTeamRewardDebt.java
New file @@ -0,0 +1,97 @@ package com.yeshi.fanli.entity.money; import java.math.BigDecimal; import java.util.Date; import org.yeshi.utils.mybatis.Column; import org.yeshi.utils.mybatis.Table; /** * 团队订单奖励欠账 * @author Administrator * */ @Table("yeshi_ec_order_team_reward_debt") public class OrderTeamRewardDebt { @Column(name = "trd_id") private Long id; @Column(name = "trd_uid") private Long uid; @Column(name = "trd_origin_money") private BigDecimal originMoney; @Column(name = "trd_left_money") private BigDecimal leftMoney; @Column(name = "trd_source_id") private Long sourceId; @Column(name = "trd_beizhu") private String beiZhu; @Column(name = "trd_create_time") private Date createTime; @Column(name = "trd_update_time") private Date updateTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getUid() { return uid; } public void setUid(Long uid) { this.uid = uid; } public BigDecimal getOriginMoney() { return originMoney; } public void setOriginMoney(BigDecimal originMoney) { this.originMoney = originMoney; } public BigDecimal getLeftMoney() { return leftMoney; } public void setLeftMoney(BigDecimal leftMoney) { this.leftMoney = leftMoney; } public Long getSourceId() { return sourceId; } public void setSourceId(Long sourceId) { this.sourceId = sourceId; } public String getBeiZhu() { return beiZhu; } public void setBeiZhu(String beiZhu) { this.beiZhu = beiZhu; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } } fanli/src/main/java/com/yeshi/fanli/entity/money/OrderTeamRewardDebtRepayHistory.java
New file @@ -0,0 +1,77 @@ package com.yeshi.fanli.entity.money; import java.math.BigDecimal; import java.util.Date; import org.yeshi.utils.mybatis.Column; import org.yeshi.utils.mybatis.Table; /** * 团队奖励欠账返款记录 * @author Administrator * */ @Table("yeshi_ec_order_team_reward_debt_repay_history") public class OrderTeamRewardDebtRepayHistory { @Column(name = "drh_id") private Long id; @Column(name = "drh_debt_id") private OrderTeamRewardDebt debt; @Column(name = "drh_money") private BigDecimal money; @Column(name = "drh_uid") private Long uid; @Column(name = "drh_beizhu") private String beiZhu; @Column(name = "drh_create_time") private Date createTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public OrderTeamRewardDebt getDebt() { return debt; } public void setDebt(OrderTeamRewardDebt debt) { this.debt = debt; } public BigDecimal getMoney() { return money; } public void setMoney(BigDecimal money) { this.money = money; } public Long getUid() { return uid; } public void setUid(Long uid) { this.uid = uid; } public String getBeiZhu() { return beiZhu; } public void setBeiZhu(String beiZhu) { this.beiZhu = beiZhu; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } } fanli/src/main/java/com/yeshi/fanli/entity/order/OrderTeamReward.java
New file @@ -0,0 +1,134 @@ package com.yeshi.fanli.entity.order; import java.math.BigDecimal; import java.util.Date; import org.yeshi.utils.mybatis.Column; import org.yeshi.utils.mybatis.Table; /** * 团队奖励 * @author Administrator * */ @Table("yeshi_ec_order_team_reward") public class OrderTeamReward { // 未知 public static final int STATE_UNKNOWN = 0; // 未到账 public static final int STATE_VALID = 1; // 无效 public static final int STATE_INVALID = 2; // 已到账 public static final int STATE_RECIEVED = 3; public OrderTeamReward(Long id) { super(); this.id = id; } public OrderTeamReward() { } @Column(name = "otr_id") private Long id; @Column(name = "otr_uid") private Long uid; @Column(name = "otr_subsidy_id") private InviteOrderSubsidy subsidy; @Column(name = "otr_order_no") private String orderNo; @Column(name = "otr_source_type") private Integer sourceType; @Column(name = "otr_state") private Integer state; @Column(name = "otr_money") private BigDecimal money; @Column(name = "otr_original_money") private BigDecimal originalMoney; @Column(name = "otr_create_time") private Date createTime; @Column(name = "otr_update_time") private Date updateTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getUid() { return uid; } public void setUid(Long uid) { this.uid = uid; } public InviteOrderSubsidy getSubsidy() { return subsidy; } public void setSubsidy(InviteOrderSubsidy subsidy) { this.subsidy = subsidy; } public String getOrderNo() { return orderNo; } public void setOrderNo(String orderNo) { this.orderNo = orderNo; } public Integer getSourceType() { return sourceType; } public void setSourceType(Integer sourceType) { this.sourceType = sourceType; } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public BigDecimal getMoney() { return money; } public void setMoney(BigDecimal money) { this.money = money; } public BigDecimal getOriginalMoney() { return originalMoney; } public void setOriginalMoney(BigDecimal originalMoney) { this.originalMoney = originalMoney; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } } fanli/src/main/java/com/yeshi/fanli/exception/order/OrderTeamRewardException.java
New file @@ -0,0 +1,16 @@ package com.yeshi.fanli.exception.order; import com.yeshi.fanli.exception.BaseException; public class OrderTeamRewardException extends BaseException { private static final long serialVersionUID = 1L; public OrderTeamRewardException(int code, String msg) { super(code, msg); } public OrderTeamRewardException() { super(); } } fanli/src/main/java/com/yeshi/fanli/service/impl/order/InviteOrderSubsidyServiceImpl.java
@@ -26,10 +26,8 @@ import com.yeshi.fanli.service.inter.order.OrderService; import com.yeshi.fanli.service.inter.order.config.HongBaoManageService; import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.MoneyBigDecimalUtil; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TimeUtil; @Service public class InviteOrderSubsidyServiceImpl implements InviteOrderSubsidyService { fanli/src/main/java/com/yeshi/fanli/service/impl/order/InviteOrderSubsidyServiceImplV2.java
New file @@ -0,0 +1,266 @@ package com.yeshi.fanli.service.impl.order; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.yeshi.fanli.dao.mybatis.order.InviteOrderSubsidyMapper; import com.yeshi.fanli.entity.bus.user.HongBaoV2; import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum; import com.yeshi.fanli.entity.order.CommonOrder; import com.yeshi.fanli.entity.order.HongBaoOrder; import com.yeshi.fanli.entity.order.InviteOrderSubsidy; import com.yeshi.fanli.exception.order.InviteOrderSubsidyException; import com.yeshi.fanli.service.inter.order.CommonOrderService; import com.yeshi.fanli.service.inter.order.HongBaoOrderService; import com.yeshi.fanli.service.inter.order.HongBaoV2Service; import com.yeshi.fanli.service.inter.order.InviteOrderSubsidyServiceV2; import com.yeshi.fanli.service.inter.order.OrderHongBaoMapService; import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService; import com.yeshi.fanli.service.inter.order.config.HongBaoManageService; import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService; import com.yeshi.fanli.service.manger.user.UserLevelManager; import com.yeshi.fanli.util.StringUtil; @Service public class InviteOrderSubsidyServiceImplV2 implements InviteOrderSubsidyServiceV2 { @Resource private InviteOrderSubsidyMapper inviteOrderSubsidyMapper; @Resource private HongBaoV2Service hongBaoV2Service; @Resource private HongBaoOrderService hongBaoOrderService; @Resource private OrderHongBaoMapService orderHongBaoMapService; @Resource private CommonOrderService commonOrderService; @Resource private HongBaoManageService hongBaoManageService; @Resource private UserVIPInfoService userVIPInfoService; @Resource private UserLevelManager userLevelManager; @Resource private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService; @Override public InviteOrderSubsidy getByOrderNoAndType(Long uid, String orderNo, Integer type) { return inviteOrderSubsidyMapper.getByOrderNoAndType(uid, orderNo, type); } @Override public InviteOrderSubsidy getByOrderNoAndTypeForUpdate(Long uid, String orderNo, Integer type) { return inviteOrderSubsidyMapper.getByOrderNoAndTypeForUpdate(uid, orderNo, type); } @Transactional(rollbackFor = Exception.class) private void addOrderSubsidy(InviteOrderSubsidy orderSubsidy) throws InviteOrderSubsidyException { if (orderSubsidy.getMoney() == null || StringUtil.isNullOrEmpty(orderSubsidy.getOrderNo()) || orderSubsidy.getSourceType() == null || orderSubsidy.getUid() == null) throw new InviteOrderSubsidyException(1, "数据不完整"); InviteOrderSubsidy old = getByOrderNoAndType(orderSubsidy.getUid(), orderSubsidy.getOrderNo(), orderSubsidy.getSourceType()); if (old != null) {// 修改 if (old.getState() == InviteOrderSubsidy.STATE_INVALID || old.getState() == InviteOrderSubsidy.STATE_SUBSIDIZED) return; // 修改状态 InviteOrderSubsidy update = new InviteOrderSubsidy(old.getId()); update.setMoney(orderSubsidy.getMoney()); if (old.getState() == InviteOrderSubsidy.STATE_UNKNOWN) {// 状态未确定之前才可以更改原始补贴资金 update.setOriginalMoney(orderSubsidy.getOriginalMoney()); } update.setState(orderSubsidy.getState()); update.setUpdateTime(new Date()); inviteOrderSubsidyMapper.updateByPrimaryKeySelective(update); } else {// 添加 if (orderSubsidy.getCreateTime() == null) orderSubsidy.setCreateTime(new Date()); inviteOrderSubsidyMapper.insertSelective(orderSubsidy); } } @Transactional(rollbackFor = Exception.class) @Override public void addOrUpdateByOrder(String orderId, int sourceType) throws InviteOrderSubsidyException { List<HongBaoOrder> list = hongBaoOrderService.listByOrderIdAndSourceType(orderId, sourceType); if (list != null && list.size() > 0) { // 必须是自购订单才返利 HongBaoV2 parent = hongBaoV2Service.selectByPrimaryKey(list.get(0).getHongBaoV2().getId()); if (parent != null && parent.getUrank() != UserLevelEnum.superVIP.getOrderRank()) {// 不是超级会员的自购/分享才补贴 List<CommonOrder> orderList = commonOrderService.listBySourceTypeAndOrderId(sourceType, orderId); if (orderList == null || orderList.size() == 0) throw new InviteOrderSubsidyException(10, "订单为空"); CommonOrder firstOrder = orderList.get(0); Date placeOrderTime = firstOrder.getThirdCreateTime(); int urank = firstOrder.getUrank(); UserLevelEnum buyerUserLevel = null; for (UserLevelEnum level : UserLevelEnum.values()) if (level.getOrderRank() == urank) buyerUserLevel = level; if (buyerUserLevel == null) throw new InviteOrderSubsidyException(11, "用户等级为空"); List<Long> idList = new ArrayList<>(); for (HongBaoOrder ho : list) if (ho.getHongBaoV2() != null) idList.add(ho.getHongBaoV2().getId()); // 查询该订单号下的所有子红包 List<HongBaoV2> children = hongBaoV2Service.listChildrenByIds(idList); if (children != null && children.size() > 0) { Map<Long, Integer> uidHongBaoMap = new ConcurrentHashMap<>(); for (HongBaoV2 v2 : children) {// 按用户ID统计红包 Long uid = v2.getUserInfo().getId(); if (v2.getState() == HongBaoV2.STATE_BUKELINGQU || v2.getState() == HongBaoV2.STATE_KELINGQU || v2.getState() == HongBaoV2.STATE_YILINGQU) { uidHongBaoMap.put(uid, v2.getType()); } } List<HongBaoV2> hbList = hongBaoV2Service.listByIds(idList); int state = InviteOrderSubsidy.STATE_UNKNOWN; // 确定是否使用了奖励券 if (orderHongBaoMapService.selectByOrderIdAndSourceType(orderId, sourceType) != null) { state = InviteOrderSubsidy.STATE_INVALID; } else { // 确定是否返利到账5天后 if (recieveMoneyMoreThan(hbList, 5)) { state = InviteOrderSubsidy.STATE_VALID; } else { state = InviteOrderSubsidy.STATE_UNKNOWN; } } // 产生改订单的返利总金额 BigDecimal totalBuyFanLiMoney = new BigDecimal(0); // 计算总返利 for (HongBaoV2 v2 : hbList) { if (v2.getState() == HongBaoV2.STATE_BUKELINGQU || v2.getState() == HongBaoV2.STATE_KELINGQU || v2.getState() == HongBaoV2.STATE_YILINGQU) totalBuyFanLiMoney = totalBuyFanLiMoney.add(v2.getMoney()); } // 计算奖励金 for (Iterator<Long> its = uidHongBaoMap.keySet().iterator(); its.hasNext();) { Long uid = its.next(); UserLevelEnum userLevel = userLevelManager.getUserLevel(uid); int type = uidHongBaoMap.get(uid); if (type == HongBaoV2.TYPE_YIJI || type == HongBaoV2.TYPE_ERJI) { BigDecimal money = null; if (type == HongBaoV2.TYPE_YIJI) money = orderHongBaoMoneyComputeService.computeFirstTeamSubsidy(totalBuyFanLiMoney, placeOrderTime, buyerUserLevel, userLevel); else money = orderHongBaoMoneyComputeService.computeSecondTeamSubsidy(totalBuyFanLiMoney, placeOrderTime, buyerUserLevel, userLevel); InviteOrderSubsidy orderSubsidy = new InviteOrderSubsidy(); orderSubsidy.setMoney(money); orderSubsidy.setOriginalMoney(money); orderSubsidy.setUid(uid); orderSubsidy.setOrderNo(orderId); orderSubsidy.setSourceType(sourceType); orderSubsidy.setState(state); // 会员才能补贴 if (userLevel != UserLevelEnum.daRen) addOrderSubsidy(orderSubsidy); } } } } } } private boolean recieveMoneyMoreThan(List<HongBaoV2> hbList, int day) { // 是否全部是到账状态或失效状态 int invalidCount = 0;// 失效个数 int recieveCount = 0;// 到账的个数 long maxGetTime = 0; for (HongBaoV2 v2 : hbList) { if (v2.getState() == HongBaoV2.STATE_SHIXIAO) invalidCount++; else if (v2.getState() == HongBaoV2.STATE_YILINGQU) { recieveCount++; if (v2.getGetTime() != null && v2.getGetTime().getTime() > maxGetTime) maxGetTime = v2.getGetTime().getTime(); } } if (invalidCount + recieveCount == hbList.size() && recieveCount > 0 && maxGetTime > 0) {// 全部已到账 // 查询到账时间距离当前时间是否超过指定天 if (System.currentTimeMillis() - maxGetTime > 1000 * 60 * 60 * 24L * day) return true; } return false; } @Override public long countByOrderIdAndSourceType(String orderId, int sourceType) { return inviteOrderSubsidyMapper.countByOrderNoAndType(orderId, sourceType); } @Transactional @Override public void invalidByOrderIdAndSourceType(String orderId, int sourceType) { List<InviteOrderSubsidy> list = inviteOrderSubsidyMapper.listByOrderNoAndType(orderId, sourceType); if (list != null && list.size() > 0) for (InviteOrderSubsidy subsidy : list) { if (subsidy.getState() == InviteOrderSubsidy.STATE_UNKNOWN || subsidy.getState() == InviteOrderSubsidy.STATE_VALID) { InviteOrderSubsidy update = new InviteOrderSubsidy(subsidy.getId()); update.setState(InviteOrderSubsidy.STATE_INVALID); update.setUpdateTime(new Date()); inviteOrderSubsidyMapper.updateByPrimaryKeySelective(update); } } } @Transactional @Override public void validByOrderIdAndSourceType(String orderId, int sourceType) { List<InviteOrderSubsidy> list = inviteOrderSubsidyMapper.listByOrderNoAndType(orderId, sourceType); if (list != null && list.size() > 0) for (InviteOrderSubsidy subsidy : list) { if (subsidy.getState() == InviteOrderSubsidy.STATE_UNKNOWN) { InviteOrderSubsidy update = new InviteOrderSubsidy(subsidy.getId()); update.setState(InviteOrderSubsidy.STATE_VALID); update.setUpdateTime(new Date()); inviteOrderSubsidyMapper.updateByPrimaryKeySelective(update); } } } @Override public void settleById(Long id, BigDecimal money) { InviteOrderSubsidy orderSubsidy = new InviteOrderSubsidy(id); orderSubsidy.setMoney(money); orderSubsidy.setState(InviteOrderSubsidy.STATE_SUBSIDIZED); orderSubsidy.setUpdateTime(new Date()); inviteOrderSubsidyMapper.updateByPrimaryKeySelective(orderSubsidy); } } fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderHongBaoMoneyComputeServiceImpl.java
New file @@ -0,0 +1,237 @@ package com.yeshi.fanli.service.impl.order; import java.math.BigDecimal; import java.util.Date; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum; 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.MoneyBigDecimalUtil; @Service public class OrderHongBaoMoneyComputeServiceImpl implements OrderHongBaoMoneyComputeService { @Resource private HongBaoManageService hongBaoManageService; // 获取基础佣金 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; } @Override public BigDecimal computeFanliMoney(CommonOrder order, UserLevelEnum userLevel) { BigDecimal rate = hongBaoManageService.getBaseFanliRate(order.getThirdCreateTime().getTime()) .add(getOfficialSubsidyRate(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)); 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 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 (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 computeSecondInviteMoney(CommonOrder order, UserLevelEnum buyer) { if (buyer == UserLevelEnum.superVIP) 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)); else if (order.getEstimate() != null) return MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(rate, order.getEstimate()), new BigDecimal(100)); else return null; } @Override public BigDecimal computeFirstTeamSubsidy(BigDecimal fanLiMoney, Date placeOrderTime, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel) { BigDecimal rate = getTeamSubsidyRate(placeOrderTime, buyerUserLevel, userLevel, true); if (rate == null) return null; BigDecimal baseRate = hongBaoManageService.getBaseFanliRate(placeOrderTime.getTime()); BigDecimal officialSubsidyRate = getOfficialSubsidyRate(placeOrderTime, userLevel, false); return MoneyBigDecimalUtil.div(fanLiMoney.multiply(baseRate).multiply(rate), baseRate.add(officialSubsidyRate).multiply(new BigDecimal(100))); } @Override public BigDecimal computeSecondTeamSubsidy(BigDecimal fanLiMoney, Date placeOrderTime, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel) { BigDecimal rate = getTeamSubsidyRate(placeOrderTime, buyerUserLevel, userLevel, false); if (rate == null) return null; BigDecimal baseRate = hongBaoManageService.getBaseFanliRate(placeOrderTime.getTime()); BigDecimal officialSubsidyRate = getOfficialSubsidyRate(placeOrderTime, userLevel, false); return MoneyBigDecimalUtil.div(fanLiMoney.multiply(baseRate).multiply(rate), baseRate.add(officialSubsidyRate).multiply(new BigDecimal(100))); } public BigDecimal computeFirstTeamReward(BigDecimal firstTeamSubsidy, Date placeOrderTime, BigDecimal secondTeamSubsidy, UserLevelEnum userLevel) { if (userLevel != UserLevelEnum.superVIP) return null; BigDecimal firstRate = getTeamRewardRate(placeOrderTime, userLevel, true); BigDecimal secondRate = getTeamRewardRate(placeOrderTime, userLevel, false); if (firstRate == null || secondRate == null) return null; BigDecimal firstReward = MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(secondRate, firstTeamSubsidy), new BigDecimal(100)); BigDecimal secondReward = MoneyBigDecimalUtil.div(MoneyBigDecimalUtil.mul(firstRate, secondTeamSubsidy), new BigDecimal(100)); return firstReward.add(secondReward); } /** * 计算二级团队奖励 * @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; } /** * 获取粉丝的补贴比例 * @Title: getSecondTeamSubsidy * @Description: * @param date * @param buyerUserLevel * @param userLevel * @return * BigDecimal 返回类型 * @throws */ private BigDecimal getTeamSubsidyRate(Date date, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel, boolean first) { String key = null; if (first) 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()); BigDecimal rate = null; if (date != null) rate = hongBaoManageService.getByKeyAndMaxTime(key, date.getTime()); else rate = new BigDecimal(hongBaoManageService.get(key)); return rate; } /** * 获取官方补贴比例 * @Title: getOfficialSubsidyRate * @Description: * @param date * @param userLevel * @param share * @return * BigDecimal 返回类型 * @throws */ private BigDecimal getOfficialSubsidyRate(Date date, UserLevelEnum userLevel, boolean share) { String key = null; if (share) 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()); else rate = new BigDecimal(hongBaoManageService.get(key)); return rate; } } fanli/src/main/java/com/yeshi/fanli/service/inter/order/InviteOrderSubsidyServiceV2.java
New file @@ -0,0 +1,71 @@ package com.yeshi.fanli.service.inter.order; import java.math.BigDecimal; import com.yeshi.fanli.entity.order.InviteOrderSubsidy; import com.yeshi.fanli.exception.order.InviteOrderSubsidyException; public interface InviteOrderSubsidyServiceV2 { /** * 查询补贴 * * @param uid * @param orderNo * @param type * @return */ public InviteOrderSubsidy getByOrderNoAndType(Long uid, String orderNo, Integer type); /** * 查询补贴(加锁) * @param uid * @param orderNo * @param type * @return */ public InviteOrderSubsidy getByOrderNoAndTypeForUpdate(Long uid, String orderNo, Integer type); /** * 添加或修改(按照订单号与来源) * * @param orderId * @param sourceType */ public void addOrUpdateByOrder(String orderId, int sourceType) throws InviteOrderSubsidyException; /** * 根据订单号与来源查询 * * @param orderId * @param sourceType * @return */ public long countByOrderIdAndSourceType(String orderId, int sourceType); /** * 使订单号对应的数据失效 * * @param orderId * @param sourceType */ public void invalidByOrderIdAndSourceType(String orderId, int sourceType); /** * 使订单号对应的数据有效 * @param orderId * @param sourceType */ public void validByOrderIdAndSourceType(String orderId, int sourceType); /** * 结算金额 * @param id * @param money */ public void settleById(Long id,BigDecimal money); } fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderHongBaoMoneyComputeService.java
New file @@ -0,0 +1,117 @@ package com.yeshi.fanli.service.inter.order; import java.math.BigDecimal; import java.util.Date; import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum; import com.yeshi.fanli.entity.order.CommonOrder; /** * 订单类红包计算服务 * @author Administrator * */ public interface OrderHongBaoMoneyComputeService { /** * 计算自购订单返利金额 * @Title: computeFanliMoney * @Description: * @param order * @param userLevel * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeFanliMoney(CommonOrder order, UserLevelEnum userLevel); /** * 计算分享订单奖金金额 * @Title: computeShareMoney * @Description: * @param order * @param userLevel * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeShareMoney(CommonOrder order, UserLevelEnum userLevel); /** * 计算直接粉丝邀请奖金 * @Title: computeFirstInviteMoney * @Description: * @param order * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeFirstInviteMoney(CommonOrder order,UserLevelEnum buyer); /** * 计算间接粉丝邀请奖金 * @Title: computeSecondInviteMoney * @Description: * @param order * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeSecondInviteMoney(CommonOrder order,UserLevelEnum buyer); /** * 计算直接粉丝团队补贴 * @Title: computeFirstTeamSubsidy * @Description: * @param order * @param buyerUserLevel * @param userLevel * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeFirstTeamSubsidy(BigDecimal fanLiMoney,Date placeOrderTime, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel); /** * 计算间接粉丝团队补贴 * @Title: computeSecondTeamSubsidy * @Description: * @param order * @param buyerUserLevel * @param userLevel * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeSecondTeamSubsidy(BigDecimal fanLiMoney,Date placeOrderTime, UserLevelEnum buyerUserLevel, UserLevelEnum userLevel); /** * 计算一级团队奖励 * @Title: computeFirstTeamReward * @Description: * @param firstTeamSubsidy -购买者上一级团队补贴 * @param secondTeamSubsidy-购买者上两级团队补贴 * @param userLevel 当前用户的等级 * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeFirstTeamReward(BigDecimal firstTeamSubsidy,Date placeOrderTime, BigDecimal secondTeamSubsidy, UserLevelEnum userLevel); /** * 计算二级团队奖励 * @Title: computeSecondTeamReward * @Description: * @param secondTeamSubsidy 购买者上两级团队补贴 * @param userLevel 当前用户的等级 * @return * BigDecimal 返回类型 * @throws */ public BigDecimal computeSecondTeamReward(BigDecimal secondTeamSubsidy,Date placeOrderTime, UserLevelEnum userLevel); } fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderTeamRewardService.java
New file @@ -0,0 +1,71 @@ package com.yeshi.fanli.service.inter.order; import java.math.BigDecimal; import com.yeshi.fanli.entity.order.OrderTeamReward; import com.yeshi.fanli.exception.order.OrderTeamRewardException; public interface OrderTeamRewardService { /** * 查询补贴 * * @param uid * @param orderNo * @param type * @return */ public OrderTeamReward getByOrderNoAndType(Long uid, String orderNo, Integer type); /** * 查询补贴(加锁) * @param uid * @param orderNo * @param type * @return */ public OrderTeamReward getByOrderNoAndTypeForUpdate(Long uid, String orderNo, Integer type); /** * 添加或修改(按照订单号与来源) * * @param orderId * @param sourceType */ public void addOrUpdateByOrder(String orderId, int sourceType) throws OrderTeamRewardException; /** * 根据订单号与来源查询 * * @param orderId * @param sourceType * @return */ public long countByOrderIdAndSourceType(String orderId, int sourceType); /** * 使订单号对应的数据失效 * * @param orderId * @param sourceType */ public void invalidByOrderIdAndSourceType(String orderId, int sourceType); /** * 使订单号对应的数据有效 * @param orderId * @param sourceType */ public void validByOrderIdAndSourceType(String orderId, int sourceType); /** * 结算金额 * @param id * @param money */ public void settleById(Long id,BigDecimal money); } fanli/src/main/java/com/yeshi/fanli/service/inter/order/config/HongBaoManageService.java
@@ -17,6 +17,8 @@ public void update(List<HongBaoManage> hongBaoManageList); public String get(String key); public BigDecimal getByKeyAndMaxTime(String key, Long time); public Map<String, String> convertMap(); fanli/src/main/java/com/yeshi/fanli/service/manger/order/HongBaoV2AddManagerV2.java
New file @@ -0,0 +1,879 @@ package com.yeshi.fanli.service.manger.order; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper; import com.yeshi.fanli.dao.mybatis.order.CommonOrderGoodsMapper; import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper; import com.yeshi.fanli.dto.HongBao; import com.yeshi.fanli.entity.bus.user.HongBaoV2; import com.yeshi.fanli.entity.bus.user.ThreeSale; import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum; import com.yeshi.fanli.entity.order.CommonOrder; import com.yeshi.fanli.entity.order.CommonOrderGoods; import com.yeshi.fanli.entity.order.HongBaoOrder; import com.yeshi.fanli.exception.order.HongBaoException; import com.yeshi.fanli.exception.user.UserAccountException; import com.yeshi.fanli.service.inter.order.CommonOrderService; import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService; import com.yeshi.fanli.service.inter.order.config.HongBaoManageService; import com.yeshi.fanli.service.inter.order.msg.UserOrderMsgNotificationService; import com.yeshi.fanli.service.inter.user.UserInfoService; import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService; import com.yeshi.fanli.service.inter.user.UserSystemCouponService; import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce; import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService; import com.yeshi.fanli.service.manger.user.UserLevelManager; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.MoneyBigDecimalUtil; import com.yeshi.fanli.util.TaoBaoConstant; import com.yeshi.fanli.util.TimeUtil; @Component public class HongBaoV2AddManagerV2 { @Resource private UserInfoService userInfoService; @Resource private ThreeSaleSerivce threeSaleSerivce; @Resource private HongBaoOrderMapper hongBaoOrderMapper; @Resource private HongBaoV2Mapper hongBaoV2Mapper; @Resource private UserOrderMsgNotificationService userOrderMsgNotificationService; @Resource private HongBaoManageService hongBaoManageService; @Resource private CommonOrderService commonOrderService; @Resource private UserSystemCouponRecordService userSystemCouponRecordService; @Resource private UserSystemCouponService userSystemCouponService; @Resource private CommonOrderGoodsMapper commonOrderGoodsMapper; @Resource private UserVIPInfoService userVIPInfoService; @Resource private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService; @Resource private UserLevelManager userLevelManager; /** * 添加红包信息 * * @param commonOrderList * @param type * @return * @throws HongBaoException * @throws UserAccountException */ public int addHongBao(List<CommonOrder> commonOrderList, int type) throws HongBaoException, UserAccountException { Set<String> orderNoSet = new HashSet<>(); for (CommonOrder co : commonOrderList) orderNoSet.add(co.getOrderNo() + "#" + co.getSourceType()); if (orderNoSet.size() > 1) throw new HongBaoException(301, "不属于同一订单"); UserLevelEnum userLevel = getUserLevelByURank(commonOrderList.get(0).getUrank()); if (userLevel == null) throw new HongBaoException(302, "用户等级获取失败"); Date placeOrderDate = commonOrderList.get(0).getThirdCreateTime(); if (commonOrderList != null && commonOrderList.size() > 0) { int orderType = commonOrderList.get(0).getSourceType(); Map<Integer, HongBaoOrder> notificationMap = new HashMap<>(); int goodsCount = 0; boolean hasAdd = false; boolean hasUpdate = false; Set<Integer> stateSet = new HashSet<>();// 订单状态Set for (CommonOrder commonOrder : commonOrderList) { stateSet.add(commonOrder.getState()); goodsCount += commonOrder.getCount(); if (commonOrder == null || commonOrder.getId() == null || commonOrder.getUserInfo() == null) throw new HongBaoException(1, "订单信息不完整"); HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId()); if (hongBaoOrder == null) { saveHongBao(commonOrder, type, notificationMap, userLevel, placeOrderDate); hasAdd = true; } else { boolean update = updateHongBao(hongBaoOrder, commonOrder, type, notificationMap, placeOrderDate); if (update) hasUpdate = true; } } /** * 通知用户的返利情况 */ int state = getOrderState(stateSet); if (!Constant.IS_TEST) { if (hasAdd) { Iterator<Integer> its = notificationMap.keySet().iterator(); while (its.hasNext()) { Integer t = its.next(); HongBaoV2 notify = notificationMap.get(t).getHongBaoV2(); CommonOrder commonOrder = notificationMap.get(t).getCommonOrder(); String orderId = commonOrderList.get(0).getOrderNo(); Long uid = notify.getUserInfo().getId(); BigDecimal money = notify.getMoney(); switch (t) { case HongBaoV2.TYPE_ZIGOU: userOrderMsgNotificationService.orderFanLiStatistic(uid, orderId, orderType, commonOrder.getPayment(), money, goodsCount, state); break; case HongBaoV2.TYPE_SHARE_GOODS: userOrderMsgNotificationService.orderShareStatistic(uid, orderId, orderType, commonOrder.getPayment(), money, goodsCount, state); break; case HongBaoV2.TYPE_YIJI: userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType, commonOrder.getPayment(), money, goodsCount, state); break; case HongBaoV2.TYPE_ERJI: userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType, commonOrder.getPayment(), money, goodsCount, state); break; case HongBaoV2.TYPE_SHARE_YIJI: userOrderMsgNotificationService.orderShareFirstLevelStatistic(uid, orderId, orderType, commonOrder.getPayment(), money, goodsCount, state, notify.getBeizhu()); break; } } } // 添加新版本通知 if (!hasAdd) { Iterator<Integer> its = notificationMap.keySet().iterator(); while (its.hasNext()) { Integer t = its.next(); HongBaoV2 notify = notificationMap.get(t).getHongBaoV2(); CommonOrder commonOrder = notificationMap.get(t).getCommonOrder(); String orderId = commonOrderList.get(0).getOrderNo(); Long uid = notify.getUserInfo().getId(); BigDecimal money = notify.getMoney(); switch (t) { case HongBaoV2.TYPE_ZIGOU: userOrderMsgNotificationService.orderFanLiStateChanged(uid, orderId, orderType, commonOrder.getPayment(), money, state); break; case HongBaoV2.TYPE_SHARE_GOODS: userOrderMsgNotificationService.orderShareStateChanged(uid, orderId, orderType, commonOrder.getPayment(), money, state); break; case HongBaoV2.TYPE_YIJI: userOrderMsgNotificationService.orderInviteStateChanged(uid, orderId, orderType, commonOrder.getPayment(), money, state); break; case HongBaoV2.TYPE_ERJI: userOrderMsgNotificationService.orderInviteStateChanged(uid, orderId, orderType, commonOrder.getPayment(), money, state); break; case HongBaoV2.TYPE_SHARE_YIJI: userOrderMsgNotificationService.orderShareFirstLevelStateChanged(uid, orderId, orderType, commonOrder.getPayment(), money, state); } } } } int resultCode = 0; if (hasAdd && hasUpdate) return 12; else if (hasAdd) return 1; else if (hasUpdate) return 2; return resultCode; } return 0; } private int getOrderState(Set<Integer> states) { if (states.size() == 1) return states.iterator().next(); Iterator<Integer> its = states.iterator(); while (its.hasNext()) { int tempState = its.next(); if (tempState == CommonOrder.STATE_FK) return CommonOrder.STATE_FK; else if (tempState == CommonOrder.STATE_JS) return CommonOrder.STATE_JS; } return CommonOrder.STATE_SX; } @Transactional(rollbackFor = Exception.class) private boolean updateHongBao(HongBaoOrder hongBaoOrder, CommonOrder commonOrder, int type, Map<Integer, HongBaoOrder> notificationMap, Date placeOrderTime) throws HongBaoException, UserAccountException { System.out.println(commonOrder.getOrderNo()); // 锁行 HongBaoV2 oldHongBao = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(hongBaoOrder.getHongBaoV2().getId()); if (oldHongBao == null) throw new HongBaoException(10, "红包对象不存在"); UserLevelEnum buyerLevel = getUserLevelByURank(oldHongBao.getUrank()); if (buyerLevel == null) throw new HongBaoException(201, "用户等级为空"); // 已经失效,已经领取,新老状态一致的红包不做处理 if (oldHongBao.getState() == HongBaoV2.STATE_SHIXIAO || oldHongBao.getState() == HongBaoV2.STATE_YILINGQU) return false; if (type == HongBaoV2.TYPE_ZIGOU) {// 获取自购的返利比例 BigDecimal money = orderHongBaoMoneyComputeService.computeFanliMoney(commonOrder, buyerLevel); // 免单处理 boolean mianDan = false; List<CommonOrder> orderList = commonOrderService.listBySourceTypeAndOrderId(Constant.SOURCE_TYPE_TAOBAO, commonOrder.getOrderNo()); if (orderList != null && orderList.size() == 1) {// 只有1个订单才参与免单 BigDecimal payMent = commonOrder.getPayment(); if (commonOrder.getState() == CommonOrder.STATE_JS) payMent = commonOrder.getSettlement(); if (payMent.compareTo(new BigDecimal(10)) < 0) { mianDan = userSystemCouponRecordService.isSuccessMianDan(commonOrder.getSourceType(), commonOrder.getOrderNo()); } } HongBaoV2 hongBao = createFanLiUpdateHongBao(commonOrder, money, hongBaoOrder.getHongBaoV2().getId(), mianDan); // 新老红包状态一致不处理 if (oldHongBao.getState().intValue() == hongBao.getState()) return false; if (hongBao.getState() == HongBaoV2.STATE_SHIXIAO) { if (mianDan) { try { userSystemCouponService.updateStateByDrawback(commonOrder.getOrderNo()); } catch (Exception e) { e.printStackTrace(); throw new HongBaoException(12, "免单券退款出错"); } } } hongBaoV2Mapper.updateByPrimaryKeySelective(hongBao); // 加入通知 if (notificationMap.get(type) == null) { HongBaoV2 tempHongBao = new HongBaoV2(oldHongBao.getId()); tempHongBao.setUserInfo(oldHongBao.getUserInfo()); tempHongBao.setMoney(hongBao.getMoney()); CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId()); tempCommonOrder.setPayment(commonOrder.getPayment()); notificationMap.put(type, new HongBaoOrder(tempCommonOrder, tempHongBao)); } else { // 增加付款金额与资金 HongBaoOrder tempHongBaoOrder = notificationMap.get(type); tempHongBaoOrder.getCommonOrder() .setPayment(tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment())); tempHongBaoOrder.getHongBaoV2() .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(hongBao.getMoney())); notificationMap.put(type, tempHongBaoOrder); } // 获取子红包 List<HongBaoV2> children = hongBaoV2Mapper.listChildrenById(hongBao.getId()); if (children != null && children.size() > 0) { for (HongBaoV2 child : children) { if (child.getState() == HongBaoV2.STATE_YILINGQU) continue; if (child.getType() == HongBaoV2.TYPE_YIJI) { money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel); } else if (child.getType() == HongBaoV2.TYPE_ERJI) { money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel); } HongBaoV2 childUpdate = createInviteUpdateHongBao(child, hongBao.getState(), money, commonOrder); hongBaoV2Mapper.updateByPrimaryKeySelective(childUpdate); // 加入通知 if (notificationMap.get(child.getType()) == null) { HongBaoV2 tempHongBao = new HongBaoV2(child.getId()); tempHongBao.setUserInfo(child.getUserInfo()); tempHongBao.setMoney(child.getMoney()); CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId()); tempCommonOrder.setPayment(commonOrder.getPayment()); notificationMap.put(child.getType(), new HongBaoOrder(tempCommonOrder, tempHongBao)); } else { // 增加付款金额与资金 HongBaoOrder tempHongBaoOrder = notificationMap.get(child.getType()); tempHongBaoOrder.getCommonOrder().setPayment( tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment())); tempHongBaoOrder.getHongBaoV2() .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(child.getMoney())); notificationMap.put(child.getType(), tempHongBaoOrder); } } } else {// 修复之前二级,三级订单未统计到的情况 if (!mianDan) { ThreeSale threeSale = threeSaleSerivce.selectByWorkerId(commonOrder.getUserInfo().getId()); if (threeSale != null && threeSale.getSucceedTime() != null && threeSale.getSucceedTime() <= placeOrderTime.getTime()) { UserInfo boss = threeSaleSerivce.getBoss(commonOrder.getUserInfo().getId()); if (boss != null) { boss = userInfoService.selectAvailableByPrimaryKey(boss.getId()); } if (boss != null) { // 插入一级子红包 money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel); UserLevelEnum bossUserLevel = userLevelManager.getUserLevel(boss.getId()); if (money != null) { HongBaoV2 firstHongbao = createInviteHongBao(boss.getId(), oldHongBao, commonOrder, HongBaoV2.TYPE_YIJI, money, bossUserLevel); if (firstHongbao != null) addInviteHongBao(firstHongbao, null, notificationMap, commonOrder); } boss = threeSaleSerivce.getBoss(boss.getId()); if (boss != null) { boss = userInfoService.selectAvailableByPrimaryKey(boss.getId()); } if (boss != null) { money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel); bossUserLevel = userLevelManager.getUserLevel(boss.getId()); if (money != null) { HongBaoV2 secondHongbao = createInviteHongBao(boss.getId(), oldHongBao, commonOrder, HongBaoV2.TYPE_ERJI, money, bossUserLevel); if (secondHongbao != null) addInviteHongBao(secondHongbao, null, notificationMap, commonOrder); } } } } } } } else if (type == HongBaoV2.TYPE_SHARE_GOODS) { BigDecimal money = orderHongBaoMoneyComputeService.computeShareMoney(commonOrder, buyerLevel); HongBaoV2 hongBao = createShareUpdateHongBao(commonOrder, money, oldHongBao.getId()); hongBaoV2Mapper.updateByPrimaryKeySelective(hongBao); // 通知 if (notificationMap.get(type) == null) { HongBaoV2 tempHongBao = new HongBaoV2(hongBao.getId()); tempHongBao.setUserInfo(hongBaoOrder.getHongBaoV2().getUserInfo()); tempHongBao.setMoney(hongBao.getMoney()); CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId()); tempCommonOrder.setPayment(commonOrder.getPayment()); notificationMap.put(type, new HongBaoOrder(tempCommonOrder, tempHongBao)); } else { // 增加付款金额与资金 HongBaoOrder tempHongBaoOrder = notificationMap.get(type); tempHongBaoOrder.getCommonOrder() .setPayment(tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment())); tempHongBaoOrder.getHongBaoV2() .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(hongBao.getMoney())); notificationMap.put(type, tempHongBaoOrder); } // 获取子红包 List<HongBaoV2> children = hongBaoV2Mapper.listChildrenById(hongBao.getId()); if (children != null) for (HongBaoV2 child : children) { if (child.getState() == HongBaoV2.STATE_YILINGQU) continue; if (child.getType() == HongBaoV2.TYPE_SHARE_YIJI) { money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel); } else if (child.getType() == HongBaoV2.TYPE_SHARE_ERJI) { money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel); } HongBaoV2 childUpdate = createInviteUpdateHongBao(child, hongBao.getState(), money, commonOrder); hongBaoV2Mapper.updateByPrimaryKeySelective(childUpdate); // 添加通知 if (notificationMap.get(child.getType()) == null) { HongBaoV2 tempHongBao = new HongBaoV2(child.getId()); tempHongBao.setUserInfo(child.getUserInfo()); tempHongBao .setMoney(childUpdate.getMoney() == null ? new BigDecimal(0) : childUpdate.getMoney()); CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId()); tempCommonOrder.setPayment(commonOrder.getPayment()); notificationMap.put(child.getType(), new HongBaoOrder(tempCommonOrder, tempHongBao)); } else { // 增加付款金额与资金 HongBaoOrder tempHongBaoOrder = notificationMap.get(child.getType()); if (commonOrder.getPayment() != null) tempHongBaoOrder.getCommonOrder().setPayment( tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment())); if (childUpdate.getMoney() != null) tempHongBaoOrder.getHongBaoV2() .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(childUpdate.getMoney())); notificationMap.put(child.getType(), tempHongBaoOrder); } } } else throw new HongBaoException(2, "type错误"); return true; } @Transactional(rollbackFor = Exception.class) private void saveHongBao(CommonOrder commonOrder, int type, Map<Integer, HongBaoOrder> notificationMap, UserLevelEnum buyerLevel, Date placeOrderDate) throws HongBaoException, UserAccountException { if (type == HongBaoV2.TYPE_ZIGOU) { // 查询是否有免单计划 BigDecimal mianDanMoney = null; if (commonOrder.getState() == CommonOrder.STATE_JS || commonOrder.getState() == CommonOrder.STATE_FK) { List<CommonOrder> orderList = commonOrderService.listBySourceTypeAndOrderId(commonOrder.getSourceType(), commonOrder.getOrderNo()); if (orderList != null && orderList.size() == 1) {// 只有1个订单才参与免单 BigDecimal payMent = commonOrder.getPayment(); if (commonOrder.getState() == CommonOrder.STATE_JS) payMent = commonOrder.getSettlement(); CommonOrderGoods goods = commonOrderGoodsMapper .selectByPrimaryKey(commonOrder.getCommonOrderGoods().getId()); if (goods != null) { try { if (userSystemCouponService.updateCouponRecordUsed(commonOrder.getUserInfo().getId(), commonOrder.getOrderNo(), payMent, Long.parseLong(goods.getGoodsId()))) mianDanMoney = payMent; } catch (NumberFormatException e) { throw new HongBaoException(10, "免单商品处理出错"); } catch (Exception e) { e.printStackTrace(); throw new HongBaoException(11, "免单商品处理出错"); } } } } else if (commonOrder.getState() == CommonOrder.STATE_SX) {// 设置免单券失效 commonOrder.setPayment(new BigDecimal(0));// 订单失效后的付款金额设置为0 try { userSystemCouponService.updateStateByDrawback(commonOrder.getOrderNo()); } catch (Exception e) { e.printStackTrace(); } } HongBaoV2 hongBao = createFanLiHongBao(commonOrder, orderHongBaoMoneyComputeService.computeFanliMoney(commonOrder, buyerLevel), mianDanMoney, buyerLevel); if (hongBao == null) return; addFanLiOrShareHongBao(hongBao, commonOrder, notificationMap); UserInfo boss = threeSaleSerivce.getBoss(hongBao.getUserInfo().getId()); if (boss != null && hongBao.getState() != HongBaoV2.STATE_SHIXIAO && mianDanMoney == null) {// 1级BOSS存在且红包未失效,免单不支持多级分销 BigDecimal money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel); if (money == null)// 返利资金为空不参与分成 return; UserLevelEnum bossLevel = userLevelManager.getUserLevel(boss.getId()); HongBaoV2 firstHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder, HongBaoV2.TYPE_YIJI, money, bossLevel); addInviteHongBao(firstHongbao, null, notificationMap, commonOrder); // 插入二级子红包 boss = threeSaleSerivce.getBoss(boss.getId()); if (boss != null) {// 二级BOSS存在且是非会员订单 money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel); bossLevel = userLevelManager.getUserLevel(boss.getId()); if (money == null) return; HongBaoV2 secondHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder, HongBaoV2.TYPE_ERJI, money, bossLevel); addInviteHongBao(secondHongbao, null, notificationMap, commonOrder); } } } else if (type == HongBaoV2.TYPE_SHARE_GOODS) { // 分享赚不加入失效的订单 if (commonOrder.getState() == CommonOrder.STATE_SX || commonOrder.getState() == CommonOrder.STATE_WQ) return; // 分享赚 BigDecimal money = null; if (commonOrder.getSourceType() == Constant.SOURCE_TYPE_TAOBAO && commonOrder.getSourcePosition().equalsIgnoreCase(TaoBaoConstant.TAOBAO_TLJ_RELATION_PID_DEFAULT))// 来自于淘礼金的分享 { BigDecimal shareRate = hongBaoManageService.getTLJShareRate(commonOrder.getCreateTime().getTime()); if (commonOrder.getState() == CommonOrder.STATE_JS || commonOrder.getState() == CommonOrder.STATE_WQ) money = MoneyBigDecimalUtil.mul(commonOrder.geteIncome(), MoneyBigDecimalUtil.div(shareRate, new BigDecimal(100))); else money = MoneyBigDecimalUtil.mul(commonOrder.getEstimate(), MoneyBigDecimalUtil.div(shareRate, new BigDecimal(100))); } else money = orderHongBaoMoneyComputeService.computeShareMoney(commonOrder, buyerLevel); if (money == null || money.compareTo(new BigDecimal(0)) <= 0) return; HongBaoV2 hongBao = createShareHongBao(commonOrder, money, buyerLevel); if (hongBao == null) return; addFanLiOrShareHongBao(hongBao, commonOrder, notificationMap); // 4月17日后才有一级分享赚 if (placeOrderDate.getTime() > TimeUtil.convertToTimeTemp("2019-04-17", "yyyy-MM-dd")) { UserInfo boss = threeSaleSerivce.getBoss(hongBao.getUserInfo().getId()); if (boss != null) { money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel); if (money == null) return; UserLevelEnum bossLevel = userLevelManager.getUserLevel(boss.getId()); HongBaoV2 firstHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder, HongBaoV2.TYPE_SHARE_YIJI, money, bossLevel); addInviteHongBao(firstHongbao, hongBao.getUserInfo().getNickName(), notificationMap, commonOrder); // 二级分享赚 boss = threeSaleSerivce.getBoss(boss.getId()); if (boss != null) { money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel); if (money == null)// 返利比例为0就不统计 return; bossLevel = userLevelManager.getUserLevel(boss.getId()); HongBaoV2 secondChild = createInviteHongBao(boss.getId(), hongBao, commonOrder, HongBaoV2.TYPE_SHARE_ERJI, money, bossLevel); addInviteHongBao(secondChild, null, notificationMap, commonOrder); } } } // 修改统计数据 Long goodsId = commonOrder.getCommonOrderGoods().getId(); // 查询商品 CommonOrderGoods goods = commonOrderGoodsMapper.selectByPrimaryKey(goodsId); HongBao hb = new HongBao(); if (goods != null) hb.setAuctionId(Long.parseLong(goods.getGoodsId())); hb.setUserInfo(hongBao.getUserInfo()); hb.setMoney(hongBao.getMoney()); // TODO 更新分享记录数据 // try { // userShareGoodsGroupService.updateOrderRecord(hb, // commonOrder.getSourceType()); // } catch (UserShareGoodsRecordException e) { // try { // LogHelper.errorDetailInfo(e); // } catch (Exception e1) { // e1.printStackTrace(); // } // } } else throw new HongBaoException(2, "type错误"); } /** * 添加邀请赚红包 * * @param child * @param notificationMap * @param commonOrder */ private void addInviteHongBao(HongBaoV2 child, String parentHongBaoUserName, Map<Integer, HongBaoOrder> notificationMap, CommonOrder commonOrder) { if (child != null) { hongBaoV2Mapper.insertSelective(child); // 用户通知 if (notificationMap.get(child.getType()) == null) { HongBaoV2 tempHongBao = new HongBaoV2(child.getId()); tempHongBao.setUserInfo(child.getUserInfo()); tempHongBao.setMoney(child.getMoney()); if (child.getType() == HongBaoV2.TYPE_SHARE_YIJI) tempHongBao.setBeizhu(parentHongBaoUserName); CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId()); tempCommonOrder.setPayment(commonOrder.getPayment()); notificationMap.put(child.getType(), new HongBaoOrder(tempCommonOrder, tempHongBao)); } else { // 增加付款金额与资金 HongBaoOrder tempHongBaoOrder = notificationMap.get(child.getType()); tempHongBaoOrder.getCommonOrder() .setPayment(tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment())); tempHongBaoOrder.getHongBaoV2() .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(child.getMoney())); notificationMap.put(child.getType(), tempHongBaoOrder); } } } /** * 创建邀请红包 * * @param uid * @param parent * @param commonOrder * @param hongBaoType * @param money * @return */ private HongBaoV2 createInviteHongBao(Long uid, HongBaoV2 parent, CommonOrder commonOrder, int hongBaoType, BigDecimal money, UserLevelEnum userLevel) { if (parent == null) return null; if (parent.getState() == HongBaoV2.STATE_SHIXIAO) return null; UserInfo user = userInfoService.selectAvailableByPrimaryKey(uid); if (user == null) return null; HongBaoV2 child = new HongBaoV2(); child.setParent(parent); child.setType(hongBaoType); child.setMoney(money); if (commonOrder.getState() == CommonOrder.STATE_FK) { child.setState(HongBaoV2.STATE_BUKELINGQU); } else if (commonOrder.getState() == CommonOrder.STATE_JS || commonOrder.getState() == CommonOrder.STATE_WQ) { child.setState(HongBaoV2.STATE_KELINGQU); Calendar calendar = Calendar.getInstance(); calendar.setTime(commonOrder.getSettleTime()); calendar.add(Calendar.MONTH, 1); child.setPreGetTime(new Date(TimeUtil.convertToTimeTemp( calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25", "yyyy-M-dd"))); } child.setUserInfo(user); child.setUrank(user.getRank()); child.setVersion(2); child.setCreateTime(new Date()); child.setOrderType(commonOrder.getSourceType()); if (child.getMoney() == null) return null; if (child.getMoney().compareTo(new BigDecimal(0)) <= 0 && userLevel == UserLevelEnum.daRen) return null; return child; } /** * * @param commonOrder * - 订单信息 * @param fanliRate * -返利比例 * @param mianDanMoney * 免单金额 * @param isVIP-是否为VIP订单 * @return * @throws HongBaoException * @throws UserAccountException */ private HongBaoV2 createFanLiHongBao(CommonOrder commonOrder, BigDecimal money, BigDecimal mianDanMoney, UserLevelEnum userLevel) throws HongBaoException, UserAccountException { HongBaoV2 hongBao = new HongBaoV2(); hongBao.setUserInfo(commonOrder.getUserInfo()); hongBao.setCreateTime(new Date()); hongBao.setType(HongBaoV2.TYPE_ZIGOU); hongBao.setVersion(2); hongBao.setMoney(money); if (commonOrder.getState() == CommonOrder.STATE_FK) { hongBao.setState(HongBaoV2.STATE_BUKELINGQU); } else if (commonOrder.getState() == CommonOrder.STATE_JS || CommonOrder.STATE_WQ == commonOrder.getState()) { hongBao.setState(HongBaoV2.STATE_KELINGQU); if (commonOrder.getSourceType() == Constant.SOURCE_TYPE_PDD)// 拼多多15天半到账 hongBao.setPreGetTime(new Date( commonOrder.getSettleTime().getTime() + 1000 * 60 * 60 * 24 * 15L + 1000 * 60 * 60 * 12L)); else hongBao.setPreGetTime(new Date(commonOrder.getSettleTime().getTime() + 1000 * 60 * 60 * 24 * 15L)); } else if (commonOrder.getState() == CommonOrder.STATE_SX) { hongBao.setState(HongBaoV2.STATE_SHIXIAO); hongBao.setMoney(new BigDecimal(0)); } else { throw new HongBaoException(3, "维权订单不能创建红包"); } if (mianDanMoney != null) hongBao.setMoney(mianDanMoney); UserInfo user = userInfoService.getUserById(commonOrder.getUserInfo().getId()); if (user == null) throw new UserAccountException(1001, "用户不存在/被封禁"); hongBao.setUrank(userLevel.getOrderRank()); hongBao.setOrderType(commonOrder.getSourceType()); return hongBao; } private HongBaoV2 createFanLiUpdateHongBao(CommonOrder commonOrder, BigDecimal money, Long hongBaoId, boolean mianDan) throws HongBaoException, UserAccountException { HongBaoV2 hongBao = new HongBaoV2(hongBaoId); hongBao.setUpdateTime(new Date()); hongBao.setMoney(money); // 更改状态与资金 if (commonOrder.getState() == CommonOrder.STATE_FK) { hongBao.setState(HongBaoV2.STATE_BUKELINGQU); if (mianDan) hongBao.setMoney(commonOrder.getPayment()); } else if (commonOrder.getState() == CommonOrder.STATE_JS || commonOrder.getState() == CommonOrder.STATE_WQ) { hongBao.setState(HongBaoV2.STATE_KELINGQU); if (commonOrder.getSourceType() == Constant.SOURCE_TYPE_PDD)// 拼多多15天过1个小时到账 hongBao.setPreGetTime(new Date( commonOrder.getSettleTime().getTime() + 1000 * 60 * 60 * 24 * 15L + 1000 * 60 * 60 * 1L)); else hongBao.setPreGetTime(new Date(commonOrder.getSettleTime().getTime() + 1000 * 60 * 60 * 24 * 15L)); if (mianDan) hongBao.setMoney(commonOrder.getSettlement().compareTo(commonOrder.getPayment()) <= 0 ? commonOrder.getSettlement() : commonOrder.getPayment());// 返利结算与付款较小的金额 } else if (commonOrder.getState() == CommonOrder.STATE_SX) { hongBao.setState(HongBaoV2.STATE_SHIXIAO); hongBao.setMoney(new BigDecimal(0)); } return hongBao; } /** * 分享赚更新 * * @param commonOrder * @param fanliRate * @param hongBaoId * @param mianDan * @return * @throws HongBaoException * @throws UserAccountException */ private HongBaoV2 createShareUpdateHongBao(CommonOrder commonOrder, BigDecimal money, Long hongBaoId) throws HongBaoException, UserAccountException { HongBaoV2 hongBao = new HongBaoV2(hongBaoId); hongBao.setUpdateTime(new Date()); hongBao.setMoney(money); // 更改状态与资金 if (commonOrder.getState() == CommonOrder.STATE_FK) { hongBao.setState(HongBaoV2.STATE_BUKELINGQU); } else if (commonOrder.getState() == CommonOrder.STATE_JS || commonOrder.getState() == CommonOrder.STATE_WQ) { hongBao.setState(HongBaoV2.STATE_KELINGQU); Calendar calendar = Calendar.getInstance(); calendar.setTime(commonOrder.getSettleTime()); calendar.add(Calendar.MONTH, 1); hongBao.setPreGetTime(new Date(TimeUtil.convertToTimeTemp( calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25", "yyyy-M-dd"))); } else if (commonOrder.getState() == CommonOrder.STATE_SX) { hongBao.setState(HongBaoV2.STATE_SHIXIAO); hongBao.setMoney(new BigDecimal(0)); } return hongBao; } private HongBaoV2 createInviteUpdateHongBao(HongBaoV2 oldChild, int mainHongBaoState, BigDecimal money, CommonOrder commonOrder) { HongBaoV2 childUpdate = new HongBaoV2(oldChild.getId()); childUpdate.setState(mainHongBaoState); childUpdate.setUpdateTime(new Date()); childUpdate.setMoney(money); // 以实际收入为准计算预估收益 if (mainHongBaoState == HongBaoV2.STATE_KELINGQU) { Calendar calendar = Calendar.getInstance(); calendar.setTime(commonOrder.getSettleTime()); calendar.add(Calendar.MONTH, 1); childUpdate.setPreGetTime(new Date(TimeUtil.convertToTimeTemp( calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25", "yyyy-M-dd"))); } return childUpdate; } private void addFanLiOrShareHongBao(HongBaoV2 hongBao, CommonOrder commonOrder, Map<Integer, HongBaoOrder> notificationMap) { hongBaoV2Mapper.insertSelective(hongBao); // 添加红包与订单的映射 HongBaoOrder hongBaoOrder = new HongBaoOrder(); hongBaoOrder.setCommonOrder(commonOrder); hongBaoOrder.setCreateTime(new Date()); hongBaoOrder.setHongBaoV2(hongBao); hongBaoOrderMapper.insertSelective(hongBaoOrder); // 加入通知 if (notificationMap.get(hongBao.getType()) == null) { HongBaoV2 tempHongBao = new HongBaoV2(hongBao.getId()); tempHongBao.setUserInfo(hongBao.getUserInfo()); tempHongBao.setMoney(hongBao.getMoney()); CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId()); tempCommonOrder.setPayment(commonOrder.getPayment()); notificationMap.put(hongBao.getType(), new HongBaoOrder(tempCommonOrder, tempHongBao)); } else { // 增加付款金额与资金 HongBaoOrder tempHongBaoOrder = notificationMap.get(hongBao.getType()); tempHongBaoOrder.getCommonOrder() .setPayment(tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment())); tempHongBaoOrder.getHongBaoV2() .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(hongBao.getMoney())); notificationMap.put(hongBao.getType(), tempHongBaoOrder); } } /** * 创建分享赚红包 * * @param commonOrder * @param shareRate * @return * @throws HongBaoException * @throws UserAccountException */ private HongBaoV2 createShareHongBao(CommonOrder commonOrder, BigDecimal money, UserLevelEnum userLevel) throws HongBaoException, UserAccountException { HongBaoV2 hongBao = new HongBaoV2(); hongBao.setCreateTime(new Date()); hongBao.setType(HongBaoV2.TYPE_SHARE_GOODS); hongBao.setVersion(2); hongBao.setMoney(money); if (commonOrder.getState() == CommonOrder.STATE_FK) { hongBao.setState(HongBaoV2.STATE_BUKELINGQU); } else if (commonOrder.getState() == CommonOrder.STATE_JS || commonOrder.getState() == CommonOrder.STATE_WQ) { hongBao.setState(HongBaoV2.STATE_KELINGQU); Calendar calendar = Calendar.getInstance(); calendar.setTime(commonOrder.getSettleTime()); calendar.add(Calendar.MONTH, 1); hongBao.setPreGetTime(new Date(TimeUtil.convertToTimeTemp( calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25", "yyyy-M-dd"))); } UserInfo user = userInfoService.getUserById(commonOrder.getUserInfo().getId()); if (user == null) throw new UserAccountException(1001, "用户不存在/被封禁"); hongBao.setUrank(userLevel.getOrderRank()); hongBao.setUserInfo(user); hongBao.setOrderType(commonOrder.getSourceType()); return hongBao; } // 根据红包里面的urank匹配用户等级 private static UserLevelEnum getUserLevelByURank(Integer rank) { if (rank == null) return null; for (UserLevelEnum e : UserLevelEnum.values()) { if (e.getOrderRank() == e.getOrderRank()) return e; } return null; } } fanli/src/main/java/com/yeshi/fanli/service/manger/user/UserLevelManager.java
New file @@ -0,0 +1,40 @@ package com.yeshi.fanli.service.manger.user; import javax.annotation.Resource; import org.springframework.stereotype.Component; import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum; import com.yeshi.fanli.entity.bus.user.vip.UserVIPPreInfo; import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService; import com.yeshi.fanli.service.inter.user.vip.UserVIPPreInfoService; @Component public class UserLevelManager { @Resource private UserVIPInfoService userVIPInfoService; @Resource private UserVIPPreInfoService userVIPPreInfoService; /** * 获取用户等级 * @Title: getUserLevel * @Description: * @param uid * @return * UserLevelEnum 返回类型 * @throws */ public UserLevelEnum getUserLevel(Long uid) { if (userVIPInfoService.isVIP(uid)) return UserLevelEnum.superVIP; UserVIPPreInfo info = userVIPPreInfoService.getLatestProcessInfo(uid); if (info != null) for (UserLevelEnum level : UserLevelEnum.values()) if (level.getLevel() == info.getProcess()) return level; return UserLevelEnum.daRen; } }