admin
2020-05-19 744594ef1a2f530fc3e86ea9dc48b62247f79420
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderProcessServiceImpl.java
@@ -2,7 +2,6 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -10,6 +9,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.Resource;
@@ -18,6 +18,11 @@
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.NumberUtil;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.transaction.LocalTransactionExecuter;
import com.aliyun.openservices.ons.api.transaction.TransactionProducer;
import com.aliyun.openservices.ons.api.transaction.TransactionStatus;
import com.google.gson.Gson;
import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
@@ -25,8 +30,12 @@
import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.OrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanOrderMapper;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.dto.mq.UidDateDTO;
import com.yeshi.fanli.dto.mq.order.OrderTopicTagEnum;
import com.yeshi.fanli.dto.mq.order.body.OrderMQMsg;
import com.yeshi.fanli.dto.mq.order.body.OrderMoneyRecievedMQMsg;
import com.yeshi.fanli.dto.order.CommonOrderAddResultDTO;
import com.yeshi.fanli.dto.order.HongBaoAddResult;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.bus.user.Order;
import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
@@ -44,13 +53,18 @@
import com.yeshi.fanli.entity.taobao.TaoBaoUnionConfig;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.elme.ElmeOrderException;
import com.yeshi.fanli.exception.money.OrderMoneySettleException;
import com.yeshi.fanli.exception.money.UserMoneyDetailException;
import com.yeshi.fanli.exception.order.CommonOrderException;
import com.yeshi.fanli.exception.order.HongBaoException;
import com.yeshi.fanli.exception.order.OrderItemException;
import com.yeshi.fanli.exception.order.TaoBaoWeiQuanException;
import com.yeshi.fanli.exception.user.UserAccountException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.log.OrderLogHelper;
import com.yeshi.fanli.service.inter.elme.ElmeHongBaoOrderMapService;
import com.yeshi.fanli.service.inter.elme.ElmeOrderProcessService;
import com.yeshi.fanli.service.inter.elme.ElmeOrderService;
import com.yeshi.fanli.service.inter.hongbao.AccountDetailsHongBaoMapService;
import com.yeshi.fanli.service.inter.money.UserMoneyService;
@@ -59,26 +73,30 @@
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
import com.yeshi.fanli.service.inter.order.LostOrderService;
import com.yeshi.fanli.service.inter.order.OrderMoneySettleService;
import com.yeshi.fanli.service.inter.order.OrderProcessService;
import com.yeshi.fanli.service.inter.order.jd.JDOrderService;
import com.yeshi.fanli.service.inter.order.msg.UserOrderMsgNotificationService;
import com.yeshi.fanli.service.inter.order.pdd.PDDOrderService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoBuyRelationMapService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.manger.order.HongBaoV2AddManager;
import com.yeshi.fanli.util.CMQManager;
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.cmq.HongBaoRecieveCMQManager;
import com.yeshi.fanli.util.cmq.PlaceOrderCMQManager;
import com.yeshi.fanli.util.cmq.order.PlaceOrderCMQManager;
import com.yeshi.fanli.util.cmq.order.TeamOrderCMQManager;
import com.yeshi.fanli.util.factory.UserMoneyDetailFactory;
import com.yeshi.fanli.util.jd.JDApiUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil;
import com.yeshi.fanli.util.taobao.TaoKeOrderApiUtil;
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
@Service
public class OrderProcessServiceImpl implements OrderProcessService {
@@ -117,6 +135,9 @@
   private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
   @Resource
   private UserOrderMsgNotificationService userOrderMsgNotificationService;
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
   @Resource
@@ -139,6 +160,18 @@
   @Resource
   private PDDOrderService pddOrderService;
   @Resource(name = "orderTransactionProducer")
   private TransactionProducer orderTransactionProducer;
   @Resource(name = "producer")
   private Producer producer;
   @Resource
   private OrderMoneySettleService orderMoneySettleService;
   @Resource
   private HongBaoV2AddManager hongBaoV2AddManager;
   /**
    * 是否是分享订单
@@ -179,6 +212,7 @@
      Iterator<String> its = orders.keySet().iterator();
      Map<String, List<TaoBaoOrder>> fanliOrderMap = new HashMap<>();
      Map<String, List<TaoBaoOrder>> shareOrderMap = new HashMap<>();
      Map<String, List<TaoBaoOrder>> elmeOrderMap = new HashMap<>();
      while (its.hasNext()) {
         String orderId = its.next();
@@ -186,26 +220,39 @@
            List<TaoBaoOrder> list = orders.get(orderId);
            String pid = String.format("mm_%s_%s_%s", configList.get(0).getAccountId(),
                  list.get(0).getSourceMediaId(), list.get(0).getAdPositionId());
            if (!StringUtil.isNullOrEmpty(list.get(0).getSpecialId())
                  || pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID)) {// 设置渠道ID当做会员运营ID的位置ID
               fanliOrderMap.put(orderId, list);
            } else if (!StringUtil.isNullOrEmpty(list.get(0).getRelationId())) {
               shareOrderMap.put(orderId, list);
            } else {
               // 通过红包查询
               CommonOrder commonOrder = commonOrderService
                     .selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, list.get(0).getTradeId());
               if (commonOrder != null) {
                  HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
                  if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null
                        && hongBaoOrder.getHongBaoV2().getType() == HongBaoV2.TYPE_SHARE_GOODS) {
                     shareOrderMap.put(orderId, list);
                     continue;
                  }
            if ("饿了么".equalsIgnoreCase(list.get(0).getOrderType())
                  && !pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT)) {
               // 饿了么订单开始归入到淘宝订单
               if (TimeUtil.convertToTimeTemp(list.get(0).getCreateTime(),
                     "yyyy-MM-dd HH:mm:ss") >= Constant.NEW_ORDER_FANLI_RULE_TIME) {
                  fanliOrderMap.put(orderId, list);
               } else {
                  elmeOrderMap.put(orderId, list);
               }
            } else if ("口碑".equalsIgnoreCase(list.get(0).getOrderType())
                  && pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_KOUBEI_PID)) {// 口碑自购
               fanliOrderMap.put(orderId, list);
            } else {
               if (!StringUtil.isNullOrEmpty(list.get(0).getSpecialId())
                     || pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID)) {// 设置渠道ID当做会员运营ID的位置ID
                  fanliOrderMap.put(orderId, list);
               } else if (!StringUtil.isNullOrEmpty(list.get(0).getRelationId())) {
                  shareOrderMap.put(orderId, list);
               } else {
                  // 通过红包查询
                  CommonOrder commonOrder = commonOrderService
                        .selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO, list.get(0).getTradeId());
                  if (commonOrder != null) {
                     HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
                     if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null
                           && hongBaoOrder.getHongBaoV2().getType() == HongBaoV2.TYPE_SHARE_GOODS) {
                        shareOrderMap.put(orderId, list);
                        continue;
                     }
                  }
                  fanliOrderMap.put(orderId, list);
               }
            }
         }
      }
@@ -214,6 +261,54 @@
      processShopingFanliOrder(fanliOrderMap);
      // 处理分享赚订单
      processShareGoodsOrder(shareOrderMap);
      // 处理饿了么订单
      processElemeOrder(elmeOrderMap);
   }
   private ElmeOrder createElmeOrder(TaoBaoOrder taoBaoOrder) {
      ElmeOrder elmeOrder = new ElmeOrder();
      elmeOrder.setChannelId("");
      elmeOrder.setCreateTime(new Date());
      elmeOrder
            .setOrderDate(new Date(TimeUtil.convertToTimeTemp(taoBaoOrder.getCreateTime(), "yyyy-MM-dd HH:mm:ss")));
      elmeOrder.setOrderId(taoBaoOrder.getOrderId());
      elmeOrder.setPayMoney(taoBaoOrder.getPayment());
      elmeOrder.setRid(taoBaoOrder.getRelationId());
      if (taoBaoOrder.getOrderState().equalsIgnoreCase("订单结算"))
         elmeOrder.setIsSettle(true);
      else
         elmeOrder.setIsSettle(false);
      if (!taoBaoOrder.getOrderState().equalsIgnoreCase("订单失效"))
         elmeOrder.setState(1);
      else {
         elmeOrder.setState(0);
         elmeOrder.setPayMoney(new BigDecimal(0));
      }
      elmeOrder.setTrackPid(
            String.format("mm_124933865_%s_%s", taoBaoOrder.getSourceMediaId(), taoBaoOrder.getAdPositionId()));
      if (!StringUtil.isNullOrEmpty(taoBaoOrder.getRelationId())) {
         UserExtraTaoBaoInfo extraInfo = userExtraTaoBaoInfoService.getByRelationId(taoBaoOrder.getRelationId());
         if (extraInfo != null)
            elmeOrder.setUid(extraInfo.getUser().getId());
      }
      return elmeOrder;
   }
   private void processElemeOrder(Map<String, List<TaoBaoOrder>> orders) {
      for (Iterator<String> its = orders.keySet().iterator(); its.hasNext();) {
         String orderId = its.next();
         List<TaoBaoOrder> orderList = orders.get(orderId);
         for (TaoBaoOrder taoBaoOrder : orderList) {
            ElmeOrder elmeOrder = createElmeOrder(taoBaoOrder);
            try {
               elmeOrderProcessService.processOrder(elmeOrder);
            } catch (ElmeOrderException e) {
               e.printStackTrace();
            }
         }
      }
   }
   @Override
@@ -322,7 +417,8 @@
               || hb.getPreGetTime().getTime() > System.currentTimeMillis())
            continue;
         try {
            CMQManager.getInstance().addFanLiMsgNew(hb);
            if (Constant.ENABLE_MQ)
               CMQManager.getInstance().addFanLiMsgNew(hb);
         } catch (Exception e) {
            try {
               LogHelper.errorDetailInfo(e);
@@ -337,10 +433,15 @@
   private HongBaoOrderMapper hongBaoOrderMapper;
   @Override
   @Transactional
   @Transactional(rollbackFor = Exception.class)
   public void fanli(HongBaoV2 hb1) throws TaoBaoWeiQuanException {
      // 查询最新的红包数据
      hb1 = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(hb1.getId());
      if (hb1 == null || hb1.getState() != HongBaoV2.STATE_KELINGQU || hb1.getPreGetTime() == null
            || hb1.getPreGetTime().getTime() > System.currentTimeMillis())
         return;
      // 正常用户才能到账
      UserInfo mainUser = userInfoMapper.selectAvailableByPrimaryKey(hb1.getUserInfo().getId());
      if (mainUser == null || mainUser.getState() != UserInfo.STATE_NORMAL) {
@@ -353,12 +454,7 @@
         return;
      }
      if (hongBaoOrder.getCommonOrder() == null) {// ||
                                       // hongBaoOrder.getCommonOrder().getSourceType()
                                       // ==
                                       // Constant.SOURCE_TYPE_JD
         // || hongBaoOrder.getCommonOrder().getSourceType() ==
         // Constant.SOURCE_TYPE_PDD
      if (hongBaoOrder.getCommonOrder() == null) {
         return;
      }
@@ -382,134 +478,57 @@
            return;
      }
      // 查询同一订单号的红包
      List<CommonOrder> orderList = commonOrderService.listBySourceTypeAndOrderId(
            hongBaoOrder.getCommonOrder().getSourceType(), hongBaoOrder.getCommonOrder().getOrderNo());
      List<HongBaoV2> hongBaoList = new ArrayList<>();
      Map<Long, BigDecimal> userMoney = new HashMap<>();
      Map<Long, List<HongBaoV2>> userHongBao = new HashMap<>();
      Map<Long, Integer> userGoodsCount = new HashMap<>();
      // Map<Long, BigDecimal> userPayMent = new HashMap<>();
      for (CommonOrder co : orderList) {
         hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(co.getId());
         hongBaoList.add(hongBaoOrder.getHongBaoV2());
         Long uid = co.getUserInfo().getId();
         if (userGoodsCount.get(uid) == null)
            userGoodsCount.put(uid, co.getCount());
         else
            userGoodsCount.put(uid, Integer.valueOf(co.getCount() + userGoodsCount.get(uid)));
         // if (userPayMent.get(uid) == null)
         // userPayMent.put(uid, new BigDecimal(0));
         // if (co.getState() == CommonOrder.STATE_JS)
         // userPayMent.put(uid,
         // userPayMent.get(uid).add(co.getSettlement()));
         // else
         // userPayMent.put(uid, userPayMent.get(uid).add(co.getPayment()));
      }
      for (HongBaoV2 hb : hongBaoList) {
         long currentTimeMillis = System.currentTimeMillis();
         if (hb.getState() != HongBao.STATE_SHIXIAO) {
            // 设置为已返利
            // 处理主红包
            if (hb.getState() != HongBaoV2.STATE_SHIXIAO && hb.getState() != HongBaoV2.STATE_YILINGQU
                  && hb.getType() == HongBaoV2.TYPE_ZIGOU) {
               // 如果红包没被领取
               Long uid = hb.getUserInfo().getId();
               HongBaoV2 updateHongBao = new HongBaoV2();
               updateHongBao.setId(hb.getId());
               updateHongBao.setState(HongBaoV2.STATE_YILINGQU);
               updateHongBao.setGetTime(new Date(currentTimeMillis));
               hongBaoV2Mapper.updateByPrimaryKeySelective(updateHongBao);
               if (userMoney.get(uid) == null)
                  userMoney.put(uid, hb.getMoney());
               else
                  userMoney.put(uid, userMoney.get(uid).add(hb.getMoney()));
               // 添加红包到用户
               if (userHongBao.get(uid) == null)
                  userHongBao.put(uid, new ArrayList<>());
               userHongBao.get(uid).add(hb);
            }
      // 查询该订单之前是否有到账
      List<HongBaoOrder> list = hongBaoOrderMapper.listByOrderIdAndSourceType(
            hongBaoOrder.getCommonOrder().getOrderNo(), hongBaoOrder.getCommonOrder().getSourceType());
      List<Long> hongBaoIdList = new ArrayList<>();
      if (list != null) {
         for (HongBaoOrder ho : list) {
            hongBaoIdList.add(ho.getHongBaoV2().getId());
         }
      }
      Iterator<Long> its = userMoney.keySet().iterator();
      while (its.hasNext()) {
         // 将自己添加到用户
         Long uid = its.next();
         BigDecimal money = userMoney.get(uid);
         UserMoneyDetail userMoneyDetail = null;
         // 插入新版资金明细
         try {
            // 此处不用订单号做唯一性索引
            userMoneyDetail = UserMoneyDetailFactory.createFanLi(uid, hongBaoOrder.getCommonOrder().getOrderNo(),
                  hongBaoOrder.getCommonOrder().getSourceType(), null, money);
         } catch (UserMoneyDetailException e1) {
            try {
               LogHelper.errorDetailInfo(e1, "订单号:" + hongBaoOrder.getCommonOrder().getOrderNo(), "");
            } catch (Exception e2) {
               e2.printStackTrace();
            }
      List<HongBaoV2> allHongBaoList = hongBaoV2Mapper.listByIds(hongBaoIdList);
      boolean first = true;
      for (HongBaoV2 v2 : allHongBaoList)
         if (v2.getState() == HongBaoV2.STATE_YILINGQU) {
            first = false;
            break;
         }
         userMoneyService.addUserMoney(uid, money, userMoneyDetail);
         // 添加资金明细与红包的映射关系
         for (HongBaoV2 v2 : userHongBao.get(uid)) {
            accountDetailsHongBaoMapService.saveAccountDetailsHongBaoMap(v2.getId(), userMoneyDetail.getId());
            try {
               HongBaoRecieveCMQManager.getInstance().addHongBaoRecieveMsg(v2.getId());
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e);
            }
         }
         // 站内信+推送
         UserInfo user = userInfoMapper.selectByPrimaryKey(uid);
         // 新版通知
         userMoneyMsgNotificationService.fanliOrderReceived(uid, hongBaoOrder.getCommonOrder().getOrderNo(),
               hongBaoOrder.getCommonOrder().getSourceType(), userGoodsCount.get(uid), money, user.getMyHongBao());
      }
      // 通知免单到账
      // 自购到账事务消息
      OrderMoneyRecievedMQMsg mqMsg = new OrderMoneyRecievedMQMsg(OrderMoneyRecievedMQMsg.TYPE_ZIGOU,
            mainUser.getId(), hongBaoOrder.getCommonOrder().getSourceType(),
            hongBaoOrder.getCommonOrder().getOrderNo(), null, new Date(), 0);
      mqMsg.setOrderFirst(first);
      Message msg = MQMsgBodyFactory.create(MQTopicName.TOPIC_ORDER, OrderTopicTagEnum.orderFanLiActual, mqMsg);
      String key = mainUser.getId() + "-" + UUID.randomUUID().toString();
      msg.setKey(key);
      try {
         userSystemCouponService.updateStateByArrivalAccount(hongBaoOrder.getCommonOrder().getOrderNo());
      } catch (Exception e) {
         e.printStackTrace();
      }
      // 维权扣款(2018-08-05后开始实行)
      if (hongBaoOrder.getCommonOrder().getSettleTime() != null && hongBaoOrder.getCommonOrder().getSettleTime()
            .getTime() >= TimeUtil.convertToTimeTemp("2018-08-05", "yyyy-MM-dd")) {
         try {
            if (hongBaoOrder.getCommonOrder().getSourceType() == Constant.SOURCE_TYPE_TAOBAO)
               taoBaoWeiQuanDrawBackService.doWeiQuanFanli(hongBaoOrder.getCommonOrder().getOrderNo());
         } catch (TaoBaoWeiQuanException e) {
            if (e.getCode() == TaoBaoWeiQuanException.CODE_NEDD_UPDATE_ORDER) {
               List<TaoBaoOrder> olist = taoBaoOrderService
                     .getTaoBaoOrderByOrderId(hongBaoOrder.getCommonOrder().getOrderNo());
               if (olist != null && olist.size() > 0) {
                  long time = TimeUtil.convertToTimeTemp(olist.get(0).getCreateTime(), "yyyy-MM-dd HH:mm:ss");
                  olist = TaoKeOrderApiUtil.getTaoBaoCommonOrderList(time, time + 1000 * 2L, 1);
                  if (olist != null && olist.size() > 0) {
                     for (int i = 0; i < olist.size(); i++) {
                        if (!olist.get(i).getOrderId()
                              .equalsIgnoreCase(hongBaoOrder.getCommonOrder().getOrderNo())) {// 删除无关订单
                           olist.remove(i);
                           i--;
                        }
                     }
                     taoBaoOrderService.addTaoBaoOrderList(olist);
         if (!Constant.IS_TEST)
            orderTransactionProducer.send(msg, new LocalTransactionExecuter() {
               @Override
               public TransactionStatus execute(Message arg0, Object arg1) {
                  try {
                     orderMoneySettleService.ziGouSettle(hongBaoOrder.getCommonOrder().getOrderNo(),
                           hongBaoOrder.getCommonOrder().getSourceType(), key);
                     return TransactionStatus.CommitTransaction;
                  } catch (Exception e) {
                     e.printStackTrace();
                     return TransactionStatus.RollbackTransaction;
                  }
               }
            } else
               throw new TaoBaoWeiQuanException(e.getCode(), e.getMsg());
            }, null);
         else {
            try {
               orderMoneySettleService.ziGouSettle(hongBaoOrder.getCommonOrder().getOrderNo(),
                     hongBaoOrder.getCommonOrder().getSourceType(), key);
            } catch (Exception e) {
            }
         }
      } catch (Exception e) {
         LogHelper.mqError(e.getMessage(), msg.getTopic(), msg.getTag(), new Gson().toJson(mqMsg));
      }
   }
   @Override
@@ -518,7 +537,8 @@
         for (TaoBaoWeiQuanOrder order : orderList) {
            try {
               if (order.getState().contains("维权成功")) {
                  CMQManager.getInstance().addWeiQuanOrderMsg(order);
                  if (Constant.ENABLE_MQ)
                     CMQManager.getInstance().addWeiQuanOrderMsg(order);
               }
            } catch (Exception e) {
               LogHelper.error("维权订单加入到队列出错:" + order != null ? new Gson().toJson(order) : null);
@@ -535,13 +555,8 @@
      if (orderList != null && orderList.size() > 0 & !StringUtil.isNullOrEmpty(orderList.get(0).getSettlementTime()))
         order.setJieSuanTime(
               new Date(TimeUtil.convertToTimeTemp(orderList.get(0).getSettlementTime(), "yyyy-MM-dd HH:mm:ss")));
      // if (order.getJieSuanTime().getTime() >=
      // TimeUtil.convertToTimeTemp("2018-08-05", "yyyy-MM-dd")) {
      // return;
      // }
      // TODO 处理维权成功但是已到账的订单
      // 处理维权成功但是已到账的订单
      if (order.getJieSuanTime().getTime() > TimeUtil.convertToTimeTemp("2019-01-01", "yyyy-MM-dd")) {// 结算时间在2月1号的开始处理已到账但是维权的
         CommonOrder commonOrder = commonOrderService.selectBySourceTypeAndTradeId(Constant.SOURCE_TYPE_TAOBAO,
               order.getOrderItemId());
@@ -552,15 +567,34 @@
               TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackService
                     .selectByOrderItemId(order.getOrderItemId());
               if (drawBack == null) {// 还未扣款
                  OrderLogHelper.taoBaoWeiQuan("已到账未扣款处理:子订单号:" + order.getOrderItemId());
                  try {
                     taoBaoWeiQuanDrawBackService.doWeiQuanFanli(order.getOrderId());
                     taoBaoWeiQuanDrawBackService.doWeiQuanFanli(order.getOrderId(), true);
                     taoBaoWeiQuanDrawBackService.doWeiQuanShare(order.getOrderId());
                     taoBaoWeiQuanDrawBackService.doWeiQuanInvite(order.getOrderId());
                  } catch (TaoBaoWeiQuanException e) {
                     try {
                        LogHelper.errorDetailInfo(e, null, "订单号:" + order.getOrderId());
                        LogHelper.errorDetailInfo(e, "到账后处理维权扣款出错", "订单号:" + order.getOrderId());
                     } catch (Exception e1) {
                        e1.printStackTrace();
                     }
                  }
               } else {
                  // 查询子红包是否已到账
                  List<HongBaoV2> children = hongBaoV2Service
                        .listChildrenById(hongBaoOrder.getHongBaoV2().getId());
                  for (HongBaoV2 hongBaoV2 : children) {
                     if (hongBaoV2.getState() == HongBaoV2.STATE_YILINGQU) {
                        try {
                           taoBaoWeiQuanDrawBackService.doWeiQuanInvite(order.getOrderId());
                        } catch (TaoBaoWeiQuanException e) {
                           try {
                              LogHelper.errorDetailInfo(e, "到账后处理维权扣款出错", "订单号:" + order.getOrderId());
                           } catch (Exception e1) {
                              e1.printStackTrace();
                           }
                        }
                        break;
                     }
                  }
               }
@@ -570,317 +604,120 @@
   }
   @Override
   public void fanliInvaiteAndShare() {
      // 查出邀请赚与分享赚该返利的用户ID
      List<Long> inviteAndShareUids = hongBaoV2Mapper.listUidCanBanlanceShareAndInvite(1000);
   public void fanliPreInvaite(Date maxTime) {
      // 查出邀请赚的用户ID
      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);
      long count = hongBaoV2Mapper.countUidCanBanlanceByTypeAndMaxTime(typeList, maxTime);
      int pageSize = 1000;
      int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      Set<Long> uidSets = new HashSet<>();
      if (inviteAndShareUids != null)
         for (Long uid : inviteAndShareUids)
            uidSets.add(uid);
      for (int i = 0; i < page; i++) {
         List<Long> inviteAndShareUids = hongBaoV2Mapper.listUidCanBanlanceByTypeAndMaxTime(typeList, maxTime,
               i * pageSize, pageSize);
         if (inviteAndShareUids != null)
            for (Long uid : inviteAndShareUids) {
               if (userInfoMapper.selectAvailableByPrimaryKey(uid) != null)
                  uidSets.add(uid);
            }
      }
      // 根据用户ID
      Iterator<Long> its = uidSets.iterator();
      while (its.hasNext()) {
         Long uid = its.next();
         try {
            CMQManager.getInstance().addFanLiTiChengMsg(uid);
            if (Constant.ENABLE_MQ)
               TeamOrderCMQManager.getInstance().addFanLiTeamIncomePreMsg(new UidDateDTO(uid, maxTime));
         } catch (Exception e) {
            e.printStackTrace();
            LogHelper.error(e);
         }
      }
   }
   private HongBaoV2 filterWeiQuanINGHongBao(HongBaoV2 hongBao) {
      long hbId = hongBao.getId();
      if (hongBao.getParent() != null) {
         hbId = hongBao.getParent().getId();
      }
      HongBaoOrder hongbaoOrder = hongBaoOrderMapper.selectByHongBaoId(hbId);
      if (hongbaoOrder == null)
         return null;
      List<TaoBaoWeiQuanOrder> taoBaoWeiQuanList = taoBaoWeiQuanOrderMapper
            .selectListByOrderIdAndState(hongbaoOrder.getCommonOrder().getOrderNo(), "维权创建");
      List<TaoBaoWeiQuanOrder> taoBaoWeiQuanList1 = taoBaoWeiQuanOrderMapper
            .selectListByOrderIdAndState(hongbaoOrder.getCommonOrder().getOrderNo(), "等待处理");
      if ((taoBaoWeiQuanList != null && taoBaoWeiQuanList.size() > 0)
            || (taoBaoWeiQuanList1 != null && taoBaoWeiQuanList1.size() > 0)) {
         return null;
      }
      return hongBao;
   }
   @Override
   @Transactional
   public void fanliInvaiteAndShare(Long uid) throws TaoBaoWeiQuanException {
      List<Long> recieveHongBaoIds = new ArrayList<>();
      /**
       * 处理邀请赚订单
       */
      // 查询UID的邀请赚订单
      List<Integer> types = new ArrayList<>();
      types.add(HongBaoV2.TYPE_YIJI);
      types.add(HongBaoV2.TYPE_ERJI);
      long count = hongBaoV2Mapper.countCanBalanceHongBaoByTypeAndUid(types, uid);
      List<HongBaoV2> hongBaoList = new ArrayList<>();
      // 1000条数据为1页
      int page = (int) (count % 1000 == 0 ? count / 1000 : count / 1000 + 1);
   public void fanliShare(Date maxTime) {
      // 查出邀请赚的用户ID
      List<Integer> typeList = new ArrayList<>();
      typeList.add(HongBaoV2.TYPE_SHARE_GOODS);
      long count = hongBaoV2Mapper.countUidCanBanlanceByTypeAndMaxTime(typeList, maxTime);
      int pageSize = 1000;
      int page = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      Set<Long> uidSets = new HashSet<>();
      for (int i = 0; i < page; i++) {
         List<HongBaoV2> tempHongBaoList = hongBaoV2Mapper.listCanBalanceHongBaoByTypeAndUid(types, uid, i * 1000,
               1000);
         if (tempHongBaoList != null && tempHongBaoList.size() > 0)
            hongBaoList.addAll(tempHongBaoList);
      }
      // 灰度测试中,京东/拼多多订单分享/邀请订单不返利
      for (int i = 0; i < hongBaoList.size(); i++) {
         HongBaoV2 item = hongBaoList.get(i);
         if (item.getType() == HongBaoV2.TYPE_SHARE_GOODS) {
         } else {
            item = item.getParent();
         }
         if (item != null) {
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByHongBaoId(item.getId());
            if (hongBaoOrder != null && hongBaoOrder.getCommonOrder() != null) {
               CommonOrder co = hongBaoOrder.getCommonOrder();
               // 上级用户不是正常用户,订单均不能到账
               UserInfo userInfo = userInfoMapper.selectAvailableByPrimaryKey(co.getUserInfo().getId());
               if (userInfo == null || userInfo.getState() != UserInfo.STATE_NORMAL) {
                  hongBaoList.remove(i);
                  i--;
               }
         List<Long> inviteAndShareUids = hongBaoV2Mapper.listUidCanBanlanceByTypeAndMaxTime(typeList, maxTime,
               i * pageSize, pageSize);
         if (inviteAndShareUids != null)
            for (Long uid : inviteAndShareUids) {
               if (userInfoMapper.selectAvailableByPrimaryKey(uid) != null)
                  uidSets.add(uid);
            }
         }
      }
      List<Long> hbIdList = new ArrayList<>();
      BigDecimal invitemoney = new BigDecimal(0);
      Set<String> inviteOrders = new HashSet<>();
      int inviteGoodsCount = 0;
      // 需要判断退款的订单号
      Set<String> drawBackOrders = new HashSet<String>();
      for (HongBaoV2 hongBao : hongBaoList) {
         hongBao = filterWeiQuanINGHongBao(hongBao);
         if (hongBao == null)
            continue;
         hongBao = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(hongBao.getId());
         if (hongBao.getState() == HongBaoV2.STATE_BUKELINGQU || hongBao.getState() == HongBaoV2.STATE_KELINGQU) {
            invitemoney = invitemoney.add(hongBao.getMoney());
            HongBaoV2 updateHongBao = new HongBaoV2();
            updateHongBao.setId(hongBao.getId());
            updateHongBao.setGetTime(new Date());
            updateHongBao.setState(HongBaoV2.STATE_YILINGQU);
            updateHongBao.setUpdateTime(new Date());
            hongBaoV2Mapper.updateByPrimaryKeySelective(updateHongBao);
            // 添加到红包返利记录集合
            hbIdList.add(hongBao.getId());
            // 2018-08-05 过后的订单才处理维权
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByHongBaoId(hongBao.getParent().getId());
            inviteGoodsCount += hongBaoOrder.getCommonOrder().getCount();
            inviteOrders.add(hongBaoOrder.getCommonOrder().getOrderNo());
            Date balanceTime = hongBaoOrder.getCommonOrder().getSettleTime();
            if (balanceTime != null
                  && balanceTime.getTime() >= TimeUtil.convertToTimeTemp("2018-08-05", "yyyy-MM-dd")) {
               if (!StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getOrderNo()))
                  drawBackOrders.add(hongBaoOrder.getCommonOrder().getOrderNo());
            }
         }
      }
      /**
       * 处理一级二级分享赚(属于邀请赚类型)
       */
      List<HongBaoV2> totalHongBaoList = new ArrayList<>();
      // 查询UID的二级或者三级分享赚订单
      // TODO 暂时查询10000条数据,后面再做分页
      types.clear();
      types.add(HongBaoV2.TYPE_SHARE_YIJI);
      types.add(HongBaoV2.TYPE_SHARE_ERJI);
      // TODO 需要处理超过1w条数据的订单
      List<HongBaoV2> hbList = hongBaoV2Mapper.listCanBalanceHongBaoByTypeAndUid(types, uid, 0, 10000);
      if (hbList != null && hbList.size() > 0)
         totalHongBaoList.addAll(hbList);
      for (HongBaoV2 hb : totalHongBaoList) {
         if (hb.getState() == HongBaoV2.STATE_BUKELINGQU || hb.getState() == HongBaoV2.STATE_KELINGQU) {
            hb = filterWeiQuanINGHongBao(hb);
            if (hb == null)
               continue;
            invitemoney = invitemoney.add(hb.getMoney());
            HongBaoV2 updateHongBao = new HongBaoV2();
            updateHongBao.setId(hb.getId());
            updateHongBao.setGetTime(new Date());
            updateHongBao.setState(HongBaoV2.STATE_YILINGQU);
            updateHongBao.setUpdateTime(new Date());
            hongBaoV2Mapper.updateByPrimaryKeySelective(updateHongBao);
            // 添加到红包返利记录集合
            hbIdList.add(hb.getId());
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByHongBaoId(hb.getParent().getId());
            inviteGoodsCount += hongBaoOrder.getCommonOrder().getCount();
            inviteOrders.add(hongBaoOrder.getCommonOrder().getOrderNo());
            if (!StringUtil.isNullOrEmpty(hongBaoOrder.getCommonOrder().getOrderNo()))
               drawBackOrders.add(hongBaoOrder.getCommonOrder().getOrderNo());
         }
      }
      // 邀请赚到账
      if (invitemoney.compareTo(new BigDecimal(0)) > 0) {
         // 添加新版详情记录
      // 根据用户ID
      Iterator<Long> its = uidSets.iterator();
      while (its.hasNext()) {
         Long uid = its.next();
         try {
            // 查询邀请赚的有效订单,失效订单,维权订单
            Calendar ca = Calendar.getInstance();
            Date maxDate = new Date(TimeUtil
                  .convertToTimeTemp(ca.get(Calendar.YEAR) + "-" + (ca.get(Calendar.MONTH) + 1), "yyyy-M"));
            ca.add(Calendar.MONTH, -1);
            Date minDate = new Date(TimeUtil
                  .convertToTimeTemp(ca.get(Calendar.YEAR) + "-" + (ca.get(Calendar.MONTH) + 1), "yyyy-M"));
            long validCount = hongBaoV2Mapper.countInviteOrderCountByUidAndSettleTime(uid, CommonOrder.STATE_JS,
                  minDate, maxDate);
            long weiQuanCount = hongBaoV2Mapper.countInviteOrderCountByUidAndSettleTime(uid, CommonOrder.STATE_WQ,
                  minDate, maxDate);
            UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createInvite(uid, Constant.SOURCE_TYPE_TAOBAO,
                  (int) validCount, (int) weiQuanCount, invitemoney, new Date());
            // 增加资金
            userMoneyService.addUserMoney(uid, invitemoney, userMoneyDetail);
            // 添加到红包返利记录集合
            accountDetailsHongBaoMapService.saveAccountDetailsHongBaoMap(hbIdList, userMoneyDetail.getId());
         } catch (UserMoneyDetailException e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
         // 新版通知
         userMoneyMsgNotificationService.inviteOrderReceived(uid, Constant.SOURCE_TYPE_TAOBAO, inviteOrders.size(),
               inviteGoodsCount, invitemoney, userInfoMapper.selectByPrimaryKey(uid).getMyHongBao());
         for (String orderId : drawBackOrders)
            taoBaoWeiQuanDrawBackService.doWeiQuanInvite(orderId);
      }
      if (hbIdList.size() > 0)
         recieveHongBaoIds.addAll(hbIdList);
      hbIdList.clear();
      drawBackOrders.clear();
      /**
       * 处理分享赚
       */
      int shareGoodsCount = 0;
      Set<String> shareOrders = new HashSet<>();
      BigDecimal sharemoney = new BigDecimal(0);
      // 查询UID的分享赚订单
      types.clear();
      types.add(HongBaoV2.TYPE_SHARE_GOODS);
      // TODO 需要处理超过10000条数据的订单
      List<HongBaoV2> hongBaoShareList = hongBaoV2Mapper.listCanBalanceHongBaoByTypeAndUid(types, uid, 0, 10000);
      for (HongBaoV2 hongBao : hongBaoShareList) {
         hongBao = hongBaoV2Mapper.selectByPrimaryKeyForUpdate(hongBao.getId());
         hongBao = filterWeiQuanINGHongBao(hongBao);
         if (hongBao == null)
            continue;
         if (hongBao.getState() == HongBaoV2.STATE_BUKELINGQU || hongBao.getState() == HongBaoV2.STATE_KELINGQU) {
            sharemoney = sharemoney.add(hongBao.getMoney());
            HongBaoV2 updateHongBao = new HongBaoV2();
            updateHongBao.setId(hongBao.getId());
            updateHongBao.setGetTime(new Date());
            updateHongBao.setState(HongBao.STATE_YILINGQU);
            updateHongBao.setUpdateTime(new Date());
            hongBaoV2Mapper.updateByPrimaryKeySelective(updateHongBao);
            // 添加到红包返利记录集合
            hbIdList.add(hongBao.getId());
            // 2018-08-05 过后的订单才处理维权
            Date balanceTime = null;
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByHongBaoId(hongBao.getId());
            if (hongBaoOrder != null) {
               balanceTime = hongBaoOrder.getCommonOrder().getSettleTime();
               shareGoodsCount += hongBaoOrder.getCommonOrder().getCount();
            }
            shareOrders.add(hongBaoOrder.getCommonOrder().getOrderNo());
            if (balanceTime != null
                  && balanceTime.getTime() >= TimeUtil.convertToTimeTemp("2018-08-05", "yyyy-MM-dd")) {
               drawBackOrders.add(hongBaoOrder.getCommonOrder().getOrderNo());
            }
         }
      }
      /**
       * 分享赚到账
       */
      if (sharemoney.compareTo(new BigDecimal(0)) > 0) {
         // 添加新版详情记录
         try {
            // 计算本月的有效订单,失效订单,维权订单
            Calendar ca = Calendar.getInstance();
            Date maxDate = new Date(TimeUtil
                  .convertToTimeTemp(ca.get(Calendar.YEAR) + "-" + (ca.get(Calendar.MONTH) + 1), "yyyy-M"));
            ca.add(Calendar.MONTH, -1);
            Date minDate = new Date(TimeUtil
                  .convertToTimeTemp(ca.get(Calendar.YEAR) + "-" + (ca.get(Calendar.MONTH) + 1), "yyyy-M"));
            long validCount = hongBaoV2Mapper.countShareOrderCountByUidAndSettleTime(uid, CommonOrder.STATE_JS,
                  minDate, maxDate);
            long weiQuanCount = hongBaoV2Mapper.countShareOrderCountByUidAndSettleTime(uid, CommonOrder.STATE_WQ,
                  minDate, maxDate);
            long invalidCount = hongBaoV2Mapper.countShareOrderCountByUidAndSettleTime(uid, CommonOrder.STATE_SX,
                  minDate, maxDate);
            UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createShare(uid, Constant.SOURCE_TYPE_TAOBAO,
                  (int) validCount, (int) weiQuanCount, sharemoney, new Date());
            // 添加资金
            userMoneyService.addUserMoney(uid, sharemoney, userMoneyDetail);
            // 添加到红包返利记录集合
            accountDetailsHongBaoMapService.saveAccountDetailsHongBaoMap(hbIdList, userMoneyDetail.getId());
            if (hbIdList.size() > 0)
               recieveHongBaoIds.addAll(hbIdList);
         } catch (UserMoneyDetailException e) {
            try {
               LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
               e1.printStackTrace();
            }
         }
         // 新版通知
         userMoneyMsgNotificationService.shareOrderReceived(uid, Constant.SOURCE_TYPE_TAOBAO, shareOrders.size(),
               shareGoodsCount, sharemoney, userInfoMapper.selectAvailableByPrimaryKey(uid).getMyHongBao());
         for (String orderId : drawBackOrders)
            taoBaoWeiQuanDrawBackService.doWeiQuanShare(orderId);
      }
      // 所有的返利到账红包ID
      for (Long hongBaoId : recieveHongBaoIds) {
         try {
            HongBaoRecieveCMQManager.getInstance().addHongBaoRecieveMsg(hongBaoId);
            if (Constant.ENABLE_MQ)
               CMQManager.getInstance().addFanLiShareMsg(new UidDateDTO(uid, maxTime));
         } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
            e.printStackTrace();
            LogHelper.error(e);
         }
      }
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void fanliPreInvaite(Long uid, Date maxPreGetTime) {
      // 邀请赚到账
      try {
         orderMoneySettleService.inviteSettleTB(uid, maxPreGetTime);
      } catch (OrderMoneySettleException e) {
         e.printStackTrace();
      }
      try {
         orderMoneySettleService.inviteSettleJD(uid, maxPreGetTime);
      } catch (OrderMoneySettleException e) {
         e.printStackTrace();
      }
      try {
         orderMoneySettleService.inviteSettlePDD(uid, maxPreGetTime);
      } catch (OrderMoneySettleException e) {
         e.printStackTrace();
      }
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void fanliShare(Long uid, Date maxPreGetTime) {
      // 邀请赚到账
      try {
         orderMoneySettleService.shareSettleTB(uid, maxPreGetTime);
      } catch (OrderMoneySettleException e) {
         e.printStackTrace();
      }
      try {
         orderMoneySettleService.shareSettleJD(uid, maxPreGetTime);
      } catch (OrderMoneySettleException e) {
         e.printStackTrace();
      }
      try {
         orderMoneySettleService.shareSettlePDD(uid, maxPreGetTime);
      } catch (OrderMoneySettleException e) {
         e.printStackTrace();
      }
   }
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@@ -902,10 +739,28 @@
         // 原来不存在订单
         Long uid = null;
         if (oldOrder == null) {
            PidUser pidUser = null;// pidUserMapper.selectByPid(pid);
            if (pidUser != null) {
               uid = pidUser.getUid();
            Long targetUid = null;
            if (pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID)
                  && !StringUtil.isNullOrEmpty(orderList.get(0).getRelationId())) {// 处理非返利商品库的商品
               targetUid = taoBaoBuyRelationMapService.selectUidByRelationId(orderList.get(0).getRelationId());
            } else if ((pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_ELEME_PID)
                  || pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_KOUBEI_PID))
                  && !StringUtil.isNullOrEmpty(orderList.get(0).getRelationId())) {// 处理饿了么,口碑的订单
               UserExtraTaoBaoInfo extraInfo = userExtraTaoBaoInfoService
                     .getByRelationId(orderList.get(0).getRelationId());
               if (extraInfo != null) {
                  targetUid = extraInfo.getUser().getId();
               }
            } else if (!StringUtil.isNullOrEmpty(orderList.get(0).getSpecialId())) {
               UserExtraTaoBaoInfo info = userExtraTaoBaoInfoService
                     .getBySpecialId(orderList.get(0).getSpecialId());
               if (info != null && info.getUser() != null)
                  targetUid = info.getUser().getId();
            }
            if (targetUid != null) {
               uid = targetUid;
               // 插入到Order中
               // 添加到订单中去
               Order order = new Order();
@@ -919,36 +774,8 @@
               // 加入到订单表
               orderMapper.insertSelective(order);
               oldOrder = order;
            } else {
               Long targetUid = null;
               if (pid.equalsIgnoreCase(TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID)
                     && !StringUtil.isNullOrEmpty(orderList.get(0).getRelationId())) {
                  targetUid = taoBaoBuyRelationMapService.selectUidByRelationId(orderList.get(0).getRelationId());
               } else if (!StringUtil.isNullOrEmpty(orderList.get(0).getSpecialId())) {
                  UserExtraTaoBaoInfo info = userExtraTaoBaoInfoService
                        .getBySpecialId(orderList.get(0).getSpecialId());
                  if (info != null && info.getUser() != null)
                     targetUid = info.getUser().getId();
               }
               if (targetUid != null) {
                  uid = targetUid;
                  // 插入到Order中
                  // 添加到订单中去
                  Order order = new Order();
                  order.setBeizhu("PID返利订单");
                  order.setCreatetime(System.currentTimeMillis());
                  order.setOrderId(orderId);
                  order.setOrderType(1);
                  order.setState(Order.STATE_YIZHIFU);
                  order.setUserInfo(new UserInfo(uid));
                  order.setVersion(2);
                  // 加入到订单表
                  orderMapper.insertSelective(order);
                  oldOrder = order;
               }
            }
         } else {
            uid = oldOrder.getUserInfo().getId();
         }
@@ -986,15 +813,15 @@
         List<CommonOrderAddResultDTO> commonOrderList = null;
         try {
            commonOrderList = commonOrderService.addTaoBaoOrder(orderList, uid);
            hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_ZIGOU);
            addHongBaoWithMQ(commonOrderList, orderId, uid, Constant.SOURCE_TYPE_TAOBAO, HongBaoV2.TYPE_ZIGOU);
            if (isCommonOrderAllAdd(commonOrderList)) {
               Order order = new Order();
               order.setOrderId(orderId);
               order.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
               order.setUserInfo(new UserInfo(uid));
               try {
                  PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
                  if (Constant.ENABLE_MQ)
                     PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
               } catch (Exception e) {
               }
            }
@@ -1010,21 +837,12 @@
   @Override
   public void processShareGoodsOrderNew(String orderId, List<TaoBaoOrder> orderList) {
      List<TaoBaoUnionConfig> configList = taoBaoUnionConfigService.getConfigByTypeCache(PidUser.TYPE_FANLI_ANDROID);
      if (orderList != null && orderList.size() > 0) {
         String pid = String.format("mm_%s_%s_%s", configList.get(0).getAccountId(),
               orderList.get(0).getSourceMediaId(), orderList.get(0).getAdPositionId());
         // 原来不存在订单
         Long uid = null;
         PidUser pidUser = null; // pidUserMapper.selectByPid(pid);-PID机制移除
         if (pidUser != null)
            uid = pidUser.getUid();
         else {
            UserExtraTaoBaoInfo info = userExtraTaoBaoInfoService.getByRelationId(orderList.get(0).getRelationId());
            if (info != null && info.getUser() != null)
               uid = info.getUser().getId();
         }
         UserExtraTaoBaoInfo info = userExtraTaoBaoInfoService.getByRelationId(orderList.get(0).getRelationId());
         if (info != null && info.getUser() != null)
            uid = info.getUser().getId();
         // 尚未找到和PID对应的用户
         if (uid == null) {
            // 通过红包查询
@@ -1046,21 +864,20 @@
         // 用第一个子订单锁定用户
         try {
            List<CommonOrderAddResultDTO> commonOrders = commonOrderService.addTaoBaoOrder(orderList, uid);
            hongBaoV2Service.addHongBao(convertCommonOrder(commonOrders), HongBaoV2.TYPE_SHARE_GOODS);
            addHongBaoWithMQ(commonOrders, orderId, uid, Constant.SOURCE_TYPE_TAOBAO, HongBaoV2.TYPE_SHARE_GOODS);
            if (isCommonOrderAllAdd(commonOrders)) {
               Order order = new Order();
               order.setOrderId(orderId);
               order.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
               order.setUserInfo(new UserInfo(uid));
               try {
                  PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
                  if (Constant.ENABLE_MQ)
                     PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
               } catch (Exception e) {
               }
            }
         } catch (CommonOrderException e) {
            e.printStackTrace();
         } catch (HongBaoException e1) {
            e1.printStackTrace();
         }
      }
   }
@@ -1085,12 +902,15 @@
   public void processJDOrder(JDOrder order) {
      if (order == null || order.getOrderItemList() == null || order.getOrderItemList().size() == 0)
         return;
      // 拆单的不做处理
      if (order.getValidCode() == 2)
         return;
      // 根据ext1与subUnionId跟单
      String uidStr = order.getExt1();
      if (StringUtil.isNullOrEmpty(uidStr))
         uidStr = order.getOrderItemList().get(0).getSubUnionId();
      Long uid = null;
      if (!StringUtil.isNullOrEmpty(uidStr) && NumberUtil.isNumeric(uidStr))
         uid = Long.parseLong(uidStr);
@@ -1165,24 +985,21 @@
      try {
         List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addJDOrder(jdOrder, uid);
         hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_ZIGOU);
         addHongBaoWithMQ(commonOrderList, jdOrder.getOrderId() + "", uid, Constant.SOURCE_TYPE_JD,
               HongBaoV2.TYPE_ZIGOU);
         if (isCommonOrderAllAdd(commonOrderList)) {
            Order order = new Order();
            order.setOrderId(jdOrder.getOrderId() + "");
            order.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
            order.setOrderType(Constant.SOURCE_TYPE_JD);
            order.setUserInfo(new UserInfo(uid));
            try {
               PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
               if (Constant.ENABLE_MQ)
                  PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
            } catch (Exception e) {
            }
         }
      } catch (CommonOrderException e) {
         try {
            LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId());
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      } catch (HongBaoException e) {
         try {
            LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId());
         } catch (Exception e1) {
@@ -1201,24 +1018,20 @@
   private void processShareJDOrder(JDOrder jdOrder, Long uid) {
      try {
         List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addJDOrder(jdOrder, uid);
         hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_SHARE_GOODS);
         addHongBaoWithMQ(commonOrderList, jdOrder.getOrderId() + "", uid, Constant.SOURCE_TYPE_JD,
               HongBaoV2.TYPE_SHARE_GOODS);
         if (isCommonOrderAllAdd(commonOrderList)) {
            Order order = new Order();
            order.setOrderId(jdOrder.getOrderId() + "");
            order.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
            order.setOrderType(Constant.SOURCE_TYPE_JD);
            order.setUserInfo(new UserInfo(uid));
            try {
               PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
               if (Constant.ENABLE_MQ)
                  PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
            } catch (Exception e) {
            }
         }
      } catch (CommonOrderException e) {
         try {
            LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId());
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      } catch (HongBaoException e) {
         try {
            LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId());
         } catch (Exception e1) {
@@ -1315,24 +1128,20 @@
         List<PDDOrder> pddOrderList = new ArrayList<>();
         pddOrderList.add(pddOrder);
         List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addPDDOrder(pddOrderList, uid);
         hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_ZIGOU);
         addHongBaoWithMQ(commonOrderList, pddOrder.getOrderSn(), uid, Constant.SOURCE_TYPE_PDD,
               HongBaoV2.TYPE_ZIGOU);
         if (isCommonOrderAllAdd(commonOrderList)) {
            Order order = new Order();
            order.setOrderId(pddOrder.getOrderSn());
            order.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
            order.setOrderType(Constant.SOURCE_TYPE_PDD);
            order.setUserInfo(new UserInfo(uid));
            try {
               PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
               if (Constant.ENABLE_MQ)
                  PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
            } catch (Exception e) {
            }
         }
      } catch (CommonOrderException e) {
         try {
            LogHelper.errorDetailInfo(e, "addPDDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderSn());
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      } catch (HongBaoException e) {
         try {
            LogHelper.errorDetailInfo(e, "addPDDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderSn());
         } catch (Exception e1) {
@@ -1353,24 +1162,20 @@
         List<PDDOrder> pddOrderList = new ArrayList<>();
         pddOrderList.add(pddOrder);
         List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addPDDOrder(pddOrderList, uid);
         hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_SHARE_GOODS);
         addHongBaoWithMQ(commonOrderList, pddOrder.getOrderSn(), uid, Constant.SOURCE_TYPE_PDD,
               HongBaoV2.TYPE_SHARE_GOODS);
         if (isCommonOrderAllAdd(commonOrderList)) {
            Order order = new Order();
            order.setOrderId(pddOrder.getOrderSn());
            order.setOrderType(Constant.SOURCE_TYPE_TAOBAO);
            order.setOrderType(Constant.SOURCE_TYPE_PDD);
            order.setUserInfo(new UserInfo(uid));
            try {
               PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
               if (Constant.ENABLE_MQ)
                  PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order);
            } catch (Exception e) {
            }
         }
      } catch (CommonOrderException e) {
         try {
            LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderId());
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      } catch (HongBaoException e) {
         try {
            LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderId());
         } catch (Exception e1) {
@@ -1450,6 +1255,23 @@
   @Transactional(rollbackFor = Exception.class)
   public void invalidHongBaoV2AndGiveGodenCorn(Long hongBaoId, Long uid, String orderId, int sourceType,
         String beiZhu) throws Exception {
      HongBaoOrder hongbaoOrder = hongBaoOrderMapper.selectByHongBaoId(hongBaoId);
      if (hongbaoOrder != null) {
         CommonOrder commonOrder = commonOrderService.selectByPrimaryKey(hongbaoOrder.getCommonOrder().getId());
         if (commonOrder != null) {
            if (commonOrder.getState() == CommonOrder.STATE_FK) {
               CommonOrder updateOrder = new CommonOrder(commonOrder.getId());
               updateOrder.setState(CommonOrder.STATE_SX);
               updateOrder.setUpdateTime(new Date());
               commonOrderService.updateByPrimaryKeySelective(updateOrder);
            }
         }
      }
      HongBaoV2 hongBao = hongBaoV2Service.selectByPrimaryKey(hongBaoId);
      if (hongBao == null || hongBao.getState() == HongBaoV2.STATE_SHIXIAO)
         return;
      HongBaoV2 v2 = new HongBaoV2(hongBaoId);
      v2.setState(HongBaoV2.STATE_SHIXIAO);
      v2.setBeizhu(beiZhu);
@@ -1464,7 +1286,10 @@
            update.setUpdateTime(new Date());
            hongBaoV2Service.updateByPrimaryKeySelective(update);
         }
      userSystemCouponService.systemGiveRewardCoupon(uid, 1, orderId, sourceType, "因商家违约未能结算返利或商家已经关店");
      if (hongBao.getType() == HongBaoV2.TYPE_ZIGOU || hongBao.getType() == HongBaoV2.TYPE_SHARE_GOODS) {
         userOrderMsgNotificationService.orderInvalidToBusinessRunning(uid, orderId, sourceType, hongBao.getType());
      }
   }
   @Transactional
@@ -1481,7 +1306,7 @@
            // 查询主红包
            HongBaoOrder hongBaoOrder = hongBaoOrderMapper.selectByCommonOrderId(commonOrder.getId());
            if (hongBaoOrder != null && hongBaoOrder.getHongBaoV2() != null) {
            if (hongBaoOrder.getHongBaoV2().getState() == HongBaoV2.STATE_BUKELINGQU) {
            if (hongBaoOrder.getHongBaoV2().getState() == HongBaoV2.STATE_BUKELINGQU || hongBaoOrder.getHongBaoV2().getState() == HongBaoV2.STATE_SHIXIAO) {
            // 订单失效,赠送金币
            try {
            invalidHongBaoV2AndGiveGodenCorn(hongBaoOrder.getHongBaoV2().getId(), hongBaoOrder.getHongBaoV2().getUserInfo().getId(), commonOrder.getOrderNo(), commonOrder.getSourceType(), "订单成功,商家未打款");
@@ -1507,6 +1332,9 @@
   @Resource
   private ElmeOrderService elmeOrderService;
   @Resource
   private ElmeOrderProcessService elmeOrderProcessService;
   /**
    * 获取饿了么可以返利的红包
    * 
@@ -1516,7 +1344,7 @@
   public List<HongBaoV2> getCanBalanceElmeFanliHongBao() {
      List<Integer> list = new ArrayList<>();
      list.add(HongBaoV2.TYPE_ELME);
      return hongBaoV2Mapper.listCanBalanceHongBaoByTypeAndUid(list, null, 0, 1000);
      return hongBaoV2Mapper.listCanBalanceHongBaoByTypeAndUid(list, null, null, new Date(), 0, 1000);
   }
   @Override
@@ -1553,11 +1381,65 @@
         }
         userMoneyService.addUserMoney(hongBao.getUserInfo().getId(), hongBao.getMoney(), detail);
         BigDecimal balance = userInfoMapper.selectByPrimaryKey(hongBao.getUserInfo().getId()).getMyHongBao();
         // 添加消息
         userMoneyMsgNotificationService.elmeFanli(hongBao.getUserInfo().getId(), order.getOrderId(),
               hongBao.getMoney(), balance);
      }
      // 返利到账
   }
   /**
    * 添加红包与事务消息
    *
    * @param commonOrderList
    * @param orderId
    * @param uid
    * @param sourceType
    * @param hongBaoType
    */
   @Transactional
   private void addHongBaoWithMQ(List<CommonOrderAddResultDTO> commonOrderList, String orderId, Long uid,
         int sourceType, int hongBaoType) {
      final List<CommonOrder> coList = convertCommonOrder(commonOrderList);
      HongBaoAddResult result = null;
      try {
         long time = TimeUtil.convertToTimeTemp("2019-12-06", "yyyy-MM-dd");
         if (!Constant.IS_TEST)
            time = TimeUtil.convertToTimeTemp("2019-12-20", "yyyy-MM-dd");
         if (coList.get(0).getThirdCreateTime().getTime() < time)
            result = hongBaoV2Service.addHongBao(coList, hongBaoType);
         else
            result = hongBaoV2AddManager.addHongBao(coList, hongBaoType);
      } catch (HongBaoException e) {
         try {
            LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + orderId);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      } catch (UserAccountException e) {
      }
      if (!Constant.IS_TEST)
         if (result.getResultCode() == HongBaoAddResult.CODE_ADD) {// 只发送新增消息
            OrderMQMsg mqMsg = new OrderMQMsg(orderId, sourceType, uid, OrderMQMsg.HANDLE_TYPE_ADD,
                  isCommonOrderValid(coList), 0, new Date(), result.isMiandan());
            Message msg = MQMsgBodyFactory.create(MQTopicName.TOPIC_ORDER, OrderTopicTagEnum.orderStatistic, mqMsg);
            producer.send(msg);
         }
   }
   /**
    * 订单是否有效
    *
    * @param coList
    * @return
    */
   private boolean isCommonOrderValid(List<CommonOrder> coList) {
      for (CommonOrder commonOrder : coList) {
         if (commonOrder.getState() == CommonOrder.STATE_JS || commonOrder.getState() == CommonOrder.STATE_FK
               || commonOrder.getState() == CommonOrder.STATE_WQ) {
            return true;
         }
      }
      return false;
   }
}