admin
2020-07-14 eec7e789a87863c25d92c10ad5dfc22ad80c448d
fanli/src/main/java/com/yeshi/fanli/service/manger/order/HongBaoV2AddManager.java
@@ -13,6 +13,7 @@
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -53,878 +54,904 @@
@Component
public class HongBaoV2AddManager {
   @Resource
   private UserInfoService userInfoService;
    @Resource
    private UserInfoService userInfoService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
    @Resource
    private ThreeSaleSerivce threeSaleSerivce;
   @Resource
   private HongBaoOrderMapper hongBaoOrderMapper;
    @Resource
    private HongBaoOrderMapper hongBaoOrderMapper;
   @Resource
   private HongBaoV2Mapper hongBaoV2Mapper;
    @Resource
    private HongBaoV2Mapper hongBaoV2Mapper;
   @Resource
   private UserOrderMsgNotificationService userOrderMsgNotificationService;
    @Resource
    private UserOrderMsgNotificationService userOrderMsgNotificationService;
   @Resource
   private HongBaoManageService hongBaoManageService;
    @Resource
    private HongBaoManageService hongBaoManageService;
   @Resource
   private CommonOrderService commonOrderService;
    @Resource
    private CommonOrderService commonOrderService;
   @Resource
   private UserSystemCouponRecordService userSystemCouponRecordService;
    @Resource
    private UserSystemCouponRecordService userSystemCouponRecordService;
   @Resource
   private UserSystemCouponService userSystemCouponService;
    @Resource
    private UserSystemCouponService userSystemCouponService;
   @Resource
   private CommonOrderGoodsMapper commonOrderGoodsMapper;
    @Resource
    private CommonOrderGoodsMapper commonOrderGoodsMapper;
   @Resource
   private UserVIPInfoService userVIPInfoService;
    @Resource
    private UserVIPInfoService userVIPInfoService;
   @Resource
   private UserLevelManager userLevelManager;
    @Resource
    private UserLevelManager userLevelManager;
   @Resource
   private InviteOrderSubsidyService inviteOrderSubsidyService;
    @Resource
    private InviteOrderSubsidyService inviteOrderSubsidyService;
   @Resource
   private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
   /**
    * 添加红包信息
    *
    * @param commonOrderList
    * @param type
    * @return
    * @throws HongBaoException
    * @throws UserAccountException
    * @throws CommonOrderException
    * @throws OrderTeamRewardException
    * @throws InviteOrderSubsidyException
    */
   public HongBaoAddResult addHongBao(List<CommonOrder> commonOrderList, int type)
         throws HongBaoException, UserAccountException {
    /**
     * 添加红包信息
     *
     * @param commonOrderList
     * @param type
     * @return
     * @throws HongBaoException
     * @throws UserAccountException
     * @throws CommonOrderException
     * @throws OrderTeamRewardException
     * @throws InviteOrderSubsidyException
     */
    public HongBaoAddResult addHongBao(List<CommonOrder> commonOrderList, int type)
            throws HongBaoException, UserAccountException {
      if (commonOrderList != null && commonOrderList.size() > 0) {
         int orderType = commonOrderList.get(0).getSourceType();
         String orderId = commonOrderList.get(0).getOrderNo();
        if (commonOrderList != null && commonOrderList.size() > 0) {
            int orderType = commonOrderList.get(0).getSourceType();
            String orderId = commonOrderList.get(0).getOrderNo();
         Map<Integer, HongBaoOrder> notificationMap = new HashMap<>();
         int goodsCount = 0;
         boolean hasAdd = false;
         boolean hasUpdate = false;
         Set<Integer> stateSet = new HashSet<>();// 订单状态Set
            Map<Integer, HongBaoOrder> notificationMap = new HashMap<>();
            int goodsCount = 0;
            boolean hasAdd = false;
            boolean hasUpdate = false;
            Set<Integer> stateSet = new HashSet<>();// 订单状态Set
         UserLevelEnum userLevel = UserLevelUtil.getByOrderRank(commonOrderList.get(0).getUrank());
            UserLevelEnum userLevel = UserLevelUtil.getByOrderRank(commonOrderList.get(0).getUrank());
         if (userLevel == null)
            userLevel = UserLevelEnum.daRen;
            if (userLevel == null)
                userLevel = UserLevelEnum.daRen;
         Date placeOrderDate = commonOrderList.get(0).getThirdCreateTime();
            Date placeOrderDate = commonOrderList.get(0).getThirdCreateTime();
         boolean miandan = false;
            boolean miandan = false;
         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) {
               miandan = saveHongBao(commonOrder, type, notificationMap, userLevel, placeOrderDate);
               hasAdd = true;
            } else {
               boolean update = updateHongBao(hongBaoOrder, commonOrder, type, notificationMap, placeOrderDate);
               if (update) {
                  hasUpdate = true;
               }
            }
         }
            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) {
                    HongBaoSaveResult result = saveHongBao(commonOrder, type, notificationMap, userLevel,
                            placeOrderDate);
                    miandan = result.isMiandan();
                    hasAdd = result.isAdd();
                } else {
                    boolean update = updateHongBao(hongBaoOrder, commonOrder, type, notificationMap, placeOrderDate);
                    if (update) {
                        hasUpdate = true;
                    }
                }
            }
         int state = getOrderState(stateSet);
            int state = getOrderState(stateSet);
         /**
          * 通知用户的返利情况
          */
            /**
             * 通知用户的返利情况
             */
         // if (!Constant.IS_TEST) {
         if (hasAdd) {
            // 获取订单补贴
            // 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();
               Long uid = notify.getUserInfo().getId();
                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();
                    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, commonOrder.getThirdCreateTime());
                    BigDecimal money = notify.getMoney();
                    switch (t) {
                        case HongBaoV2.TYPE_ZIGOU:
                            userOrderMsgNotificationService.orderFanLiStatistic(uid, orderId, orderType,
                                    commonOrder.getPayment(), money, goodsCount, state, commonOrder.getThirdCreateTime());
                  break;
               case HongBaoV2.TYPE_SHARE_GOODS:
                            break;
                        case HongBaoV2.TYPE_SHARE_GOODS:
                  userOrderMsgNotificationService.orderShareStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, goodsCount, state, commonOrder.getThirdCreateTime());
                            userOrderMsgNotificationService.orderShareStatistic(uid, orderId, orderType,
                                    commonOrder.getPayment(), money, goodsCount, state, commonOrder.getThirdCreateTime());
                  break;
               case HongBaoV2.TYPE_YIJI:
                  userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                        commonOrder.getThirdCreateTime());
                            break;
                        case HongBaoV2.TYPE_YIJI:
                            userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                                    commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                                    commonOrder.getThirdCreateTime());
                  break;
               case HongBaoV2.TYPE_ERJI:
                            break;
                        case HongBaoV2.TYPE_ERJI:
                  userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                        commonOrder.getThirdCreateTime());
                            userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                                    commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                                    commonOrder.getThirdCreateTime());
                  break;
                            break;
               case HongBaoV2.TYPE_SHARE_YIJI:
                  userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                        commonOrder.getThirdCreateTime());
                  break;
               case HongBaoV2.TYPE_SHARE_ERJI:
                        case HongBaoV2.TYPE_SHARE_YIJI:
                            userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                                    commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                                    commonOrder.getThirdCreateTime());
                            break;
                        case HongBaoV2.TYPE_SHARE_ERJI:
                  userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                        commonOrder.getThirdCreateTime());
                            userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                                    commonOrder.getPayment(), money, new BigDecimal(0), goodsCount, state,
                                    commonOrder.getThirdCreateTime());
                  break;
                            break;
               }
            }
            // }
         }
                    }
                }
                // }
            }
         int resultCode = 0;
         if (hasAdd && hasUpdate)
            return new HongBaoAddResult(HongBaoAddResult.CODE_ADD_AND_UPDATE, miandan);
         else if (hasAdd)
            return new HongBaoAddResult(HongBaoAddResult.CODE_ADD, miandan);
         else if (hasUpdate)
            return new HongBaoAddResult(HongBaoAddResult.CODE_UPDATE, miandan);
         return new HongBaoAddResult(resultCode, miandan);
      }
      return new HongBaoAddResult(0, false);
   }
            int resultCode = 0;
            if (hasAdd && hasUpdate)
                return new HongBaoAddResult(HongBaoAddResult.CODE_ADD_AND_UPDATE, miandan);
            else if (hasAdd)
                return new HongBaoAddResult(HongBaoAddResult.CODE_ADD, miandan);
            else if (hasUpdate)
                return new HongBaoAddResult(HongBaoAddResult.CODE_UPDATE, miandan);
            return new HongBaoAddResult(resultCode, miandan);
        }
        return new HongBaoAddResult(0, false);
    }
   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;
   }
    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;
    }
   private List<UserTeamLevel> getBossList(Long uid, int deep) {
      List<UserTeamLevel> resultList = new ArrayList<>();
      List<ThreeSale> threeSales = threeSaleSerivce.getMyBossDeepList(uid, deep);
    private List<UserTeamLevel> getBossList(Long uid, int deep) {
        List<UserTeamLevel> resultList = new ArrayList<>();
        List<ThreeSale> threeSales = threeSaleSerivce.getMyBossDeepList(uid, deep);
      if (threeSales != null) {
         List<Long> uidList = new ArrayList<Long>();
         for (ThreeSale ts : threeSales)
            uidList.add(ts.getBoss().getId());
        if (threeSales != null) {
            List<Long> uidList = new ArrayList<Long>();
            for (ThreeSale ts : threeSales)
                uidList.add(ts.getBoss().getId());
         for (Long bossUid : uidList) {
            UserLevelEnum level = userLevelManager.getUserLevel(bossUid);
            resultList.add(new UserTeamLevel(bossUid, level));
         }
            for (Long bossUid : uidList) {
                UserLevelEnum level = userLevelManager.getUserLevel(bossUid);
                resultList.add(new UserTeamLevel(bossUid, level));
            }
      }
        }
      return resultList;
   }
        return resultList;
    }
   private List<UserTeamLevel> getBossList(List<HongBaoV2> children) {
      List<UserTeamLevel> resultList = new ArrayList<>();
      for (HongBaoV2 v2 : children) {
    private List<UserTeamLevel> getBossList(List<HongBaoV2> children) {
        List<UserTeamLevel> resultList = new ArrayList<>();
        for (HongBaoV2 v2 : children) {
         UserLevelEnum level = UserLevelUtil.getByOrderRank(v2.getUrank());
         if (level == null)
            level = UserLevelEnum.daRen;
         UserTeamLevel teamLevel = new UserTeamLevel(v2.getUserInfo().getId(), level);
            UserLevelEnum level = UserLevelUtil.getByOrderRank(v2.getUrank());
            if (level == null)
                level = UserLevelEnum.daRen;
            UserTeamLevel teamLevel = new UserTeamLevel(v2.getUserInfo().getId(), level);
         if (v2.getType() == HongBaoV2.TYPE_YIJI || v2.getType() == HongBaoV2.TYPE_SHARE_YIJI) {
            resultList.add(0, teamLevel);
         } else {
            resultList.add(teamLevel);
         }
      }
      return resultList;
   }
            if (v2.getType() == HongBaoV2.TYPE_YIJI || v2.getType() == HongBaoV2.TYPE_SHARE_YIJI) {
                resultList.add(0, teamLevel);
            } else {
                resultList.add(teamLevel);
            }
        }
        return resultList;
    }
   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 = UserLevelUtil.getByOrderRank(oldHongBao.getUrank());
      if (buyerLevel == null)
         throw new HongBaoException(201, "用户等级为空");
    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 = UserLevelUtil.getByOrderRank(oldHongBao.getUrank());
        if (buyerLevel == null)
            throw new HongBaoException(201, "用户等级为空");
      // 已经失效,已经领取,新老状态一致的红包不做处理
      if (oldHongBao.getState() == HongBaoV2.STATE_SHIXIAO || oldHongBao.getState() == HongBaoV2.STATE_YILINGQU)
         return false;
        // 已经失效,已经领取,新老状态一致的红包不做处理
        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 (type == HongBaoV2.TYPE_ZIGOU) {// 获取自购的返利比例
            BigDecimal money = orderHongBaoMoneyComputeService.computeFanliMoney(commonOrder, buyerLevel);
            // 免单处理
            boolean mianDan = false;
            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();
            if (payMent.compareTo(new BigDecimal(10)) < 0) {
               mianDan = userSystemCouponRecordService.isSuccessMianDan(commonOrder.getSourceType(),
                     commonOrder.getOrderNo());
            }
         }
                if (payMent.compareTo(new BigDecimal(10)) < 0) {
                    mianDan = userSystemCouponRecordService.isSuccessMianDan(commonOrder.getSourceType(),
                            commonOrder.getOrderNo());
                }
            }
         HongBaoV2 hongBao = createFanLiUpdateHongBao(commonOrder, money, hongBaoOrder.getHongBaoV2().getId(),
               mianDan);
            HongBaoV2 hongBao = createFanLiUpdateHongBao(commonOrder, money, hongBaoOrder.getHongBaoV2().getId(),
                    mianDan);
         // 新老红包状态一致不处理
         if (oldHongBao.getState().intValue() == hongBao.getState())
            return false;
            // 新老红包状态一致不处理
            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, "免单券退款出错");
               }
            }
         }
            if (hongBao.getState() == HongBaoV2.STATE_SHIXIAO) {
                if (mianDan) {
                    try {
                        userSystemCouponService.updateStateByDrawback(commonOrder.getOrderNo(), commonOrder.getSourceType());
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw new HongBaoException(12, "免单券退款出错");
                    }
                }
            }
         hongBaoV2Mapper.updateByPrimaryKeySelective(hongBao);
            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());
            tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
            notificationMap.put(type, new HongBaoOrder(tempCommonOrder, tempHongBao));
         } else {
            // 增加付款金额与资金
            HongBaoOrder tempHongBaoOrder = notificationMap.get(type);
            tempHongBaoOrder.getCommonOrder()
                  .setPayment(tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment()));
            // 加入通知
            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());
                tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
                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);
         }
                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) {
            List<UserTeamLevel> bossList = getBossList(children);
            // 获取子红包
            List<HongBaoV2> children = hongBaoV2Mapper.listChildrenById(hongBao.getId());
            if (children != null && children.size() > 0) {
                List<UserTeamLevel> bossList = getBossList(children);
            for (HongBaoV2 child : children) {
               if (child.getState() == HongBaoV2.STATE_YILINGQU)
                  continue;
                for (HongBaoV2 child : children) {
                    if (child.getState() == HongBaoV2.STATE_YILINGQU)
                        continue;
               if (child.getType() == HongBaoV2.TYPE_YIJI) {
                  money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                        bossList);
               } else if (child.getType() == HongBaoV2.TYPE_ERJI) {
                  money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel,
                        bossList);
               }
                    if (child.getType() == HongBaoV2.TYPE_YIJI) {
                        money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                                bossList);
                    } else if (child.getType() == HongBaoV2.TYPE_ERJI) {
                        money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel,
                                bossList);
                    }
               HongBaoV2 childUpdate = createInviteUpdateHongBao(child, hongBao.getState(), money, commonOrder);
               hongBaoV2Mapper.updateByPrimaryKeySelective(childUpdate);
                    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());
                  tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
                  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 (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());
                        tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
                        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) {
                     List<UserTeamLevel> bossList = getBossList(oldHongBao.getUserInfo().getId(), 2);
                        if (boss != null) {
                            List<UserTeamLevel> bossList = getBossList(oldHongBao.getUserInfo().getId(), 2);
                     // 插入一级子红包
                     money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                           bossList);
                     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, bossList);
                        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) {
                            // 插入一级子红包
                            money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                                    bossList);
                            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, bossList);
                                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);
            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());
            tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
            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);
         }
            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());
                tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
                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) {
            List<UserTeamLevel> bossList = getBossList(children);
            for (HongBaoV2 child : children) {
               if (child.getState() == HongBaoV2.STATE_YILINGQU)
                  continue;
            // 获取子红包
            List<HongBaoV2> children = hongBaoV2Mapper.listChildrenById(hongBao.getId());
            if (children != null && children.size() > 0) {
                List<UserTeamLevel> bossList = getBossList(children);
                for (HongBaoV2 child : children) {
                    if (child.getState() == HongBaoV2.STATE_YILINGQU)
                        continue;
               if (child.getType() == HongBaoV2.TYPE_SHARE_YIJI) {
                  money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                        bossList);
               } else if (child.getType() == HongBaoV2.TYPE_SHARE_ERJI) {
                  money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel,
                        bossList);
               }
               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());
                  tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
                  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);
               }
                    if (child.getType() == HongBaoV2.TYPE_SHARE_YIJI) {
                        money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                                bossList);
                    } else if (child.getType() == HongBaoV2.TYPE_SHARE_ERJI) {
                        money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel,
                                bossList);
                    }
                    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());
                        tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
                        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;
    }
    private HongBaoSaveResult saveHongBao(CommonOrder commonOrder, int type, Map<Integer, HongBaoOrder> notificationMap,
                                          UserLevelEnum buyerLevel, Date placeOrderDate) throws HongBaoException, UserAccountException {
        SystemEnum system = userInfoService.getUserSystem(commonOrder.getUserInfo().getId());
        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()), commonOrder.getSourceType()))
                                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(), commonOrder.getSourceType());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            HongBaoV2 hongBao = createFanLiHongBao(commonOrder,
                    orderHongBaoMoneyComputeService.computeFanliMoney(commonOrder, buyerLevel), mianDanMoney,
                    buyerLevel);
            if (hongBao == null)
                return new HongBaoSaveResult(false, mianDanMoney != null);
            addFanLiOrShareHongBao(hongBao, commonOrder, notificationMap);
            UserInfo boss = threeSaleSerivce.getBoss(hongBao.getUserInfo().getId());
            if (boss != null && hongBao.getState() != HongBaoV2.STATE_SHIXIAO && mianDanMoney == null) {// 1级BOSS存在且红包未失效,免单不支持多级分销
                List<UserTeamLevel> bossList = getBossList(hongBao.getUserInfo().getId(), 2);
            }
         }
      } else
         throw new HongBaoException(2, "type错误");
                BigDecimal money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                        bossList);
                if (money == null)// 返利资金为空不参与分成
                    return new HongBaoSaveResult(true, mianDanMoney != null);
      return true;
   }
                UserLevelEnum bossLevel = userLevelManager.getUserLevel(boss.getId());
   @Transactional(rollbackFor = Exception.class)
   private boolean saveHongBao(CommonOrder commonOrder, int type, Map<Integer, HongBaoOrder> notificationMap,
         UserLevelEnum buyerLevel, Date placeOrderDate) throws HongBaoException, UserAccountException {
                HongBaoV2 firstHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder, HongBaoV2.TYPE_YIJI,
                        money, bossLevel);
      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();
            }
         }
                addInviteHongBao(firstHongbao, null, notificationMap, commonOrder);
         HongBaoV2 hongBao = createFanLiHongBao(commonOrder,
               orderHongBaoMoneyComputeService.computeFanliMoney(commonOrder, buyerLevel), mianDanMoney,
               buyerLevel);
         if (hongBao == null)
            return mianDanMoney != null;
         addFanLiOrShareHongBao(hongBao, commonOrder, notificationMap);
         UserInfo boss = threeSaleSerivce.getBoss(hongBao.getUserInfo().getId());
         if (boss != null && hongBao.getState() != HongBaoV2.STATE_SHIXIAO && mianDanMoney == null) {// 1级BOSS存在且红包未失效,免单不支持多级分销
                // 插入二级子红包
                boss = threeSaleSerivce.getBoss(boss.getId());
                if (boss != null) {// 二级BOSS存在且是非会员订单
                    money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel, bossList);
                    bossLevel = userLevelManager.getUserLevel(boss.getId());
                    if (money == null)
                        return new HongBaoSaveResult(true, mianDanMoney != null);
                    HongBaoV2 secondHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder,
                            HongBaoV2.TYPE_ERJI, money, bossLevel);
                    addInviteHongBao(secondHongbao, null, notificationMap, commonOrder);
                }
            }
            List<UserTeamLevel> bossList = getBossList(hongBao.getUserInfo().getId(), 2);
        } else if (type == HongBaoV2.TYPE_SHARE_GOODS) {
            // 分享赚不加入失效的订单
            if (commonOrder.getState() == CommonOrder.STATE_SX || commonOrder.getState() == CommonOrder.STATE_WQ)
                return new HongBaoSaveResult(false, false);
            // 分享赚
            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(), system);
                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);
            BigDecimal money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel,
                  bossList);
            if (money == null)// 返利资金为空不参与分成
               return mianDanMoney != null;
            if (money == null || money.compareTo(new BigDecimal(0)) <= 0)
                return new HongBaoSaveResult(false, false);
            HongBaoV2 hongBao = createShareHongBao(commonOrder, money, buyerLevel);
            if (hongBao == null)
                return new HongBaoSaveResult(false, false);
            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) {
            UserLevelEnum bossLevel = userLevelManager.getUserLevel(boss.getId());
                    List<UserTeamLevel> bossList = getBossList(hongBao.getUserInfo().getId(), 2);
            HongBaoV2 firstHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder, HongBaoV2.TYPE_YIJI,
                  money, bossLevel);
                    money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel, bossList);
                    if (money == null)
                        return new HongBaoSaveResult(true, false);
                    UserLevelEnum bossLevel = userLevelManager.getUserLevel(boss.getId());
                    HongBaoV2 firstHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder,
                            HongBaoV2.TYPE_SHARE_YIJI, money, bossLevel);
            addInviteHongBao(firstHongbao, null, notificationMap, commonOrder);
                    addInviteHongBao(firstHongbao, hongBao.getUserInfo().getNickName(), notificationMap, commonOrder);
            // 插入二级子红包
            boss = threeSaleSerivce.getBoss(boss.getId());
            if (boss != null) {// 二级BOSS存在且是非会员订单
               money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel, bossList);
               bossLevel = userLevelManager.getUserLevel(boss.getId());
               if (money == null)
                  return mianDanMoney != null;
               HongBaoV2 secondHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder,
                     HongBaoV2.TYPE_ERJI, money, bossLevel);
               addInviteHongBao(secondHongbao, null, notificationMap, commonOrder);
            }
         }
                    // 二级分享赚
                    boss = threeSaleSerivce.getBoss(boss.getId());
                    if (boss != null) {
                        money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel,
                                bossList);
                        if (money == null)// 返利比例为0就不统计
                            return new HongBaoSaveResult(true, false);
                        bossLevel = userLevelManager.getUserLevel(boss.getId());
                        HongBaoV2 secondChild = createInviteHongBao(boss.getId(), hongBao, commonOrder,
                                HongBaoV2.TYPE_SHARE_ERJI, money, bossLevel);
                        addInviteHongBao(secondChild, null, notificationMap, commonOrder);
                    }
                }
            }
      } else if (type == HongBaoV2.TYPE_SHARE_GOODS) {
         // 分享赚不加入失效的订单
         if (commonOrder.getState() == CommonOrder.STATE_SX || commonOrder.getState() == CommonOrder.STATE_WQ)
            return false;
         // 分享赚
         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);
            // 修改统计数据
            Long goodsId = commonOrder.getCommonOrderGoods().getId();
            // 查询商品
            CommonOrderGoods goods = commonOrderGoodsMapper.selectByPrimaryKey(goodsId);
         if (money == null || money.compareTo(new BigDecimal(0)) <= 0)
            return false;
         HongBaoV2 hongBao = createShareHongBao(commonOrder, money, buyerLevel);
         if (hongBao == null)
            return false;
         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) {
            HongBao hb = new HongBao();
            if (goods != null)
                hb.setAuctionId(Long.parseLong(goods.getGoodsId()));
            hb.setUserInfo(hongBao.getUserInfo());
            hb.setMoney(hongBao.getMoney());
               List<UserTeamLevel> bossList = getBossList(hongBao.getUserInfo().getId(), 2);
            // 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错误");
               money = orderHongBaoMoneyComputeService.computeFirstInviteMoney(commonOrder, buyerLevel, bossList);
               if (money == null)
                  return false;
               UserLevelEnum bossLevel = userLevelManager.getUserLevel(boss.getId());
               HongBaoV2 firstHongbao = createInviteHongBao(boss.getId(), hongBao, commonOrder,
                     HongBaoV2.TYPE_SHARE_YIJI, money, bossLevel);
        return new HongBaoSaveResult(true, false);
    }
               addInviteHongBao(firstHongbao, hongBao.getUserInfo().getNickName(), notificationMap, commonOrder);
    /**
     * 添加邀请赚红包
     *
     * @param child
     * @param notificationMap
     * @param commonOrder
     */
    private void addInviteHongBao(HongBaoV2 child, String parentHongBaoUserName,
                                  Map<Integer, HongBaoOrder> notificationMap, CommonOrder commonOrder) {
        if (child != null) {
            // 老版本资金为0的红包不加入邀请订单
            if (child.getMoney() == null || (child.getMoney().compareTo(new BigDecimal(0)) == 0
                    && commonOrder.getThirdCreateTime().getTime() < Constant.NEW_ORDER_FANLI_RULE_TIME))
                return;
               // 二级分享赚
               boss = threeSaleSerivce.getBoss(boss.getId());
               if (boss != null) {
                  money = orderHongBaoMoneyComputeService.computeSecondInviteMoney(commonOrder, buyerLevel,
                        bossList);
                  if (money == null)// 返利比例为0就不统计
                     return false;
                  bossLevel = userLevelManager.getUserLevel(boss.getId());
                  HongBaoV2 secondChild = createInviteHongBao(boss.getId(), hongBao, commonOrder,
                        HongBaoV2.TYPE_SHARE_ERJI, money, bossLevel);
                  addInviteHongBao(secondChild, null, notificationMap, commonOrder);
               }
            }
         }
            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);
         // 修改统计数据
         Long goodsId = commonOrder.getCommonOrderGoods().getId();
         // 查询商品
         CommonOrderGoods goods = commonOrderGoodsMapper.selectByPrimaryKey(goodsId);
                CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId());
                tempCommonOrder.setPayment(commonOrder.getPayment());
                tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
                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);
            }
        }
    }
         HongBao hb = new HongBao();
         if (goods != null)
            hb.setAuctionId(Long.parseLong(goods.getGoodsId()));
         hb.setUserInfo(hongBao.getUserInfo());
         hb.setMoney(hongBao.getMoney());
    /**
     * 创建邀请红包
     *
     * @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;
         // 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错误");
        HongBaoV2 child = new HongBaoV2();
        child.setParent(parent);
        child.setType(hongBaoType);
        child.setMoney(money);
      return false;
   }
        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")));
        }
   /**
    * 添加邀请赚红包
    *
    * @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);
        child.setUserInfo(user);
        child.setUrank(userLevel.getOrderRank());
        child.setVersion(2);
        child.setCreateTime(new Date());
        child.setOrderType(commonOrder.getSourceType());
        if (child.getMoney() == null)
            return null;
        return child;
    }
            CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId());
            tempCommonOrder.setPayment(commonOrder.getPayment());
            tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
            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 commonOrder
     * @param money
     * @param mianDanMoney
     * @param userLevel
     * @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);
   /**
    * 创建邀请红包
    *
    * @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;
        } 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, "维权订单不能创建红包");
        }
      HongBaoV2 child = new HongBaoV2();
      child.setParent(parent);
      child.setType(hongBaoType);
      child.setMoney(money);
        if (mianDanMoney != null)
            hongBao.setMoney(mianDanMoney);
      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")));
      }
        UserInfo user = userInfoService.getUserById(commonOrder.getUserInfo().getId());
        if (user == null)
            throw new UserAccountException(1001, "用户不存在/被封禁");
        hongBao.setUrank(userLevel.getOrderRank());
        hongBao.setOrderType(commonOrder.getSourceType());
        return hongBao;
    }
      child.setUserInfo(user);
      child.setUrank(userLevel.getOrderRank());
      child.setVersion(2);
      child.setCreateTime(new Date());
      child.setOrderType(commonOrder.getSourceType());
      if (child.getMoney() == null)
         return null;
      return child;
   }
    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);
   /**
    *
    * @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);
            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;
    }
      } 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, "维权订单不能创建红包");
      }
    /**
     * 分享赚更新
     *
     * @param commonOrder
     * @param hongBaoId
     * @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;
    }
      if (mianDanMoney != null)
         hongBao.setMoney(mianDanMoney);
    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;
    }
      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 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());
            tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
            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);
        }
    }
   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);
    /**
     * 创建分享赚红包
     *
     * @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;
    }
         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;
   }
    class HongBaoSaveResult {
        boolean add;
        boolean miandan;
   /**
    * 分享赚更新
    *
    * @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;
   }
        public void setMiandan(boolean miandan) {
            this.miandan = miandan;
        }
   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;
   }
        public HongBaoSaveResult(boolean add, boolean miandan) {
            super();
            this.add = add;
            this.miandan = miandan;
        }
   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());
         tempCommonOrder.setThirdCreateTime(commonOrder.getThirdCreateTime());
         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);
      }
   }
        public boolean isAdd() {
            return add;
        }
   /**
    * 创建分享赚红包
    *
    * @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;
   }
        public void setAdd(boolean add) {
            this.add = add;
        }
        public boolean isMiandan() {
            return miandan;
        }
    }
}