admin
2020-03-17 b85fb24ab565ab70f6648cc09d93ba9ff1fc6b57
订单补贴
2个文件已修改
12个文件已添加
2038 ■■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/entity/bus/user/vip/UserLevelEnum.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/money/OrderTeamRewardDebt.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/money/OrderTeamRewardDebtRepayHistory.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/order/OrderTeamReward.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/exception/order/OrderTeamRewardException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/InviteOrderSubsidyServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/InviteOrderSubsidyServiceImplV2.java 266 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderHongBaoMoneyComputeServiceImpl.java 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/InviteOrderSubsidyServiceV2.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderHongBaoMoneyComputeService.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/OrderTeamRewardService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/config/HongBaoManageService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/manger/order/HongBaoV2AddManagerV2.java 879 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/manger/user/UserLevelManager.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
    }
}