yujian
2019-12-12 8c04d27e5cebb7e654c208533e9567c4df2c8acc
fanli/src/main/java/com/yeshi/fanli/service/impl/order/CommonOrderServiceImpl.java
@@ -1,7 +1,6 @@
package com.yeshi.fanli.service.impl.order;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
@@ -14,12 +13,15 @@
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.entity.DateInfo;
import org.yeshi.utils.taobao.TbImgUtil;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderGoodsMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderTradeIdMapMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanOrderMapper;
import com.yeshi.fanli.dto.order.CommonOrderAddResultDTO;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
@@ -33,6 +35,7 @@
import com.yeshi.fanli.entity.order.CommonOrderGoods;
import com.yeshi.fanli.entity.order.CommonOrderTradeIdMap;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.order.InviteOrderSubsidy;
import com.yeshi.fanli.entity.pdd.PDDOrder;
import com.yeshi.fanli.entity.system.SystemCoupon.CouponTypeEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
@@ -45,11 +48,13 @@
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.config.SystemCouponService;
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoV2Service;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
import com.yeshi.fanli.service.inter.order.InviteOrderSubsidyService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
@@ -67,6 +72,7 @@
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
import com.yeshi.fanli.vo.order.CommonOrderGoodsVO;
import com.yeshi.fanli.vo.order.CommonOrderVO;
import com.yeshi.fanli.vo.order.OrderCountVO;
import com.yeshi.fanli.vo.order.WeiQuanInfo;
import net.sf.json.JSONObject;
@@ -109,6 +115,12 @@
   @Resource
   private HongBaoOrderService hongBaoOrderService;
   @Resource
   private InviteOrderSubsidyService inviteOrderSubsidyService;
   @Resource
   private UserVIPInfoService userVIPInfoService;
   // 奖励订单图片
   public final static String PIC_REWARD = "http://img.flqapp.com/resource/order/order_state_reward.png";
@@ -166,7 +178,7 @@
   @Override
   public List<CommonOrderVO> getOrderByUid(AcceptData acceptData, Integer page, Long uid, Integer state, Integer type,
         Integer orderState, String orderNo, String startTime, String endTime, Integer dateType, Integer source)
         throws CommonOrderException {
         throws CommonOrderException, Exception {
      int pageSize = Constant.PAGE_SIZE;
@@ -187,43 +199,22 @@
      }
      // 数据加工重新组织
      listDataFactory(acceptData, listOrder, listGoods, uid);
      orderVOFactory(acceptData, listOrder, listGoods, uid);
      return listOrder;
   }
   @Override
   public Map<String, BigDecimal> countHistoryOrder(Long uid, Integer day, Integer source) {
      return commonOrderMapper.countHistoryOrder(uid, day, source);
   }
   @Override
   public long countBonusOrderNumber(Long uid, Integer type, Integer day, String startTime, String endTime,
         Integer source) {
      return commonOrderMapper.countBonusOrderNumber(uid, type, day, startTime, endTime, source);
   }
   @Override
   public BigDecimal countBonusOrderMoney(Long uid, Integer type, Integer day, String startTime, String endTime,
         Integer source) {
      return commonOrderMapper.countBonusOrderMoney(uid, type, day, startTime, endTime, source);
   }
   @Override
   public Map<String, Object> countBonusOrderMoneyAndNumber(Long uid, Integer type, Integer day, String startTime,
         String endTime, Integer source) {
      return commonOrderMapper.countBonusOrderMoneyAndNumber(uid, type, day, startTime, endTime, source);
   }
   @Override
   public Map<String, BigDecimal> countByUidAndOrderState(Long uid, Integer type, String startTime, String endTime,
         Integer day, Integer source) {
      return commonOrderMapper.countByUidAndOrderState(uid, type, startTime, endTime, day, source);
   }
   public void listDataFactory(AcceptData acceptData, List<CommonOrderVO> listOrder, List<CommonOrderVO> listGoods,
         Long uid) {
   /**
    * 订单信息加工
    *
    * @param acceptData
    * @param listOrder
    * @param listGoods
    * @param uid
    */
   private void orderVOFactory(AcceptData acceptData, List<CommonOrderVO> listOrder, List<CommonOrderVO> listGoods,
         Long uid) throws Exception {
      List<String> listTB = new ArrayList<String>();
      List<String> listJD = new ArrayList<String>();
      List<String> listPDD = new ArrayList<String>();
@@ -255,37 +246,76 @@
         listRecordPDD = userSystemCouponRecordService.getRecordByOrderNoList(Constant.SOURCE_TYPE_PDD, listPDD);
      }
      /* 组合商品信息 */
      for (CommonOrderVO commonOrder : listGoods) {
         CommonOrderGoods goods = commonOrder.getCommonOrderGoods();
         if (goods == null) {
            continue;
         }
      // 需要查询是否为VIP的用户ID,只有邀请订单才需要查询
      List<Long> needSelectVIPUidList = new ArrayList<>();
         String orderNo1 = commonOrder.getOrderNo();
         Integer sourceType = commonOrder.getSourceType();
         for (CommonOrderVO order : listOrder) {
            String orderNo2 = order.getOrderNo();
            Integer sourceType2 = order.getSourceType();
      for (CommonOrderVO order : listOrder) {
         if (order.getHongBaoType() == HongBaoV2.TYPE_YIJI || order.getHongBaoType() == HongBaoV2.TYPE_ERJI
               || order.getHongBaoType() == HongBaoV2.TYPE_SHARE_ERJI
               || order.getHongBaoType() == HongBaoV2.TYPE_SHARE_ERJI)
            needSelectVIPUidList.add(Long.parseLong(order.getUserId()));
      }
      Map<Long, Boolean> vipUserMap = userVIPInfoService.listByUids(needSelectVIPUidList);
            // 来源、订单号相同
            if (sourceType.equals(sourceType2) && orderNo1.equals(orderNo2)) {
               // 加入商品信息
               List<CommonOrderGoodsVO> listOrderGoods = order.getListOrderGoods();
      // 设置是否为vip订单
      for (CommonOrderVO order : listOrder) {
         if (order.getHongBaoType() == HongBaoV2.TYPE_YIJI || order.getHongBaoType() == HongBaoV2.TYPE_ERJI
               || order.getHongBaoType() == HongBaoV2.TYPE_SHARE_ERJI
               || order.getHongBaoType() == HongBaoV2.TYPE_SHARE_ERJI) {
            if (vipUserMap.get(Long.parseLong(order.getUserId())) != null
                  && vipUserMap.get(Long.parseLong(order.getUserId())) == true)
               order.setVipOrder(true);
            else
               order.setVipOrder(false);
         } else
            order.setVipOrder(false);
         if(order.isVipOrder())
            order.setVipOrderDesc("订单来源:由超级会员的粉丝产生");
      }
      SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
      SimpleDateFormat formatday = new SimpleDateFormat("yyyy.MM.dd");
      // 2019.8.1开始返回维权信息
      Date august = TimeUtil.parse("2019-08-01");
      // 当前用户是否VIP
      boolean vip = userVIPInfoService.isVIP(uid);
      // 是否存在奖励券
      boolean hasRewardCoupon = userSystemCouponService.getValidRebateCoupon(uid);
      for (CommonOrderVO order : listOrder) {
         String orderNo = order.getOrderNo();
         Integer sourceType = order.getSourceType();
         // 商品信息组合
         for (CommonOrderVO commonOrder : listGoods) {
            CommonOrderGoods goods = commonOrder.getCommonOrderGoods();
            if (goods == null) {
               continue;
            }
            if (sourceType.equals(commonOrder.getSourceType()) && orderNo.equals(commonOrder.getOrderNo())) {
               CommonOrderGoodsVO commonGoodsVO = new CommonOrderGoodsVO();
               try {
                  PropertyUtils.copyProperties(commonGoodsVO, goods);
               } catch (Exception e) {
                  e.printStackTrace();
               }
               PropertyUtils.copyProperties(commonGoodsVO, goods);
               commonGoodsVO.setGoodsType(sourceType);
               commonGoodsVO.setGoodsType(sourceType2);
               // 淘宝商品图片处理
               String picture = commonGoodsVO.getPicture();
               if (!StringUtil.isNullOrEmpty(picture) && !picture.contains("320x320")) {
               if (sourceType == Constant.SOURCE_TYPE_TAOBAO && !StringUtil.isNullOrEmpty(picture)
                     && !picture.contains("320x320")) {
                  commonGoodsVO.setPicture(TbImgUtil.getTBSize320Img(picture));
               }
               // 购买数量
               commonGoodsVO.setActualCount(commonOrder.getTotalCount() + "件");
               // 实付款
               BigDecimal totalSettlement = commonOrder.getTotalSettlement();
               if (totalSettlement == null || totalSettlement.compareTo(new BigDecimal(0)) <= 0) {
                  totalSettlement = commonOrder.getTotalPayment();
               }
               commonGoodsVO.setActualPay("付款金额:¥" + totalSettlement);
               Integer hongBaoType = order.getHongBaoType();
               // 邀请订单信息保护
@@ -300,16 +330,7 @@
                  commonGoodsVO.setGoodsTitle(titleMap);
               }
               // 购买数量
               commonGoodsVO.setActualCount(commonOrder.getTotalCount() + "件");
               BigDecimal totalSettlement = commonOrder.getTotalSettlement();
               if (totalSettlement == null || totalSettlement.compareTo(new BigDecimal(0)) <= 0) {
                  totalSettlement = commonOrder.getTotalPayment();
               }
               // 实付款
               commonGoodsVO.setActualPay("付款金额:¥" + totalSettlement);
               // 订单类型为空时 已商品类为准
               Integer orderType = order.getOrderType();
               if (orderType == null) {
                  String shopType = commonGoodsVO.getShopType();
@@ -319,28 +340,10 @@
                     order.setOrderType(2);
                  }
               }
               listOrderGoods.add(commonGoodsVO);
               break;
               order.getListOrderGoods().add(commonGoodsVO);
            }
         }
      }
      SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
      SimpleDateFormat formatday = new SimpleDateFormat("yyyy.MM.dd");
      // 是否存在奖励券
      boolean hasRewardCoupon = userSystemCouponService.hasRewardCoupon(uid);
      // 2019.8.1开始返回维权信息
      Date august = null;
      try {
         august = TimeUtil.parse("2019-08-01");
      } catch (ParseException e) {
         e.printStackTrace();
      }
      /* 组织订单状态 等信息 */
      for (CommonOrderVO order : listOrder) {
         Date thirdCreateTime = order.getThirdCreateTime();
         if (thirdCreateTime != null) {
@@ -353,22 +356,20 @@
            order.setReceiveTime("收货时间:" + format.format(settleTime));
         }
         Integer sourceType2 = order.getSourceType();
         if (sourceType2 == Constant.SOURCE_TYPE_TAOBAO) {
         // 订单类型
         if (sourceType == Constant.SOURCE_TYPE_TAOBAO) {
            Integer orderType = order.getOrderType();
            if (orderType == null) {
            if (orderType == null)
               order.setOrderType(1);
            }
         } else if (sourceType2 == Constant.SOURCE_TYPE_JD) {
         } else if (sourceType == Constant.SOURCE_TYPE_JD) {
            order.setOrderType(3);
         } else if (sourceType2 == Constant.SOURCE_TYPE_PDD) {
         } else if (sourceType == Constant.SOURCE_TYPE_PDD) {
            order.setOrderType(4);
         }
         /* 订单状态 转换处理 */
         String orderStateContent = "";
         Map<String, String> orderStateMap = new HashMap<String, String>();
         // 订单状态
         Integer orderState = order.getState();
         // 红包状态
@@ -398,30 +399,14 @@
         } else if (CommonOrder.STATE_SX == orderState) {
            orderStateContent = "未付款/已退款";
         } else if (CommonOrder.STATE_WQ == orderState) {
            orderStateContent = "已维权";
            Integer sourceType = order.getSourceType();
            orderStateContent = "已售后";
            if (sourceType != null && sourceType == Constant.SOURCE_TYPE_TAOBAO) {
               /* 订单维权 判断是否全部维权 */
               List<TaoBaoWeiQuanOrder> listWQ = taoBaoWeiQuanOrderMapper
                     .selectListByOrderIdAndState(order.getOrderNo(), "维权成功");
               boolean isPart = false;// 默认失效
               BigDecimal weiQuanMoney = new BigDecimal(0);
               if (listWQ != null && listWQ.size() > 0) {
                  BigDecimal fanTotalMoney = new BigDecimal(0);
                  for (TaoBaoWeiQuanOrder weiQuanOrder : listWQ) {
                     BigDecimal fanMoney = weiQuanOrder.getFanMoney();
                     if (fanMoney != null) {
                        fanTotalMoney = MoneyBigDecimalUtil.add(fanTotalMoney, fanMoney);
                     }
                     weiQuanMoney = MoneyBigDecimalUtil.add(weiQuanOrder.getMoney(), weiQuanMoney);
                  }
                  if (fanTotalMoney.compareTo(hongBao) < 0) {
                     isPart = true;
                  }
               }
               BigDecimal weiQuanMoney = getWeiQuanMoney(listWQ, sourceType, uid);
               if (!VersionUtil.greaterThan_1_6_0(acceptData.getPlatform(), acceptData.getVersion())) {
                  if (isPart) {
@@ -432,22 +417,12 @@
               } else {
                  // 2019.8.1 返回维权信息
                  if (settleTime != null && august != null && settleTime.getTime() > august.getTime()) {
                     orderStateContent = "维权成功";
                     orderStateContent = "售后成功";
                     WeiQuanInfo weiQuanInfo = new WeiQuanInfo();
                     weiQuanInfo.setOldHongBao("¥" + hongBao.setScale(2, BigDecimal.ROUND_DOWN).toString());
                     if (isPart) {
                        // 维权失效金额=维权的金额*获得的红包/结算金额
                        BigDecimal settlement = order.getSettlement();
                        BigDecimal wqHongbao = MoneyBigDecimalUtil
                              .div(MoneyBigDecimalUtil.mul(hongBao, settlement), settlement);
                        weiQuanInfo.setWqHongBao(
                              "维权:-¥" + wqHongbao.setScale(2, BigDecimal.ROUND_DOWN).toString());
                        hongBao = MoneyBigDecimalUtil.sub(hongBao, wqHongbao);
                     } else {
                        weiQuanInfo
                              .setWqHongBao("维权:-¥" + hongBao.setScale(2, BigDecimal.ROUND_DOWN).toString());
                        hongBao = new BigDecimal(0);
                     }
                     weiQuanInfo
                           .setWqHongBao("售后:-¥" + weiQuanMoney.setScale(2, BigDecimal.ROUND_DOWN).toString());
                     hongBao = MoneyBigDecimalUtil.sub(hongBao, weiQuanMoney);
                     order.setWeiQuanInfo(weiQuanInfo);
                  }
               }
@@ -475,16 +450,46 @@
            order.setHongBaoTypePic(CommonOrder.TYPE_SHARE);
            signList.add(CommonOrder.TYPE_SHARE);
         } else if (HongBaoV2.TYPE_YAOQING == hongBaoType || HongBaoV2.TYPE_YIJI == hongBaoType
               || HongBaoV2.TYPE_ERJI == hongBaoType || HongBaoV2.TYPE_SHARE_YIJI == hongBaoType
               || HongBaoV2.TYPE_SHARE_ERJI == hongBaoType) {
            // 邀请
         } else if (HongBaoV2.TYPE_SHARE_YIJI == hongBaoType || HongBaoV2.TYPE_SHARE_ERJI == hongBaoType) {
            // 下级的分享订单: 显示邀请
            hongbaoInfo = "奖金";
            order.setOrderOrigin("3");
            order.setHongBaoTypePic(CommonOrder.TYPE_INVITE);
            signList.add(CommonOrder.TYPE_INVITE);
         }
         } else if (HongBaoV2.TYPE_YAOQING == hongBaoType || HongBaoV2.TYPE_YIJI == hongBaoType
               || HongBaoV2.TYPE_ERJI == hongBaoType) {
            // 邀请订单
            hongbaoInfo = "奖金";
            order.setOrderOrigin("3");
            order.setHongBaoTypePic(CommonOrder.TYPE_INVITE);
            signList.add(CommonOrder.TYPE_INVITE);
            // 版本区分:2-0-2
            if (VersionUtil.greaterThan_2_1(acceptData.getPlatform(), acceptData.getVersion())) {
               InviteOrderSubsidy orderSubsidy = inviteOrderSubsidyService.getByOrderNoAndType(uid,
                     order.getOrderNo(), sourceType);
               if (orderSubsidy != null) {
                  ClientTextStyleVO subsidyInfo = new ClientTextStyleVO();
                  subsidyInfo.setContent("(补贴¥" + orderSubsidy.getMoney() + ")");
                  if (orderSubsidy.getState() == InviteOrderSubsidy.STATE_SUBSIDIZED) {
                     subsidyInfo.setColor("#E5005C");
                  } else {
                     subsidyInfo.setColor("#888888");
                  }
                  order.setSubsidy(subsidyInfo);
                  // 解释信息(问号)
                  List<String> subsidyList = new ArrayList<String>();
                  subsidyList.add("额外补贴能否获得由系统算法自动判断,人为无法干涉;");
                  subsidyList.add("额外补贴到账时间以及金额请以实际到账为准;");
                  subsidyList.add("额外补贴产生后将会在消息-资金消息中提醒你。");
                  order.setSubsidyList(subsidyList);
               }
            }
         }
         order.setSignList(signList);
         String hongBaoDate = null;
         String hongBaoState_Str = "";
         String hongbaoInfoFontColor = "#E5005C";
@@ -529,6 +534,10 @@
         order.setHongBaoState(orderHongBaoState);
         order.setHongBaoDate(hongBaoDate);
         if (!StringUtil.isNullOrEmpty(order.getStateDesc())) {
            stateContent = stateContent + "-" + order.getStateDesc();
         }
         Map<String, String> stateMap = new HashMap<String, String>();
         stateMap.put("content", stateContent);
         stateMap.put("fontColor", stateFontColor);
@@ -540,21 +549,21 @@
         hongBaoMap.put("content", hongbaoInfo + " ¥" + hongBao.setScale(2, BigDecimal.ROUND_DOWN).toString());
         hongBaoMap.put("fontColor", hongbaoInfoFontColor);
         order.setHongBaoInfo(hongBaoMap);
         Integer sourceType = order.getSourceType();
         // 非自购的订单 不显示返利、免单详情
         if (HongBaoV2.TYPE_ZIGOU != hongBaoType) {
            order.setSignList(signList);
         } else {
         // 显示返利、免单详情
         if (HongBaoV2.TYPE_ZIGOU == hongBaoType) {
            // 奖励订单、免单 使用记录
            if (sourceType == null) {
               setSystemCouponRecord(order, hasRewardCoupon, hongBaoState, hongBaoType, null, signList);
               couponFactory(order, hasRewardCoupon, hongBaoState, hongBaoType, null, uid, vip, acceptData);
            } else if (sourceType == Constant.SOURCE_TYPE_TAOBAO) {
               setSystemCouponRecord(order, hasRewardCoupon, hongBaoState, hongBaoType, listRecordTB, signList);
               couponFactory(order, hasRewardCoupon, hongBaoState, hongBaoType,
                     listRecordTB, uid, vip, acceptData);
            } else if (sourceType == Constant.SOURCE_TYPE_JD) {
               setSystemCouponRecord(order, hasRewardCoupon, hongBaoState, hongBaoType, listRecordJD, signList);
               couponFactory(order, hasRewardCoupon, hongBaoState, hongBaoType,
                     listRecordJD, uid, vip, acceptData);
            } else if (sourceType == Constant.SOURCE_TYPE_PDD) {
               setSystemCouponRecord(order, hasRewardCoupon, hongBaoState, hongBaoType, listRecordPDD, signList);
               couponFactory(order, hasRewardCoupon, hongBaoState, hongBaoType,
                     listRecordPDD, uid, vip, acceptData);
            }
         }
@@ -566,7 +575,8 @@
         }
      }
   }
   /**
    * 订单: 免单标识 奖励标识
    * 
@@ -576,97 +586,67 @@
    * @param list
    * @param signList
    */
   public void setSystemCouponRecord(CommonOrderVO order, boolean hasRewardCoupon, Integer hongBaoState,
         Integer hongBaoType, List<UserSystemCouponRecord> list, List<String> signList) {
   private void couponFactory(CommonOrderVO order, boolean hasRewardCoupon,   Integer hongBaoState,
         Integer hongBaoType, List<UserSystemCouponRecord> list, Long uid, boolean vip, AcceptData acceptData) throws Exception{
      // 是否免单商品
      boolean freeOrder = false;
      // 是否奖励成功
      boolean rewardSuccess = false;
      boolean version2_1 = VersionUtil.greaterThan_2_1(acceptData.getPlatform(), acceptData.getVersion());
      if (list != null && list.size() > 0) {
         for (UserSystemCouponRecord couponRecord : list) {
            // 订单号匹配
            if (order.getOrderNo().equals(couponRecord.getOrderNo())) {
            int goodSource = couponRecord.getGoodSource();
            if (goodSource == 0)
               goodSource = 1;
            if (order.getOrderNo().equals(couponRecord.getOrderNo()) && goodSource == order.getSourceType()) {
               Integer state = couponRecord.getState();
               String systemCouponType = couponRecord.getCouponType();
               // 奖励订单: 且成功
               if (CouponTypeEnum.rebatePercentCoupon.name().equals(systemCouponType)
                     && UserSystemCouponRecord.STATE_SUCCESS == state) {
                  rewardSuccess = true;
                  signList.add(PIC_REWARD); // 加入奖励成功图片
                  if (!version2_1) {
                     // 奖励成功
                     order.getSignList().add(PIC_REWARD);
                  }
               } else if (CouponTypeEnum.freeCoupon.name().equals(systemCouponType)
                     || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)) {
                     || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)
                     || CouponTypeEnum.freeCouponBuy.name().equals(systemCouponType)) {
                  if (UserSystemCouponRecord.STATE_FREE_ON == state) {
                     // 免单中
                     freeOrder = true;
                     signList.add(PIC_FREE_ON);
                     order.getSignList().add(PIC_FREE_ON);
                  } else if (UserSystemCouponRecord.STATE_SUCCESS == state) {
                     // 免单成功
                     freeOrder = true;
                     signList.add(PIC_FREE_SUCCEED);
                     order.getSignList().add(PIC_FREE_SUCCEED);
                  } else if (UserSystemCouponRecord.STATE_FAIL_RULE == state
                        || UserSystemCouponRecord.STATE_FAIL_DRAWBACK == state) {
                     // 规则不匹配、退款
                     freeOrder = true;
                     signList.add(PIC_FREE_FAIL);
                     order.getSignList().add(PIC_FREE_FAIL);
                  }
               }
               break;
            }
         }
      }
      // 订单标识
      order.setSignList(signList);
      boolean rewardOrder = false;
      int type = 1; // 1 常规跳转页面 2弹出选项(奖励券)
      if (rewardSuccess) {
         // 奖励成功
         rewardOrder = true;
      } else if (hasRewardCoupon && !freeOrder && HongBaoV2.TYPE_ZIGOU == hongBaoType
            && HongBaoV2.STATE_YILINGQU == hongBaoState) {
         // 有可用的奖励券 、非免单订单 、且已到账的 、返利订单
         type = 2;
         rewardOrder = true;
      }
      if (rewardOrder) {
         ClientTextStyleVO rewardStyleVO = new ClientTextStyleVO();
         // 奖励券进度详情
         rewardStyleVO.setContent("返利奖励 >");
         rewardStyleVO.setColor("#E5005C");
         rewardStyleVO.setBottomColor("#FFDCEA");
         Map<String, Object> jumpLink = new HashMap<String, Object>();
         jumpLink.put("orderNo", order.getOrderNo());
         Map<String, Object> jump = new HashMap<String, Object>();
         jump.put("type", type);
         jump.put("params", jumpLink);
         jump.put("jumpDetail", jumpDetailV2Service.getByTypeCache("rewardCouponDetail"));
         Map<String, Object> rewardMap = new HashMap<String, Object>();
         rewardMap.put("text", rewardStyleVO);
         rewardMap.put("jump", jump);
         order.setRewardDetail(rewardMap);
      }
      // 免单详情
      if (freeOrder) {
         ClientTextStyleVO rewardStyleVO = new ClientTextStyleVO();
         // 返利、免单详情
         rewardStyleVO.setContent("免单详情 >");
         rewardStyleVO.setColor("#E5005C");
         rewardStyleVO.setBottomColor("#FFDCEA");
         Map<String, Object> jumpLink = new HashMap<String, Object>();
         jumpLink.put("orderNo", order.getOrderNo());
         if (VersionUtil.greaterThan_1_6_0(acceptData.getPlatform(), acceptData.getVersion())) {
            jumpLink.put("goodsType", order.getSourceType() + "");
         }
         Map<String, Object> jump = new HashMap<String, Object>();
         jump.put("type", 1); // 页面跳转
@@ -676,9 +656,214 @@
         Map<String, Object> rewardMap = new HashMap<String, Object>();
         rewardMap.put("text", rewardStyleVO);
         rewardMap.put("jump", jump);
         order.setRewardDetail(rewardMap);
      }
      // 已使用奖励券
      if (rewardSuccess) {
         ClientTextStyleVO rewardStyleVO = new ClientTextStyleVO();
         rewardStyleVO.setColor("#E5005C");
         rewardStyleVO.setBottomColor("#FFDCEA");
         if (version2_1) {
            rewardStyleVO.setContent("已使用奖励券 >");
         } else {
            rewardStyleVO.setContent("返利奖励 >");
         }
         Map<String, Object> rewardMap = new HashMap<String, Object>();
         rewardMap.put("text", rewardStyleVO);
         Map<String, Object> jumpLink = new HashMap<String, Object>();
         jumpLink.put("orderNo", order.getOrderNo());
         jumpLink.put("goodsType", order.getSourceType() + "");
         Map<String, Object> jump = new HashMap<String, Object>();
         jump.put("type", 1); // 1 常规跳转页面
         jump.put("params", jumpLink);
         jump.put("jumpDetail", jumpDetailV2Service.getByTypeCache("rewardCouponDetail"));
         rewardMap.put("jump", jump);
         order.setRewardDetail(rewardMap);
      }
      // 是否可使用奖励券
      if (!rewardSuccess && !freeOrder && HongBaoV2.TYPE_ZIGOU == hongBaoType
            && HongBaoV2.STATE_YILINGQU == hongBaoState && !vip && CommonOrder.STATE_WQ != order.getState()) {
         // 下单时间
         Date thirdCreateTime = order.getThirdCreateTime();
         // 到账时间
         Date accountTime = order.getAccountTime();
         if (thirdCreateTime == null || accountTime == null)
            return;
         // 下单日期是否是符合上线日期
         long downOrderTime = thirdCreateTime.getTime();
         long limitDate = TimeUtil.parse(Constant.COUPON_REWARD_TIME).getTime();
         if (downOrderTime > limitDate)  {
            // 2.1 开始新版
            rewardCounponLimitTime(order, accountTime);
         } else if (hasRewardCoupon) {
            // 在2.1新版上线之前订单-存在则显示奖励券可使用
            ClientTextStyleVO rewardStyleVO = new ClientTextStyleVO();
            rewardStyleVO.setColor("#E5005C");
            rewardStyleVO.setBottomColor("#FFDCEA");
            rewardStyleVO.setContent("返利奖励 >");
            Map<String, Object> jumpLink = new HashMap<String, Object>();
            jumpLink.put("orderNo", order.getOrderNo());
            jumpLink.put("goodsType", order.getSourceType() + "");
            Map<String, Object> jump = new HashMap<String, Object>();
            jump.put("type", 2); // 弹框
            jump.put("params", jumpLink);
            jump.put("jumpDetail", jumpDetailV2Service.getByTypeCache("rewardCouponDetail"));
            Map<String, Object> rewardMap = new HashMap<String, Object>();
            rewardMap.put("text", rewardStyleVO);
            rewardMap.put("jump", jump);
            order.setRewardDetail(rewardMap);
         }
      }
   }
   private void rewardCounponLimitTime(CommonOrderVO order,Date accountTime) throws Exception {
      // 倒计时验证
      Date endDay = DateUtil.plusDayDate(Constant.COUPON_REWARD_LIMIT_DAY, accountTime);
      long currentTime = java.lang.System.currentTimeMillis();
      if (endDay.getTime() <= currentTime)
         return;
      String num = null;
      String unit = null;
      boolean canUse = false;
      DateInfo dateInfo = DateUtil.dateDiff3(currentTime, endDay.getTime());
      if (dateInfo.getDay() > 0) {
         canUse = true;
         unit = "天";
         num = dateInfo.getDay().toString();
      }
      if (!canUse && dateInfo.getHour() > 0) {
         canUse = true;
         unit = "小时";
         num = dateInfo.getHour().toString();
      }
      if (!canUse && dateInfo.getMinute() > 0) {
         canUse = true;
         unit = "分";
         num = dateInfo.getMinute().toString();
      }
      if (!canUse && dateInfo.getSecond() > 0) {
         canUse = true;
         unit = "秒";
         num = dateInfo.getSecond().toString();
      }
      // 已经超时
      if (!canUse)
         return;
      Map<String, Object> rewardMap = new HashMap<String, Object>();
      ClientTextStyleVO rewardStyleVO = new ClientTextStyleVO();
      rewardStyleVO.setColor("#E5005C");
      rewardStyleVO.setBottomColor("#FFDCEA");
      rewardStyleVO.setContent("使用奖励券");
      rewardMap.put("text", rewardStyleVO);
      ClientTextStyleVO txt1 = new ClientTextStyleVO();
      txt1.setContent("剩");
      txt1.setColor("#666666");
      txt1.setBottomColor("#FFDCEA");
      ClientTextStyleVO txt2 = new ClientTextStyleVO();
      txt2.setContent(num);
      txt2.setColor("#E5005C");
      txt2.setBottomColor("#FFDCEA");
      txt2.setFontSize("1.33");
      ClientTextStyleVO txt3 = new ClientTextStyleVO();
      txt3.setContent(unit + "关闭 >");
      txt3.setColor("#666666");
      txt3.setBottomColor("#FFDCEA");
      List<ClientTextStyleVO> ticking = new ArrayList<ClientTextStyleVO>();
      ticking.add(txt1);
      ticking.add(txt2);
      ticking.add(txt3);
      rewardMap.put("ticking", ticking);
      Map<String, Object> jumpLink = new HashMap<String, Object>();
      jumpLink.put("orderNo", order.getOrderNo());
      jumpLink.put("goodsType", order.getSourceType() + "");
      Map<String, Object> jump = new HashMap<String, Object>();
      jump.put("type", 2); // 弹出框使用券
      jump.put("params", jumpLink);
      jump.put("jumpDetail", jumpDetailV2Service.getByTypeCache("rewardCouponDetail"));
      rewardMap.put("jump", jump);
      order.setRewardDetail(rewardMap);
   }
   @Override
   public Map<String, BigDecimal> countHistoryOrder(Long uid, Integer day, Integer source) {
      return commonOrderMapper.countHistoryOrder(uid, day, source);
   }
   @Override
   public OrderCountVO getOrderCount(Long uid, Integer day, Integer source) {
      return commonOrderMapper.getOrderCount(uid, day, source);
   }
   @Override
   public long countBonusOrderNumber(Long uid, Integer type, Integer day, String startTime, String endTime,
         Integer source) {
      return commonOrderMapper.countBonusOrderNumber(uid, type, day, startTime, endTime, source);
   }
   @Override
   public BigDecimal countBonusOrderMoney(Long uid, Integer type, Integer day, String startTime, String endTime,
         Integer source) {
      return commonOrderMapper.countBonusOrderMoney(uid, type, day, startTime, endTime, source);
   }
   @Override
   public Map<String, Object> countBonusOrderMoneyAndNumber(Long uid, Integer type, Integer day, String startTime,
         String endTime, Integer source) {
      return commonOrderMapper.countBonusOrderMoneyAndNumber(uid, type, day, startTime, endTime, source);
   }
   @Override
   public Long countUserOrderToApp(Long uid, Integer type, String startTime, String endTime, Integer day,
         Integer source, Integer state, Integer stateOrder) {
      return commonOrderMapper.countUserOrderToApp(uid, type, startTime, endTime, day, source, state, stateOrder);
   }
   private BigDecimal getWeiQuanMoney(List<TaoBaoWeiQuanOrder> listWQ, int sourceType, Long uid) {
      BigDecimal weiQuanMoney = new BigDecimal(0);
      if (listWQ != null && listWQ.size() > 0) {
         for (TaoBaoWeiQuanOrder weiQuanOrder : listWQ) {
            String tradeId = weiQuanOrder.getOrderItemId();
            // 查询红包
            List<String> tradeList = new ArrayList<>();
            tradeList.add(tradeId);
            List<HongBaoV2> hongBaoList = hongBaoV2Service.listBySourceTypeAndTradeIdListAndUid(sourceType, uid,
                  tradeList);
            if (hongBaoList != null && hongBaoList.size() > 0) {
               CommonOrder commonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(sourceType, tradeId);
               if (commonOrder != null && commonOrder.getSettlement().compareTo(new BigDecimal(0)) > 0) {
                  BigDecimal wqMoney = MoneyBigDecimalUtil
                        .mul(hongBaoList.get(0).getMoney(), weiQuanOrder.getMoney())
                        .divide(commonOrder.getSettlement(), 2, BigDecimal.ROUND_UP);
                  if (wqMoney.compareTo(hongBaoList.get(0).getMoney()) > 0)
                     wqMoney = hongBaoList.get(0).getMoney();
                  weiQuanMoney = weiQuanMoney.add(wqMoney);
               }
            }
         }
      }
      return weiQuanMoney;
   }
   @Override
@@ -688,8 +873,9 @@
   @Transactional
   @Override
   public List<CommonOrder> addTaoBaoOrder(List<TaoBaoOrder> taoBaoOrders, Long uid) throws CommonOrderException {
      List<CommonOrder> commonOrderList = new ArrayList<>();
   public List<CommonOrderAddResultDTO> addTaoBaoOrder(List<TaoBaoOrder> taoBaoOrders, Long uid)
         throws CommonOrderException {
      List<CommonOrderAddResultDTO> commonOrderList = new ArrayList<>();
      // 判断所有的订单状态
      int invalidCount = 0;
      for (TaoBaoOrder tb : taoBaoOrders) {
@@ -749,8 +935,9 @@
   @Transactional
   @Override
   public List<CommonOrder> addPDDOrder(List<PDDOrder> pddOrderList, Long uid) throws CommonOrderException {
      List<CommonOrder> commonOrderList = new ArrayList<>();
   public List<CommonOrderAddResultDTO> addPDDOrder(List<PDDOrder> pddOrderList, Long uid)
         throws CommonOrderException {
      List<CommonOrderAddResultDTO> commonOrderList = new ArrayList<>();
      // 判断所有的订单状态
      int invalidCount = 0;
      for (PDDOrder order : pddOrderList) {
@@ -798,8 +985,8 @@
   @Transactional
   @Override
   public List<CommonOrder> addJDOrder(JDOrder jdOrder, Long uid) throws CommonOrderException {
      List<CommonOrder> commonOrderList = new ArrayList<>();
   public List<CommonOrderAddResultDTO> addJDOrder(JDOrder jdOrder, Long uid) throws CommonOrderException {
      List<CommonOrderAddResultDTO> commonOrderList = new ArrayList<>();
      // 判断所有的订单状态
      int invalidCount = 0;
      for (JDOrderItem tb : jdOrder.getOrderItemList()) {
@@ -844,11 +1031,11 @@
               goods.setPrice(itemOrder.getPrice());
               goods.setSkuId(itemOrder.getSkuId());
            }
            if (goods != null) {
               cog = CommonOrderGoodsFactory.create(goods);
            }
            cog.setCreateTime(new Date());
            cog.setUpdateTime(new Date());
            commonOrderGoodsMapper.insertSelective(cog);
@@ -867,7 +1054,7 @@
    * @param commonOrder
    */
   @Transactional
   private CommonOrder addCommonOrder(CommonOrder commonOrder) throws CommonOrderException {
   private CommonOrderAddResultDTO addCommonOrder(CommonOrder commonOrder) throws CommonOrderException {
      // 判断商品是否存在
      if (commonOrder == null)
         throw new CommonOrderException(1, "订单为空");
@@ -900,10 +1087,9 @@
      if (!StringUtil.isNullOrEmpty(commonOrder.getTradeId()))
         oldCommonOrder = commonOrderMapper.selectBySourceTypeAndTradeId(commonOrder.getSourceType(),
               commonOrder.getTradeId());
      else
         oldCommonOrder = commonOrderMapper.selectByOrderNoAndOrderTypeAndOrderBy(commonOrder.getOrderNo(),
               commonOrder.getSourceType(), commonOrder.getOrderBy());
      else {
         throw new CommonOrderException(10, "交易ID为空");
      }
      if (oldCommonOrder == null)// 新增
      {
         commonOrder.setCreateTime(new Date());
@@ -911,13 +1097,15 @@
         // 插入映射,保证交易ID的完整性
         commonOrderTradeIdMapMapper.insertSelective(new CommonOrderTradeIdMap(commonOrder.getId(),
               commonOrder.getTradeId(), new Date(), commonOrder.getSourceType()));
         return commonOrder;
         return new CommonOrderAddResultDTO(commonOrder, CommonOrderAddResultDTO.TYPE_ADD);
      } else {// 修改
         // 已经结算,已经失效,状态未改变的订单不处理
         if (oldCommonOrder.getState() == CommonOrder.STATE_JS || oldCommonOrder.getState() == CommonOrder.STATE_SX
         // 非京东已经结算,已经失效,状态未改变的订单不处理
         if ((oldCommonOrder.getState() == CommonOrder.STATE_JS
               && oldCommonOrder.getSourceType() != Constant.SOURCE_TYPE_JD)
               || oldCommonOrder.getState() == CommonOrder.STATE_SX
               || oldCommonOrder.getState() == CommonOrder.STATE_WQ
               || (oldCommonOrder.getState().intValue() == commonOrder.getState())) {
            return oldCommonOrder;
            return new CommonOrderAddResultDTO(oldCommonOrder, CommonOrderAddResultDTO.TYPE_NOUPDATE);
         }
         // 交易ID一致才修改
         if (commonOrder.getTradeId() != null
@@ -933,9 +1121,10 @@
            updateCommonOrder.setUpdateTime(new Date());
            updateCommonOrder.setTradeId(commonOrder.getTradeId());
            commonOrderMapper.updateByPrimaryKeySelective(updateCommonOrder);
            return commonOrderMapper.selectByPrimaryKey(updateCommonOrder.getId());
            return new CommonOrderAddResultDTO(commonOrderMapper.selectByPrimaryKey(updateCommonOrder.getId()),
                  CommonOrderAddResultDTO.TYPE_UPDATE);
         } else
            return oldCommonOrder;
            return new CommonOrderAddResultDTO(oldCommonOrder, CommonOrderAddResultDTO.TYPE_NOUPDATE);
      }
   }
@@ -1028,17 +1217,18 @@
   @Override
   public List<CommonOrderVO> listQuery(long start, int count, Integer keyType, String key, Integer state,
         Integer type, Integer orderState, String startTime, String endTime, Integer source)
         throws CommonOrderException {
         Integer type, Integer orderState, String startTime, String endTime, Integer source, List<Long> listShopId,
         List<Long> listGoodsId, Date minTime, BigDecimal money) throws CommonOrderException {
      List<CommonOrderVO> list = null;
      if (StringUtil.isNullOrEmpty(key) || keyType == 1) {// 搜索框无值或者按订单号搜索时都只搜索主订单
         list = commonOrderMapper.listQueryWithNoChild(start, count, keyType, key, state, type, orderState,
               startTime, endTime, source);
      } else
      } else {
         list = commonOrderMapper.listQuery(start, count, keyType, key, state, type, orderState, startTime, endTime,
               source);
               source, listShopId, listGoodsId, minTime, money);
      }
      if (list == null) {
         list = new ArrayList<CommonOrderVO>();
@@ -1166,7 +1356,8 @@
                  String systemCouponType = couponRecord.getCouponType();
                  Integer couponState = couponRecord.getState();
                  if (CouponTypeEnum.freeCoupon.name().equals(systemCouponType)
                        || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)) {
                        || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)
                        || CouponTypeEnum.freeCouponBuy.name().equals(systemCouponType)) {
                     if (UserSystemCouponRecord.STATE_SUCCESS == couponState) {
                        // 免单成功
                        order.setOtherState(2);
@@ -1183,7 +1374,8 @@
                  String systemCouponType = couponRecord.getCouponType();
                  Integer couponState = couponRecord.getState();
                  if (CouponTypeEnum.freeCoupon.name().equals(systemCouponType)
                        || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)) {
                        || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)
                        || CouponTypeEnum.freeCouponBuy.name().equals(systemCouponType)) {
                     if (UserSystemCouponRecord.STATE_SUCCESS == couponState) {
                        // 免单成功
                        order.setOtherState(2);
@@ -1200,7 +1392,8 @@
                  String systemCouponType = couponRecord.getCouponType();
                  Integer couponState = couponRecord.getState();
                  if (CouponTypeEnum.freeCoupon.name().equals(systemCouponType)
                        || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)) {
                        || CouponTypeEnum.welfareFreeCoupon.name().equals(systemCouponType)
                        || CouponTypeEnum.freeCouponBuy.name().equals(systemCouponType)) {
                     if (UserSystemCouponRecord.STATE_SUCCESS == couponState) {
                        // 免单成功
                        order.setOtherState(2);
@@ -1220,12 +1413,15 @@
   @Override
   public long countQuery(Integer keyType, String key, Integer state, Integer type, Integer orderState,
         String startTime, String endTime, Integer source) throws CommonOrderException {
         String startTime, String endTime, Integer source, List<Long> listShopId, List<Long> listGoodsId,
         Date minTime, BigDecimal money) throws CommonOrderException {
      if (StringUtil.isNullOrEmpty(key) || keyType == 1) {// 搜索框无值或者按订单号搜索时都只搜索主订单
         return commonOrderMapper.countQueryWithNoChild(keyType, key, state, type, orderState, startTime, endTime,
               source);
      } else
         return commonOrderMapper.countQuery(keyType, key, state, type, orderState, startTime, endTime, source);
      } else {
         return commonOrderMapper.countQuery(keyType, key, state, type, orderState, startTime, endTime, source,
               listShopId, listGoodsId, minTime, money);
      }
   }
   @Override
@@ -1326,7 +1522,7 @@
   }
   @Override
   public JSONObject getRewardJumpInfo(String orderNo) {
   public JSONObject getRewardJumpInfo(String orderNo, Integer goodsType) {
      JSONObject map = new JSONObject();
      // 订单标识
@@ -1343,6 +1539,7 @@
      Map<String, Object> jumpLink = new HashMap<String, Object>();
      jumpLink.put("orderNo", orderNo);
      jumpLink.put("goodsType", goodsType == null ? goodsType : goodsType + "");
      Map<String, Object> jump = new HashMap<String, Object>();
      jump.put("type", 1);
@@ -1403,4 +1600,50 @@
      return commonOrderMapper.listBySourceTypeAndStateAndThirdCrateTime(sourceType, state, minTime, maxTime,
            (page - 1) * pageSize, pageSize);
   }
   @Override
   public List<CommonOrder> getByOrderNo(Long uid, String orderNO) {
      return commonOrderMapper.getByOrderNo(uid, orderNO);
   }
   @Override
   public CommonOrder selectLatestValidByUid(Long uid) {
      List<Integer> stateList = new ArrayList<>();
      stateList.add(CommonOrder.STATE_FK);
      stateList.add(CommonOrder.STATE_JS);
      List<CommonOrder> commonOrderList = commonOrderMapper.listByUid(uid, stateList, 0, 1);
      if (commonOrderList == null || commonOrderList.size() == 0)
         return null;
      return commonOrderList.get(0);
   }
   @Override
   public CommonOrderVO firstValidOrderByUid(Long uid) {
      return commonOrderMapper.firstValidOrderByUid(uid, null, null);
   }
   @Override
   public CommonOrderVO firstValidOrderByUidAndType(Long uid, Integer type) {
      return commonOrderMapper.firstValidOrderByUid(uid, type, null);
   }
   @Override
   public CommonOrderVO firstValidOrderLastMonthByUidAndType(Long uid, Integer type) {
      return commonOrderMapper.firstValidOrderByUid(uid, type, 4);
   }
   @Override
   public CommonOrder getFirstShareOrderByUid(Long uid) {
      return commonOrderMapper.getFirstShareOrderByUid(uid);
   }
   @Override
   public BigDecimal getTotalRewardMoneyByOrderNoAndSourceType(String orderNo, Integer sourceType) {
      return commonOrderMapper.getTotalRewardMoneyByOrderNoAndSourceType(orderNo, sourceType);
   }
   @Override
   public long count24HValidOrderByUid(Long uid, Date minTime) {
      return commonOrderMapper.count24HValidOrderByUid(uid, minTime);
   }
}