yujian
2019-09-02 9eeda0d3049b71877c373c04d65533939b5582ef
fanli/src/main/java/com/yeshi/fanli/service/impl/hongbao/HongBaoV2ServiceImpl.java
@@ -1,9 +1,8 @@
package com.yeshi.fanli.service.impl.hongbao;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -18,29 +17,23 @@
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
import com.yeshi.fanli.dao.mybatis.PidOrderMapper;
import com.yeshi.fanli.dao.mybatis.hongbao.HongBaoMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderGoodsMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.OrderItemMapper;
import com.yeshi.fanli.dao.mybatis.order.OrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanOrderMapper;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.dto.HongBaoDTO;
import com.yeshi.fanli.entity.bus.msg.MsgOrderDetail;
import com.yeshi.fanli.entity.bus.user.HongBao;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.bus.user.Order;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
import com.yeshi.fanli.entity.bus.user.UserInfo;
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.entity.order.ShareGoodsActivityOrder;
import com.yeshi.fanli.entity.taobao.PidOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.HongBaoException;
import com.yeshi.fanli.exception.order.ShareGoodsActivityOrderException;
import com.yeshi.fanli.exception.share.UserShareGoodsRecordException;
@@ -54,13 +47,14 @@
import com.yeshi.fanli.service.inter.order.ShareGoodsActivityOrderService;
import com.yeshi.fanli.service.inter.user.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserNotificationService;
import com.yeshi.fanli.service.inter.user.UserShareGoodsGroupService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.taobao.TaoBaoOrderUtil;
@Service
public class HongBaoV2ServiceImpl implements HongBaoV2Service {
@@ -69,13 +63,7 @@
   private HongBaoV2Mapper hongBaoV2Mapper;
   @Resource
   private HongBaoMapper hongBaoMapper;
   @Resource
   private TaoBaoOrderMapper taoBaoOrderMapper;
   @Resource
   private OrderItemMapper orderItemMapper;
   @Resource
   private CommonOrderMapper commonOrderMapper;
@@ -102,16 +90,10 @@
   private UserShareGoodsGroupService userShareGoodsGroupService;
   @Resource
   private PidOrderMapper pidOrderMapper;
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   @Resource
   private UserNotificationService userNotificationService;
   @Resource
   private UserOrderMsgNotificationService userOrderMsgNotificationService;
@@ -124,6 +106,12 @@
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
   @Resource
   private UserSystemCouponService userSystemCouponService;
   @Resource
   private UserSystemCouponRecordService userSystemCouponRecordService;
   @Override
   public int insert(HongBaoV2 record) {
@@ -155,235 +143,13 @@
      return hongBaoV2Mapper.selectByPrimaryKey(id);
   }
   private HongBaoV2 getHongBaoV2(HongBao hb) {
      int type = hb.getType().intValue();
      HongBaoV2 v2 = new HongBaoV2(hb.getId());
      v2.setCreateTime(new Date(hb.getCreatetime()));
      if (hb.getGetTime() == null || hb.getGetTime() == 0)
         v2.setGetTime(null);
      else
         v2.setGetTime(new Date(hb.getGetTime()));
      v2.setMoney(hb.getMoney());
      if (hb.getParent() != null)
         v2.setParent(new HongBaoV2(hb.getParent().getId()));
      if (hb.getType() == HongBao.TYPE_SHARE_GOODS) {
         if (hb.getBalanceTime() != null)
            v2.setPreGetTime(new Date(hb.getPreGettime()));
         else
            v2.setPreGetTime(null);
      } else {
         if (hb.getPreGettime() == null || hb.getPreGettime() == 0)
            v2.setPreGetTime(null);
         else
            v2.setPreGetTime(new Date(hb.getPreGettime()));
      }
      v2.setState(hb.getState());
      if (hb.getState() == 1 && hb.getBalanceTime() != null) {
         v2.setState(HongBaoV2.STATE_KELINGQU);
      }
      v2.setType(type);
      v2.setUpdateTime(new Date(hb.getCreatetime()));
      v2.setUrank(hb.getUrank());
      v2.setUserInfo(hb.getUserInfo());
      v2.setVersion(hb.getVersion());
      return v2;
   }
   @Transactional
   @Override
   public void convert(HongBao hb) {
      if (hb == null || hb.getParent() != null)
         return;
      int type = hb.getType().intValue();
      if (type == HongBao.TYPE_TAOBAO || type == HongBao.TYPE_SHARE_GOODS) {// 自购与分享赚需要查询出所有的订单
         // 属于返利订单
         String orderId = "";
         if (hb.getOrder() != null) {
            orderId = hb.getOrder().getOrderId();
            // 查询同一订单号的非子红包
         } else
            orderId = hb.getOrderId();
         int count = commonOrderMapper.countByOrderNOAndOrderType(orderId, Constant.SOURCE_TYPE_TAOBAO);
         // 已经插入订单
         if (count > 0)
            return;
         //
         if (hb.getVersion() == 1) {// 很老版本的处理方式,已hongbao为主
            if (hongBaoV2Mapper.selectByPrimaryKey(hb.getId()) != null)
               return;
            HongBaoV2 hongBaoV2 = getHongBaoV2(hb);
            hongBaoV2.setBeizhu("订单号:" + orderId);
            hongBaoV2Mapper.insert(hongBaoV2);
            if (hb.getHasChild())// 存在子红包
            {
               List<HongBao> children = hongBaoMapper.selectChildHongBaoByPid(hb.getId());
               if (children != null)
                  for (HongBao hongBao : children) {
                     HongBaoV2 child = getHongBaoV2(hongBao);
                     hongBaoV2Mapper.insert(child);
                  }
            }
         } else {// 新版本处理方式
            List<HongBao> list = hongBaoMapper.selectByOrderId(orderId);
            if (list.size() == 0)
               list = hongBaoMapper.selectByOid(hb.getOrder().getId());
            if (list != null)
               // 删除子红包
               for (int i = 0; i < list.size(); i++) {
               if (list.get(i).getParent() != null) {
               list.remove(i);
               i--;
               }
               }
            if (list.size() <= 0)
               return;
            if (list.get(0).getType() == 20)
               for (HongBao hb1 : list) {
                  PidOrder pidOrder = pidOrderMapper.getPidOrderByHongBaoId(hb1.getId());
                  if (pidOrder != null)
                     hb1.setAuctionId(pidOrder.getAuctionId());
               }
            List<TaoBaoOrder> orderList = taoBaoOrderMapper.selectTaoBaoOrderByOrderId(orderId);
            if (orderList == null || orderList.size() < list.size()) {
               System.out.println("红包数与订单数不对应");
               return;
            }
            // 加入排序值
            for (int i = 0; i < orderList.size(); i++) {
               orderList.get(i).setOrderBy(i + 1);
            }
            // 按照auctionId,payMoney排序
            Comparator<HongBao> cm = new Comparator<HongBao>() {
               @Override
               public int compare(HongBao o1, HongBao o2) {
                  if (o1.getAuctionId().longValue() < o2.getAuctionId().longValue())
                     return -3;
                  else if (o1.getAuctionId().longValue() > o2.getAuctionId().longValue()) {
                     return 3;
                  } else {
                     if (o1.getState() - o2.getState() > 0)
                        return 2;
                     else if (o1.getState() - o2.getState() < 0)
                        return -2;
                     else {
                        if (o1.getPayMoney().compareTo(o2.getPayMoney()) >= 0)
                           return 1;
                        else
                           return -1;
                     }
                  }
               }
            };
            Collections.sort(list, cm);
            Comparator<TaoBaoOrder> cmOrder = new Comparator<TaoBaoOrder>() {
               @Override
               public int compare(TaoBaoOrder o1, TaoBaoOrder o2) {
                  if (o1.getAuctionId().longValue() < o2.getAuctionId().longValue())
                     return -3;
                  else if (o1.getAuctionId().longValue() > o2.getAuctionId().longValue()) {
                     return 3;
                  } else {
                     if (o1.getPayment().compareTo(o2.getPayment()) < 0)
                        return 2;
                     else
                        return -2;
                  }
               }
            };
            Collections.sort(orderList, cmOrder);
            for (TaoBaoOrder t : orderList)
               System.out.println(t.getAuctionId());
            for (int i = 0; i < list.size(); i++) {
               CommonOrder commonOrder = TaoBaoOrderUtil.convert(orderList.get(i));
               CommonOrderGoods goods = new CommonOrderGoods();
               goods.setGoodsId(orderList.get(i).getAuctionId() + "");
               goods.setGoodsType(Constant.SOURCE_TYPE_TAOBAO);
               // 商品是否已经插入
               List<CommonOrderGoods> commonGoodsList = commonOrderGoodsMapper
                     .listByGoodsIdAndGoodsType(goods.getGoodsId(), goods.getGoodsType());
               if (commonGoodsList.size() <= 0)// 不存在就插入商品
                  commonOrderGoodsMapper.insertSelective(goods);
               else
                  goods.setId(commonGoodsList.get(commonGoodsList.size() - 1).getId());
               commonOrder.setCommonOrderGoods(goods);
               commonOrder.setUserInfo(list.get(i).getUserInfo());
               commonOrder.setCreateTime(new Date(list.get(i).getCreatetime()));
               // TODO 维权判断
               List<TaoBaoWeiQuanOrder> weiQuanList = taoBaoWeiQuanOrderMapper.selectListByOrderIdAndState(orderId,
                     "维权成功");
               if (weiQuanList != null && weiQuanList.size() > 0)
                  commonOrder.setState(CommonOrder.STATE_WQ);
               commonOrderMapper.insertSelective(commonOrder);
               // 插入红包
               HongBaoV2 hongBaoV2 = getHongBaoV2(list.get(i));
               hongBaoV2.setId(list.get(i).getId());
               hongBaoV2Mapper.insert(hongBaoV2);
               HongBaoOrder ho = new HongBaoOrder();
               ho.setCommonOrder(commonOrder);
               ho.setCreateTime(new Date());
               ho.setHongBaoV2(hongBaoV2);
               hongBaoOrderMapper.insertSelective(ho);
               if (list.get(i).getHasChild())// 存在子红包
               {
                  List<HongBao> children = hongBaoMapper.selectChildHongBaoByPid(list.get(i).getId());
                  if (children != null)
                     for (HongBao hongBao : children) {
                        HongBaoV2 child = getHongBaoV2(hongBao);
                        hongBaoV2Mapper.insert(child);
                     }
               }
            }
         }
      } else {// 直接插入
         if (type != HongBao.TYPE_ERJI && type != HongBao.TYPE_YIJI && type != HongBao.TYPE_SHARE_YIJI
               && type != HongBao.TYPE_SHARE_ERJI) {
            if (hongBaoV2Mapper.selectByPrimaryKey(hb.getId()) == null)
               hongBaoV2Mapper.insert(getHongBaoV2(hb));
         }
      }
   }
   @Transactional
   @Override
   public void addHongBao(List<CommonOrder> commonOrderList, int type) throws HongBaoException {
      Set<Integer> stateSet = new HashSet<>();// 订单状态Set
      if (commonOrderList != null && commonOrderList.size() > 0) {
         int orderType = commonOrderList.get(0).getSourceType();
         Map<Integer, HongBaoOrder> notificationMap = new HashMap<>();
         int goodsCount = 0;
         boolean hasAdd = false;
@@ -407,7 +173,6 @@
         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();
@@ -416,28 +181,28 @@
               BigDecimal money = notify.getMoney();
               switch (t) {
               case HongBaoV2.TYPE_ZIGOU:
                  userNotificationService.orderFanliStatisticed(uid, orderId, goodsCount, MsgOrderDetail.STATE_FK,
                        null, money);
                  userOrderMsgNotificationService.orderFanLiStatistic(uid, orderId, commonOrder.getPayment(),
                        money, goodsCount, state);
                  userOrderMsgNotificationService.orderFanLiStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, goodsCount, state);
                  break;
               case HongBaoV2.TYPE_SHARE_GOODS:
                  userNotificationService.orderShareStatisticed(uid, orderId, goodsCount, MsgOrderDetail.STATE_FK,
                        null, money);
                  userOrderMsgNotificationService.orderShareStatistic(uid, orderId, commonOrder.getPayment(),
                        money, goodsCount, state);
                  userOrderMsgNotificationService.orderShareStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, goodsCount, state);
                  break;
               case HongBaoV2.TYPE_YIJI:
                  userNotificationService.orderInviteStatisticed(uid, orderId, goodsCount,
                        MsgOrderDetail.STATE_FK, null, money);
                  userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, commonOrder.getPayment(),
                        money, goodsCount, state);
                  userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, orderType,
                        commonOrder.getPayment(), money, goodsCount, state);
                  break;
               case HongBaoV2.TYPE_ERJI:
                  userNotificationService.orderInviteStatisticed(uid, orderId, goodsCount,
                        MsgOrderDetail.STATE_FK, null, money);
                  userOrderMsgNotificationService.orderInviteStatistic(uid, orderId, commonOrder.getPayment(),
                        money, goodsCount, state);
                  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;
               }
            }
@@ -456,21 +221,24 @@
               BigDecimal money = notify.getMoney();
               switch (t) {
               case HongBaoV2.TYPE_ZIGOU:
                  userOrderMsgNotificationService.orderFanLiStateChanged(uid, orderId, commonOrder.getPayment(),
                        money, state);
                  userOrderMsgNotificationService.orderFanLiStateChanged(uid, orderId, orderType,
                        commonOrder.getPayment(), money, state);
                  break;
               case HongBaoV2.TYPE_SHARE_GOODS:
                  userOrderMsgNotificationService.orderShareStateChanged(uid, orderId, commonOrder.getPayment(),
                        money, state);
                  userOrderMsgNotificationService.orderShareStateChanged(uid, orderId, orderType,
                        commonOrder.getPayment(), money, state);
                  break;
               case HongBaoV2.TYPE_YIJI:
                  userOrderMsgNotificationService.orderInviteStateChanged(uid, orderId, commonOrder.getPayment(),
                        money, state);
                  userOrderMsgNotificationService.orderInviteStateChanged(uid, orderId, orderType,
                        commonOrder.getPayment(), money, state);
                  break;
               case HongBaoV2.TYPE_ERJI:
                  userOrderMsgNotificationService.orderInviteStateChanged(uid, orderId, commonOrder.getPayment(),
                        money, state);
                  userOrderMsgNotificationService.orderInviteStateChanged(uid, orderId, orderType,
                        commonOrder.getPayment(), money, state);
                  break;
               case HongBaoV2.TYPE_SHARE_YIJI:
                  userOrderMsgNotificationService.orderShareFirstLevelStateChanged(uid, orderId, orderType,
                        commonOrder.getPayment(), money, state);
               }
            }
         }
@@ -499,12 +267,27 @@
      HongBaoV2 oldHongBao = hongBaoV2Mapper.selectByPrimaryKey(hongBaoOrder.getHongBaoV2().getId());
      if (oldHongBao == null)
         throw new HongBaoException(10, "红包对象不存在");
      // 已经失效或者已经领取的红包不做处理
      // 已经失效,已经领取,新老状态一致的红包不做处理
      if (oldHongBao.getState() == HongBaoV2.STATE_SHIXIAO || oldHongBao.getState() == HongBaoV2.STATE_YILINGQU)
         return;
      if (type == HongBaoV2.TYPE_ZIGOU) {// 获取自购的返利比例
         BigDecimal fanliRate = hongBaoManageService.getFanLiRate(commonOrder.getCreateTime().getTime());
         // 免单处理
         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 = new HongBaoV2(hongBaoOrder.getHongBaoV2().getId());
         hongBao.setUpdateTime(new Date());
         // 更改状态与资金
@@ -512,15 +295,40 @@
            hongBao.setState(HongBaoV2.STATE_BUKELINGQU);
            hongBao.setMoney(
                  MoneyBigDecimalUtil.mul(commonOrder.getEstimate(), fanliRate.divide(new BigDecimal(100))));
            if (mianDan)
               hongBao.setMoney(commonOrder.getPayment());
         } else if (commonOrder.getState() == CommonOrder.STATE_JS) {
            hongBao.setState(HongBaoV2.STATE_KELINGQU);
            hongBao.setMoney(
                  MoneyBigDecimalUtil.mul(commonOrder.geteIncome(), fanliRate.divide(new BigDecimal(100))));
            hongBao.setPreGetTime(new Date(commonOrder.getSettleTime().getTime() + 1000 * 60 * 60 * 24 * 15L));
            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));
         }
         // 新老红包状态一致不处理
         if (oldHongBao.getState().intValue() == hongBao.getState())
            return;
         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);
         // 加入通知
@@ -543,7 +351,7 @@
         // 获取子红包
         List<HongBaoV2> children = hongBaoV2Mapper.listChildrenById(hongBao.getId());
         if (children != null)
         if (children != null && children.size() > 0)
            for (HongBaoV2 child : children) {
               HongBaoV2 childUpdate = new HongBaoV2(child.getId());
               childUpdate.setState(hongBao.getState());
@@ -592,9 +400,118 @@
               }
            }
         else {// 修复之前二级,三级订单未统计到的情况
            if (!mianDan) {
               ThreeSale threeSale = threeSaleSerivce.selectByWorkerId(commonOrder.getUserInfo().getId());
               if (threeSale != null && threeSale.getSucceedTime() != null
                     && threeSale.getSucceedTime() <= commonOrder.getThirdCreateTime().getTime()) {
                  UserInfo boss = threeSaleSerivce.getBoss(commonOrder.getUserInfo().getId());
                  // 插入一级子红包
                  BigDecimal firstRate = hongBaoManageService
                        .getFirstInviteRate(boss.getRank() == null ? 0 : boss.getRank());
                  if (firstRate.compareTo(new BigDecimal(0)) <= 0)
                     return;
                  HongBaoV2 firstHongbao = new HongBaoV2();
                  firstHongbao.setUserInfo(boss);
                  firstHongbao.setUrank(boss.getRank());
                  firstHongbao.setParent(hongBao);
                  firstHongbao.setCreateTime(new Date());
                  firstHongbao.setType(HongBaoV2.TYPE_YIJI);
                  firstHongbao.setVersion(2);
                  firstHongbao.setState(hongBao.getState());
                  if (hongBao.getState() == HongBaoV2.STATE_KELINGQU) {
                     firstHongbao.setMoney(
                           MoneyBigDecimalUtil.mul(hongBao.getMoney(), firstRate.divide(new BigDecimal(100))));
                     Calendar calendar = Calendar.getInstance();
                     calendar.setTime(commonOrder.getSettleTime());
                     calendar.add(Calendar.MONTH, 1);
                     firstHongbao.setPreGetTime(new Date(TimeUtil.convertToTimeTemp(
                           calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25",
                           "yyyy-M-dd")));
                  } else if (hongBao.getState() == HongBaoV2.STATE_BUKELINGQU) {
                     firstHongbao.setMoney(
                           MoneyBigDecimalUtil.mul(hongBao.getMoney(), firstRate.divide(new BigDecimal(100))));
                  }
                  hongBaoV2Mapper.insertSelective(firstHongbao);
                  // 用户通知
                  if (notificationMap.get(HongBaoV2.TYPE_YIJI) == null) {
                     HongBaoV2 tempHongBao = new HongBaoV2(firstHongbao.getId());
                     tempHongBao.setUserInfo(firstHongbao.getUserInfo());
                     tempHongBao.setMoney(firstHongbao.getMoney());
                     CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId());
                     tempCommonOrder.setPayment(commonOrder.getPayment());
                     notificationMap.put(HongBaoV2.TYPE_YIJI, new HongBaoOrder(tempCommonOrder, tempHongBao));
                  } else {
                     // 增加付款金额与资金
                     HongBaoOrder tempHongBaoOrder = notificationMap.get(HongBaoV2.TYPE_YIJI);
                     tempHongBaoOrder.getCommonOrder().setPayment(
                           tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment()));
                     tempHongBaoOrder.getHongBaoV2()
                           .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(firstHongbao.getMoney()));
                     notificationMap.put(HongBaoV2.TYPE_YIJI, tempHongBaoOrder);
                  }
                  // 插入二级子红包
                  boss = threeSaleSerivce.getBoss(boss.getId());
                  if (boss != null) {// 二级BOSS存在
                     BigDecimal secondRate = hongBaoManageService
                           .getSecondInviteRate(boss.getRank() == null ? 0 : boss.getRank());
                     if (secondRate.compareTo(new BigDecimal(0)) <= 0)
                        return;
                     HongBaoV2 secondHongbao = new HongBaoV2();
                     secondHongbao.setUserInfo(boss);
                     secondHongbao.setUrank(boss.getRank());
                     secondHongbao.setParent(hongBao);
                     secondHongbao.setCreateTime(new Date());
                     secondHongbao.setType(HongBaoV2.TYPE_ERJI);
                     secondHongbao.setVersion(2);
                     secondHongbao.setState(hongBao.getState());
                     if (hongBao.getState() == HongBaoV2.STATE_KELINGQU) {
                        secondHongbao.setMoney(MoneyBigDecimalUtil.mul(hongBao.getMoney(),
                              secondRate.divide(new BigDecimal(100))));
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(commonOrder.getSettleTime());
                        calendar.add(Calendar.MONTH, 1);
                        secondHongbao.setPreGetTime(new Date(TimeUtil.convertToTimeTemp(
                              calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25",
                              "yyyy-M-dd")));
                     } else if (hongBao.getState() == HongBaoV2.STATE_BUKELINGQU) {
                        secondHongbao.setMoney(MoneyBigDecimalUtil.mul(hongBao.getMoney(),
                              secondRate.divide(new BigDecimal(100))));
                     }
                     hongBaoV2Mapper.insertSelective(secondHongbao);
                     // 用户通知
                     if (notificationMap.get(HongBaoV2.TYPE_ERJI) == null) {
                        HongBaoV2 tempHongBao = new HongBaoV2(secondHongbao.getId());
                        tempHongBao.setUserInfo(secondHongbao.getUserInfo());
                        tempHongBao.setMoney(secondHongbao.getMoney());
                        CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId());
                        tempCommonOrder.setPayment(commonOrder.getPayment());
                        notificationMap.put(HongBaoV2.TYPE_ERJI,
                              new HongBaoOrder(tempCommonOrder, tempHongBao));
                     } else {
                        // 增加付款金额与资金
                        HongBaoOrder tempHongBaoOrder = notificationMap.get(HongBaoV2.TYPE_ERJI);
                        tempHongBaoOrder.getCommonOrder().setPayment(
                              tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment()));
                        tempHongBaoOrder.getHongBaoV2().setMoney(
                              tempHongBaoOrder.getHongBaoV2().getMoney().add(secondHongbao.getMoney()));
                        notificationMap.put(HongBaoV2.TYPE_ERJI, tempHongBaoOrder);
                     }
                  }
               }
            }
         }
      } else if (type == HongBaoV2.TYPE_SHARE_GOODS) {
         BigDecimal fanliRate = hongBaoManageService.getShareRate(commonOrder.getCreateTime().getTime());
         BigDecimal fanliRate = null;
         if (commonOrder.getSourceType() == Constant.SOURCE_TYPE_TAOBAO
               && commonOrder.getSourcePosition().equalsIgnoreCase(TaoBaoConstant.TAOBAO_TLJ_RELATION_PID_DEFAULT))
            fanliRate = hongBaoManageService.getTLJShareRate(commonOrder.getCreateTime().getTime());
         else
            fanliRate = hongBaoManageService.getShareRate(commonOrder.getCreateTime().getTime());
         List<ShareGoodsActivityOrder> list = shareGoodsActivityOrderService
               .listByOrderIdAndUid(commonOrder.getUserInfo().getId(), commonOrder.getOrderNo());
         if (list != null && list.size() > 0) {
@@ -650,17 +567,20 @@
               childUpdate.setUpdateTime(new Date());
               BigDecimal rate = null;
               if (child.getType() == HongBaoV2.TYPE_SHARE_YIJI) {// 一级分享赚
                  rate = hongBaoManageService.getFirstShareRate(child.getUrank(),
                        commonOrder.getCreateTime().getTime());
                  rate = hongBaoManageService.getFirstShareRate(1, commonOrder.getCreateTime().getTime());
               } else if (child.getType() == HongBaoV2.TYPE_SHARE_ERJI) {// 二级分享赚
                  rate = hongBaoManageService.getSecondShareRate(child.getUrank(),
                        commonOrder.getCreateTime().getTime());
                  rate = hongBaoManageService.getSecondShareRate(1, commonOrder.getCreateTime().getTime());
               }
               // 以实际收入为准计算预估收益
               if (CommonOrder.STATE_JS == commonOrder.getState()) {
                  childUpdate.setMoney(
                        MoneyBigDecimalUtil.mul(hongBao.getMoney(), rate.divide(new BigDecimal(100))));
                  if (commonOrder.getThirdCreateTime().getTime() > TimeUtil.convertToTimeTemp("2019-04-16",
                        "yyyy-MM-dd"))
                     childUpdate.setMoney(MoneyBigDecimalUtil.mul(commonOrder.geteIncome(),
                           rate.divide(new BigDecimal(100))));
                  Calendar calendar = Calendar.getInstance();
                  calendar.setTime(commonOrder.getSettleTime());
                  calendar.add(Calendar.MONTH, 1);
@@ -668,13 +588,36 @@
                        calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-25",
                        "yyyy-M-dd")));
               } else if (CommonOrder.STATE_FK == commonOrder.getState()) {
                  if (commonOrder.getOrderNo().equalsIgnoreCase("314134177659155087"))
                     System.out.println("");
                  childUpdate.setMoney(
                        MoneyBigDecimalUtil.mul(hongBao.getMoney(), rate.divide(new BigDecimal(100))));
                  if (commonOrder.getThirdCreateTime().getTime() > TimeUtil.convertToTimeTemp("2019-04-16",
                        "yyyy-MM-dd"))
                     childUpdate.setMoney(MoneyBigDecimalUtil.mul(commonOrder.getEstimate(),
                           rate.divide(new BigDecimal(100))));
                  else
                     childUpdate.setMoney(
                           MoneyBigDecimalUtil.mul(hongBao.getMoney(), rate.divide(new BigDecimal(100))));
               }
               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错误");
@@ -685,6 +628,41 @@
         throws HongBaoException {
      if (type == HongBaoV2.TYPE_ZIGOU) {// 获取自购的返利比例
         BigDecimal fanliRate = hongBaoManageService.getFanLiRate(commonOrder.getCreateTime().getTime());
         // 查询是否有免单计划
         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 = new HongBaoV2();
         hongBao.setUserInfo(commonOrder.getUserInfo());
         hongBao.setCreateTime(new Date());
@@ -698,13 +676,21 @@
            hongBao.setState(HongBaoV2.STATE_KELINGQU);
            hongBao.setMoney(
                  MoneyBigDecimalUtil.mul(commonOrder.geteIncome(), fanliRate.divide(new BigDecimal(100))));
            hongBao.setPreGetTime(new Date(commonOrder.getSettleTime().getTime() + 1000 * 60 * 60 * 24 * 15L));
            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());
         hongBao.setUrank(user.getRank());
         hongBaoV2Mapper.insertSelective(hongBao);
@@ -733,7 +719,7 @@
         }
         UserInfo boss = threeSaleSerivce.getBoss(user.getId());
         if (boss != null && hongBao.getState() != HongBaoV2.STATE_SHIXIAO) {// 1级BOSS存在且红包未失效
         if (boss != null && hongBao.getState() != HongBaoV2.STATE_SHIXIAO && mianDanMoney == null) {// 1级BOSS存在且红包未失效,免单不支持多级分销
            // 插入一级子红包
            BigDecimal firstRate = hongBaoManageService
@@ -762,6 +748,10 @@
               firstHongbao.setMoney(
                     MoneyBigDecimalUtil.mul(hongBao.getMoney(), firstRate.divide(new BigDecimal(100))));
            }
            // 返利为0的不通知
            if (firstHongbao.getMoney() == null || firstHongbao.getMoney().compareTo(new BigDecimal(0)) <= 0)
               return;
            hongBaoV2Mapper.insertSelective(firstHongbao);
            // 用户通知
            if (notificationMap.get(HongBaoV2.TYPE_YIJI) == null) {
@@ -809,6 +799,11 @@
                  secondHongbao.setMoney(
                        MoneyBigDecimalUtil.mul(hongBao.getMoney(), secondRate.divide(new BigDecimal(100))));
               }
               // 返利为0的不统计
               if (secondHongbao.getMoney() == null || secondHongbao.getMoney().compareTo(new BigDecimal(0)) <= 0)
                  return;
               hongBaoV2Mapper.insertSelective(secondHongbao);
               // 用户通知
@@ -837,7 +832,12 @@
         if (commonOrder.getState() == CommonOrder.STATE_SX || commonOrder.getState() == CommonOrder.STATE_WQ)
            return;
         // 分享赚
         BigDecimal shareRate = hongBaoManageService.getShareRate(commonOrder.getCreateTime().getTime());
         BigDecimal shareRate = null;
         if (commonOrder.getSourceType() == Constant.SOURCE_TYPE_TAOBAO
               && commonOrder.getSourcePosition().equalsIgnoreCase(TaoBaoConstant.TAOBAO_TLJ_RELATION_PID_DEFAULT))// 来自于淘礼金的分享
            shareRate = hongBaoManageService.getTLJShareRate(commonOrder.getCreateTime().getTime());
         else
            shareRate = hongBaoManageService.getShareRate(commonOrder.getCreateTime().getTime());
         // 判断订单分享活动是否开启
         if ("1".equalsIgnoreCase(configService.get("share_goods_activity_open"))) {
@@ -866,7 +866,6 @@
                  }
               }
            }
         }
         HongBaoV2 hongBao = new HongBaoV2();
@@ -915,6 +914,56 @@
            notificationMap.put(type, tempHongBaoOrder);
         }
         // 4月17日后才有一级分享赚
         if (commonOrder.getThirdCreateTime().getTime() > TimeUtil.convertToTimeTemp("2019-04-17", "yyyy-MM-dd")) {
            UserInfo boss = threeSaleSerivce.getBoss(hongBao.getUserInfo().getId());
            if (boss != null) {
               BigDecimal firstLevelRate = hongBaoManageService.getFirstShareRate(1,
                     commonOrder.getThirdCreateTime().getTime());
               HongBaoV2 child = new HongBaoV2();
               child.setParent(hongBao);
               child.setType(HongBaoV2.TYPE_SHARE_YIJI);
               if (commonOrder.getState() == CommonOrder.STATE_FK) {
                  child.setState(HongBaoV2.STATE_BUKELINGQU);
                  child.setMoney(MoneyBigDecimalUtil.mul(commonOrder.getEstimate(),
                        firstLevelRate.divide(new BigDecimal(100))));
               } else if (commonOrder.getState() == CommonOrder.STATE_JS) {
                  child.setState(HongBaoV2.STATE_KELINGQU);
                  child.setMoney(MoneyBigDecimalUtil.mul(commonOrder.geteIncome(),
                        firstLevelRate.divide(new BigDecimal(100))));
                  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(boss);
               child.setUrank(boss.getRank());
               child.setVersion(2);
               child.setCreateTime(new Date());
               hongBaoV2Mapper.insertSelective(child);
               // 添加通知
               if (notificationMap.get(HongBaoV2.TYPE_SHARE_YIJI) == null) {
                  HongBaoV2 tempHongBao = new HongBaoV2(child.getId());
                  tempHongBao.setUserInfo(child.getUserInfo());
                  tempHongBao.setMoney(child.getMoney());
                  tempHongBao.setBeizhu(hongBao.getUserInfo().getNickName());
                  CommonOrder tempCommonOrder = new CommonOrder(commonOrder.getId());
                  tempCommonOrder.setPayment(commonOrder.getPayment());
                  notificationMap.put(HongBaoV2.TYPE_SHARE_YIJI, new HongBaoOrder(tempCommonOrder, tempHongBao));
               } else {
                  // 增加付款金额与资金
                  HongBaoOrder tempHongBaoOrder = notificationMap.get(HongBaoV2.TYPE_SHARE_YIJI);
                  tempHongBaoOrder.getCommonOrder().setPayment(
                        tempHongBaoOrder.getCommonOrder().getPayment().add(commonOrder.getPayment()));
                  tempHongBaoOrder.getHongBaoV2()
                        .setMoney(tempHongBaoOrder.getHongBaoV2().getMoney().add(child.getMoney()));
                  notificationMap.put(HongBaoV2.TYPE_SHARE_YIJI, tempHongBaoOrder);
               }
            }
         }
         // 修改统计数据
         Long goodsId = commonOrder.getCommonOrderGoods().getId();
         // 查询商品
@@ -927,7 +976,7 @@
         hb.setMoney(hongBao.getMoney());
         try {
            userShareGoodsGroupService.updateOrderRecord(hb);
            userShareGoodsGroupService.updateOrderRecord(hb, commonOrder.getSourceType());
         } catch (UserShareGoodsRecordException e) {
            try {
               LogHelper.errorDetailInfo(e);
@@ -996,4 +1045,58 @@
      else
         return money;
   }
   @Override
   public BigDecimal computeMoneyByUidAndState(Long uid, int state) {
      List<Integer> stateList = new ArrayList<>();
      stateList.add(state);
      BigDecimal money = hongBaoV2Mapper.computeMoneyByUidAndState(uid, stateList);
      if (money == null)
         return new BigDecimal(0);
      else
         return money;
   }
   @Override
   public List<HongBaoV2> listChildrenById(Long id) {
      return hongBaoV2Mapper.listChildrenById(id);
   }
   @Override
   public List<Long> getUidByNear30DayShareSucceed() {
      return hongBaoV2Mapper.getUidByNear30DayShareSucceed();
   }
   @Override
   public void invalidInviteHongBaoByParentUid(Long parentUid, String beiZhu) {
      List<Integer> typeList = new ArrayList<>();
      typeList.add(HongBaoV2.TYPE_YIJI);
      typeList.add(HongBaoV2.TYPE_ERJI);
      typeList.add(HongBaoV2.TYPE_SHARE_YIJI);
      typeList.add(HongBaoV2.TYPE_SHARE_ERJI);
      List<Integer> stateList = new ArrayList<>();
      stateList.add(HongBaoV2.STATE_KELINGQU);
      stateList.add(HongBaoV2.STATE_BUKELINGQU);
      long count = hongBaoV2Mapper.countByParentUidAndTypeAndState(parentUid, typeList, stateList);
      int page = (int) (count % 100 == 0 ? count / 100 : count / 100 + 1);
      for (int i = 1; i <= page; i++) {
         List<HongBaoV2> list = hongBaoV2Mapper.listByParentUidAndTypeAndState(parentUid, typeList, stateList, 0,
               100);
         if (list != null)
            for (HongBaoV2 v2 : list) {
               HongBaoV2 update = new HongBaoV2(v2.getId());
               update.setUpdateTime(new Date());
               update.setState(HongBaoV2.STATE_SHIXIAO);
               update.setBeizhu(beiZhu);
               hongBaoV2Mapper.updateByPrimaryKeySelective(update);
            }
      }
   }
   @Override
   public List<HongBaoV2> listBySourceTypeAndTradeIdListAndUid(int sourceType, long uid, List<String> tradeIdList) {
      if (tradeIdList == null || tradeIdList.size() == 0)
         return null;
      return hongBaoV2Mapper.listBySourceTypeAndTradeIdListAndUid(sourceType, uid, tradeIdList);
   }
}