admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/util/taobao/TaoKeApiUtil.java
@@ -1,2122 +1,2664 @@
package com.yeshi.fanli.util.taobao;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.yeshi.utils.taobao.TbImgUtil;
import com.taobao.api.ApiException;
import com.yeshi.fanli.dto.taobao.TaoBaoShopInfoDTO;
import com.yeshi.fanli.dto.taobao.TaoLiJinDTO;
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinReport;
import com.yeshi.fanli.entity.taobao.RelateGoods;
import com.yeshi.fanli.entity.taobao.SearchFilter;
import com.yeshi.fanli.entity.taobao.SearchShopFilter;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoBaoHead;
import com.yeshi.fanli.entity.taobao.TaoBaoProvince;
import com.yeshi.fanli.entity.taobao.TaoBaoSearchNav;
import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult;
import com.yeshi.fanli.entity.taobao.TaoBaoShopInfo;
import com.yeshi.fanli.entity.taobao.TaoKeAppInfo;
import com.yeshi.fanli.exception.taobao.TaoBaoAuthException;
import com.yeshi.fanli.exception.taobao.TaoKeApiException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.exception.tlj.TaoLiJinCreateException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.log.TLJLogHelper;
import com.yeshi.fanli.log.TaoKeLogHelper;
import com.yeshi.fanli.tag.PageEntity;
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 net.sf.json.JSONArray;
import net.sf.json.JSONObject;
//淘宝客API接口
public class TaoKeApiUtil {
   // 解析券的内容
   private static TaoBaoSearchResult parseCoupleContent(String content) {
      TaoBaoSearchResult result = new TaoBaoSearchResult();
      JSONObject root = JSONObject.fromObject(content);
      root = root.optJSONObject("tbk_dg_item_coupon_get_response");
      if (root.optJSONObject("results") == null)
         return null;
      JSONArray array = root.optJSONObject("results").optJSONArray("tbk_coupon");
      if (array != null) {
         List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
         for (int i = 0; i < array.size(); i++) {
            JSONObject item = array.optJSONObject(i);
            TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
            goods.setPictUrl(item.optString("pict_url"));
            goods.setAuctionId(item.optLong("num_iid"));
            goods.setAuctionUrl(item.optString("item_url"));
            goods.setBiz30day(item.optInt("volume"));
            goods.setCouponInfo(item.optString("coupon_info"));
            List<BigDecimal> quanInfo = TaoBaoCouponUtil.getCouponInfo(goods.getCouponInfo());
            goods.setCouponAmount(quanInfo.get(1));
            goods.setCouponEffectiveEndTime(item.optString("coupon_end_time"));
            goods.setCouponEffectiveStartTime(item.optString("coupon_start_time"));
            goods.setCouponStartFee(quanInfo.get(0));
            goods.setCouponLeftCount(item.optInt("coupon_remain_count"));
            goods.setCouponLink(item.optString("coupon_click_url"));
            goods.setCouponTotalCount(item.optInt("coupon_total_count"));
            goods.setDayLeft(-1);
            if (item.optJSONObject("small_images") != null) {
               JSONArray imgArray = item.optJSONObject("small_images").optJSONArray("string");
               if (imgArray != null) {
                  List<String> imgList = new ArrayList<>();
                  for (int n = 0; n < imgArray.size(); n++) {
                     imgList.add(imgArray.optString(n));
                  }
                  goods.setImgList(imgList);
               }
            }
            goods.setSellerId(item.optLong("seller_id"));
            goods.setShopTitle(item.optString("shop_title"));
            goods.setTitle(item.optString("title"));
            goods.setTkRate(new BigDecimal(item.optString("commission_rate")));
            goods.setTotalNum(1000);
            goods.setUserType(item.optInt("user_type"));
            goods.setUserTypeName("");
            goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
            if (goods.getZkPrice().compareTo(goods.getCouponStartFee()) >= 0
                  && goods.getZkPrice().compareTo(goods.getCouponAmount()) > 0) {
               BigDecimal finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
               goods.setTkCommFee(finalPrice.multiply(goods.getTkRate()).divide(new BigDecimal(100)));
            } else
               goods.setTkCommFee(new BigDecimal(0));
            goodsList.add(goods);
         }
         result.setTaoBaoGoodsBriefs(goodsList);
         int totalCount = 1000;// root.optInt("total_results");
         PageEntity pe = new PageEntity(0, 0, totalCount);
         result.setPageEntity(pe);
      }
      result.setNavList(new ArrayList<>());
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
      result.setTaoBaoHead(taoBaoHead);
      return result;
   }
   /**
    * 获取商品详情,简版
    *
    * @param id
    *            -商品AuctionId
    * @return
    */
   public static TaoBaoGoodsBrief getSimpleGoodsInfo(Long id) throws TaobaoGoodsDownException {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.item.info.get");
      map.put("num_iids", id + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
      JSONObject data = JSONObject.fromObject(resultStr);
      // 商品下架
      if (data.optJSONObject("error_response") != null && data.optJSONObject("error_response").optInt("code") == 15
            && data.optJSONObject("error_response").optInt("sub_code") == 50001) {
         throw new TaobaoGoodsDownException(data.optJSONObject("error_response").optInt("code"), "商品下架");
      }
      if (data.optJSONObject("tbk_item_info_get_response") == null)
         return null;
      JSONArray array = data.optJSONObject("tbk_item_info_get_response").optJSONObject("results")
            .optJSONArray("n_tbk_item");
      if (array != null && array.size() > 0) {
         JSONObject item = array.optJSONObject(0);
         return parseSimpleGoodsInfo(item);
      }
      return null;
   }
   private static TaoBaoGoodsBrief parseSimpleGoodsInfo(JSONObject item) {
      TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
      goods.setAuctionId(item.optLong("num_iid"));
      goods.setAuctionUrl(item.optString("item_url"));
      goods.setBiz30day(item.optInt("volume"));
      if (item.optJSONObject("small_images") != null) {
         JSONArray imgArray = item.optJSONObject("small_images").optJSONArray("string");
         if (imgArray != null) {
            List<String> imgList = new ArrayList<>();
            for (int n = 0; n < imgArray.size(); n++) {
               imgList.add(imgArray.optString(n));
            }
            goods.setImgList(imgList);
         }
      }
      goods.setTitle(item.optString("title"));
      goods.setUserType(item.optInt("user_type"));
      goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
      goods.setReservePrice(new BigDecimal(item.optString("zk_final_price")));
      goods.setAuctionUrl(item.optString("item_url"));
      goods.setProvcity(item.optString("provcity"));
      goods.setPictUrl(item.optString("pict_url"));
      goods.setShopTitle(item.optString("nick"));
      goods.setSellerId(item.optLong("seller_id"));
      String optString = item.optString("shop_dsr");
      if (!StringUtil.isNullOrEmpty(optString)) {
         goods.setShopDsr(new Integer(optString));
      }
      String ratesum = item.optString("ratesum");
      if (!StringUtil.isNullOrEmpty(ratesum)) {
         goods.setRatesum(new Integer(ratesum));
      }
      if (item.optBoolean("is_prepay"))
         goods.setIsPrepay(1);
      if (item.optBoolean("i_rfd_rate"))
         goods.setRfdRate(1);
      if (item.optBoolean("h_good_rate"))
         goods.setGoodRate(1);
      if (item.optBoolean("h_pay_rate30"))
         goods.setPayRate30(1);
      if (item.optBoolean("free_shipment"))
         goods.setFreeShipment(1);
      if (!StringUtil.isNullOrEmpty(item.optString("material_lib_type"))) {
         try {
            String materialLibType = item.optString("material_lib_type");
            goods.setMaterialLibType(Integer.parseInt(materialLibType.split(",")[0]));
         } catch (Exception e) {
            goods.setMaterialLibType(0);
         }
      } else
         goods.setMaterialLibType(0);
      goods = loadYuShouInfo(goods, item);
      return goods;
   }
   private static TaoBaoGoodsBrief loadYuShouInfo(TaoBaoGoodsBrief goods, JSONObject item) {
      if (goods != null && item != null) {
         // 预售相关解析
         goods.setYsylClickUrl(item.optString("ysyl_click_url"));
         if (!StringUtil.isNullOrEmpty(item.optString("ysyl_commission_rate")))
            goods.setYsylCommissionRate(new BigDecimal(item.optString("ysyl_commission_rate")));
         goods.setYsylTljFace(item.optString("ysyl_tlj_face"));
         goods.setYsylTljSendTime(item.optString("ysyl_tlj_send_time"));
         goods.setYsylTljUseEndTime(item.optString("ysyl_tlj_use_end_time"));
         goods.setYsylTljUseStartTime(item.optString("ysyl_tlj_use_start_time"));
         goods.setPresaleDeposit(item.optString("presale_deposit"));
         goods.setPresaleDiscountFeeText(item.optString("presale_discount_fee_text"));
         goods.setPresaleEndTime(item.optString("presale_end_time"));
         goods.setPresaleStartTime(item.optString("presale_start_time"));
         goods.setPresaleTailEndTime(item.optString("presale_tail_end_time"));
         goods.setPresaleTailStartTime(item.optString("presale_tail_start_time"));
         return goods;
      }
      return goods;
   }
   public static List<TaoBaoGoodsBrief> getBatchGoodsInfo(List<Long> listId)
         throws TaoKeApiException, TaobaoGoodsDownException {
      if (listId == null || listId.size() == 0) {
         throw new TaobaoGoodsDownException(1, "淘宝商品ID不能为空");
      }
      if (listId.size() > 40) {
         throw new TaobaoGoodsDownException(1, "淘宝商品ID不能超过40个");
      }
      StringBuffer ids = new StringBuffer();
      for (Long id : listId) {
         ids.append(id + ",");
      }
      return getBatchGoodsInfos(ids.substring(0, ids.length() - 1));
   }
   /**
    * 获取商品详情,简版
    *
    * @param id
    * @return
    */
   public static List<TaoBaoGoodsBrief> getBatchGoodsInfos(String ids) throws TaobaoGoodsDownException {
      List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.item.info.get");
      map.put("num_iids", ids + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject data = JSONObject.fromObject(resultStr);
      // 商品下架
      if (data.optJSONObject("error_response") != null && data.optJSONObject("error_response").optInt("code") == 15
            && data.optJSONObject("error_response").optInt("sub_code") == 50001) {
         throw new TaobaoGoodsDownException(data.optJSONObject("error_response").optInt("code"), "商品下架");
      }
      if (data.optJSONObject("tbk_item_info_get_response") == null)
         return null;
      JSONArray array = data.optJSONObject("tbk_item_info_get_response").optJSONObject("results")
            .optJSONArray("n_tbk_item");
      if (array != null && array.size() > 0) {
         for (int i = 0; i < array.size(); i++) {
            JSONObject item = array.optJSONObject(i);
            goodsList.add(parseSimpleGoodsInfo(item));
         }
      }
      return goodsList;
   }
   /**
    * 搜索商品详情-详细
    *
    * @param id
    * @return
    * @throws TaobaoGoodsDownException
    */
   public static TaoBaoGoodsBrief searchGoodsDetail(Long id) throws TaobaoGoodsDownException {
      TaoBaoGoodsBrief goods = getSimpleGoodsInfo(id);
      if (goods == null)
         return null;
      SearchFilter filter = new SearchFilter();
      filter.setKey(goods.getTitle());
      filter.setPage(1);
      filter.setPageSize(50);
      TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
            goods.getUserType());
      if (result != null && result.getTaoBaoGoodsBriefs() != null)
         for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
            System.out.println(goods.getAuctionId() + ":" + g.getAuctionId());
            if (goods.getAuctionId().longValue() == g.getAuctionId()) {
               g.setId(goods.getAuctionId());
               g.setCreatetime(new Date());
               g.setMaterialLibType(goods.getMaterialLibType());
               g.setProvcity(goods.getProvcity());
               return g;
            }
         }
      // 再从淘宝联盟网页搜索
      filter.setKey(goods.getAuctionUrl());
      TaoBaoSearchResult searchResult = TaoBaoUtil.searchFromAlimamaWeb(filter, null);
      if (searchResult != null && searchResult.getTaoBaoGoodsBriefs() != null
            && searchResult.getTaoBaoGoodsBriefs().size() > 0) {
         for (TaoBaoGoodsBrief g : searchResult.getTaoBaoGoodsBriefs()) {
            if (g.getAuctionId().longValue() == goods.getAuctionId()) {
               g.setImgList(goods.getImgList());
               goods = g;
               if ("无".equalsIgnoreCase(goods.getCouponInfo()))
                  goods.setCouponInfo(null);
               return goods;
            }
         }
      }
      TaoKeLogHelper.error(null, "没有搜索到详情:" + id);
      goods.setCouponAmount(new BigDecimal("0"));
      goods.setTkMktStatus("1");
      goods.setTkRate(new BigDecimal("0"));
      goods.setReservePrice(new BigDecimal(0));
      goods.setTkCommFee(new BigDecimal(0));
      return goods;
   }
   /**
    * 搜索商品详情-详细
    *
    * @param id
    * @return
    * @throws TaobaoGoodsDownException
    */
   public static TaoBaoGoodsBrief searchGoodsDetail(Long id, TaoKeAppInfo app) throws TaobaoGoodsDownException {
      TaoBaoGoodsBrief goods = getSimpleGoodsInfo(id);
      if (goods == null)
         return null;
      SearchFilter filter = new SearchFilter();
      filter.setKey(goods.getTitle());
      filter.setPage(1);
      filter.setPageSize(50);
      TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
            goods.getUserType(), app);
      if (result != null && result.getTaoBaoGoodsBriefs() != null)
         for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
            if (goods.getAuctionId().longValue() == g.getAuctionId()) {
               g.setId(goods.getAuctionId());
               // 判断是否有优惠券
               if (!StringUtil.isNullOrEmpty(g.getCouponActivityId())) {
                  // 获取优惠券详情
                  QuanInfo quanInfo = getQuanInfo(g.getAuctionId(), g.getCouponActivityId());
                  if (quanInfo != null) {
                     g.setCouponAmount(quanInfo.coupon_amount);
                     g.setCouponEffectiveEndTime(quanInfo.coupon_end_time);
                     g.setCouponEffectiveStartTime(quanInfo.coupon_start_time);
                     g.setCouponLeftCount(quanInfo.coupon_remain_count);
                     g.setCouponStartFee(quanInfo.coupon_start_fee);
                     g.setCouponTotalCount(quanInfo.coupon_total_count);
                  }
               } else {
                  g.setCouponAmount(new BigDecimal(0));
                  g.setCouponStartFee(new BigDecimal(0));
               }
               g.setCreatetime(new Date());
               g.setMaterialLibType(goods.getMaterialLibType());
               g.setProvcity(goods.getProvcity());
               return g;
            }
         }
      // 再从淘宝联盟网页搜索
      filter.setKey(goods.getAuctionUrl());
      TaoBaoSearchResult searchResult = TaoBaoUtil.searchFromAlimamaWeb(filter, null);
      if (searchResult != null && searchResult.getTaoBaoGoodsBriefs() != null
            && searchResult.getTaoBaoGoodsBriefs().size() > 0) {
         for (TaoBaoGoodsBrief g : searchResult.getTaoBaoGoodsBriefs()) {
            if (g.getAuctionId().longValue() == goods.getAuctionId()) {
               g.setImgList(goods.getImgList());
               goods = g;
               if ("无".equalsIgnoreCase(goods.getCouponInfo()))
                  goods.setCouponInfo(null);
               return goods;
            }
         }
      }
      TaoKeLogHelper.error(null, "没有搜索到详情:" + id);
      goods.setCouponAmount(new BigDecimal("0"));
      goods.setTkMktStatus("1");
      goods.setTkRate(new BigDecimal("0"));
      goods.setReservePrice(new BigDecimal(0));
      goods.setTkCommFee(new BigDecimal(0));
      return goods;
   }
   /**
    * 物料转链
    *
    * @param id
    * @param app
    * @return
    * @throws TaobaoGoodsDownException
    */
   public static TaoBaoGoodsBrief searchGoodsDetailForConvert(Long id, TaoKeAppInfo app)
         throws TaobaoGoodsDownException {
      TaoBaoGoodsBrief goods = getSimpleGoodsInfo(id);
      if (goods == null)
         return null;
      SearchFilter filter = new SearchFilter();
      filter.setKey(goods.getTitle());
      filter.setPage(1);
      filter.setPageSize(50);
      TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
            goods.getUserType(), app);
      if (result != null && result.getTaoBaoGoodsBriefs() != null)
         for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
            if (goods.getAuctionId().longValue() == g.getAuctionId()) {
               g.setId(goods.getAuctionId());
               g.setCreatetime(new Date());
               return g;
            }
         }
      TaoKeLogHelper.error(null, "没有搜索到详情:" + id);
      goods.setCouponAmount(new BigDecimal("0"));
      goods.setTkMktStatus("1");
      goods.setTkRate(new BigDecimal("0"));
      goods.setReservePrice(new BigDecimal(0));
      goods.setTkCommFee(new BigDecimal(0));
      return goods;
   }
   public static List<TaoBaoGoodsBrief> searchBatchGoodsDetail(String ids) throws TaobaoGoodsDownException {
      List<TaoBaoGoodsBrief> goodsBriefList = getBatchGoodsInfos(ids);
      if (goodsBriefList == null || goodsBriefList.size() == 0) {
         return null;
      }
      // System.out.println("---------goodsBriefList--------------:"+
      // goodsBriefList.size());
      List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
      for (TaoBaoGoodsBrief goods : goodsBriefList) {
         boolean pross = false;
         SearchFilter filter = new SearchFilter();
         filter.setKey(goods.getTitle());
         filter.setPage(1);
         filter.setPageSize(50);
         TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
               goods.getUserType());
         if (result != null && result.getTaoBaoGoodsBriefs() != null)
            for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
               if (goods.getAuctionId().longValue() == g.getAuctionId()) {
                  g.setId(goods.getAuctionId());
                  g.setAuctionUrl(goods.getAuctionUrl());
                  g.setShopTitle(goods.getShopTitle());
                  // 判断是否有优惠券
                  if (!StringUtil.isNullOrEmpty(g.getCouponActivityId())) {
                     // 获取优惠券详情
                     QuanInfo quanInfo = getQuanInfo(g.getAuctionId(), g.getCouponActivityId());
                     if (quanInfo != null) {
                        g.setCouponAmount(quanInfo.coupon_amount);
                        g.setCouponEffectiveEndTime(quanInfo.coupon_end_time);
                        g.setCouponEffectiveStartTime(quanInfo.coupon_start_time);
                        g.setCouponLeftCount(quanInfo.coupon_remain_count);
                        g.setCouponStartFee(quanInfo.coupon_start_fee);
                        g.setCouponTotalCount(quanInfo.coupon_total_count);
                     }
                  } else {
                     g.setCouponAmount(new BigDecimal(0));
                     g.setCouponStartFee(new BigDecimal(0));
                  }
                  g.setCreatetime(new Date());
                  goodsList.add(g);
                  pross = true;
                  break;
               }
            }
         if (pross)
            continue;
         // 再从淘宝联盟网页搜索
         filter.setKey(goods.getAuctionUrl());
         TaoBaoSearchResult searchResult = TaoBaoUtil.searchFromAlimamaWeb(filter, null);
         if (searchResult != null && searchResult.getTaoBaoGoodsBriefs() != null
               && searchResult.getTaoBaoGoodsBriefs().size() > 0) {
            for (TaoBaoGoodsBrief g : searchResult.getTaoBaoGoodsBriefs()) {
               if (g.getAuctionId().longValue() == goods.getAuctionId()) {
                  g.setImgList(goods.getImgList());
                  g.setId(goods.getAuctionId());
                  g.setAuctionUrl(goods.getAuctionUrl());
                  g.setShopTitle(goods.getShopTitle());
                  goods = g;
                  if ("无".equalsIgnoreCase(goods.getCouponInfo()))
                     goods.setCouponInfo(null);
                  goodsList.add(goods);
                  pross = true;
                  break;
               }
            }
         }
         if (pross)
            continue;
         goods.setCouponAmount(new BigDecimal("0"));
         goods.setTkMktStatus("1");
         goods.setTkRate(new BigDecimal("0"));
         goods.setReservePrice(new BigDecimal(0));
         goods.setTkCommFee(new BigDecimal(0));
         goodsList.add(goods);
      }
      return goodsList;
   }
   /**
    * 商品物料搜索
    *
    * @param filter
    * @return
    */
   public static TaoBaoSearchResult searchWuLiao(SearchFilter filter) {
      if (filter.getKey() != null && filter.getKey().trim().equalsIgnoreCase(""))
         return null;
      if (filter.getKey() != null && filter.getKey().length() > 100)
         return null;
      PageEntity pageEntity = new PageEntity();
      TaoBaoSearchResult taoBaoSearchResult = new TaoBaoSearchResult();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.material.optional");
      map.put("page_size", filter.getPageSize() == 0 ? "20" : filter.getPageSize() + "");
      map.put("page_no", (filter.getPage() <= 0 ? 1 : filter.getPage()) + "");
      // map.put("material_id", "3756");
      pageEntity.setPageIndex(filter.getPage());
      pageEntity.setPageSize(filter.getPageSize() == 0 ? 20 : filter.getPageSize());
      // 包含了地区筛选
      if (filter.getProvinceId() > 0) {
         List<TaoBaoProvince> provinceList = TaoBaoUtil.getTaoBaoProvinceList();
         for (TaoBaoProvince province : provinceList) {
            if (Integer.parseInt(province.getId()) == filter.getProvinceId()) {
               map.put("itemloc", province.getName());
               break;
            }
         }
      }
      if (filter.getMaterialId() != null)
         map.put("material_id", filter.getMaterialId());
      if (filter.getStartPrice() != null)
         map.put("start_price", filter.getStartPrice() + "");
      if (filter.getEndPrice() != null)
         map.put("end_price", filter.getEndPrice() + "");
      if (filter.getStartTkRate() > 0)
         map.put("start_tk_rate", filter.getStartTkRate() + "");
      if (filter.getEndTkRate() > 0)
         map.put("end_tk_rate", filter.getEndTkRate() + "");
      if (filter.getStartKaTkRate() > 0)
         map.put("start_ka_tk_rate", filter.getStartKaTkRate() + "");
      if (filter.getEndKaTkRate() > 0)
         map.put("end_ka_tk_rate", filter.getEndKaTkRate() + "");
      if (filter.isTmall())
         map.put("is_tmall", filter.isTmall() + "");
      if (filter.isOverseas())
         map.put("is_overseas", filter.isOverseas() + "");
      if (filter.isBaoYou())
         map.put("need_free_shipment", filter.isBaoYou() + "");
      if (filter.isNeedPrepay())
         map.put("need_prepay", filter.isNeedPrepay() + "");
      if (filter.isIncludePayRate30())
         map.put("include_pay_rate_30", filter.isIncludePayRate30() + "");
      if (filter.isIncludeGoodRate())
         map.put("include_good_rate", filter.isIncludeGoodRate() + "");
      if (filter.isIncludeRfdRate())
         map.put("include_rfd_rate", filter.isIncludeRfdRate() + "");
      if (filter.getStartDsr() > 0)
         map.put("start_dsr", filter.getStartDsr() + "");
      if (filter.getNpxLevel() > 0)
         map.put("npx_level", filter.getNpxLevel() + "");
      if (!StringUtil.isNullOrEmpty(filter.getCateIds()))
         map.put("cat", filter.getCateIds());
      if (!StringUtil.isNullOrEmpty(filter.getKey()))
         map.put("q", filter.getKey());
      if (filter.getQuan() > 0)
         map.put("has_coupon", true + "");
      if (!StringUtil.isNullOrEmpty(filter.getIp()))
         map.put("ip", filter.getIp());
      if (filter.getSort() > 0) {
         if (filter.getSort() == TaoBaoUtil.SORT_SALE_HIGH_TO_LOW) {
            map.put("sort", "total_sales_des"); // 销量从高到低
         } else if (filter.getSort() == TaoBaoUtil.SORT_SALE_LOW_TO_HIGH) {
            map.put("sort", "total_sales_asc"); // 销量从低到高
         } else if (filter.getSort() == TaoBaoUtil.SORT_PRICE_HIGH_TO_LOW) {
            map.put("sort", "price_des"); // 价格从高到低
         } else if (filter.getSort() == TaoBaoUtil.SORT_PRICE_LOW_TO_HIGH) {
            map.put("sort", "price_asc"); // 价格从低到高
         } else if (filter.getSort() == TaoBaoUtil.SORT_TKRATE_HIGH_TO_LOW) {
            map.put("sort", "tk_rate_des"); // 淘客佣金比率高到低
         } else if (filter.getSort() == TaoBaoUtil.SORT_TKRATE_LOW_TO_HIGH) {
            map.put("sort", "tk_rate_asc"); // 淘客佣金比率低到高
         } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_COMMI_HIGH_TO_LOW) {
            map.put("sort", "tk_total_commi_des"); // 总支出佣金高到低
         } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_COMMI_LOW_TO_HIGH) {
            map.put("sort", "tk_total_commi_asc"); // 总支出佣金低到高
         } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_SALES_HIGH_TO_LOW) {
            map.put("sort", "tk_total_sales_des"); // 累计推广量高到低
         } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_SALES_LOW_TO_HIGH) {
            map.put("sort", "tk_total_sales_asc"); // 累计推广量低到高
         }
      }
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      // System.out.println("resultStr"+ resultStr);
      JSONObject data = JSONObject.fromObject(resultStr);
      if (data.optJSONObject("tbk_dg_material_optional_response") != null
            && data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list") != null) {
         JSONArray array = data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list")
               .optJSONArray("map_data");
         List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               TaoBaoGoodsBrief goods = parseWuLiaoItem(array.optJSONObject(i));
               if (goods != null)
                  goodsList.add(goods);
            }
         }
         taoBaoSearchResult.setTaoBaoGoodsBriefs(goodsList);
         JSONObject optJSONObject = data.optJSONObject("tbk_dg_material_optional_response");
         int totalResults = optJSONObject.getInt("total_results");
         int totalPage = totalResults % pageEntity.getPageSize() == 0 ? totalResults / pageEntity.getPageSize()
               : totalResults / pageEntity.getPageSize() + 1;
         pageEntity.setTotalCount(totalResults);
         pageEntity.setTotalPage(totalPage);
      }
      List<TaoBaoSearchNav> navList = new ArrayList<>();
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound((int) pageEntity.getTotalCount());
      taoBaoSearchResult.setTaoBaoHead(taoBaoHead);
      taoBaoSearchResult.setPageEntity(pageEntity);
      // filter.get
      // 设置发货地址
      TaoBaoSearchNav nav = new TaoBaoSearchNav();
      nav.setName("发货地选择");
      nav.setFlag("address");
      nav.setId(11110);
      nav.setType("fahuodi");
      List<TaoBaoSearchNav> childNavList = new ArrayList<>();
      List<TaoBaoProvince> provinceList = TaoBaoUtil.getTaoBaoProvinceList();
      for (TaoBaoProvince province : provinceList) {
         TaoBaoSearchNav childNav = new TaoBaoSearchNav();
         childNav.setName(province.getName());
         childNav.setId(Integer.parseInt(province.getId()));
         childNav.setType("fahuodi-child");
         if (Integer.parseInt(province.getId()) == filter.getProvinceId())
            childNav.setSelector(1);
         childNavList.add(childNav);
      }
      nav.setSubIds(childNavList);
      navList.add(nav);
      // 测试
      taoBaoSearchResult.setNavList(navList);
      return taoBaoSearchResult;
   }
   /**
    * 商品物料搜索
    *
    * @param filter
    * @return
    */
   public static TaoBaoSearchResult searchWuLiaoForDetail(String title, BigDecimal zkPrice, String provcity,
         int userType) {
      if (provcity.trim().contains(" "))
         provcity = provcity.split(" ")[provcity.split(" ").length - 1];
      TaoBaoSearchResult taoBaoSearchResult = new TaoBaoSearchResult();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.material.optional");
      map.put("page_size", 50 + "");
      map.put("page_no", 1 + "");
      map.put("start_price", (int) zkPrice.subtract(new BigDecimal(1)).doubleValue() + "");
      map.put("end_price", (int) zkPrice.add(new BigDecimal(1)).doubleValue() + "");
      map.put("is_tmall", (userType == 1) + "");
      map.put("q", title);
      map.put("itemloc", provcity);
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
      JSONObject data = JSONObject.fromObject(resultStr);
      if (data.optJSONObject("tbk_dg_material_optional_response") != null
            && data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list") != null) {
         JSONArray array = data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list")
               .optJSONArray("map_data");
         List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               TaoBaoGoodsBrief goods = parseWuLiaoItem(array.optJSONObject(i));
               if (goods != null)
                  goodsList.add(goods);
            }
         }
         taoBaoSearchResult.setTaoBaoGoodsBriefs(goodsList);
      }
      List<TaoBaoSearchNav> navList = new ArrayList<>();
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound(1000);
      taoBaoSearchResult.setTaoBaoHead(taoBaoHead);
      taoBaoSearchResult.setPageEntity(new PageEntity());
      taoBaoSearchResult.setNavList(navList);
      return taoBaoSearchResult;
   }
   /**
    * 商品物料搜索
    *
    * @param filter
    * @return
    */
   public static TaoBaoSearchResult searchWuLiaoForDetail(String title, BigDecimal zkPrice, String provcity,
         int userType, TaoKeAppInfo app) {
      if (provcity.trim().contains(" "))
         provcity = provcity.split(" ")[provcity.split(" ").length - 1];
      TaoBaoSearchResult taoBaoSearchResult = new TaoBaoSearchResult();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.material.optional");
      map.put("page_size", 50 + "");
      map.put("page_no", 1 + "");
      map.put("start_price", (int) zkPrice.subtract(new BigDecimal(1)).doubleValue() + "");
      map.put("end_price", (int) zkPrice.add(new BigDecimal(1)).doubleValue() + "");
      map.put("is_tmall", (userType == 1) + "");
      map.put("q", title);
      map.put("itemloc", provcity);
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
      JSONObject data = JSONObject.fromObject(resultStr);
      if (data.optJSONObject("tbk_dg_material_optional_response") != null
            && data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list") != null) {
         JSONArray array = data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list")
               .optJSONArray("map_data");
         List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               TaoBaoGoodsBrief goods = parseWuLiaoItem(array.optJSONObject(i));
               if (goods != null)
                  goodsList.add(goods);
            }
         }
         taoBaoSearchResult.setTaoBaoGoodsBriefs(goodsList);
      }
      List<TaoBaoSearchNav> navList = new ArrayList<>();
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound(1000);
      taoBaoSearchResult.setTaoBaoHead(taoBaoHead);
      taoBaoSearchResult.setPageEntity(new PageEntity());
      taoBaoSearchResult.setNavList(navList);
      return taoBaoSearchResult;
   }
   // 解析物料
   private static TaoBaoGoodsBrief parseWuLiaoItem(JSONObject item) {
      TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
      goods.setPictUrl(item.optString("pict_url"));
      if (!StringUtil.isNullOrEmpty(item.optString("white_image"))) {
         goods.setPictUrlWhite(item.optString("white_image"));
      }
      goods.setAuctionId(item.optLong("num_iid"));
      goods.setAuctionUrl("https:" + item.optString("url"));
      goods.setBiz30day(item.optInt("volume"));
      goods.setCouponInfo(item.optString("coupon_info"));
      if (goods.getCouponInfo() != null)
         goods.setCouponInfo(goods.getCouponInfo().replace(".00", ""));
      if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
         List<BigDecimal> quanInfo = TaoBaoCouponUtil.getCouponInfo(goods.getCouponInfo());
         goods.setCouponAmount(quanInfo.get(1));
         goods.setCouponEffectiveEndTime(item.optString("coupon_end_time"));
         goods.setCouponEffectiveStartTime(item.optString("coupon_start_time"));
         goods.setCouponStartFee(new BigDecimal(item.optString("coupon_start_fee")));
         goods.setCouponLeftCount(item.optInt("coupon_remain_count"));
         goods.setCouponLink("https:" + item.optString("coupon_share_url"));
         goods.setCouponTotalCount(item.optInt("coupon_total_count"));
         goods.setCouponActivityId(item.optString("coupon_id"));
      } else {
         goods.setCouponAmount(new BigDecimal(0));
      }
      goods.setDayLeft(-1);
      if (item.optJSONObject("small_images") != null) {
         JSONArray imgArray = item.optJSONObject("small_images").optJSONArray("string");
         if (imgArray != null) {
            List<String> imgList = new ArrayList<>();
            for (int n = 0; n < imgArray.size(); n++) {
               imgList.add(imgArray.optString(n));
            }
            goods.setImgList(imgList);
         }
      }
      if (item.optBoolean("include_mkt"))
         goods.setTkMktStatus("1");
      else
         goods.setTkMktStatus("0");
      if (item.optBoolean("include_dxjh"))
         goods.setIncludeDxjh(1);
      goods.setSellerId(item.optLong("seller_id"));
      goods.setShopTitle(item.optString("shop_title"));
      goods.setTitle(item.optString("title"));
      goods.setProvcity(item.optString("provcity"));
      if (!StringUtil.isNullOrEmpty(item.optString("level_one_category_id"))) {
         goods.setRootCatId(item.optInt("level_one_category_id"));
      }
      goods.setRootCategoryName(item.optString("level_one_category_name"));
      if (!StringUtil.isNullOrEmpty(item.optString("category_id"))) {
         goods.setLeafCatId(item.optInt("category_id"));
      }
      goods.setLeafName(item.optString("category_name"));
      goods.setTkRate(new BigDecimal(item.optString("commission_rate")).divide(new BigDecimal(100)));
      goods.setTotalNum(1000);
      goods.setUserType(item.optInt("user_type"));
      goods.setUserTypeName("");
      goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
      if (item.optBoolean("include_dxjh")) {
         goods.setDxjhInfo(item.optString("info_dxjh"));
      }
      if (StringUtil.isNullOrEmpty(goods.getCouponInfo())) {// 无券
         goods.setTkCommFee(goods.getZkPrice().multiply(goods.getTkRate()).divide(new BigDecimal(100)));
      } else if (goods.getZkPrice().compareTo(goods.getCouponStartFee()) >= 0// 有券
            && goods.getZkPrice().compareTo(goods.getCouponAmount()) >= 0) {
         BigDecimal finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
         goods.setTkCommFee(finalPrice.multiply(goods.getTkRate()).divide(new BigDecimal(100)));
      } else {
         goods.setTkCommFee(new BigDecimal(0));
      }
      if (!StringUtil.isNullOrEmpty(item.optString("reserve_price")))
         goods.setReservePrice(new BigDecimal(item.optString("reserve_price")));
      goods.setTotalFee(new BigDecimal("0"));
      goods = loadYuShouInfo(goods, item);
      return goods;
   }
   /**
    * 获取淘口令
    *
    * @param logo
    *            -图标
    * @param text
    *            -文字
    * @param url
    *            -简介
    * @return
    */
   public static String getTKToken(String logo, String text, String url) {
      if (text == null)
         return null;
      if (text.length() < 5)
         text = "好货:" + text;
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.tpwd.create");
      map.put("url", url);
      map.put("text", text);
      map.put("logo", logo);
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject data = JSONObject.fromObject(resultStr);
      if (data.optJSONObject("tbk_tpwd_create_response").optJSONObject("data") != null)
         return data.optJSONObject("tbk_tpwd_create_response").optJSONObject("data").optString("model");
      return null;
   }
   public static List<RelateGoods> getRelateGoodsList(long auctionId) throws ApiException {
      List<RelateGoods> resultList = new ArrayList<>();
      List<TaoBaoGoodsBrief> list = getRelationGoodsRecommend(auctionId, 9);
      for (TaoBaoGoodsBrief goods : list) {
         if (goods != null) {
            RelateGoods rg = new RelateGoods();
            rg.setId(goods.getAuctionId() + "");
            rg.setPicUrl(goods.getPictUrl());
            rg.setTitle(goods.getTitle());
            rg.setZkPrice(goods.getZkPrice().toString());
            rg.setUrl(goods.getAuctionUrl());
            resultList.add(rg);
         }
      }
      return resultList;
   }
   /**
    * 获取券详细信息
    *
    * @param auctionId
    * @param activityId
    * @return
    */
   public static QuanInfo getQuanInfo(Long auctionId, String activityId) {
      QuanInfo info = new QuanInfo();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.coupon.get");
      map.put("item_id", auctionId + "");
      map.put("activity_id", activityId);
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject data = JSONObject.fromObject(resultStr);
      if (data.optJSONObject("tbk_coupon_get_response") != null) {
         data = data.optJSONObject("tbk_coupon_get_response").optJSONObject("data");
         info.coupon_start_time = data.optString("coupon_start_time");
         info.coupon_end_time = data.optString("coupon_end_time");
         info.coupon_amount = new BigDecimal(data.optString("coupon_amount"));
         info.coupon_total_count = data.optInt("coupon_total_count");
         info.coupon_remain_count = data.optInt("coupon_remain_count");
         info.coupon_start_fee = new BigDecimal(data.optString("coupon_start_fee"));
      } else
         return null;
      return info;
   }
   /**
    * 获取关联商品推荐
    *
    * @param auctionId
    * @return
    */
   public static List<TaoBaoGoodsBrief> getRelationGoodsRecommend(long auctionId, int count) {
      List<TaoBaoGoodsBrief> list = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.item.recommend.get");
      map.put("num_iid", auctionId + "");
      map.put("count", count + "");
      map.put("platform", 2 + "");
      map.put("fields",
            "num_iid,title,pict_url,small_images,reserve_price,zk_final_price,user_type,provcity,item_url");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject data = JSONObject.fromObject(resultStr);
      if (data.optJSONObject("tbk_item_recommend_get_response") != null) {
         if (data.optJSONObject("tbk_item_recommend_get_response").optJSONObject("results") == null)
            return list;
         JSONArray array = data.optJSONObject("tbk_item_recommend_get_response").optJSONObject("results")
               .optJSONArray("n_tbk_item");
         if (array != null)
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
               goods.setAuctionId(item.optLong("num_iid"));
               goods.setTitle(item.optString("title"));
               goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
               goods.setAuctionUrl(item.optString("item_url"));
               goods.setPictUrl(item.optString("pict_url"));
               goods.setSalesCount(item.optString("volume"));
               goods.setUserType(item.optInt("user_type"));
               list.add(goods);
            }
      }
      return list;
   }
   public static void taoQiangGou() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.ju.tqg.get");
      map.put("fields",
            "click_url,pic_url,reserve_price,zk_final_price,total_amount,sold_num,title,category_name,start_time,end_time");
      map.put("start_time", "2018-06-11 08:00:00");
      map.put("end_time", "2018-06-12 12:00:00");
      map.put("page_no", "1");
      map.put("page_size", "96");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
   }
   public static TaoBaoSearchResult taoQiangGou(int page, int pageSize, String startTime, String endTime) {
      List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.ju.tqg.get");
      map.put("fields",
            "click_url,pic_url,reserve_price,zk_final_price,total_amount,sold_num,title,category_name,start_time,end_time");
      map.put("start_time", startTime);
      map.put("end_time", endTime);
      map.put("page_no", page + "");
      map.put("page_size", pageSize + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject resultJSON = JSONObject.fromObject(resultStr);
      JSONObject response = resultJSON.optJSONObject("tbk_ju_tqg_get_response");
      if (response != null && response.optJSONObject("results") != null) {
         JSONArray array = response.optJSONObject("results").optJSONArray("results");
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               String url = item.optString("click_url");
               // 排除 非淘客商品
               if (url.contains("s.click.taobao.com/t?e=m")) {
                  TaoBaoGoodsBrief goods;
                  try {
                     goods = searchGoodsDetail(item.optLong("num_iid"));
                     if (goods != null)
                        goodsList.add(goods);
                  } catch (TaobaoGoodsDownException e) {
                     e.printStackTrace();
                  }
               }
            }
            pageSize = array.size();
         }
      }
      TaoBaoSearchResult result = new TaoBaoSearchResult();
      result.setTaoBaoGoodsBriefs(goodsList);
      int totalResults = response.getInt("total_results");
      PageEntity pe = new PageEntity(page, pageSize, totalResults);
      result.setPageEntity(pe);
      result.setNavList(new ArrayList<>());
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
      result.setTaoBaoHead(taoBaoHead);
      return result;
   }
   /*
    * TODO 获取分类列表
    */
   public static void getTaoBaoCategoryList() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.itemcats.get");
      map.put("parent_cid", "0");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
   }
   /**
    * 店铺搜索
    *
    * @param key
    *            -店铺名称
    * @param page
    *            -页码
    * @return
    */
   public static List<TaoBaoShopInfo> searchShop(String key, int page) {
      if (StringUtil.isNullOrEmpty(key))
         return new ArrayList<>();
      List<TaoBaoShopInfo> list = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.shop.get");
      map.put("fields", "user_id,shop_title,shop_type,seller_nick,pict_url,shop_url");
      map.put("q", key);
      map.put("page_size", "95");
      map.put("page_no", page + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject resultDate = JSONObject.fromObject(resultStr);
      if (resultDate.optJSONObject("tbk_shop_get_response") != null
            && resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results") != null) {
         JSONArray array = resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results")
               .optJSONArray("n_tbk_shop");
         if (array != null)
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               TaoBaoShopInfo info = new TaoBaoShopInfo();
               info.setPictureUrl(item.optString("pict_url"));
               info.setSellerNick(item.optString("seller_nick"));
               info.setShopTitle(item.optString("shop_title"));
               info.setShopType(item.optString("shop_type"));
               info.setShopUrl(item.optString("shop_url"));
               info.setUserId(item.optLong("user_id"));
               list.add(info);
            }
      }
      return list;
   }
   /**
    * 店铺搜索
    *
    * @param key
    *            -店铺名称
    * @param page
    *            -页码
    * @return
    */
   public static TaoBaoShopInfoDTO searchShop(String key, int page, int pageSize) {
      TaoBaoShopInfoDTO dto = new TaoBaoShopInfoDTO();
      if (StringUtil.isNullOrEmpty(key))
         return dto;
      PageEntity pageEntity = new PageEntity();
      List<TaoBaoShopInfo> list = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.shop.get");
      map.put("fields", "user_id,shop_title,shop_type,seller_nick,pict_url,shop_url");
      map.put("q", key);
      map.put("page_size", pageSize + "");
      map.put("page_no", page + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject resultDate = JSONObject.fromObject(resultStr);
      if (resultDate.optJSONObject("tbk_shop_get_response") != null
            && resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results") != null) {
         JSONArray array = resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results")
               .optJSONArray("n_tbk_shop");
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               TaoBaoShopInfo info = new TaoBaoShopInfo();
               info.setPictureUrl(item.optString("pict_url"));
               info.setSellerNick(item.optString("seller_nick"));
               info.setShopTitle(item.optString("shop_title"));
               info.setShopType(item.optString("shop_type"));
               info.setShopUrl(item.optString("shop_url"));
               info.setUserId(item.optLong("user_id"));
               list.add(info);
            }
         }
         JSONObject optJSONObject = resultDate.optJSONObject("tbk_shop_get_response");
         int totalResults = optJSONObject.getInt("total_results");
         int totalPage = totalResults % pageSize == 0 ? totalResults / pageSize : totalResults / pageSize + 1;
         pageEntity.setTotalCount(totalResults);
         pageEntity.setTotalPage(totalPage);
      }
      pageEntity.setPageIndex(page);
      pageEntity.setPageSize(pageSize);
      dto.setListInfo(list);
      dto.setPage(pageEntity);
      return dto;
   }
   /**
    * 店铺搜索
    *
    * @param key
    *            -店铺名称
    * @param page
    *            -页码
    * @return
    */
   public static List<TaoBaoShopInfo> searchShop(SearchShopFilter filter) {
      if (StringUtil.isNullOrEmpty(filter.getKey()))
         return new ArrayList<>();
      List<TaoBaoShopInfo> list = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.shop.get");
      map.put("fields", "user_id,shop_title,shop_type,seller_nick,pict_url,shop_url");
      map.put("q", filter.getKey());
      map.put("page_size", filter.getPageSize() + "");
      map.put("page_no", filter.getPage() + "");
      if (!StringUtil.isNullOrEmpty(filter.getSort()))
         map.put("sort", filter.getSort());
      if (filter.getTmall() != null)
         map.put("is_tmall", filter.getTmall() + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject resultDate = JSONObject.fromObject(resultStr);
      if (resultDate.optJSONObject("tbk_shop_get_response") != null
            && resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results") != null) {
         JSONArray array = resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results")
               .optJSONArray("n_tbk_shop");
         if (array != null)
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               TaoBaoShopInfo info = new TaoBaoShopInfo();
               info.setPictureUrl(item.optString("pict_url"));
               info.setSellerNick(item.optString("seller_nick"));
               info.setShopTitle(item.optString("shop_title"));
               info.setShopType(item.optString("shop_type"));
               info.setShopUrl(item.optString("shop_url"));
               info.setUserId(item.optLong("user_id"));
               list.add(info);
            }
      }
      return list;
   }
   /**
    * 品牌券获取
    *
    * @param pageNo
    * @param pageSize
    */
   public static void pingPaiCoupon(int pageNo, int pageSize) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.sc.coupon.brand.recommend");
      map.put("page_no", pageNo + "");
      map.put("page_size", pageSize + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
   }
   public static void getOrder(String order) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "alibaba.mos.order.get");
      map.put("order_number", order);
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
   }
   public static void getTAEGoodsDetail(Long auctionId) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tae.items.list");
      map.put("fields", "title,nick,pic_url,location,cid,price,post_fee,promoted_service,ju,shop_name");
      map.put("num_iids", auctionId + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
   }
   // taobao.ju.items.search
   public static void searchJuHuaSuan() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.ju.items.search");
      map.put("current_page", "1");
      map.put("page_size", 20 + "");
      map.put("pid", "mm_124933865_43788020_381938426");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, false);
      System.out.println(resultStr);
   }
   /**
    * 通过物料ID获取商品信息
    *
    * @param materialId
    *            -物料ID
    * @param page
    *            -页码
    * @param pageSize
    *            -每页数量
    * @return
    */
   public static TaoBaoSearchResult getMaterialByMaterialId(int materialId, int page, int pageSize) {
      List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.optimus.material");
      map.put("page_no", page + "");
      map.put("page_size", pageSize + "");
      map.put("material_id", materialId + "");
      // map.put("content_id", "561388751621");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      System.out.println(resultStr);
      JSONObject resultJSON = JSONObject.fromObject(resultStr);
      JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
      if (response != null && response.optJSONObject("result_list") != null) {
         JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
               if (goods != null)
                  goodsList.add(goods);
            }
            pageSize = array.size();
         }
      }
      TaoBaoSearchResult result = new TaoBaoSearchResult();
      result.setTaoBaoGoodsBriefs(goodsList);
      int totalCount = 1000;// root.optInt("total_results");
      PageEntity pe = new PageEntity(page, pageSize, totalCount);
      result.setPageEntity(pe);
      result.setNavList(new ArrayList<>());
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
      result.setTaoBaoHead(taoBaoHead);
      return result;
   }
   public static TaoBaoSearchResult getQTZMaterialByMaterialId(int materialId, int page, int pageSize) {
      List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.sc.optimus.material");
      map.put("page_no", page + "");
      map.put("page_size", pageSize + "");
      map.put("material_id", materialId + "");
      String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
      JSONObject resultJSON = JSONObject.fromObject(resultStr);
      JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
      if (response != null && response.optJSONObject("result_list") != null) {
         JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
               if (goods != null)
                  goodsList.add(goods);
            }
            pageSize = array.size();
         }
      }
      TaoBaoSearchResult result = new TaoBaoSearchResult();
      result.setTaoBaoGoodsBriefs(goodsList);
      int totalCount = 1000;// root.optInt("total_results");
      PageEntity pe = new PageEntity(page, pageSize, totalCount);
      result.setPageEntity(pe);
      result.setNavList(new ArrayList<>());
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
      result.setTaoBaoHead(taoBaoHead);
      return result;
   }
   /**
    * 根据设备猜你喜欢
    *
    * @param page
    * @param pageSize
    * @param imei
    * @param idfa
    * @return
    */
   public static TaoBaoSearchResult guessDeviceLike(int page, int pageSize, String imei, String idfa) {
      List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.optimus.material");
      map.put("page_no", page + "");
      map.put("page_size", pageSize + "");
      map.put("material_id", "6708");
      if (StringUtil.isNullOrEmpty(imei) && StringUtil.isNullOrEmpty(idfa))
         return null;
      map.put("device_encrypt", "MD5");
      if (!StringUtil.isNullOrEmpty(imei)) {
         map.put("device_value", StringUtil.Md5(imei));
         map.put("device_type", "IMEI");
      } else {
         map.put("device_value", StringUtil.Md5(idfa));
         map.put("device_type", "IDFA");
      }
      JSONObject resultJSON = null;
      try {
         resultJSON = TaoKeBaseUtil.baseRequest(map, true);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
      if (resultJSON == null)
         return null;
      // JSONObject resultJSON = JSONObject.fromObject(resultStr);
      JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
      if (response != null && response.optJSONObject("result_list") != null) {
         JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
         if (array != null) {
            for (int i = 0; i < array.size(); i++) {
               JSONObject item = array.optJSONObject(i);
               TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
               if (goods != null)
                  goodsList.add(goods);
            }
            pageSize = array.size();
         }
      }
      TaoBaoSearchResult result = new TaoBaoSearchResult();
      result.setTaoBaoGoodsBriefs(goodsList);
      int totalCount = 1000;// root.optInt("total_results");
      PageEntity pe = new PageEntity(page, pageSize, totalCount);
      result.setPageEntity(pe);
      result.setNavList(new ArrayList<>());
      TaoBaoHead taoBaoHead = new TaoBaoHead();
      taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
      result.setTaoBaoHead(taoBaoHead);
      return result;
   }
   /**
    * 从淘宝链接中解析商品ID(高级接口)
    *
    * @param link
    * @return
    */
   public static String parseAuctionIdFromLink(String link) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.item.click.extract");
      map.put("click_url", link + "");
      TaoKeAppInfo app = new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
            TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID);
      JSONObject resultJSON = null;
      try {
         resultJSON = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(resultJSON);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
      if (resultJSON == null)
         return null;
      return null;
   }
   public static String getAccessToken(String code, String appKey, String appSecret) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.top.auth.token.create");
      map.put("code", code);
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(appKey);
      app.setAppSecret(appSecret);
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         if (json != null)
            return json.toString();
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    * 渠道邀请码
    *
    * @param relationId
    * @return
    */
   public static String getInviteCode(Long relationId, String accessToken, String appKey, String appSecret) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.sc.invitecode.get");
      map.put("session", accessToken);
      map.put("code_type", "1");
      map.put("relation_app", "common");
      JSONObject resultJSON = null;
      try {
         TaoKeAppInfo app = new TaoKeAppInfo();
         app.setAppKey(appKey);
         app.setAppSecret(appSecret);
         resultJSON = TaoKeBaseUtil.baseRequest(map, app);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
      if (resultJSON == null)
         return null;
      return null;
   }
   /**
    * 获取渠道邀请码
    *
    * @param accessToken
    * @param appKey
    * @param appSecret
    * @return
    */
   public static String getRootRelationInviteCode(String accessToken, String appKey, String appSecret) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.sc.invitecode.get");
      map.put("session", accessToken);
      map.put("code_type", "1");
      map.put("relation_app", "common");
      JSONObject resultJSON = null;
      try {
         TaoKeAppInfo app = new TaoKeAppInfo();
         app.setAppKey(appKey);
         app.setAppSecret(appSecret);
         resultJSON = TaoKeBaseUtil.baseRequest(map, app);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
      if (resultJSON == null)
         return null;
      return null;
   }
   public static String getRootSpecialInviteCode(String accessToken, String appKey, String appSecret) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.sc.invitecode.get");
      map.put("session", accessToken);
      map.put("code_type", "3");
      map.put("relation_app", "common");
      JSONObject resultJSON = null;
      try {
         TaoKeAppInfo app = new TaoKeAppInfo();
         app.setAppKey(appKey);
         app.setAppSecret(appSecret);
         resultJSON = TaoKeBaseUtil.baseRequest(map, app);
         return resultJSON.optJSONObject("tbk_sc_invitecode_get_response").optJSONObject("data")
               .optString("inviter_code");
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
      if (resultJSON == null)
         return null;
      return null;
   }
   public static String getRelationId(String accessToken, String appKey, String appSecret) throws TaoBaoAuthException {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.sc.publisher.info.save");
      map.put("session", accessToken);
      map.put("inviter_code", "A2QnGL");
      map.put("info_type", "1");
      map.put("online_scene", "1");
      JSONObject resultJSON = null;
      try {
         TaoKeAppInfo app = new TaoKeAppInfo();
         app.setAppKey(appKey);
         app.setAppSecret(appSecret);
         resultJSON = TaoKeBaseUtil.baseRequest(map, app);
         return resultJSON.optJSONObject("tbk_sc_publisher_info_save_response").optJSONObject("data")
               .optString("relation_id");
      } catch (TaoKeApiException e) {
         JSONObject errorJSON = JSONObject.fromObject(e.getMsg()).optJSONObject("error_response");
         if (errorJSON.optInt("code") == 15 && errorJSON.optInt("sub_code") == 1)// 未实名
         {
            throw new TaoBaoAuthException(TaoBaoAuthException.CODE_NOT_REAL_NAME, errorJSON.optString("sub_msg"));
         } else {
            e.printStackTrace();
            LogHelper.error("渠道ID申请出错:" + e.getMsg());
            throw new TaoBaoAuthException(TaoBaoAuthException.CODE_OTHER, errorJSON.optString("sub_msg"));
         }
      } catch (Exception e) {
         LogHelper.error("渠道ID申请出错:" + (resultJSON != null ? resultJSON.toString() : "未知错误"));
      }
      return null;
   }
   public static String getSpecialId(String accessToken, String appKey, String appSecret) throws TaoBaoAuthException {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.sc.publisher.info.save");
      map.put("session", accessToken);
      map.put("inviter_code", "AA5ISJ");
      map.put("info_type", "1");
      map.put("online_scene", "1");
      JSONObject resultJSON = null;
      try {
         TaoKeAppInfo app = new TaoKeAppInfo();
         app.setAppKey(appKey);
         app.setAppSecret(appSecret);
         resultJSON = TaoKeBaseUtil.baseRequest(map, app);
         return resultJSON.optJSONObject("tbk_sc_publisher_info_save_response").optJSONObject("data")
               .optString("special_id");
      } catch (TaoKeApiException e) {
         JSONObject errorJSON = JSONObject.fromObject(e.getMsg()).optJSONObject("error_response");
         if (errorJSON.optInt("code") == 15 && errorJSON.optInt("sub_code") == 1)// 未实名
         {
            throw new TaoBaoAuthException(TaoBaoAuthException.CODE_NOT_REAL_NAME, errorJSON.optString("sub_msg"));
         } else {
            e.printStackTrace();
            LogHelper.error("会员运营ID申请出错:" + e.getMsg());
            throw new TaoBaoAuthException(TaoBaoAuthException.CODE_OTHER, errorJSON.optString("sub_msg"));
         }
      } catch (Exception e) {
         LogHelper.error("会员运营ID申请出错:" + (resultJSON != null ? resultJSON.toString() : "未知错误"));
      }
      return null;
   }
   public static void specialConvertItem(Long auctionId, TaoKeAppInfo app) {
      String pid = app.getPid();
      String[] sts = pid.split("_");
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.item.convert");
      map.put("num_iids", auctionId + "");
      map.put("fields", "num_iid,click_url");
      map.put("adzone_id", sts[3]);
      map.put("platform", "2");
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(json.toString());
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
   }
   public static TaoBaoGoodsBrief specialConvertCoupon(Long auctionId, TaoKeAppInfo app) {
      String pid = app.getPid();
      String[] sts = pid.split("_");
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.coupon.convert");
      map.put("item_id", auctionId + "");
      map.put("adzone_id", sts[3]);
      try {
         String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
         JSONObject json = JSONObject.fromObject(result);
         JSONObject resultJSON = json.optJSONObject("tbk_coupon_convert_response").optJSONObject("result")
               .optJSONObject("results");
         String couponLink = resultJSON.optString("coupon_click_url");
         String itemLink = resultJSON.optString("item_url");
         TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
         goods.setAuctionUrl(itemLink);
         if (!StringUtil.isNullOrEmpty(resultJSON.optString("coupon_info"))) {
            goods.setCouponLink(couponLink);
            goods.setCouponInfo(resultJSON.optString("coupon_info"));
         }
         String tkRate = resultJSON.optString("max_commission_rate");
         if (!StringUtil.isNullOrEmpty(tkRate)) {
            goods.setTkRate(new BigDecimal(tkRate));
         }
         goods = loadYuShouInfo(goods, resultJSON);
         return goods;
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   public static void juHuaSuan() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.ju.items.search");
      map.put("current_page", 1 + "");
      map.put("page_size", 100 + "");
      map.put("pid", "mm_124933865_43788020_381938426");
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey("24838852");
      app.setAppSecret("bc8265e2bf8d8115329d652f9d3d4cd8");
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(json);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
   }
   public static void taoKeContent() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.content.get");
      map.put("adzone_id", TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT.split("_")[3]);
      map.put("type", "1");
      map.put("count", "100");
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(json);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
   }
   public static void taoKeContentSource(String contentId, String source) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.optimus.material");
      map.put("adzone_id", TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT.split("_")[3]);
      map.put("page_size", "10");
      map.put("page_no", "1");
      map.put("content_id", contentId);
      map.put("content_source", source);
      map.put("material_id", "1");
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(json);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
   }
   // AA5ISJ
   private static TaoBaoGoodsBrief parseWuLiaoItemFromMaterialId(JSONObject item) {
      TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
      // 设置成320*320的图片尺寸
      goods.setPictUrl(TbImgUtil.getTBSize320Img("https:" + item.optString("pict_url")));
      goods.setAuctionId(item.optLong("item_id"));
      goods.setAuctionUrl("https://item.taobao.com/item.htm?id=" + goods.getAuctionId());
      goods.setBiz30day(item.optInt("volume"));
      if (!StringUtil.isNullOrEmpty(item.optString("coupon_amount"))) {
         goods.setCouponEffectiveEndTime(TimeUtil.getGernalTime(item.optLong("coupon_end_time"), "yyyy-MM-dd"));
         goods.setCouponEffectiveStartTime(TimeUtil.getGernalTime(item.optLong("coupon_start_time"), "yyyy-MM-dd"));
         goods.setCouponStartFee(new BigDecimal(item.optString("coupon_start_fee")));
         goods.setCouponLeftCount(item.optInt("coupon_remain_count"));
         goods.setCouponLink(null);
         goods.setCouponAmount(new BigDecimal(item.optString("coupon_amount")));
         goods.setCouponTotalCount(item.optInt("coupon_total_count"));
         goods.setCouponActivityId(item.optString("coupon_id"));
         if (goods.getCouponStartFee().compareTo(new BigDecimal(0)) > 0)
            goods.setCouponInfo(String.format("满%s元减%s元",
                  MoneyBigDecimalUtil.getWithNoZera(goods.getCouponStartFee()).toString(),
                  MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()).toString()));
         else
            goods.setCouponInfo(String.format("%s元无条件券",
                  MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()).toString()));
         if (goods.getCouponStartFee().compareTo(new BigDecimal(0)) <= 0) {
            goods.setCouponStartFee(goods.getCouponAmount());
         }
      } else {
         goods.setCouponAmount(new BigDecimal(0));
      }
      goods.setDayLeft(-1);
      if (item.optJSONObject("small_images") != null) {
         JSONArray imgArray = item.optJSONObject("small_images").optJSONArray("string");
         if (imgArray != null) {
            List<String> imgList = new ArrayList<>();
            for (int n = 0; n < imgArray.size(); n++) {
               imgList.add(imgArray.optString(n));
            }
            goods.setImgList(imgList);
         }
      }
      goods.setTkMktStatus("0");
      goods.setIncludeDxjh(0);
      goods.setSellerId(item.optLong("seller_id"));
      goods.setShopTitle(item.optString("shop_title"));
      goods.setTitle(item.optString("title"));
      goods.setProvcity(item.optString("provcity"));
      if (!StringUtil.isNullOrEmpty(item.optString("level_one_category_id"))) {
         goods.setRootCatId(item.optInt("level_one_category_id"));
      }
      goods.setRootCategoryName(item.optString("level_one_category_name"));
      if (!StringUtil.isNullOrEmpty(item.optString("category_id"))) {
         goods.setLeafCatId(item.optInt("category_id"));
      }
      goods.setLeafName(item.optString("category_name"));
      goods.setTotalNum(1000);
      goods.setUserType(item.optInt("user_type"));
      goods.setUserTypeName("");
      if (!StringUtil.isNullOrEmpty(item.optString("commission_rate"))) {
         goods.setTkRate(new BigDecimal(item.optString("commission_rate")));
      } else {
         goods.setTkRate(new BigDecimal(0));
      }
      if (!StringUtil.isNullOrEmpty(item.optString("zk_final_price"))) {
         goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
      } else {
         goods.setZkPrice(new BigDecimal(0));
      }
      if (StringUtil.isNullOrEmpty(goods.getCouponInfo())) {// 无券
         goods.setTkCommFee(goods.getZkPrice().multiply(goods.getTkRate()).divide(new BigDecimal(100)));
      } else if (goods.getZkPrice().compareTo(goods.getCouponStartFee()) >= 0// 有券
            && goods.getZkPrice().compareTo(goods.getCouponAmount()) >= 0) {
         BigDecimal finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
         goods.setTkCommFee(finalPrice.multiply(goods.getTkRate()).divide(new BigDecimal(100)));
      } else {
         goods.setTkCommFee(new BigDecimal(0));
      }
      goods.setReservePrice(new BigDecimal(0));
      goods.setTotalFee(new BigDecimal("0"));
      goods.setPictUrlWhite(item.optString("white_image"));
      goods = loadYuShouInfo(goods, item);
      return goods;
   }
   public static void getShopGoodsList(Long shopId) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "tmall.omni.pc.iteminfo.getbyshopid");
      map.put("shop_id", shopId + "");
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey("24838852");
      app.setAppSecret("bc8265e2bf8d8115329d652f9d3d4cd8");
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(json);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
   }
   public static void getTaoKeContentEffective() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.optimus.material");
      map.put("adzone_id", TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID.split("_")[3]);
      map.put("page_no", "1");
      map.put("page_size", "20");
      map.put("content_id", "8872035");
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(json);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
   }
   public static void getTaoKeContent() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.content.get");
      map.put("adzone_id", TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID.split("_")[3]);
      map.put("type", "1");
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.println(json);
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
   }
   /**
    * 淘口令转商品ID
    *
    * @param token
    * @return
    */
   public static Long tokenConvertAuctionId(String token) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.tpwd.convert");
      map.put("password_content", token);
      map.put("adzone_id", TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT.split("_")[3]);
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         try {
            return json.optJSONObject("tbk_tpwd_convert_response").optJSONObject("data").optLong("num_iid");
         } catch (Exception e) {
            return null;
         }
      } catch (TaoKeApiException e) {
         e.printStackTrace();
      }
      return null;
   }
   // 淘礼金创建
   public static TaoLiJinDTO createTaoLiJin(Long auctionId, String name, BigDecimal perface, int totalNum,
         Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime, TaoKeAppInfo app)
         throws TaoLiJinCreateException, TaoKeApiException {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.vegas.tlj.create");
      map.put("adzone_id", app.getPid().split("_")[3]);
      map.put("item_id", auctionId + "");
      map.put("total_num", totalNum + "");
      map.put("name", name);
      map.put("user_total_win_num_limit", "1");
      map.put("security_switch", "false");
      map.put("per_face", perface.toString());
      map.put("send_start_time", TimeUtil.getGernalTime(sendStartTime.getTime(), "yyyy-MM-dd HH:mm:ss"));
      if (sendEndTime != null)
         map.put("send_end_time", TimeUtil.getGernalTime(sendEndTime.getTime(), "yyyy-MM-dd HH:mm:ss"));
      if (useEndTime != null) {
         map.put("use_end_time", TimeUtil.getGernalTime(useEndTime.getTime(), "yyyy-MM-dd"));
         map.put("use_end_time_mode", "2");
      }
      if (useStartTime != null)
         map.put("use_start_time", TimeUtil.getGernalTime(useStartTime.getTime(), "yyyy-MM-dd"));
      try {
         String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
         JSONObject json = JSONObject.fromObject(result);
         System.out.println(json);
         JSONObject root = json.optJSONObject("tbk_dg_vegas_tlj_create_response");
         if (root != null && root.optJSONObject("result") != null) {
            if (root.optJSONObject("result").optBoolean("success")) {
               JSONObject modelJson = root.optJSONObject("result").optJSONObject("model");
               TaoLiJinDTO dto = new TaoLiJinDTO();
               dto.setRightsId(modelJson.optString("rights_id"));
               dto.setSendUrl(modelJson.optString("send_url"));
               return dto;
            } else {
               LogHelper.error(json);
            }
            // 接口返回异常
            String msgCode = root.optJSONObject("result").optString("msg_code");
            if (!StringUtil.isNullOrEmpty(msgCode)) {
               TLJLogHelper.info(auctionId, root.toString());// 淘礼金异常信息记录
               switch (msgCode) {
               case "FAIL_BIZ_ITEM_FORBIDDEN":
                  throw new TaoLiJinCreateException(TaoLiJinCreateException.CODE_TLJ_FORBIDDEN, "该商品不支持创建淘礼金红包");
               case "FAIL_BIZ_ACCOUNT_UN_PAID":
               case "PRE_FREEZE_ASSET_ACCOUNT_ERROR":
                  throw new TaoLiJinCreateException(TaoLiJinCreateException.CODE_TLJ_NO_MONEY, "官方玩法钱包余额不足");
               default:
                  throw new TaoKeApiException(Integer.parseInt(msgCode), root.toString());
               }
            }
         }
      } catch (TaoKeApiException e) {
         throw e;
      }
      return null;
   }
   // 淘礼金报告
   public static UserTaoLiJinReport getTaoLiJinEffective(String rightsId) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.dg.vegas.tlj.instance.report");
      map.put("rights_id", rightsId);
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
         JSONObject json = JSONObject.fromObject(result);
         System.out.println(json);
         JSONObject root = json.optJSONObject("tbk_dg_vegas_tlj_instance_report_response");
         if (root != null && root.optJSONObject("result") != null) {
            if (root.optJSONObject("result").optBoolean("success")) {
               JSONObject modelJson = root.optJSONObject("result").optJSONObject("model");
               if (modelJson != null && modelJson.size() > 0) {
                  UserTaoLiJinReport report = new UserTaoLiJinReport();
                  report.setId(rightsId);
                  report.setUnfreezeAmount(new BigDecimal(modelJson.optString("unfreeze_amount")));
                  report.setUnfreezeNum(modelJson.optInt("unfreeze_num"));
                  report.setRefundAmount(new BigDecimal(modelJson.optString("refund_amount")));
                  report.setRefundNum(modelJson.optInt("refund_num"));
                  report.setAlipayAmount(new BigDecimal(modelJson.optString("alipay_amount")));
                  report.setUseAmount(new BigDecimal(modelJson.optString("use_amount")));
                  report.setUseNum(modelJson.optInt("use_num"));
                  report.setWinAmount(new BigDecimal(modelJson.optString("win_amount")));
                  report.setWinNum(modelJson.optInt("win_num"));
                  report.setPreCommissionAmount(new BigDecimal(modelJson.optString("pre_commission_amount")));
                  return report;
               }
            }
         }
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
      }
      return null;
   }
   public static void getCouponByAuctionId(Long auctionId) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.itemid.coupon.get");
      map.put("platform", 2 + "");
      map.put("pid", TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID);
      map.put("num_iids", auctionId + "");
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
         System.out.print(json);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   /**
    * 获取淘宝系统时间
    *
    * @return
    */
   public static Date getTaoBaoSystemTime() {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.time.get");
      try {
         JSONObject json = TaoKeBaseUtil.baseRequest(map, false);
         String time = json.optJSONObject("time_get_response").optString("time");
         return new Date(TimeUtil.convertToTimeTemp(time, "yyyy-MM-dd HH:mm:ss"));
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    * 官方活动推广
    *
    * @param adZoneId
    *            -广告位
    * @param promotionSceneId-活动ID
    * @param relationId
    *            -渠道ID
    * @return
    */
   public static String officialActivityConvert(String adZoneId, String promotionSceneId, String relationId) {
      Map<String, String> map = new HashMap<>();
      map.put("method", "taobao.tbk.activitylink.get");
      map.put("adzone_id", adZoneId);
      map.put("promotion_scene_id", promotionSceneId);
      if (relationId != null)
         map.put("relation_id", relationId);
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      try {
         String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
         JSONObject json = JSONObject.fromObject(result);
         if (json != null) {
            json = json.optJSONObject("tbk_activitylink_get_response");
            if (json.optInt("result_code") == 200) {
               return json.optString("data");
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
}
class QuanInfo {
   public String coupon_start_time;// 开始时间
   public String coupon_end_time; // 券结束时间
   public BigDecimal coupon_amount;// 券金额
   public int coupon_total_count;// 券总数量
   public int coupon_remain_count;// 券剩余数量
   public BigDecimal coupon_start_fee;// 券起始金额
}
package com.yeshi.fanli.util.taobao;
import com.google.gson.Gson;
import com.yeshi.common.entity.PageEntity;
import com.yeshi.common.entity.taobao.TaoBaoShopInfo;
import com.yeshi.common.entity.taobao.TaoKeAppInfo;
import com.yeshi.fanli.dto.taobao.TaoLiJinDTO;
import com.yeshi.fanli.dto.taobao.api.TaoKeOfficialActivityConvertResultDTO;
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinReport;
import com.yeshi.fanli.entity.taobao.*;
import com.yeshi.fanli.exception.taobao.TaoBaoAuthException;
import com.yeshi.fanli.exception.taobao.TaoBaoTokenParseException;
import com.yeshi.fanli.exception.taobao.TaoKeApiException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.exception.tlj.TaoLiJinCreateException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.log.TLJLogHelper;
import com.yeshi.fanli.log.TaoKeLogHelper;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.goods.facade.dto.taobao.TaoBaoShopInfoDTO;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.goods.facade.entity.taobao.TaoBaoHead;
import com.yeshi.goods.facade.utils.taobao.DaTaoKeApiUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.MoneyBigDecimalUtil;
import org.yeshi.utils.NumberUtil;
import org.yeshi.utils.TimeUtil;
import org.yeshi.utils.taobao.TbImgUtil;
import java.math.BigDecimal;
import java.util.*;
//淘宝客API接口
public class TaoKeApiUtil {
    /**
     * 获取商品详情,简版
     *
     * @param id -商品AuctionId
     * @return
     */
    public static TaoBaoGoodsBrief getSimpleGoodsInfo(String id) throws TaobaoGoodsDownException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.item.info.get");
        map.put("num_iids", id + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
        JSONObject data = JSONObject.fromObject(resultStr);
        // 商品下架
        if (data.optJSONObject("error_response") != null && data.optJSONObject("error_response").optInt("code") == 15
                && data.optJSONObject("error_response").optInt("sub_code") == 50001) {
            throw new TaobaoGoodsDownException(data.optJSONObject("error_response").optInt("code"), "商品下架");
        }
        //TODO 修改临时接口 tbk_item_info_get_response
        if (data.optJSONObject("tbk_item_info_get_response") == null)
            return null;
        JSONArray array = data.optJSONObject("tbk_item_info_get_response").optJSONObject("results")
                .optJSONArray("n_tbk_item");
        if (array != null && array.size() > 0) {
            JSONObject item = array.optJSONObject(0);
            TaoBaoGoodsBrief goods = parseSimpleGoodsInfo(item);
            if (goods != null && !NumberUtil.isNumeric(id)) {
                goods.setAuctionId(id);
            }
            return goods;
        }
        return null;
    }
    // 获取商品详情自购
    public static TaoBaoGoodsBrief getSimpleGoodsInfoForOwnBuy(String id) throws TaobaoGoodsDownException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.item.info.get");
        map.put("num_iids", id + "");
        String resultStr = null;
        if (!NumberUtil.isNumeric(id)) {
            resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        } else {
            map.put("biz_scene_id", "2");
            resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, TaoBaoConstant.getSpecialAuthAppInfo(TaoBaoConstant.TAOBAO_PID_DEFAULT));
        }
        System.out.println(resultStr);
        JSONObject data = JSONObject.fromObject(resultStr);
        // 商品下架
        if (data.optJSONObject("error_response") != null && data.optJSONObject("error_response").optInt("code") == 15
                && data.optJSONObject("error_response").optInt("sub_code") == 50001) {
            throw new TaobaoGoodsDownException(data.optJSONObject("error_response").optInt("code"), "商品下架");
        }
        //TODO 修改临时接口 tbk_item_info_get_response
        if (data.optJSONObject("tbk_item_info_get_response") == null)
            return null;
        JSONArray array = data.optJSONObject("tbk_item_info_get_response").optJSONObject("results")
                .optJSONArray("n_tbk_item");
        if (array != null && array.size() > 0) {
            JSONObject item = array.optJSONObject(0);
            TaoBaoGoodsBrief goods = parseSimpleGoodsInfo(item);
            if (goods != null && !NumberUtil.isNumeric(id)) {
                goods.setAuctionId(id);
            }
            return goods;
        }
        return null;
    }
    private static TaoBaoGoodsBrief parseSimpleGoodsInfo(JSONObject item) {
        TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
        goods.setAuctionId(item.optString("num_iid"));
        goods.setAuctionUrl(item.optString("item_url"));
        if (item.containsKey("annual_vol")) {
            goods.setBiz30day(item.optInt("annual_vol") / 12);
        } else {
            goods.setBiz30day(item.optInt("volume"));
        }
        if (item.optJSONObject("small_images") != null) {
            JSONArray imgArray = item.optJSONObject("small_images").optJSONArray("string");
            if (imgArray != null) {
                List<String> imgList = new ArrayList<>();
                for (int n = 0; n < imgArray.size(); n++) {
                    imgList.add(imgArray.optString(n));
                }
                goods.setImgList(imgList);
            }
        }
        goods.setTitle(item.optString("title"));
        goods.setUserType(item.optInt("user_type"));
        goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
        goods.setReservePrice(new BigDecimal(item.optString("zk_final_price")));
        goods.setAuctionUrl(item.optString("item_url"));
        goods.setProvcity(item.optString("provcity"));
        goods.setPictUrl(item.optString("pict_url"));
        goods.setShopTitle(item.optString("nick"));
        goods.setSellerId(item.optLong("seller_id"));
        goods.setRootCategoryName(item.optString("cat_name"));
        goods.setLeafName(item.optString("cat_leaf_name"));
        String optString = item.optString("shop_dsr");
        if (!StringUtil.isNullOrEmpty(optString)) {
            goods.setShopDsr(new Integer(optString));
        }
        String ratesum = item.optString("ratesum");
        if (!StringUtil.isNullOrEmpty(ratesum)) {
            goods.setRatesum(new Integer(ratesum));
        }
        if (item.optBoolean("is_prepay"))
            goods.setIsPrepay(1);
        if (item.optBoolean("i_rfd_rate"))
            goods.setRfdRate(1);
        if (item.optBoolean("h_good_rate"))
            goods.setGoodRate(1);
        if (item.optBoolean("h_pay_rate30"))
            goods.setPayRate30(1);
        if (item.optBoolean("free_shipment"))
            goods.setFreeShipment(1);
        goods.setMaterialLibTypes(item.optString("material_lib_type"));
        if (!StringUtil.isNullOrEmpty(item.optString("material_lib_type"))) {
            try {
                String materialLibType = item.optString("material_lib_type");
                goods.setMaterialLibType(Integer.parseInt(materialLibType.split(",")[0]));
            } catch (Exception e) {
                goods.setMaterialLibType(0);
            }
        } else
            goods.setMaterialLibType(0);
        goods.setRootCategoryName(item.optString("cat_name"));
        goods.setLeafName(item.optString("cat_leaf_name"));
        goods = loadYuShouInfo(goods, item);
        return goods;
    }
    private static TaoBaoGoodsBrief loadYuShouInfo(TaoBaoGoodsBrief goods, JSONObject item) {
        if (goods != null && item != null) {
            JSONObject preSaleInfo = item.optJSONObject("presale_info");
            if (preSaleInfo != null) {
                // 预售相关解析
                goods.setYsylClickUrl(item.optString("ysyl_click_url"));
                if (!StringUtil.isNullOrEmpty(item.optString("ysyl_commission_rate")))
                    goods.setYsylCommissionRate(new BigDecimal(item.optString("ysyl_commission_rate")));
                goods.setYsylTljFace(item.optString("ysyl_tlj_face"));
                goods.setYsylTljSendTime(item.optString("ysyl_tlj_send_time"));
                goods.setYsylTljUseEndTime(item.optString("ysyl_tlj_use_end_time"));
                goods.setYsylTljUseStartTime(item.optString("ysyl_tlj_use_start_time"));
                goods.setPresaleDeposit(preSaleInfo.optString("presale_deposit"));
                goods.setPresaleDiscountFeeText(preSaleInfo.optString("presale_discount_fee_text"));
                goods.setPresaleEndTime(preSaleInfo.optString("presale_end_time"));
                goods.setPresaleStartTime(preSaleInfo.optString("presale_start_time"));
                goods.setPresaleTailEndTime(preSaleInfo.optString("presale_tail_end_time"));
                goods.setPresaleTailStartTime(preSaleInfo.optString("presale_tail_start_time"));
                return goods;
            }
        }
        return goods;
    }
    public static List<TaoBaoGoodsBrief> getBatchGoodsInfo(List<String> listId)
            throws TaoKeApiException, TaobaoGoodsDownException {
        if (listId == null || listId.size() == 0) {
            throw new TaobaoGoodsDownException(1, "淘宝商品ID不能为空");
        }
        if (listId.size() > 40) {
            throw new TaobaoGoodsDownException(1, "淘宝商品ID不能超过40个");
        }
        StringBuffer ids = new StringBuffer();
        for (String id : listId) {
            ids.append(id + ",");
        }
        return getBatchGoodsInfos(ids.substring(0, ids.length() - 1));
    }
    /**
     * 获取商品详情,简版
     *
     * @param ids
     * @return
     * @throws TaobaoGoodsDownException
     */
    public static List<TaoBaoGoodsBrief> getBatchGoodsInfos(String ids) throws TaobaoGoodsDownException {
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.item.info.get");
        map.put("num_iids", ids + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject data = JSONObject.fromObject(resultStr);
        // 商品下架
        if (data.optJSONObject("error_response") != null && data.optJSONObject("error_response").optInt("code") == 15
                && data.optJSONObject("error_response").optInt("sub_code") == 50001) {
            throw new TaobaoGoodsDownException(data.optJSONObject("error_response").optInt("code"), "商品下架");
        }
        if (data.optJSONObject("tbk_item_info_get_response") == null)
            return null;
        JSONArray array = data.optJSONObject("tbk_item_info_get_response").optJSONObject("results")
                .optJSONArray("n_tbk_item");
        if (array != null && array.size() > 0) {
            for (int i = 0; i < array.size(); i++) {
                JSONObject item = array.optJSONObject(i);
                goodsList.add(parseSimpleGoodsInfo(item));
            }
        }
        return goodsList;
    }
    public static List<TaoBaoGoodsBrief> getBatchGoodsInfo(List<Long> listId, String ip)
            throws TaoKeApiException, TaobaoGoodsDownException {
        if (listId == null || listId.size() == 0) {
            throw new TaobaoGoodsDownException(1, "淘宝商品ID不能为空");
        }
        if (listId.size() > 40) {
            throw new TaobaoGoodsDownException(1, "淘宝商品ID不能超过40个");
        }
        StringBuffer ids = new StringBuffer();
        for (Long id : listId) {
            ids.append(id + ",");
        }
        return getBatchGoodsInfos(ids.substring(0, ids.length() - 1), ip);
    }
    /**
     * 获取商品详情,简版
     *
     * @param ids
     * @param ip
     * @return
     * @throws TaobaoGoodsDownException
     */
    public static List<TaoBaoGoodsBrief> getBatchGoodsInfos(String ids, String ip) throws TaobaoGoodsDownException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.item.info.get");
        map.put("num_iids", ids + "");
        if (!StringUtil.isNullOrEmpty(ip)) {
            map.put("ip", ip);
        }
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject data = JSONObject.fromObject(resultStr);
        // 商品下架
        if (data.optJSONObject("error_response") != null && data.optJSONObject("error_response").optInt("code") == 15
                && data.optJSONObject("error_response").optInt("sub_code") == 50001) {
            throw new TaobaoGoodsDownException(data.optJSONObject("error_response").optInt("code"), "商品下架");
        }
        if (data.optJSONObject("tbk_item_info_get_response") == null)
            return null;
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        JSONArray array = data.optJSONObject("tbk_item_info_get_response").optJSONObject("results")
                .optJSONArray("n_tbk_item");
        if (array != null && array.size() > 0) {
            for (int i = 0; i < array.size(); i++) {
                JSONObject item = array.optJSONObject(i);
                goodsList.add(parseSimpleGoodsInfo(item));
            }
        }
        return goodsList;
    }
    /**
     * 搜索商品详情-详细
     *
     * @param id
     * @return
     * @throws TaobaoGoodsDownException
     */
    public static TaoBaoGoodsBrief searchGoodsDetail(String id, String specialId, String relationId) throws TaobaoGoodsDownException {
        TaoBaoGoodsBrief goods = getSimpleGoodsInfo(id);
        if (goods == null)
            return null;
        SearchFilter filter = new SearchFilter();
        filter.setKey(goods.getTitle());
        filter.setPage(1);
        filter.setPageSize(50);
        TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
                goods.getUserType(), specialId, relationId);
        if (result != null && result.getTaoBaoGoodsBriefs() != null)
            for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
                System.out.println(goods.getAuctionId() + ":" + g.getAuctionId());
                if (TaoBaoUtil.isEqual(goods.getAuctionId(), g.getAuctionId())) {
                    g.setAuctionId(goods.getAuctionId());
                    g.setCreatetime(new Date());
                    g.setMaterialLibType(goods.getMaterialLibType());
                    g.setProvcity(goods.getProvcity());
                    return g;
                }
            }
        // 从转链搜索
        TaoBaoGoodsBrief newGoods = specialConvertCouponV2(goods.getAuctionId(),
                new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
                        TaoBaoConstant.TAOBAO_PID_DEFAULT), specialId, relationId);
        if (newGoods != null) {
            goods.setTkRate(newGoods.getTkRate());
            if (!StringUtil.isNullOrEmpty(newGoods.getCouponInfo())) {
                List<BigDecimal> couponInfo = TaoBaoCouponUtil.getCouponInfo(newGoods.getCouponInfo());
                if (couponInfo != null && couponInfo.size() > 1) {
                    goods.setCouponStartFee(couponInfo.get(0));
                    goods.setCouponAmount(couponInfo.get(1));
                    goods.setCouponEffectiveStartTime(newGoods.getCouponEffectiveStartTime());
                    goods.setCouponEffectiveEndTime(newGoods.getCouponEffectiveEndTime());
                    goods.setCouponLeftCount(newGoods.getCouponLeftCount());
                    goods.setCouponTotalCount(newGoods.getCouponTotalCount());
                    goods.setCouponInfo(newGoods.getCouponInfo());
                }
            }
            return goods;
        } else {
            goods.setCouponAmount(new BigDecimal("0"));
            goods.setTkMktStatus("1");
            goods.setTkRate(new BigDecimal("0"));
            goods.setReservePrice(new BigDecimal(0));
            goods.setTkCommFee(new BigDecimal(0));
            return goods;
        }
    }
    public static TaoBaoGoodsBrief searchGoodsDetail(String id) throws TaobaoGoodsDownException {
        return searchGoodsDetail(id, null, null);
    }
    /**
     * 搜索商品详情-详细
     *
     * @param id
     * @return
     * @throws TaobaoGoodsDownException
     */
    public static TaoBaoGoodsBrief searchGoodsDetail(String id, TaoKeAppInfo app) throws TaobaoGoodsDownException {
        TaoBaoGoodsBrief goods = getSimpleGoodsInfo(id);
        if (goods == null)
            return null;
        SearchFilter filter = new SearchFilter();
        filter.setKey(goods.getTitle());
        filter.setPage(1);
        filter.setPageSize(50);
        TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
                goods.getUserType(), app, null, null);
        if (result != null && result.getTaoBaoGoodsBriefs() != null)
            for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
                if (TaoBaoUtil.isEqual(goods.getAuctionId(), g.getAuctionId())) {
                    g.setAuctionId(goods.getAuctionId());
                    // 判断是否有优惠券
                    if (!StringUtil.isNullOrEmpty(g.getCouponActivityId())) {
                        // 获取优惠券详情
                        QuanInfo quanInfo = getQuanInfo(g.getAuctionId(), g.getCouponActivityId());
                        if (quanInfo != null) {
                            g.setCouponAmount(quanInfo.coupon_amount);
                            g.setCouponEffectiveEndTime(quanInfo.coupon_end_time);
                            g.setCouponEffectiveStartTime(quanInfo.coupon_start_time);
                            g.setCouponLeftCount(quanInfo.coupon_remain_count);
                            g.setCouponStartFee(quanInfo.coupon_start_fee);
                            g.setCouponTotalCount(quanInfo.coupon_total_count);
                        }
                    } else {
                        g.setCouponAmount(new BigDecimal(0));
                        g.setCouponStartFee(new BigDecimal(0));
                    }
                    g.setCreatetime(new Date());
                    g.setMaterialLibType(goods.getMaterialLibType());
                    g.setProvcity(goods.getProvcity());
                    return g;
                }
            }
        // 从转链搜索
        TaoBaoGoodsBrief newGoods = specialConvertCouponV2(goods.getAuctionId(),
                new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
                        TaoBaoConstant.TAOBAO_PID_DEFAULT), null, null);
        if (newGoods != null) {
            goods.setTkRate(newGoods.getTkRate());
            goods.setAuctionUrl(newGoods.getAuctionUrl());
            goods.setCouponLink(newGoods.getCouponLink());
            if (!StringUtil.isNullOrEmpty(newGoods.getCouponInfo())) {
                List<BigDecimal> couponInfo = TaoBaoCouponUtil.getCouponInfo(newGoods.getCouponInfo());
                if (couponInfo != null && couponInfo.size() > 1) {
                    goods.setCouponStartFee(couponInfo.get(0));
                    goods.setCouponAmount(couponInfo.get(1));
                    goods.setCouponEffectiveStartTime(newGoods.getCouponEffectiveStartTime());
                    goods.setCouponEffectiveEndTime(newGoods.getCouponEffectiveEndTime());
                    goods.setCouponLeftCount(newGoods.getCouponLeftCount());
                    goods.setCouponTotalCount(newGoods.getCouponTotalCount());
                    goods.setCouponInfo(newGoods.getCouponInfo());
                }
            }
            return goods;
        } else {
            goods.setCouponAmount(new BigDecimal("0"));
            goods.setTkMktStatus("1");
            goods.setTkRate(new BigDecimal("0"));
            goods.setReservePrice(new BigDecimal(0));
            goods.setTkCommFee(new BigDecimal(0));
            return goods;
        }
    }
    /**
     * 物料转链
     *
     * @param id
     * @param app
     * @return
     * @throws TaobaoGoodsDownException
     */
    public static TaoBaoGoodsBrief searchGoodsDetailForConvert(String id, TaoKeAppInfo app, String specialId, String relationId)
            throws TaobaoGoodsDownException {
        TaoBaoGoodsBrief goods = getSimpleGoodsInfo(id);
        if (goods == null)
            return null;
        SearchFilter filter = new SearchFilter();
        filter.setKey(goods.getTitle());
        filter.setPage(1);
        filter.setPageSize(50);
        TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
                goods.getUserType(), app, specialId, relationId);
        if (result != null && result.getTaoBaoGoodsBriefs() != null)
            for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
                if (TaoBaoUtil.isEqual(goods.getAuctionId(), g.getAuctionId())) {
                    g.setAuctionId(goods.getAuctionId());
                    g.setCreatetime(new Date());
                    return g;
                }
            }
        TaoKeLogHelper.error(null, "没有搜索到详情:" + id);
        goods.setCouponAmount(new BigDecimal("0"));
        goods.setTkMktStatus("1");
        goods.setTkRate(new BigDecimal("0"));
        goods.setReservePrice(new BigDecimal(0));
        goods.setTkCommFee(new BigDecimal(0));
        return goods;
    }
    public static List<TaoBaoGoodsBrief> searchBatchGoodsDetail(String ids) throws TaobaoGoodsDownException {
        List<TaoBaoGoodsBrief> goodsBriefList = getBatchGoodsInfos(ids);
        if (goodsBriefList == null || goodsBriefList.size() == 0) {
            return null;
        }
        // System.out.println("---------goodsBriefList--------------:"+
        // goodsBriefList.size());
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        for (TaoBaoGoodsBrief goods : goodsBriefList) {
            boolean pross = false;
            SearchFilter filter = new SearchFilter();
            filter.setKey(goods.getTitle());
            filter.setPage(1);
            filter.setPageSize(50);
            TaoBaoSearchResult result = searchWuLiaoForDetail(goods.getTitle(), goods.getZkPrice(), goods.getProvcity(),
                    goods.getUserType(), null, null);
            if (result != null && result.getTaoBaoGoodsBriefs() != null)
                for (TaoBaoGoodsBrief g : result.getTaoBaoGoodsBriefs()) {
                    if (TaoBaoUtil.isEqual(goods.getAuctionId(), g.getAuctionId())) {
                        g.setAuctionId(goods.getAuctionId());
                        g.setAuctionUrl(goods.getAuctionUrl());
                        g.setShopTitle(goods.getShopTitle());
                        // 判断是否有优惠券
                        if (!StringUtil.isNullOrEmpty(g.getCouponActivityId())) {
                            // 获取优惠券详情
                            QuanInfo quanInfo = getQuanInfo(g.getAuctionId(), g.getCouponActivityId());
                            if (quanInfo != null) {
                                g.setCouponAmount(quanInfo.coupon_amount);
                                g.setCouponEffectiveEndTime(quanInfo.coupon_end_time);
                                g.setCouponEffectiveStartTime(quanInfo.coupon_start_time);
                                g.setCouponLeftCount(quanInfo.coupon_remain_count);
                                g.setCouponStartFee(quanInfo.coupon_start_fee);
                                g.setCouponTotalCount(quanInfo.coupon_total_count);
                            }
                        } else {
                            g.setCouponAmount(new BigDecimal(0));
                            g.setCouponStartFee(new BigDecimal(0));
                        }
                        g.setCreatetime(new Date());
                        goodsList.add(g);
                        pross = true;
                        break;
                    }
                }
            if (pross)
                continue;
            // 再从淘宝联盟网页搜索
            filter.setKey(goods.getAuctionUrl());
            TaoBaoSearchResult searchResult = TaoBaoUtil.searchFromAlimamaWeb(filter, null);
            if (searchResult != null && searchResult.getTaoBaoGoodsBriefs() != null
                    && searchResult.getTaoBaoGoodsBriefs().size() > 0) {
                for (TaoBaoGoodsBrief g : searchResult.getTaoBaoGoodsBriefs()) {
                    if (TaoBaoUtil.isEqual(g.getAuctionId(), goods.getAuctionId())) {
                        g.setImgList(goods.getImgList());
                        g.setAuctionId(goods.getAuctionId());
                        g.setAuctionUrl(goods.getAuctionUrl());
                        g.setShopTitle(goods.getShopTitle());
                        goods = g;
                        if ("无".equalsIgnoreCase(goods.getCouponInfo()))
                            goods.setCouponInfo(null);
                        goodsList.add(goods);
                        pross = true;
                        break;
                    }
                }
            }
            if (pross)
                continue;
            goods.setCouponAmount(new BigDecimal("0"));
            goods.setTkMktStatus("1");
            goods.setTkRate(new BigDecimal("0"));
            goods.setReservePrice(new BigDecimal(0));
            goods.setTkCommFee(new BigDecimal(0));
            goodsList.add(goods);
        }
        return goodsList;
    }
    /**
     * 商品物料搜索
     *
     * @param filter
     * @param specialId
     * @param relationId
     * @return
     */
    public static TaoBaoSearchResult searchWuLiao(SearchFilter filter, String specialId, String relationId) {
        if (filter.getKey() != null && filter.getKey().trim().equalsIgnoreCase(""))
            return null;
//        if (filter.getKey() != null && filter.getKey().length() > 100)
//            return null;
        PageEntity pageEntity = new PageEntity();
        TaoBaoSearchResult taoBaoSearchResult = new TaoBaoSearchResult();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.material.optional");
        map.put("page_size", filter.getPageSize() == 0 ? "20" : filter.getPageSize() + "");
        map.put("page_no", (filter.getPage() <= 0 ? 1 : filter.getPage()) + "");
        //1-动态ID转链场景,2-消费者比价场景(不填默认为1)
//        map.put("biz_scene_id","2");
//        map.put("promotion_type","1");
        if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(specialId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(relationId)) {
            map.put("relation_id", relationId);
        }
        // map.put("material_id", "3756");
        pageEntity.setPageIndex(filter.getPage());
        pageEntity.setPageSize(filter.getPageSize() == 0 ? 20 : filter.getPageSize());
        // 包含了地区筛选
        if (filter.getProvinceId() > 0) {
            List<TaoBaoProvince> provinceList = TaoBaoUtil.getTaoBaoProvinceList();
            for (TaoBaoProvince province : provinceList) {
                if (Integer.parseInt(province.getId()) == filter.getProvinceId()) {
                    map.put("itemloc", province.getName());
                    break;
                }
            }
        }
        if (filter.getMaterialId() != null)
            map.put("material_id", filter.getMaterialId());
        if (filter.getStartPrice() != null)
            map.put("start_price", filter.getStartPrice() + "");
        if (filter.getEndPrice() != null)
            map.put("end_price", filter.getEndPrice() + "");
        if (filter.getStartTkRate() > 0)
            map.put("start_tk_rate", filter.getStartTkRate() + "");
        if (filter.getEndTkRate() > 0)
            map.put("end_tk_rate", filter.getEndTkRate() + "");
        if (filter.getStartKaTkRate() > 0)
            map.put("start_ka_tk_rate", filter.getStartKaTkRate() + "");
        if (filter.getEndKaTkRate() > 0)
            map.put("end_ka_tk_rate", filter.getEndKaTkRate() + "");
        if (filter.isTmall())
            map.put("is_tmall", filter.isTmall() + "");
        if (filter.isOverseas())
            map.put("is_overseas", filter.isOverseas() + "");
        if (filter.isBaoYou())
            map.put("need_free_shipment", filter.isBaoYou() + "");
        if (filter.isNeedPrepay())
            map.put("need_prepay", filter.isNeedPrepay() + "");
        if (filter.isIncludePayRate30())
            map.put("include_pay_rate_30", filter.isIncludePayRate30() + "");
        if (filter.isIncludeGoodRate())
            map.put("include_good_rate", filter.isIncludeGoodRate() + "");
        if (filter.isIncludeRfdRate())
            map.put("include_rfd_rate", filter.isIncludeRfdRate() + "");
        if (filter.getStartDsr() > 0)
            map.put("start_dsr", filter.getStartDsr() + "");
        if (filter.getNpxLevel() > 0)
            map.put("npx_level", filter.getNpxLevel() + "");
        if (!StringUtil.isNullOrEmpty(filter.getCateIds()))
            map.put("cat", filter.getCateIds());
        if (!StringUtil.isNullOrEmpty(filter.getKey()))
            map.put("q", filter.getKey());
        if (filter.getQuan() > 0)
            map.put("has_coupon", true + "");
        if (!StringUtil.isNullOrEmpty(filter.getIp()))
            map.put("ip", filter.getIp());
        if (filter.getSort() > 0) {
            if (filter.getSort() == TaoBaoUtil.SORT_SALE_HIGH_TO_LOW) {
                map.put("sort", "total_sales_des"); // 销量从高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_SALE_LOW_TO_HIGH) {
                map.put("sort", "total_sales_asc"); // 销量从低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_PRICE_HIGH_TO_LOW) {
                map.put("sort", "price_des"); // 价格从高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_PRICE_LOW_TO_HIGH) {
                map.put("sort", "price_asc"); // 价格从低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_TKRATE_HIGH_TO_LOW) {
                map.put("sort", "tk_rate_des"); // 淘客佣金比率高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_TKRATE_LOW_TO_HIGH) {
                map.put("sort", "tk_rate_asc"); // 淘客佣金比率低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_COMMI_HIGH_TO_LOW) {
                map.put("sort", "tk_total_commi_des"); // 总支出佣金高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_COMMI_LOW_TO_HIGH) {
                map.put("sort", "tk_total_commi_asc"); // 总支出佣金低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_SALES_HIGH_TO_LOW) {
                map.put("sort", "tk_total_sales_des"); // 累计推广量高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_SALES_LOW_TO_HIGH) {
                map.put("sort", "tk_total_sales_asc"); // 累计推广量低到高
            }
        }
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println("resultStr" + resultStr);
        JSONObject data = JSONObject.fromObject(resultStr);
        //TODO 临时接口tbk_dg_material_optional_response
        if (data.optJSONObject("tbk_dg_material_optional_response") != null
                && data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list") != null) {
            JSONArray array = data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list")
                    .optJSONArray("map_data");
            List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    TaoBaoGoodsBrief goods = parseWuLiaoItem(array.optJSONObject(i));
                    if (goods != null)
                        goodsList.add(goods);
                }
            }
            taoBaoSearchResult.setTaoBaoGoodsBriefs(goodsList);
            JSONObject optJSONObject = data.optJSONObject("tbk_dg_material_optional_response");
            int totalResults = optJSONObject.getInt("total_results");
            int totalPage = totalResults % pageEntity.getPageSize() == 0 ? totalResults / pageEntity.getPageSize()
                    : totalResults / pageEntity.getPageSize() + 1;
            pageEntity.setTotalCount(totalResults);
            pageEntity.setTotalPage(totalPage);
        }
        List<TaoBaoSearchNav> navList = new ArrayList<>();
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound((int) pageEntity.getTotalCount());
        taoBaoSearchResult.setTaoBaoHead(taoBaoHead);
        taoBaoSearchResult.setPageEntity(pageEntity);
        // filter.get
        // 设置发货地址
        TaoBaoSearchNav nav = new TaoBaoSearchNav();
        nav.setName("发货地选择");
        nav.setFlag("address");
        nav.setId(11110);
        nav.setType("fahuodi");
        List<TaoBaoSearchNav> childNavList = new ArrayList<>();
        List<TaoBaoProvince> provinceList = TaoBaoUtil.getTaoBaoProvinceList();
        for (TaoBaoProvince province : provinceList) {
            TaoBaoSearchNav childNav = new TaoBaoSearchNav();
            childNav.setName(province.getName());
            childNav.setId(Integer.parseInt(province.getId()));
            childNav.setType("fahuodi-child");
            if (Integer.parseInt(province.getId()) == filter.getProvinceId())
                childNav.setSelector(1);
            childNavList.add(childNav);
        }
        nav.setSubIds(childNavList);
        navList.add(nav);
        // 测试
        taoBaoSearchResult.setNavList(navList);
        return taoBaoSearchResult;
    }
    public static TaoBaoSearchResult searchWuLiaoNew(SearchFilter filter, String specialId, String relationId) {
        if (filter.getKey() != null && filter.getKey().trim().equalsIgnoreCase(""))
            return null;
        PageEntity pageEntity = new PageEntity();
        TaoBaoSearchResult taoBaoSearchResult = new TaoBaoSearchResult();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.material.optional.upgrade");
        map.put("page_size", filter.getPageSize() == 0 ? "20" : filter.getPageSize() + "");
        map.put("page_no", (filter.getPage() <= 0 ? 1 : filter.getPage()) + "");
        //1-动态ID转链场景,2-消费者比价场景(不填默认为1)
//        map.put("biz_scene_id","2");
//        map.put("promotion_type","1");
        if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(specialId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(relationId)) {
            map.put("relation_id", relationId);
        }
        // map.put("material_id", "3756");
        pageEntity.setPageIndex(filter.getPage());
        pageEntity.setPageSize(filter.getPageSize() == 0 ? 20 : filter.getPageSize());
        // 包含了地区筛选
        if (filter.getProvinceId() > 0) {
            List<TaoBaoProvince> provinceList = TaoBaoUtil.getTaoBaoProvinceList();
            for (TaoBaoProvince province : provinceList) {
                if (Integer.parseInt(province.getId()) == filter.getProvinceId()) {
                    map.put("itemloc", province.getName());
                    break;
                }
            }
        }
        if (filter.getMaterialId() != null)
            map.put("material_id", filter.getMaterialId());
        if (filter.getStartPrice() != null)
            map.put("start_price", filter.getStartPrice() + "");
        if (filter.getEndPrice() != null)
            map.put("end_price", filter.getEndPrice() + "");
        if (filter.getStartTkRate() > 0)
            map.put("start_tk_rate", filter.getStartTkRate() + "");
        if (filter.getEndTkRate() > 0)
            map.put("end_tk_rate", filter.getEndTkRate() + "");
        if (filter.getStartKaTkRate() > 0)
            map.put("start_ka_tk_rate", filter.getStartKaTkRate() + "");
        if (filter.getEndKaTkRate() > 0)
            map.put("end_ka_tk_rate", filter.getEndKaTkRate() + "");
        if (filter.isTmall())
            map.put("is_tmall", filter.isTmall() + "");
        if (filter.isOverseas())
            map.put("is_overseas", filter.isOverseas() + "");
        if (filter.isBaoYou())
            map.put("need_free_shipment", filter.isBaoYou() + "");
        if (filter.isNeedPrepay())
            map.put("need_prepay", filter.isNeedPrepay() + "");
        if (filter.isIncludePayRate30())
            map.put("include_pay_rate_30", filter.isIncludePayRate30() + "");
        if (filter.isIncludeGoodRate())
            map.put("include_good_rate", filter.isIncludeGoodRate() + "");
        if (filter.isIncludeRfdRate())
            map.put("include_rfd_rate", filter.isIncludeRfdRate() + "");
        if (filter.getStartDsr() > 0)
            map.put("start_dsr", filter.getStartDsr() + "");
        if (filter.getNpxLevel() > 0)
            map.put("npx_level", filter.getNpxLevel() + "");
        if (!StringUtil.isNullOrEmpty(filter.getCateIds()))
            map.put("cat", filter.getCateIds());
        if (!StringUtil.isNullOrEmpty(filter.getKey()))
            map.put("q", filter.getKey());
        if (filter.getQuan() > 0)
            map.put("has_coupon", true + "");
        if (!StringUtil.isNullOrEmpty(filter.getIp()))
            map.put("ip", filter.getIp());
        if (filter.getSort() > 0) {
            if (filter.getSort() == TaoBaoUtil.SORT_SALE_HIGH_TO_LOW) {
                map.put("sort", "total_sales_des"); // 销量从高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_SALE_LOW_TO_HIGH) {
                map.put("sort", "total_sales_asc"); // 销量从低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_PRICE_HIGH_TO_LOW) {
                map.put("sort", "price_des"); // 价格从高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_PRICE_LOW_TO_HIGH) {
                map.put("sort", "price_asc"); // 价格从低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_TKRATE_HIGH_TO_LOW) {
                map.put("sort", "tk_rate_des"); // 淘客佣金比率高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_TKRATE_LOW_TO_HIGH) {
                map.put("sort", "tk_rate_asc"); // 淘客佣金比率低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_COMMI_HIGH_TO_LOW) {
                map.put("sort", "tk_total_commi_des"); // 总支出佣金高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_COMMI_LOW_TO_HIGH) {
                map.put("sort", "tk_total_commi_asc"); // 总支出佣金低到高
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_SALES_HIGH_TO_LOW) {
                map.put("sort", "tk_total_sales_des"); // 累计推广量高到低
            } else if (filter.getSort() == TaoBaoUtil.SORT_TOTAL_SALES_LOW_TO_HIGH) {
                map.put("sort", "tk_total_sales_asc"); // 累计推广量低到高
            }
        }
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println("resultStr" + resultStr);
        JSONObject data = JSONObject.fromObject(resultStr);
        JSONObject rootData = data.optJSONObject("tbk_dg_material_optional_upgrade_response");
        if (rootData != null
                && rootData.optJSONObject("result_list") != null) {
            JSONArray array = rootData.optJSONObject("result_list")
                    .optJSONArray("map_data");
            List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    TaoBaoGoodsBrief goods = parseWuLiaoItemNew(array.optJSONObject(i));
                    if (goods != null)
                        goodsList.add(goods);
                }
            }
            taoBaoSearchResult.setTaoBaoGoodsBriefs(goodsList);
            int totalResults = rootData.getInt("total_results");
            int totalPage = totalResults % pageEntity.getPageSize() == 0 ? totalResults / pageEntity.getPageSize()
                    : totalResults / pageEntity.getPageSize() + 1;
            pageEntity.setTotalCount(totalResults);
            pageEntity.setTotalPage(totalPage);
        }
        List<TaoBaoSearchNav> navList = new ArrayList<>();
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound((int) pageEntity.getTotalCount());
        taoBaoSearchResult.setTaoBaoHead(taoBaoHead);
        taoBaoSearchResult.setPageEntity(pageEntity);
        // filter.get
        // 设置发货地址
        TaoBaoSearchNav nav = new TaoBaoSearchNav();
        nav.setName("发货地选择");
        nav.setFlag("address");
        nav.setId(11110);
        nav.setType("fahuodi");
        List<TaoBaoSearchNav> childNavList = new ArrayList<>();
        List<TaoBaoProvince> provinceList = TaoBaoUtil.getTaoBaoProvinceList();
        for (TaoBaoProvince province : provinceList) {
            TaoBaoSearchNav childNav = new TaoBaoSearchNav();
            childNav.setName(province.getName());
            childNav.setId(Integer.parseInt(province.getId()));
            childNav.setType("fahuodi-child");
            if (Integer.parseInt(province.getId()) == filter.getProvinceId())
                childNav.setSelector(1);
            childNavList.add(childNav);
        }
        nav.setSubIds(childNavList);
        navList.add(nav);
        // 测试
        taoBaoSearchResult.setNavList(navList);
        return taoBaoSearchResult;
    }
    /**
     * 商品物料搜索
     *
     * @param title
     * @param zkPrice
     * @param provcity
     * @param userType
     * @param specialId
     * @param relationId
     * @return
     */
    public static TaoBaoSearchResult searchWuLiaoForDetail(String title, BigDecimal zkPrice, String provcity,
                                                           int userType, String specialId, String relationId) {
        if (provcity.trim().contains(" "))
            provcity = provcity.split(" ")[provcity.split(" ").length - 1];
        TaoBaoSearchResult taoBaoSearchResult = new TaoBaoSearchResult();
        Map<String, String> map = new HashMap<>();
        //TODO 临时接口 taobao.tbk.dg.material.optional
        map.put("method", "taobao.tbk.dg.material.optional");
        map.put("page_size", 50 + "");
        map.put("page_no", 1 + "");
        map.put("start_price", (int) zkPrice.subtract(new BigDecimal(1)).doubleValue() + "");
        map.put("end_price", (int) zkPrice.add(new BigDecimal(1)).doubleValue() + "");
        map.put("is_tmall", (userType == 1) + "");
        map.put("q", title);
        map.put("itemloc", provcity);
        if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(specialId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(relationId)) {
            map.put("relation_id", relationId);
        }
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
        JSONObject data = JSONObject.fromObject(resultStr);
        //TODO 临时接口 tbk_dg_material_optional_response
        if (data.optJSONObject("tbk_dg_material_optional_response") != null
                && data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list") != null) {
            JSONArray array = data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list")
                    .optJSONArray("map_data");
            List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    TaoBaoGoodsBrief goods = parseWuLiaoItem(array.optJSONObject(i));
                    if (goods != null)
                        goodsList.add(goods);
                }
            }
            taoBaoSearchResult.setTaoBaoGoodsBriefs(goodsList);
        }
        List<TaoBaoSearchNav> navList = new ArrayList<>();
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound(1000);
        taoBaoSearchResult.setTaoBaoHead(taoBaoHead);
        taoBaoSearchResult.setPageEntity(new PageEntity());
        taoBaoSearchResult.setNavList(navList);
        return taoBaoSearchResult;
    }
    /**
     * 商品物料搜索
     *
     * @param title
     * @param zkPrice
     * @param provcity
     * @param userType
     * @param app
     * @param specialId
     * @param relationId
     * @return
     */
    public static TaoBaoSearchResult searchWuLiaoForDetail(String title, BigDecimal zkPrice, String provcity,
                                                           int userType, TaoKeAppInfo app, String specialId, String relationId) {
        if (provcity.trim().contains(" "))
            provcity = provcity.split(" ")[provcity.split(" ").length - 1];
        TaoBaoSearchResult taoBaoSearchResult = new TaoBaoSearchResult();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.material.optional");
        map.put("page_size", 50 + "");
        map.put("page_no", 1 + "");
        map.put("start_price", (int) zkPrice.subtract(new BigDecimal(1)).doubleValue() + "");
        map.put("end_price", (int) zkPrice.add(new BigDecimal(1)).doubleValue() + "");
        map.put("is_tmall", (userType == 1) + "");
        map.put("q", title);
        map.put("itemloc", provcity);
        if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(specialId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(relationId)) {
            map.put("relation_id", relationId);
        }
        if (app != null && app.getPid() != null) {
            map.put("adzone_id", app.getPid().split("_")[3]);
        }
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
        System.out.println(resultStr);
        JSONObject data = JSONObject.fromObject(resultStr);
        if (data.optJSONObject("tbk_dg_material_optional_response") != null
                && data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list") != null) {
            JSONArray array = data.optJSONObject("tbk_dg_material_optional_response").optJSONObject("result_list")
                    .optJSONArray("map_data");
            List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    TaoBaoGoodsBrief goods = parseWuLiaoItem(array.optJSONObject(i));
                    if (goods != null)
                        goodsList.add(goods);
                }
            }
            taoBaoSearchResult.setTaoBaoGoodsBriefs(goodsList);
        }
        List<TaoBaoSearchNav> navList = new ArrayList<>();
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound(1000);
        taoBaoSearchResult.setTaoBaoHead(taoBaoHead);
        taoBaoSearchResult.setPageEntity(new PageEntity());
        taoBaoSearchResult.setNavList(navList);
        return taoBaoSearchResult;
    }
    // 解析物料
    public static TaoBaoGoodsBrief parseWuLiaoItem(JSONObject item) {
        TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
        goods.setPictUrl(item.optString("pict_url"));
        if (!StringUtil.isNullOrEmpty(item.optString("white_image"))) {
            goods.setPictUrlWhite(item.optString("white_image"));
        }
        goods.setAuctionId(item.optString("num_iid"));
        goods.setAuctionUrl("https:" + item.optString("url"));
        if (item.containsKey("annual_vol")) {
            goods.setBiz30day(item.optInt("annual_vol") / 100);
        } else {
            goods.setBiz30day(item.optInt("volume"));
        }
        goods.setCouponInfo(item.optString("coupon_info"));
        if (goods.getCouponInfo() != null)
            goods.setCouponInfo(goods.getCouponInfo().replace(".00", ""));
        if (!StringUtil.isNullOrEmpty(goods.getCouponInfo())) {
            List<BigDecimal> quanInfo = TaoBaoCouponUtil.getCouponInfo(goods.getCouponInfo());
            goods.setCouponAmount(quanInfo.get(1));
            goods.setCouponEffectiveEndTime(item.optString("coupon_end_time"));
            goods.setCouponEffectiveStartTime(item.optString("coupon_start_time"));
            goods.setCouponStartFee(new BigDecimal(item.optString("coupon_start_fee")));
            goods.setCouponLeftCount(item.optInt("coupon_remain_count"));
            goods.setCouponLink("https:" + item.optString("coupon_share_url"));
            goods.setCouponTotalCount(item.optInt("coupon_total_count"));
            goods.setCouponActivityId(item.optString("coupon_id"));
        } else {
            goods.setCouponAmount(new BigDecimal(0));
        }
        goods.setDayLeft(-1);
        if (item.optJSONObject("small_images") != null) {
            JSONArray imgArray = item.optJSONObject("small_images").optJSONArray("string");
            if (imgArray != null) {
                List<String> imgList = new ArrayList<>();
                for (int n = 0; n < imgArray.size(); n++) {
                    imgList.add(imgArray.optString(n));
                }
                goods.setImgList(imgList);
            }
        }
        if (item.optBoolean("include_mkt"))
            goods.setTkMktStatus("1");
        else
            goods.setTkMktStatus("0");
        if (item.optBoolean("include_dxjh"))
            goods.setIncludeDxjh(1);
        goods.setSellerId(item.optLong("seller_id"));
        goods.setShopTitle(item.optString("shop_title"));
        goods.setTitle(item.optString("title"));
        goods.setProvcity(item.optString("provcity"));
        if (!StringUtil.isNullOrEmpty(item.optString("level_one_category_id"))) {
            goods.setRootCatId(item.optInt("level_one_category_id"));
        }
        goods.setRootCategoryName(item.optString("level_one_category_name"));
        if (!StringUtil.isNullOrEmpty(item.optString("category_id"))) {
            goods.setLeafCatId(item.optInt("category_id"));
        }
        goods.setLeafName(item.optString("category_name"));
        goods.setTkRate(new BigDecimal(item.optString("commission_rate")).divide(new BigDecimal(100)));
        goods.setTotalNum(1000);
        goods.setUserType(item.optInt("user_type"));
        goods.setUserTypeName("");
        goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
        if (item.optBoolean("include_dxjh")) {
            goods.setDxjhInfo(item.optString("info_dxjh"));
        }
        if (StringUtil.isNullOrEmpty(goods.getCouponInfo())) {// 无券
            goods.setTkCommFee(goods.getZkPrice().multiply(goods.getTkRate()).divide(new BigDecimal(100)));
        } else if (goods.getZkPrice().compareTo(goods.getCouponStartFee()) >= 0// 有券
                && goods.getZkPrice().compareTo(goods.getCouponAmount()) >= 0) {
            BigDecimal finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
            goods.setTkCommFee(finalPrice.multiply(goods.getTkRate()).divide(new BigDecimal(100)));
        } else {
            goods.setTkCommFee(new BigDecimal(0));
        }
        if (!StringUtil.isNullOrEmpty(item.optString("reserve_price")))
            goods.setReservePrice(new BigDecimal(item.optString("reserve_price")));
        goods.setTotalFee(new BigDecimal("0"));
        // 推荐语
        goods.setDescription(item.optString("item_description"));
        goods = loadYuShouInfo(goods, item);
        return goods;
    }
    public static TaoBaoGoodsBrief parseWuLiaoItemNew(JSONObject item) {
        JSONObject basicInfo = item.optJSONObject("item_basic_info");
        JSONObject pricePromotionInfo = item.optJSONObject("price_promotion_info");
        JSONObject publishInfo = item.optJSONObject("publish_info");
        // 线报内容
        JSONObject mgcInfo = item.optJSONObject("mgc_info");
        TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
        goods.setPictUrl(basicInfo.optString("pict_url"));
        if (!StringUtil.isNullOrEmpty(basicInfo.optString("white_image"))) {
            goods.setPictUrlWhite(basicInfo.optString("white_image"));
        }
        goods.setAuctionId(item.optString("item_id"));
        goods.setAuctionUrl("https:" + item.optString("url"));
        if (basicInfo.containsKey("annual_vol")) {
            goods.setBiz30day(basicInfo.optInt("annual_vol") / 12);
        } else {
            goods.setBiz30day(basicInfo.optInt("volume"));
        }
        if (pricePromotionInfo.optJSONObject("final_promotion_path_list") != null && pricePromotionInfo.optJSONObject("final_promotion_path_list").optJSONArray("final_promotion_path_map_data").size() > 0) {
            JSONArray array = pricePromotionInfo.optJSONObject("final_promotion_path_list").optJSONArray("final_promotion_path_map_data");
            JSONObject couponInfo = array.optJSONObject(0);
            goods.setCouponInfo(couponInfo.optString("promotion_desc").replace(".00", ""));
            List<BigDecimal> quanInfo = TaoBaoCouponUtil.getCouponInfo(goods.getCouponInfo());
            goods.setCouponAmount(new BigDecimal(couponInfo.optString("promotion_fee")));
            goods.setCouponEffectiveEndTime(couponInfo.optString("promotion_end_time"));
            goods.setCouponEffectiveStartTime(couponInfo.optString("promotion_start_time"));
            goods.setCouponStartFee(quanInfo.get(0));
            goods.setCouponLeftCount(100);
            goods.setCouponLink(publishInfo.optString("coupon_share_url"));
            goods.setCouponTotalCount(100);
            goods.setCouponActivityId(couponInfo.optString("promotion_id"));
        } else {
            goods.setCouponAmount(new BigDecimal(0));
        }
        goods.setDayLeft(-1);
        if (basicInfo.optJSONObject("small_images") != null) {
            JSONArray imgArray = basicInfo.optJSONObject("small_images").optJSONArray("string");
            if (imgArray != null) {
                List<String> imgList = new ArrayList<>();
                for (int n = 0; n < imgArray.size(); n++) {
                    imgList.add(imgArray.optString(n));
                }
                goods.setImgList(imgList);
            }
        }
        if (publishInfo.optString("commission_type").contains("MKT"))
            goods.setTkMktStatus("1");
        else
            goods.setTkMktStatus("0");
        if (publishInfo.optString("commission_type").contains("SP"))
            goods.setIncludeDxjh(1);
        goods.setSellerId(basicInfo.optLong("seller_id"));
        goods.setShopTitle(basicInfo.optString("shop_title"));
        goods.setTitle(basicInfo.optString("title"));
        goods.setProvcity(basicInfo.optString("provcity"));
        if (!StringUtil.isNullOrEmpty(basicInfo.optString("level_one_category_id"))) {
            goods.setRootCatId(basicInfo.optInt("level_one_category_id"));
        }
        goods.setRootCategoryName(basicInfo.optString("level_one_category_name"));
        if (!StringUtil.isNullOrEmpty(basicInfo.optString("category_id"))) {
            goods.setLeafCatId(basicInfo.optInt("category_id"));
        }
        goods.setLeafName(basicInfo.optString("category_name"));
        goods.setTkRate(new BigDecimal(publishInfo.optString("income_rate")));
        goods.setTotalNum(1000);
        goods.setUserType(basicInfo.optInt("user_type"));
        goods.setUserTypeName("");
        goods.setZkPrice(new BigDecimal(pricePromotionInfo.optString("zk_final_price")));
        if (publishInfo.optJSONArray("sp_campaign_list") != null && publishInfo.optJSONArray("sp_campaign_list").size() > 0) {
            goods.setDxjhInfo(publishInfo.optJSONArray("sp_campaign_list").optJSONObject(0).optString("sp_name"));
        }
        if (StringUtil.isNullOrEmpty(goods.getCouponInfo())) {// 无券
            goods.setTkCommFee(goods.getZkPrice().multiply(goods.getTkRate()).divide(new BigDecimal(100)));
        } else if (goods.getZkPrice().compareTo(goods.getCouponStartFee()) >= 0// 有券
                && goods.getZkPrice().compareTo(goods.getCouponAmount()) >= 0) {
            BigDecimal finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
            goods.setTkCommFee(finalPrice.multiply(goods.getTkRate()).divide(new BigDecimal(100)));
        } else {
            goods.setTkCommFee(new BigDecimal(0));
        }
        if (!StringUtil.isNullOrEmpty(pricePromotionInfo.optString("reserve_price")))
            goods.setReservePrice(new BigDecimal(pricePromotionInfo.optString("reserve_price")));
        goods.setTotalFee(new BigDecimal("0"));
        // 推荐语
        if (mgcInfo != null) {
            goods.setDescription(mgcInfo.optString("item_description"));
        }
        goods = loadYuShouInfo(goods, item);
        return goods;
    }
    /**
     * 获取淘口令
     *
     * @param logo -图标
     * @param text -文字
     * @param url  -简介
     * @return
     */
    public static String getTKToken(String logo, String text, String url) {
        if (text == null)
            return null;
        if (text.length() < 5)
            text = "好货:" + text;
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.tpwd.create");
        map.put("url", url);
        map.put("text", text);
        map.put("logo", logo);
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject data = JSONObject.fromObject(resultStr);
        if (data.optJSONObject("tbk_tpwd_create_response").optJSONObject("data") != null)
            return data.optJSONObject("tbk_tpwd_create_response").optJSONObject("data").optString("model");
        return null;
    }
    public static String getTKToken(String logo, String text, String url, boolean simpleToken) {
        if (simpleToken) {
            return getSimpleTKToken(logo, text, url);
        } else {
            return getTKToken(logo, text, url);
        }
    }
    public static String getSimpleTKToken(String logo, String text, String url) {
        if (text == null)
            return null;
        if (text.length() < 5)
            text = "好货:" + text;
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.tpwd.create");
        map.put("url", url);
        map.put("text", text);
        map.put("logo", logo);
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject data = JSONObject.fromObject(resultStr);
        if (data.optJSONObject("tbk_tpwd_create_response").optJSONObject("data") != null)
            return data.optJSONObject("tbk_tpwd_create_response").optJSONObject("data").optString("password_simple");
        return null;
    }
    /**
     * 获取券详细信息
     *
     * @param auctionId
     * @param activityId
     * @return
     */
    public static QuanInfo getQuanInfo(String auctionId, String activityId) {
        QuanInfo info = new TaoKeApiUtil.QuanInfo();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.coupon.get");
        map.put("item_id", auctionId + "");
        map.put("activity_id", activityId);
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject data = JSONObject.fromObject(resultStr);
        if (data.optJSONObject("tbk_coupon_get_response") != null) {
            data = data.optJSONObject("tbk_coupon_get_response").optJSONObject("data");
            info.coupon_start_time = data.optString("coupon_start_time");
            info.coupon_end_time = data.optString("coupon_end_time");
            info.coupon_amount = new BigDecimal(data.optString("coupon_amount"));
            info.coupon_total_count = data.optInt("coupon_total_count");
            info.coupon_remain_count = data.optInt("coupon_remain_count");
            info.coupon_start_fee = new BigDecimal(data.optString("coupon_start_fee"));
        } else
            return null;
        return info;
    }
    public static void taoQiangGou() {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.ju.tqg.get");
        map.put("fields",
                "click_url,pic_url,reserve_price,zk_final_price,total_amount,sold_num,title,category_name,start_time,end_time");
        map.put("start_time", "2018-06-11 08:00:00");
        map.put("end_time", "2018-06-12 12:00:00");
        map.put("page_no", "1");
        map.put("page_size", "96");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
    }
    public static TaoBaoSearchResult taoQiangGou(int page, int pageSize, String startTime, String endTime) {
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.ju.tqg.get");
        map.put("fields",
                "click_url,pic_url,reserve_price,zk_final_price,total_amount,sold_num,title,category_name,start_time,end_time");
        map.put("start_time", startTime);
        map.put("end_time", endTime);
        map.put("page_no", page + "");
        map.put("page_size", pageSize + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject resultJSON = JSONObject.fromObject(resultStr);
        JSONObject response = resultJSON.optJSONObject("tbk_ju_tqg_get_response");
        if (response != null && response.optJSONObject("results") != null) {
            JSONArray array = response.optJSONObject("results").optJSONArray("results");
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    JSONObject item = array.optJSONObject(i);
                    String url = item.optString("click_url");
                    // 排除 非淘客商品
                    if (url.contains("s.click.taobao.com/t?e=m")) {
                        TaoBaoGoodsBrief goods;
                        try {
                            goods = searchGoodsDetail(item.optString("num_iid"));
                            if (goods != null)
                                goodsList.add(goods);
                        } catch (TaobaoGoodsDownException e) {
                            e.printStackTrace();
                        }
                    }
                }
                pageSize = array.size();
            }
        }
        TaoBaoSearchResult result = new TaoBaoSearchResult();
        result.setTaoBaoGoodsBriefs(goodsList);
        int totalResults = response.getInt("total_results");
        PageEntity pe = new PageEntity(page, pageSize, totalResults);
        result.setPageEntity(pe);
        result.setNavList(new ArrayList<>());
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
        result.setTaoBaoHead(taoBaoHead);
        return result;
    }
    /*
     * TODO 获取分类列表
     */
    public static void getTaoBaoCategoryList() {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.itemcats.get");
        map.put("parent_cid", "0");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
    }
    /**
     * 店铺搜索
     *
     * @param key  -店铺名称
     * @param page -页码
     * @return
     */
    public static List<TaoBaoShopInfo> searchShop(String key, int page) {
        if (StringUtil.isNullOrEmpty(key))
            return new ArrayList<>();
        List<TaoBaoShopInfo> list = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.shop.get");
        map.put("fields", "user_id,shop_title,shop_type,seller_nick,pict_url,shop_url");
        map.put("q", key);
        map.put("page_size", "95");
        map.put("page_no", page + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject resultDate = JSONObject.fromObject(resultStr);
        if (resultDate.optJSONObject("tbk_shop_get_response") != null
                && resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results") != null) {
            JSONArray array = resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results")
                    .optJSONArray("n_tbk_shop");
            if (array != null)
                for (int i = 0; i < array.size(); i++) {
                    JSONObject item = array.optJSONObject(i);
                    TaoBaoShopInfo info = new TaoBaoShopInfo();
                    info.setPictureUrl(item.optString("pict_url"));
                    info.setSellerNick(item.optString("seller_nick"));
                    info.setShopTitle(item.optString("shop_title"));
                    info.setShopType(item.optString("shop_type"));
                    info.setShopUrl(item.optString("shop_url"));
                    info.setUserId(item.optLong("user_id"));
                    list.add(info);
                }
        }
        return list;
    }
    /**
     * 店铺搜索
     *
     * @param key  -店铺名称
     * @param page -页码
     * @return
     */
    public static TaoBaoShopInfoDTO searchShop(String key, int page, int pageSize) {
        TaoBaoShopInfoDTO dto = new TaoBaoShopInfoDTO();
        if (StringUtil.isNullOrEmpty(key))
            return dto;
        PageEntity pageEntity = new PageEntity();
        List<TaoBaoShopInfo> list = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.shop.get");
        map.put("fields", "user_id,shop_title,shop_type,seller_nick,pict_url,shop_url");
        map.put("q", key);
        map.put("page_size", pageSize + "");
        map.put("page_no", page + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject resultDate = JSONObject.fromObject(resultStr);
        if (resultDate.optJSONObject("tbk_shop_get_response") != null
                && resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results") != null) {
            JSONArray array = resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results")
                    .optJSONArray("n_tbk_shop");
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    JSONObject item = array.optJSONObject(i);
                    TaoBaoShopInfo info = new TaoBaoShopInfo();
                    info.setPictureUrl(item.optString("pict_url"));
                    info.setSellerNick(item.optString("seller_nick"));
                    info.setShopTitle(item.optString("shop_title"));
                    info.setShopType(item.optString("shop_type"));
                    info.setShopUrl(item.optString("shop_url"));
                    info.setUserId(item.optLong("user_id"));
                    list.add(info);
                }
            }
            JSONObject optJSONObject = resultDate.optJSONObject("tbk_shop_get_response");
            int totalResults = optJSONObject.getInt("total_results");
            int totalPage = totalResults % pageSize == 0 ? totalResults / pageSize : totalResults / pageSize + 1;
            pageEntity.setTotalCount(totalResults);
            pageEntity.setTotalPage(totalPage);
        }
        pageEntity.setPageIndex(page);
        pageEntity.setPageSize(pageSize);
        dto.setListInfo(list);
        dto.setPage(pageEntity);
        return dto;
    }
    /**
     * @param filter
     * @return
     */
    public static List<TaoBaoShopInfo> searchShop(SearchShopFilter filter) {
        if (StringUtil.isNullOrEmpty(filter.getKey()))
            return new ArrayList<>();
        List<TaoBaoShopInfo> list = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.shop.get");
        map.put("fields", "user_id,shop_title,shop_type,seller_nick,pict_url,shop_url");
        map.put("q", filter.getKey());
        map.put("page_size", filter.getPageSize() + "");
        map.put("page_no", filter.getPage() + "");
        if (!StringUtil.isNullOrEmpty(filter.getSort()))
            map.put("sort", filter.getSort());
        if (filter.getTmall() != null)
            map.put("is_tmall", filter.getTmall() + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject resultDate = JSONObject.fromObject(resultStr);
        if (resultDate.optJSONObject("tbk_shop_get_response") != null
                && resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results") != null) {
            JSONArray array = resultDate.optJSONObject("tbk_shop_get_response").optJSONObject("results")
                    .optJSONArray("n_tbk_shop");
            if (array != null)
                for (int i = 0; i < array.size(); i++) {
                    JSONObject item = array.optJSONObject(i);
                    TaoBaoShopInfo info = new TaoBaoShopInfo();
                    info.setPictureUrl(item.optString("pict_url"));
                    info.setSellerNick(item.optString("seller_nick"));
                    info.setShopTitle(item.optString("shop_title"));
                    info.setShopType(item.optString("shop_type"));
                    info.setShopUrl(item.optString("shop_url"));
                    info.setUserId(item.optLong("user_id"));
                    list.add(info);
                }
        }
        return list;
    }
    /**
     * 品牌券获取
     *
     * @param pageNo
     * @param pageSize
     */
    public static void pingPaiCoupon(int pageNo, int pageSize) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.sc.coupon.brand.recommend");
        map.put("page_no", pageNo + "");
        map.put("page_size", pageSize + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
    }
    public static void getOrder(String order) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "alibaba.mos.order.get");
        map.put("order_number", order);
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
    }
    public static void getTAEGoodsDetail(String auctionId) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tae.items.list");
        map.put("fields", "title,nick,pic_url,location,cid,price,post_fee,promoted_service,ju,shop_name");
        map.put("num_iids", auctionId + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
    }
    // taobao.ju.items.search
    public static void searchJuHuaSuan() {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.ju.items.search");
        map.put("current_page", "1");
        map.put("page_size", 20 + "");
        map.put("pid", "mm_124933865_43788020_381938426");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, false);
        System.out.println(resultStr);
    }
    /**
     * 通过物料ID获取商品信息
     *
     * @param materialId -物料ID
     * @param page       -页码
     * @param pageSize   -每页数量
     * @return
     */
    public static TaoBaoSearchResult getMaterialByMaterialId(int materialId, int page, int pageSize) {
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.optimus.material");
        map.put("page_no", page + "");
        map.put("page_size", pageSize + "");
        map.put("material_id", materialId + "");
        // map.put("content_id", "561388751621");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        System.out.println(resultStr);
        JSONObject resultJSON = JSONObject.fromObject(resultStr);
        JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
        if (response != null && response.optJSONObject("result_list") != null) {
            JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    JSONObject item = array.optJSONObject(i);
                    TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
                    if (goods != null)
                        goodsList.add(goods);
                }
                pageSize = array.size();
            }
        }
        TaoBaoSearchResult result = new TaoBaoSearchResult();
        result.setTaoBaoGoodsBriefs(goodsList);
        int totalCount = 1000;// root.optInt("total_results");
        PageEntity pe = new PageEntity(page, pageSize, totalCount);
        result.setPageEntity(pe);
        result.setNavList(new ArrayList<>());
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
        result.setTaoBaoHead(taoBaoHead);
        return result;
    }
    public static TaoBaoSearchResult getQTZMaterialByMaterialId(int materialId, int page, int pageSize) {
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.sc.optimus.material");
        map.put("page_no", page + "");
        map.put("page_size", pageSize + "");
        map.put("material_id", materialId + "");
        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
        JSONObject resultJSON = JSONObject.fromObject(resultStr);
        JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
        if (response != null && response.optJSONObject("result_list") != null) {
            JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    JSONObject item = array.optJSONObject(i);
                    TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
                    if (goods != null)
                        goodsList.add(goods);
                }
                pageSize = array.size();
            }
        }
        TaoBaoSearchResult result = new TaoBaoSearchResult();
        result.setTaoBaoGoodsBriefs(goodsList);
        int totalCount = 1000;// root.optInt("total_results");
        PageEntity pe = new PageEntity(page, pageSize, totalCount);
        result.setPageEntity(pe);
        result.setNavList(new ArrayList<>());
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
        result.setTaoBaoHead(taoBaoHead);
        return result;
    }
    /**
     * 根据设备猜你喜欢
     *
     * @param page
     * @param pageSize
     * @param imei
     * @param idfa
     * @return
     */
    public static TaoBaoSearchResult guessDeviceLike(int page, int pageSize, String imei, String idfa, String utdid) {
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.optimus.material");
        map.put("page_no", page + "");
        map.put("page_size", pageSize + "");
        map.put("material_id", "6708");
        if (StringUtil.isNullOrEmpty(imei) && StringUtil.isNullOrEmpty(idfa) && StringUtil.isNullOrEmpty(utdid))
            return null;
        if (!StringUtil.isNullOrEmpty(imei)) {
            map.put("device_encrypt", "MD5");
            map.put("device_value", StringUtil.Md5(imei));
            map.put("device_type", "IMEI");
        } else if (!StringUtil.isNullOrEmpty(idfa)) {
            map.put("device_encrypt", "MD5");
            map.put("device_value", StringUtil.Md5(idfa));
            map.put("device_type", "IDFA");
        } else if (!StringUtil.isNullOrEmpty(utdid)) {
            map.put("device_value", utdid);
            map.put("device_type", "UTDID");
        }
        JSONObject resultJSON = null;
        try {
            resultJSON = TaoKeBaseUtil.baseRequest(map, true);
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
        if (resultJSON == null)
            return null;
        // JSONObject resultJSON = JSONObject.fromObject(resultStr);
        JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
        if (response != null && response.optJSONObject("result_list") != null) {
            JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
            if (array != null) {
                for (int i = 0; i < array.size(); i++) {
                    JSONObject item = array.optJSONObject(i);
                    TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
                    if (goods != null)
                        goodsList.add(goods);
                }
                pageSize = array.size();
            }
        }
        TaoBaoSearchResult result = new TaoBaoSearchResult();
        result.setTaoBaoGoodsBriefs(goodsList);
        int totalCount = 1000;// root.optInt("total_results");
        PageEntity pe = new PageEntity(page, pageSize, totalCount);
        result.setPageEntity(pe);
        result.setNavList(new ArrayList<>());
        TaoBaoHead taoBaoHead = new TaoBaoHead();
        taoBaoHead.setDocsfound((int) result.getPageEntity().getTotalCount());
        result.setTaoBaoHead(taoBaoHead);
        return result;
    }
    public static String getAccessToken(String code, String appKey, String appSecret) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.top.auth.token.create");
        map.put("code", code);
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(appKey);
        app.setAppSecret(appSecret);
        try {
            JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
            if (json != null)
                return json.toString();
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 渠道邀请码
     *
     * @param relationId
     * @return
     */
    public static String getInviteCode(Long relationId, String accessToken, String appKey, String appSecret) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.sc.invitecode.get");
        map.put("session", accessToken);
        map.put("code_type", "1");
        map.put("relation_app", "common");
        JSONObject resultJSON = null;
        try {
            TaoKeAppInfo app = new TaoKeAppInfo();
            app.setAppKey(appKey);
            app.setAppSecret(appSecret);
            resultJSON = TaoKeBaseUtil.baseRequest(map, app);
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
        if (resultJSON == null)
            return null;
        return null;
    }
    /**
     * 获取渠道邀请码
     *
     * @param accessToken
     * @param appKey
     * @param appSecret
     * @return
     */
    public static String getRootRelationInviteCode(String accessToken, String appKey, String appSecret) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.sc.invitecode.get");
        map.put("session", accessToken);
        map.put("code_type", "1");
        map.put("relation_app", "common");
        JSONObject resultJSON = null;
        try {
            TaoKeAppInfo app = new TaoKeAppInfo();
            app.setAppKey(appKey);
            app.setAppSecret(appSecret);
            resultJSON = TaoKeBaseUtil.baseRequest(map, app);
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
        if (resultJSON == null)
            return null;
        return null;
    }
    public static String getRootSpecialInviteCode(String accessToken, String appKey, String appSecret) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.sc.invitecode.get");
        map.put("session", accessToken);
        map.put("code_type", "3");
        map.put("relation_app", "common");
        JSONObject resultJSON = null;
        try {
            TaoKeAppInfo app = new TaoKeAppInfo();
            app.setAppKey(appKey);
            app.setAppSecret(appSecret);
            resultJSON = TaoKeBaseUtil.baseRequest(map, app);
            return resultJSON.optJSONObject("tbk_sc_invitecode_get_response").optJSONObject("data")
                    .optString("inviter_code");
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
        if (resultJSON == null)
            return null;
        return null;
    }
    public static String getRelationId(String accessToken, String appKey, String appSecret) throws TaoBaoAuthException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.sc.publisher.info.save");
        map.put("session", accessToken);
        map.put("inviter_code", "A2QnGL");
        map.put("info_type", "1");
        map.put("online_scene", "1");
        JSONObject resultJSON = null;
        try {
            TaoKeAppInfo app = new TaoKeAppInfo();
            app.setAppKey(appKey);
            app.setAppSecret(appSecret);
            resultJSON = TaoKeBaseUtil.baseRequest(map, app);
            System.out.println(resultJSON.toString());
            return resultJSON.optJSONObject("tbk_sc_publisher_info_save_response").optJSONObject("data")
                    .optString("relation_id");
        } catch (TaoKeApiException e) {
            JSONObject errorJSON = JSONObject.fromObject(e.getMsg()).optJSONObject("error_response");
            if (errorJSON.optInt("code") == 15 && errorJSON.optInt("sub_code") == 1)// 未实名
            {
                throw new TaoBaoAuthException(TaoBaoAuthException.CODE_NOT_REAL_NAME, errorJSON.optString("sub_msg"));
            } else {
                e.printStackTrace();
                LogHelper.error("渠道ID申请出错:" + e.getMsg());
                throw new TaoBaoAuthException(TaoBaoAuthException.CODE_OTHER, errorJSON.optString("sub_msg"));
            }
        } catch (Exception e) {
            LogHelper.error("渠道ID申请出错:" + (resultJSON != null ? resultJSON.toString() : "未知错误"));
        }
        return null;
    }
    public static String getSpecialId(String accessToken, String appKey, String appSecret) throws TaoBaoAuthException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.sc.publisher.info.save");
        map.put("session", accessToken);
        map.put("inviter_code", "AA5ISJ");
        map.put("info_type", "1");
        map.put("online_scene", "1");
        JSONObject resultJSON = null;
        try {
            TaoKeAppInfo app = new TaoKeAppInfo();
            app.setAppKey(appKey);
            app.setAppSecret(appSecret);
            resultJSON = TaoKeBaseUtil.baseRequest(map, app);
            return resultJSON.optJSONObject("tbk_sc_publisher_info_save_response").optJSONObject("data")
                    .optString("special_id");
        } catch (TaoKeApiException e) {
            JSONObject errorJSON = JSONObject.fromObject(e.getMsg()).optJSONObject("error_response");
            if (errorJSON.optInt("code") == 15 && errorJSON.optInt("sub_code") == 1)// 未实名
            {
                throw new TaoBaoAuthException(TaoBaoAuthException.CODE_NOT_REAL_NAME, errorJSON.optString("sub_msg"));
            } else {
                e.printStackTrace();
                LogHelper.error("会员运营ID申请出错:" + e.getMsg());
                throw new TaoBaoAuthException(TaoBaoAuthException.CODE_OTHER, errorJSON.optString("sub_msg"));
            }
        } catch (Exception e) {
            LogHelper.error("会员运营ID申请出错:" + (resultJSON != null ? resultJSON.toString() : "未知错误"));
        }
        return null;
    }
    public static void specialConvertItem(String auctionId, TaoKeAppInfo app) {
        String pid = app.getPid();
        String[] sts = pid.split("_");
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.item.convert");
        map.put("num_iids", auctionId + "");
        map.put("fields", "num_iid,click_url");
        map.put("adzone_id", sts[3]);
        map.put("platform", "2");
        try {
            JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
            System.out.println(json.toString());
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
    }
    public static TaoBaoGoodsBrief specialConvertCoupon(String auctionId, TaoKeAppInfo app, String specialId, String relationId) {
        String pid = app.getPid();
        String[] sts = pid.split("_");
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.coupon.convert");
        map.put("item_id", auctionId + "");
        map.put("adzone_id", sts[3]);
        if (System.currentTimeMillis() > TimeUtil.convertToTimeTemp("2020-07-22", "yyyy-MM-dd")) {
            if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId)) {
                map.put("special_id", specialId);
            } else if (!StringUtil.isNullOrEmpty(specialId)) {
                map.put("special_id", specialId);
            } else if (!StringUtil.isNullOrEmpty(relationId)) {
                map.put("relation_id", relationId);
            }
        }
        try {
            String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
            JSONObject json = JSONObject.fromObject(result);
            JSONObject resultJSON = json.optJSONObject("tbk_coupon_convert_response").optJSONObject("result")
                    .optJSONObject("results");
            String couponLink = resultJSON.optString("coupon_click_url");
            String itemLink = resultJSON.optString("item_url");
            TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
            goods.setAuctionUrl(itemLink);
            if (!StringUtil.isNullOrEmpty(resultJSON.optString("coupon_info"))) {
                goods.setCouponLink(couponLink);
                goods.setCouponInfo(resultJSON.optString("coupon_info"));
                if (!StringUtil.isNullOrEmpty(resultJSON.optString("coupon_total_count"))) {
                    goods.setCouponTotalCount(Integer.parseInt(resultJSON.optString("coupon_total_count")));
                }
                if (!StringUtil.isNullOrEmpty(resultJSON.optString("coupon_remain_count"))) {
                    goods.setCouponLeftCount(Integer.parseInt(resultJSON.optString("coupon_remain_count")));
                }
                goods.setCouponEffectiveStartTime(resultJSON.optString("coupon_start_time"));
                goods.setCouponEffectiveEndTime(resultJSON.optString("coupon_end_time"));
            }
            String tkRate = resultJSON.optString("max_commission_rate");
            if (StringUtil.isNullOrEmpty(tkRate)) {
                tkRate = resultJSON.optString("min_commission_rate");
            }
            if (!StringUtil.isNullOrEmpty(tkRate)) {
                goods.setTkRate(new BigDecimal(tkRate));
            }
            goods = loadYuShouInfo(goods, resultJSON);
            return goods;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static TaoBaoGoodsBrief specialConvertCouponV2(String auctionId, TaoKeAppInfo app, String specialId, String relationId) {
        String pid = app.getPid();
        String[] sts = pid.split("_");
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.general.link.convert");
        map.put("item_id_list", auctionId + "");
        map.put("adzone_id", sts[3]);
        if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(specialId)) {
            map.put("special_id", specialId);
        } else if (!StringUtil.isNullOrEmpty(relationId)) {
            map.put("relation_id", relationId);
        }
        try {
            String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
            System.out.println(result);
            JSONObject json = JSONObject.fromObject(result);
            JSONObject resultJSON = json.optJSONObject("tbk_dg_general_link_convert_response").optJSONObject("data")
                    .optJSONObject("item_url_list").optJSONArray("item_url_list").optJSONObject(0);
            JSONObject goodsInfo=resultJSON.optJSONObject("link_info_dto");
            String couponLink = goodsInfo.optString("coupon_short_url");
            String itemLink = goodsInfo.optString("cps_short_url");
            TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
            goods.setAuctionUrl(itemLink);
            goods.setCouponLink(couponLink);
            if (!StringUtil.isNullOrEmpty(resultJSON.optString("coupon_info"))) {
                goods.setCouponLink(couponLink);
                goods.setCouponInfo(resultJSON.optString("coupon_info"));
                if (!StringUtil.isNullOrEmpty(resultJSON.optString("coupon_total_count"))) {
                    goods.setCouponTotalCount(Integer.parseInt(resultJSON.optString("coupon_total_count")));
                }
                if (!StringUtil.isNullOrEmpty(resultJSON.optString("coupon_remain_count"))) {
                    goods.setCouponLeftCount(Integer.parseInt(resultJSON.optString("coupon_remain_count")));
                }
                goods.setCouponEffectiveStartTime(resultJSON.optString("coupon_start_time"));
                goods.setCouponEffectiveEndTime(resultJSON.optString("coupon_end_time"));
            }
            JSONObject rateInfo=resultJSON.optJSONObject("promotion_info_dto");
            String tkRate = rateInfo.optString("commission_rate");
            if (!StringUtil.isNullOrEmpty(tkRate)) {
                goods.setTkRate(new BigDecimal(tkRate));
            }
            goods = loadYuShouInfo(goods, resultJSON);
            return goods;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    // AA5ISJ
    private static TaoBaoGoodsBrief parseWuLiaoItemFromMaterialId(JSONObject item) {
        TaoBaoGoodsBrief goods = new TaoBaoGoodsBrief();
        // 设置成320*320的图片尺寸
        goods.setPictUrl(TbImgUtil.getTBSize320Img("https:" + item.optString("pict_url")));
        goods.setAuctionId(item.optString("item_id"));
        goods.setAuctionUrl("https://item.taobao.com/item.htm?id=" + goods.getAuctionId());
        if (item.containsKey("annual_vol")) {
            goods.setBiz30day(item.optInt("annual_vol") / 12);
        } else {
            goods.setBiz30day(item.optInt("volume"));
        }
        if (!StringUtil.isNullOrEmpty(item.optString("coupon_amount"))) {
            goods.setCouponEffectiveEndTime(TimeUtil.getGernalTime(item.optLong("coupon_end_time"), "yyyy-MM-dd"));
            goods.setCouponEffectiveStartTime(TimeUtil.getGernalTime(item.optLong("coupon_start_time"), "yyyy-MM-dd"));
            goods.setCouponStartFee(new BigDecimal(item.optString("coupon_start_fee")));
            goods.setCouponLeftCount(item.optInt("coupon_remain_count"));
            goods.setCouponLink(null);
            goods.setCouponAmount(new BigDecimal(item.optString("coupon_amount")));
            goods.setCouponTotalCount(item.optInt("coupon_total_count"));
            goods.setCouponActivityId(item.optString("coupon_id"));
            if (goods.getCouponStartFee().compareTo(new BigDecimal(0)) > 0)
                goods.setCouponInfo(String.format("满%s元减%s元",
                        MoneyBigDecimalUtil.getWithNoZera(goods.getCouponStartFee()).toString(),
                        MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()).toString()));
            else
                goods.setCouponInfo(String.format("%s元无条件券",
                        MoneyBigDecimalUtil.getWithNoZera(goods.getCouponAmount()).toString()));
            if (goods.getCouponStartFee().compareTo(new BigDecimal(0)) <= 0) {
                goods.setCouponStartFee(goods.getCouponAmount());
            }
        } else {
            goods.setCouponAmount(new BigDecimal(0));
        }
        goods.setDayLeft(-1);
        if (item.optJSONObject("small_images") != null) {
            JSONArray imgArray = item.optJSONObject("small_images").optJSONArray("string");
            if (imgArray != null) {
                List<String> imgList = new ArrayList<>();
                for (int n = 0; n < imgArray.size(); n++) {
                    imgList.add(imgArray.optString(n));
                }
                goods.setImgList(imgList);
            }
        }
        goods.setTkMktStatus("0");
        goods.setIncludeDxjh(0);
        goods.setSellerId(item.optLong("seller_id"));
        goods.setShopTitle(item.optString("nick"));
        goods.setTitle(item.optString("title"));
        goods.setProvcity(item.optString("provcity"));
        if (!StringUtil.isNullOrEmpty(item.optString("level_one_category_id"))) {
            goods.setRootCatId(item.optInt("level_one_category_id"));
        }
        goods.setRootCategoryName(item.optString("level_one_category_name"));
        if (!StringUtil.isNullOrEmpty(item.optString("category_id"))) {
            goods.setLeafCatId(item.optInt("category_id"));
        }
        goods.setLeafName(item.optString("category_name"));
        goods.setTotalNum(1000);
        goods.setUserType(item.optInt("user_type"));
        goods.setUserTypeName("");
        if (!StringUtil.isNullOrEmpty(item.optString("commission_rate"))) {
            goods.setTkRate(new BigDecimal(item.optString("commission_rate")));
        } else {
            goods.setTkRate(new BigDecimal(0));
        }
        if (!StringUtil.isNullOrEmpty(item.optString("zk_final_price"))) {
            goods.setZkPrice(new BigDecimal(item.optString("zk_final_price")));
        } else {
            goods.setZkPrice(new BigDecimal(0));
        }
        if (StringUtil.isNullOrEmpty(goods.getCouponInfo())) {// 无券
            goods.setTkCommFee(goods.getZkPrice().multiply(goods.getTkRate()).divide(new BigDecimal(100)));
        } else if (goods.getZkPrice().compareTo(goods.getCouponStartFee()) >= 0// 有券
                && goods.getZkPrice().compareTo(goods.getCouponAmount()) >= 0) {
            BigDecimal finalPrice = goods.getZkPrice().subtract(goods.getCouponAmount());
            goods.setTkCommFee(finalPrice.multiply(goods.getTkRate()).divide(new BigDecimal(100)));
        } else {
            goods.setTkCommFee(new BigDecimal(0));
        }
        goods.setReservePrice(new BigDecimal(0));
        goods.setTotalFee(new BigDecimal("0"));
        goods.setPictUrlWhite(item.optString("white_image"));
        goods = loadYuShouInfo(goods, item);
        return goods;
    }
    public static void getShopGoodsList(Long shopId) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "tmall.omni.pc.iteminfo.getbyshopid");
        map.put("shop_id", shopId + "");
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey("24838852");
        app.setAppSecret("bc8265e2bf8d8115329d652f9d3d4cd8");
        try {
            JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
            System.out.println(json);
        } catch (TaoKeApiException e) {
            e.printStackTrace();
        }
    }
    /**
     * 淘口令转商品ID
     *
     * @param token
     * @return
     */
    public static TokenConvertResult tokenConvert(String token) throws TaoBaoTokenParseException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.tpwd.convert");
        map.put("password_content", token);
        map.put("adzone_id", TaoBaoConstant.TAOBAO_PID_DEFAULT.split("_")[3]);
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
        app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
        try {
            JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
            System.out.println(json.toString());
            try {
                JSONObject data = json.optJSONObject("tbk_tpwd_convert_response").optJSONObject("data");
                Gson gson = new Gson();
                return gson.fromJson(data.toString(), TokenConvertResult.class);
            } catch (Exception e) {
                return null;
            }
        } catch (TaoKeApiException e) {
            JSONObject msg = null;
            try {
                msg = JSONObject.fromObject(e.getMsg());
            } catch (Exception e2) {
            }
            if (msg != null && msg.optJSONObject("error_response") != null) {
                throw new TaoBaoTokenParseException(msg.optJSONObject("error_response").optInt("sub_code"),
                        msg.optJSONObject("error_response").optString("sub_msg"));
            }
        }
        return null;
    }
    // 淘礼金创建
    //{"result":{"msg_code":"FAIL_CHECK_ITEM_DAILY_SEND_NUM_CHECK_ERROR","msg_info":"今日该商品淘礼金创建数已超上限,请您明日再试","success":false},"request_id":"10p30v02qadkq"}
    //{"result":{"msg_code":"ASSET_ACCOUNT_BALANCE_NOT_ENOUGH","msg_info":"账户预算不足","success":false},"request_id":"5caz9izr7jqp"}
    public static TaoLiJinDTO createTaoLiJin(String auctionId, String name, BigDecimal perface, int totalNum,
                                             Date sendStartTime, Date sendEndTime, Date useStartTime, Date useEndTime, TaoKeAppInfo app)
            throws TaoLiJinCreateException, TaoKeApiException {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.vegas.tlj.create");
        map.put("adzone_id", app.getPid().split("_")[3]);
        map.put("item_id", auctionId + "");
        map.put("total_num", totalNum + "");
        map.put("name", name);
        map.put("user_total_win_num_limit", "1");
        map.put("security_switch", "false");
        map.put("per_face", perface.toString());
        map.put("send_start_time", TimeUtil.getGernalTime(sendStartTime.getTime(), "yyyy-MM-dd HH:mm:ss"));
        if (sendEndTime != null)
            map.put("send_end_time", TimeUtil.getGernalTime(sendEndTime.getTime(), "yyyy-MM-dd HH:mm:ss"));
        if (useEndTime != null) {
            map.put("use_end_time", TimeUtil.getGernalTime(useEndTime.getTime(), "yyyy-MM-dd"));
            map.put("use_end_time_mode", "2");
        }
        if (useStartTime != null)
            map.put("use_start_time", TimeUtil.getGernalTime(useStartTime.getTime(), "yyyy-MM-dd"));
        try {
            String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
            JSONObject json = JSONObject.fromObject(result);
            System.out.println(json);
            JSONObject root = json.optJSONObject("tbk_dg_vegas_tlj_create_response");
            if (root != null && root.optJSONObject("result") != null) {
                if (root.optJSONObject("result").optBoolean("success")) {
                    JSONObject modelJson = root.optJSONObject("result").optJSONObject("model");
                    TaoLiJinDTO dto = new TaoLiJinDTO();
                    dto.setRightsId(modelJson.optString("rights_id"));
                    dto.setSendUrl(modelJson.optString("send_url"));
                    return dto;
                } else {
                    LogHelper.error(json);
                }
                // 接口返回异常
                String msgCode = root.optJSONObject("result").optString("msg_code");
                if (!StringUtil.isNullOrEmpty(msgCode)) {
                    TLJLogHelper.info(auctionId, root.toString());// 淘礼金异常信息记录
                    switch (msgCode) {
                        case "FAIL_BIZ_ITEM_FORBIDDEN":
                            throw new TaoLiJinCreateException(TaoLiJinCreateException.CODE_TLJ_FORBIDDEN, "该商品不支持创建淘礼金红包");
                        case "FAIL_BIZ_ACCOUNT_UN_PAID":
                        case "PRE_FREEZE_ASSET_ACCOUNT_ERROR":
                            throw new TaoLiJinCreateException(TaoLiJinCreateException.CODE_TLJ_NO_MONEY, "官方玩法钱包余额不足");
                        default:
                            throw new TaoKeApiException(Integer.parseInt(msgCode), root.toString());
                    }
                }
            }
        } catch (TaoKeApiException e) {
            throw e;
        }
        return null;
    }
    /**
     * @return com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinReport
     * @author hxh
     * @description 淘礼金报告 接口文档:https://open.taobao.com/api.htm?source=search&docId=58736&docType=2
     * @date 10:57 2022/1/11
     * @param: rightsId
     **/
    public static UserTaoLiJinReport getTaoLiJinEffective(String rightsId, String pid) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.vegas.tlj.report");
        map.put("rights_id", rightsId);
        map.put("adzone_id", pid.split("_")[3]);
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
        app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
        try {
            String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
            JSONObject json = JSONObject.fromObject(result);
            System.out.println(json);
            JSONObject root = json.optJSONObject("tbk_dg_vegas_tlj_report_response");
            if (root != null && root.optBoolean("result_success")) {
                JSONObject modelJson = root.optJSONObject("model").optJSONObject("extra");
                if (modelJson != null && modelJson.size() > 0) {
                    UserTaoLiJinReport report = new UserTaoLiJinReport();
                    report.setId(rightsId);
                    report.setWinAmount(new BigDecimal(modelJson.optString("win_sum_amt")));
                    report.setWinNum(modelJson.optInt("win_pv"));
                    report.setRefundAmount(new BigDecimal(modelJson.optString("refund_sum_amt")));
                    report.setRefundNum(modelJson.optInt("refund_num"));
                    report.setAlipayAmount(new BigDecimal(modelJson.optString("alipay_amt")));
                    report.setUseAmount(new BigDecimal(modelJson.optString("use_sum_amt")));
                    report.setUseNum(modelJson.optInt("use_num"));
                    report.setUnfreezeAmount(new BigDecimal(modelJson.optString("remaining_amt")));
                    report.setUnfreezeNum(modelJson.optInt("remaining_num"));
                    report.setPreCommissionAmount(new BigDecimal(modelJson.optString("pre_pub_share_fee_for_disp")));
                    return report;
                }
            }
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
        }
        return null;
    }
    public static void getCouponByAuctionId(String auctionId) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.itemid.coupon.get");
        map.put("platform", 2 + "");
        map.put("pid", TaoBaoConstant.TAOBAO_PID_DEFAULT);
        map.put("num_iids", auctionId + "");
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
        app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
        try {
            JSONObject json = TaoKeBaseUtil.baseRequest(map, app);
            System.out.print(json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取淘宝系统时间(收费API,谨慎调用)
     *
     * @return
     */
    public static Date getTaoBaoSystemTime() {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.time.get");
        try {
            JSONObject json = TaoKeBaseUtil.baseRequest(map, false);
            String time = json.optJSONObject("time_get_response").optString("time");
            return new Date(TimeUtil.convertToTimeTemp(time, "yyyy-MM-dd HH:mm:ss"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 官方活动推广
     *
     * @param adZoneId              -广告位
     * @param promotionSceneId-活动ID
     * @param relationId            -渠道ID
     * @return
     */
    public static TaoKeOfficialActivityConvertResultDTO officialActivityConvert(String adZoneId,
                                                                                String promotionSceneId, String relationId) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.activity.info.get");
        map.put("adzone_id", adZoneId);
        map.put("activity_material_id", promotionSceneId);
        if (relationId != null)
            map.put("relation_id", relationId);
        TaoKeAppInfo app = new TaoKeAppInfo();
        app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
        app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
        try {
            String result = TaoKeBaseUtil.baseRequestForThreeTimes(map, app);
            System.out.println(result);
            JSONObject json = JSONObject.fromObject(result);
            if (json != null) {
                json = json.optJSONObject("tbk_activity_info_get_response");
                if (json.optJSONObject("data") != null) {
                    return JsonUtil.getSimpleGson().fromJson(json.optJSONObject("data").toString(),
                            TaoKeOfficialActivityConvertResultDTO.class);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static List<TaoBaoGoodsBrief> guessLikeByAuctionId(String auctionId, int count) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.dg.optimus.material");
        map.put("item_id", auctionId + "");
        map.put("page_size", count + "");
        map.put("page_no", 1 + "");
        map.put("material_id", 13256 + "");
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        JSONObject resultJSON = null;
        try {
            resultJSON = TaoKeBaseUtil.baseRequest(map, true);
            JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
            if (response != null && response.optJSONObject("result_list") != null) {
                JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
                if (array != null) {
                    for (int i = 0; i < array.size(); i++) {
                        JSONObject item = array.optJSONObject(i);
                        TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
                        if (goods != null)
                            goodsList.add(goods);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return goodsList;
    }
    public static List<TaoBaoGoodsBrief> getCouponListByItemId(String auctionId) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.itemid.coupon.get");
        map.put("platform", auctionId + "");
        map.put("num_iids", auctionId + "");
        map.put("pid", TaoBaoConstant.TAOBAO_PID_DEFAULT);
        List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
        JSONObject resultJSON = null;
        try {
            resultJSON = TaoKeBaseUtil.baseRequest(map, new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY,
                    TaoBaoConstant.TAOBAO_AUTH_APPSECRET, TaoBaoConstant.TAOBAO_PID_DEFAULT));
            JSONObject response = resultJSON.optJSONObject("tbk_dg_optimus_material_response");
            if (response != null && response.optJSONObject("result_list") != null) {
                JSONArray array = response.optJSONObject("result_list").optJSONArray("map_data");
                if (array != null) {
                    for (int i = 0; i < array.size(); i++) {
                        JSONObject item = array.optJSONObject(i);
                        TaoBaoGoodsBrief goods = parseWuLiaoItemFromMaterialId(item);
                        if (goods != null)
                            goodsList.add(goods);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return goodsList;
    }
    /**
     * 淘宝客-推广者-官方活动信息获取
     *
     * @param activityMaterialId
     * @param pid
     * @param relationId
     * @return String 返回类型
     * @throws
     * @Title: getActivityInfo
     * @Description:
     */
    public static String getActivityInfo(String activityMaterialId, String pid, String relationId) {
        Map<String, String> map = new HashMap<>();
        map.put("method", "taobao.tbk.activity.info.get");
        map.put("activity_material_id", activityMaterialId);
        map.put("adzone_id", pid.split("_")[3] + "");
        map.put("relation_id", relationId);
        JSONObject resultJSON = null;
        try {
            resultJSON = TaoKeBaseUtil.baseRequest(map,
                    new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET, pid));
            JSONObject response = resultJSON.optJSONObject("tbk_activity_info_get_response");
            if (response != null && response.optJSONObject("data") != null) {
                return response.optJSONObject("data").optString("click_url");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static class QuanInfo {
        public String coupon_start_time;// 开始时间
        public String coupon_end_time; // 券结束时间
        public BigDecimal coupon_amount;// 券金额
        public int coupon_total_count;// 券总数量
        public int coupon_remain_count;// 券剩余数量
        public BigDecimal coupon_start_fee;// 券起始金额
    }
    public static class TokenConvertResult {
        private String num_iid;//   商品Id
        private String click_url;//商品淘客转链
        private String seller_id;//店铺卖家ID
        private String origin_url;//入参淘口令对应原始链接
        private String origin_pid;//入参淘口令推广链接中的pid,如果不属于当前调用的推广者则展示“0”
        public String getNum_iid() {
            return num_iid;
        }
        public void setNum_iid(String num_iid) {
            this.num_iid = num_iid;
        }
        public String getClick_url() {
            return click_url;
        }
        public void setClick_url(String click_url) {
            this.click_url = click_url;
        }
        public String getSeller_id() {
            return seller_id;
        }
        public void setSeller_id(String seller_id) {
            this.seller_id = seller_id;
        }
        public String getOrigin_url() {
            return origin_url;
        }
        public void setOrigin_url(String origin_url) {
            this.origin_url = origin_url;
        }
        public String getOrigin_pid() {
            return origin_pid;
        }
        public void setOrigin_pid(String origin_pid) {
            this.origin_pid = origin_pid;
        }
    }
    public static void main(String[] args) throws TaoBaoTokenParseException, TaobaoGoodsDownException {
//        SearchFilter sf =new SearchFilter();
//        sf.setKey("https://s.click.taobao.com/HCsB7Du");
//        sf.setPageSize(10);
//        sf.setPage(1);
//        searchWuLiao(sf,null,null);
//        tokenConvert("【淘宝】https://m.tb.cn/h.5YFsc7F?tk=A8wSdGRxsjm CZ0001 「俄罗斯风味迷你提拉米苏蜂蜜奶油千层甜品蛋糕早餐整箱3000克零食」\n" +
//                "点击链接直接打开 或者 淘宝搜索直接打开");
//
//     TaoBaoGoodsBrief goods =  getSimpleGoodsInfo("kNWkWZuYt28BaNcG9ycPtJ-aRG5QXwIdOXvv5bNcNq");
//     System.out.println(goods);
//     System.out.println(goods.getAuctionId());
//        Map<String, String> map = new HashMap<>();
//        map.put("method", "taobao.tbk.item.info.get");
//        map.put("biz_scene_id", "2");
//        map.put("num_iids",  "708395859317");
//        String resultStr = TaoKeBaseUtil.baseRequestForThreeTimes(map, true);
//        System.out.println(resultStr);
//        SearchFilter sf=new SearchFilter();
//        sf.setKey("鞋");
//        sf.setPage(1);
//        sf.setPageSize(20);
//        TaoBaoSearchResult result =  searchWuLiaoNew(sf,null,null);
//        System.out.printf(result.toString());
//        public static final String TAOBAO_AUTH_APPKEY = "24980167";
//        public static final String TAOBAO_AUTH_APPSECRET = "e0a2e05deabf5ce039b52e5b492d5382";
//        public static final String TAOBAO_PID_DEFAULT="mm_124933865_56750082_89555600043";
        TaoKeAppInfo app = new TaoKeAppInfo("24980167", "e0a2e05deabf5ce039b52e5b492d5382", "mm_124933865_56750082_89555600043");
        specialConvertCouponV2("ZMxBywvT6tPr0wabjaFBQPiVt6-g4DYZPC2OoJaaRXIoq", app, "511379263", null);
    }
}