yujian
2020-01-18 f4a0f2acc63d7785eab108419a4e16f5f688cb95
fanli/src/main/java/com/yeshi/fanli/util/taobao/TaoBaoOrderUtil.java
@@ -5,40 +5,34 @@
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.springframework.stereotype.Component;
import org.yeshi.utils.HttpUtil;
import com.yeshi.fanli.dto.order.OrderItem;
import com.yeshi.fanli.entity.bus.user.Order;
import com.yeshi.fanli.entity.bus.user.OrderItem;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.taobao.PidOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoUnionConfig;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.TaoBaoOrderException;
import com.yeshi.fanli.exception.order.TaoBaoOrderException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoService;
import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.order.OrderItemServcie;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import org.yeshi.utils.HttpUtil;
import jxl.Sheet;
import jxl.Workbook;
@@ -47,40 +41,10 @@
@Component
public class TaoBaoOrderUtil {
   private final static String CACHENAME = "tbCookie";
   private static final String ORDERFAILURE = "订单失效";
   private static final String ORDERPAYMENT = "订单付款";
   private static final String ORDERSETTLEMENT = "订单结算";
   private static final String ORDERSUCCESS = "订单成功";
   @Resource
   private OrderService orderService;
   @Resource
   private HongBaoService hongBaoService;
   @Resource
   private ConfigService configService;
   @Resource
   private OrderItemServcie orderItemServcie;
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   private static TaoBaoOrderUtil taoBaoOrderUtil;
   @PostConstruct
   public void init() {
      taoBaoOrderUtil = this;
      taoBaoOrderUtil.orderService = this.orderService;
      taoBaoOrderUtil.hongBaoService = this.hongBaoService;
      taoBaoOrderUtil.configService = this.configService;
      taoBaoOrderUtil.hongBaoManageService = this.hongBaoManageService;
      taoBaoOrderUtil.orderItemServcie = this.orderItemServcie;
   }
   /**
    * 获取淘宝联盟的Cookie
@@ -137,14 +101,14 @@
         String as = gm.getResponseBodyAsString();
         JSONObject root = JSONObject.fromObject(as);
         if (root.optInt("code") == 0) {// 上报成功
            LogHelper.cookieLog("上报成功!");
            LogHelper.error("上报成功!");
            return;
         }
         LogHelper.cookieLog("上报失败!");
         LogHelper.error("上报失败!");
      } catch (Exception e) {
         e.printStackTrace();
         LogHelper.cookieLog("上报失败!");
         LogHelper.error("上报失败!");
      }
   }
@@ -157,7 +121,7 @@
   public static List<TaoBaoOrder> getOrderList(int day, TaoBaoUnionConfig config) {
      String cookie1 = getTaoBaoCookie(config.getAccount());
      LogHelper.cookieLog("账号为:" + config.getAccount() + ",cookie为:" + cookie1);
      LogHelper.error("账号为:" + config.getAccount() + ",cookie为:" + cookie1);
      String[] cookies = new String[] { cookie1 };
      List<TaoBaoOrder> list = new ArrayList<TaoBaoOrder>();
@@ -231,7 +195,7 @@
   private static List<TaoBaoOrder> downLoadOrderFromTaoBao(String url, TaoBaoUnionConfig config)
         throws TaoBaoOrderException {
      String cookie1 = getTaoBaoCookie(config.getAccount());
      LogHelper.cookieLog("账号为:" + config.getAccount() + ",cookie为:" + cookie1);
      LogHelper.error("账号为:" + config.getAccount() + ",cookie为:" + cookie1);
      String[] cookies = new String[] { cookie1 };
      List<TaoBaoOrder> list = new ArrayList<TaoBaoOrder>();
      int i = 0;
@@ -343,16 +307,8 @@
      return getOrderList(30, config);
   }
   /**
    * 获取维权成功订单
    *
    * @param startTime
    * @param endTime
    * @return
    */
   public static List<TaoBaoWeiQuanOrder> getWeiQuanOrders(long startTime, long endTime, TaoBaoUnionConfig config) {
      String cookie = getTaoBaoCookie(config.getAccount());
      return getWeiQuanOrders(cookie, startTime, endTime);
   public static List<TaoBaoWeiQuanOrder> getWeiQuanOrders(InputStream input) {
      return parseWeiQuanOrder(input);
   }
   private static List<TaoBaoWeiQuanOrder> getWeiQuanOrders(String cookies, long startTime, long endTime) {
@@ -596,24 +552,6 @@
   }
   /**
    * 解析商品分享订单
    *
    * @param in
    * @return
    */
   public static List<PidOrder> parsePidOrder(InputStream in) {
      List<TaoBaoOrder> orderList = parseOrder(in);
      if (orderList != null && orderList.size() > 0) {
         List<PidOrder> pidOrderList = new ArrayList<>();
         for (TaoBaoOrder order : orderList) {
            pidOrderList.add(convertToPidOrder(order));
         }
         return pidOrderList;
      }
      return new ArrayList<PidOrder>();
   }
   /**
    * 解析维权订单
    * 
    * @param in
@@ -629,38 +567,42 @@
            for (int c = 0; c < sheet.getColumns(); c++) {
               String content = sheet.getCell(c, r).getContents().trim();
               switch (c) {
               case 0://
                  orderRecord.setOrderId(content);
                  break;
               case 1://
                  orderRecord.setOrderItemId(content);
                  break;
               case 2://
                  orderRecord.setGoodsName(content);
                  break;
               case 3:
                  orderRecord.setMoney(StringUtil.isNullOrEmpty(content) ? null : new BigDecimal(content));
                  break;
               case 4:
                  orderRecord.setFanMoney(StringUtil.isNullOrEmpty(content) ? null : new BigDecimal(content));
                  break;
               case 5://
                  orderRecord.setState(content);
                  break;
               case 6://
                  if (!StringUtil.isNullOrEmpty(content))
                     orderRecord.setJieSuanTime(
                           new Date(TimeUtil.convertToTimeTemp(content, "yyyy-MM-dd HH:mm:ss")));
                  break;
               case 7://
               case 0:// 维权时间
                  if (!StringUtil.isNullOrEmpty(content))
                     orderRecord.setWeiQuanTime(
                           new Date(TimeUtil.convertToTimeTemp(content, "yyyy-MM-dd HH:mm:ss")));
                  break;
               case 8://
               case 1:// 维权完成时间
                  if (!StringUtil.isNullOrEmpty(content))
                     orderRecord.setWeiQuanFinishTime(
                           new Date(TimeUtil.convertToTimeTemp(content, "yyyy-MM-dd HH:mm:ss")));
                  break;
               case 2:// 结算时间
                  if (!StringUtil.isNullOrEmpty(content))
                     orderRecord.setJieSuanTime(
                           new Date(TimeUtil.convertToTimeTemp(content, "yyyy-MM-dd HH:mm:ss")));
                  break;
               case 3:// 商品名称
                  orderRecord.setGoodsName(content);
                  break;
               case 5:// 淘宝订单号
                  orderRecord.setOrderId(content);
                  break;
               case 6:// 淘宝子订单号
                  orderRecord.setOrderItemId(content);
                  break;
               case 7:// 维权状态
                  orderRecord.setState(content);
                  break;
               case 8:// 结算金额
                  break;
               case 9:// 退款金额
                  orderRecord.setMoney(StringUtil.isNullOrEmpty(content) ? null : new BigDecimal(content));
                  break;
               case 10:// 返还商家金额
                  orderRecord.setFanMoney(StringUtil.isNullOrEmpty(content) ? null : new BigDecimal(content));
                  break;
               }
            }
@@ -723,74 +665,6 @@
      return orderItem;
   }
   public static List<PidOrder> getPidOrderList(int day, TaoBaoUnionConfig config) {
      String cookie1 = getTaoBaoCookie(config.getAccount());
      LogHelper.cookieLog("账号为:" + config.getAccount() + ",cookie为:" + cookie1);
      String[] cookies = new String[] { cookie1 };
      List<PidOrder> list = new ArrayList<PidOrder>();
      int i = 0;
      for (String cookie : cookies) {
         if (com.yeshi.fanli.util.StringUtil.isNullOrEmpty(cookie)) {
            i++;
            continue;
         }
         // 原始为30
         String startTime = TimeUtil.getGernalTime(System.currentTimeMillis() - 1000 * 60 * 60 * 24L * day,
               "yyyy-MM-dd");
         String endTime = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyy-MM-dd");
         String url = String.format(
               "http://pub.alimama.com/report/getTbkPaymentDetails.json?spm=a219t.7664554.1998457203.85.9pFBtK&queryType=1&payStatus=&DownloadID=DOWNLOAD_REPORT_INCOME_NEW&startTime=%s&endTime=%s",
               startTime, endTime);
         HttpClient client = new HttpClient();
         // client.getHostConfiguration().setProxy("192.168.1.200", 8888);
         GetMethod gm = new GetMethod(url);
         gm.setRequestHeader("Cookie", cookie);
         gm.setRequestHeader("User-Agent",
               "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36");
         InputStream inputStream = null;
         try {
            client.executeMethod(gm);
            System.out.println(gm.getStatusCode());
            if (gm.getStatusCode() == 200) {
               System.out.println(gm.getResponseHeader("Content-Type").getValue());
               if (!gm.getResponseHeader("Content-Type").getValue().contains("excel")) {
                  if (i == 0) {
                     reportCookieInvalid(config.getAccount());
                  }
                  continue;
               }
               inputStream = gm.getResponseBodyAsStream();
               list.addAll(parsePidOrder(inputStream));
               // String path =
               // TaoBaoOrderUtil.class.getClassLoader().getResource("/").getPath();
               // String yyyyMMddHHmmss =
               // TimeUtil.yyyyMMddHHmmss(System.currentTimeMillis());
               // FileUtils.copyInputStreamToFile(inputStream, new
               // File(path+"/excel/"+yyyyMMddHHmmss+"."+"xls"));
            }
         } catch (HttpException e) {
            e.printStackTrace();
         } catch (IOException e) {
            e.printStackTrace();
         } finally {
            i++;
            if (inputStream != null) {
               try {
                  inputStream.close();
               } catch (IOException e) {
                  e.printStackTrace();
               }
            }
         }
      }
      return list;
   }
   /**
    * 将淘宝订单按照订单号归类
    * 
@@ -798,7 +672,7 @@
    * @return
    */
   public static Map<String, List<TaoBaoOrder>> classifyTaoBaoOrderByOrderId(List<TaoBaoOrder> orderList) {
      Map<String, List<TaoBaoOrder>> map = new HashMap<>();
      Map<String, List<TaoBaoOrder>> map = new ConcurrentHashMap<>();
      for (TaoBaoOrder order : orderList) {
         if (map.get(order.getOrderId()) == null)
            map.put(order.getOrderId(), new ArrayList<>());
@@ -806,38 +680,65 @@
         order.setOrderBy(map.get(order.getOrderId()).size() + 1);
         map.get(order.getOrderId()).add(order);
      }
      // 订单排序值灰度测试
      try {
         for (Iterator<String> its = map.keySet().iterator(); its.hasNext();) {
            String orderId = its.next();
            try {
               setOrderBy(map.get(orderId));
            } catch (Exception e) {
               LogHelper.errorDetailInfo(e, "订单号:" + orderId, "订单排序值灰度测试");
            }
         }
      } catch (Exception e) {
      }
      return map;
   }
   /**
    * 订单转换
    *
    * @param taoBaoOrder
    * @return
    */
   public static PidOrder convertToPidOrder(TaoBaoOrder taoBaoOrder) {
      PidOrder pidOrder = new PidOrder();
      pidOrder.setOrderCreateTime(new Date(TimeUtil.convertDateToTemp2(taoBaoOrder.getCreateTime())));
      pidOrder.setGoodsTitle(taoBaoOrder.getTitle());
      pidOrder.setAuctionId(taoBaoOrder.getAuctionId());
      pidOrder.setGoodsNum(taoBaoOrder.getCount());
      pidOrder.setPrice(taoBaoOrder.getPrice());
      pidOrder.setState(taoBaoOrder.getOrderState());
      pidOrder.setOrderType(taoBaoOrder.getOrderType());
      pidOrder.setRate(taoBaoOrder.getiRatio());
      pidOrder.setPayMoney(taoBaoOrder.getPayment());
      if ("订单结算".equalsIgnoreCase(taoBaoOrder.getOrderState()))
         pidOrder.setPreMoney(taoBaoOrder.geteIncome());
      else
         pidOrder.setPreMoney(taoBaoOrder.getEstimate());
      pidOrder.setFinalMoney(taoBaoOrder.getSettlement());
      if (!StringUtil.isNullOrEmpty(taoBaoOrder.getSettlementTime()))
         pidOrder.setBalanceTime(new Date(TimeUtil.convertDateToTemp2(taoBaoOrder.getSettlementTime())));
      pidOrder.setOrderId(taoBaoOrder.getOrderId());
      pidOrder.setTypeName(taoBaoOrder.getClassName());
      pidOrder.setSrcMediaId(taoBaoOrder.getSourceMediaId());
      pidOrder.setAdzoneId(taoBaoOrder.getAdPositionId());
      return pidOrder;
   public static void setOrderBy(List<TaoBaoOrder> orderList) {// 提取一样的
      if (orderList == null || orderList.size() == 1)
         return;
      int len = orderList.get(0).getTradeId().length();
      int startIndex = 0;
      for (int i = 0; i < len; i++) {
         boolean isSame = true;
         for (int j = 0; j < orderList.size() - 1; j++) {
            if (orderList.get(j).getTradeId().charAt(i) != orderList.get(j + 1).getTradeId().charAt(i)) {
               isSame = false;
               break;
            }
         }
         if (!isSame) {
            startIndex = i;
            break;
         }
      }
      int endIndex = 0;
      for (int i = len - 1; i >= 0; i--) {
         boolean isSame = true;
         for (int j = 0; j < orderList.size() - 1; j++) {
            if (orderList.get(j).getTradeId().charAt(i) != orderList.get(j + 1).getTradeId().charAt(i)) {
               isSame = false;
               break;
            }
         }
         if (!isSame) {
            endIndex = i;
            break;
         }
      }
      for (TaoBaoOrder taoBaoOrder : orderList) {
         String tradeId = taoBaoOrder.getTradeId();
         String orderByStr = tradeId.substring(startIndex, endIndex + 1);
         if (orderByStr.length() > 8) {
            LogHelper.error(taoBaoOrder.getOrderId() + "-订单的orderBy超过8位:" + taoBaoOrder.getOrderBy());
         }
         int orderBy = Integer.parseInt(orderByStr);
         // taoBaoOrder.setOrderBy(orderBy);
      }
   }
   /**
@@ -866,7 +767,10 @@
      CommonOrder commonOrder = new CommonOrder();
      commonOrder.setCount(taoBaoOrder.getCount());
      commonOrder.setCreateTime(new Date());
      commonOrder.seteIncome(taoBaoOrder.geteIncome());
      if (taoBaoOrder.geteIncome() != null && taoBaoOrder.getSubsidy() != null)
         commonOrder.seteIncome(taoBaoOrder.geteIncome().add(taoBaoOrder.getSubsidy()));
      else
         commonOrder.seteIncome(taoBaoOrder.geteIncome());
      commonOrder.setEstimate(taoBaoOrder.getEstimate());
      commonOrder.setOrderNo(taoBaoOrder.getOrderId());
      commonOrder.setPayment(taoBaoOrder.getPayment());
@@ -874,8 +778,8 @@
      if (!StringUtil.isNullOrEmpty(taoBaoOrder.getSettlementTime()))
         commonOrder.setSettleTime(
               new Date(TimeUtil.convertToTimeTemp(taoBaoOrder.getSettlementTime(), "yyyy-MM-dd HH:mm:ss")));
      commonOrder.setSourcePosition(
            String.format("mm_%s_%s_%s", "124933865", taoBaoOrder.getSourceMediaId(), taoBaoOrder.getAdPositionId()));
      commonOrder.setSourcePosition(String.format("mm_%s_%s_%s", "124933865", taoBaoOrder.getSourceMediaId(),
            taoBaoOrder.getAdPositionId()));
      commonOrder.setSourceType(Constant.SOURCE_TYPE_TAOBAO);
      int state = 0;
      if ("订单付款".equalsIgnoreCase(taoBaoOrder.getOrderState())) {
@@ -892,8 +796,33 @@
      commonOrder.setThirdCreateTime(
            new Date(TimeUtil.convertToTimeTemp(taoBaoOrder.getCreateTime(), "yyyy-MM-dd HH:mm:ss")));
      commonOrder.setUpdateTime(new Date());
      commonOrder.setTradeId(taoBaoOrder.getTradeId());
      return commonOrder;
   }
   /**
    * 获取一组订单的hash值
    *
    * @param list
    * @return
    */
   public static String getOrderDataHashCode(List<TaoBaoOrder> list) {
      List<TaoBaoOrder> orderList = new ArrayList<>();
      orderList.addAll(list);
      Comparator<TaoBaoOrder> orderCM = new Comparator<TaoBaoOrder>() {
         @Override
         public int compare(TaoBaoOrder o1, TaoBaoOrder o2) {
            return Long.parseLong(o1.getTradeId()) - Long.parseLong(o2.getTradeId()) > 0 ? 1 : -1;
         }
      };
      Collections.sort(orderList, orderCM);
      String sts = "";
      for (TaoBaoOrder order : orderList) {
         sts += (order.getTradeId() + "-" + order.getSpecialId() + "-" + order.getRelationId());
      }
      return StringUtil.Md5(sts);
   }
}