yujian
2019-07-17 20d1a38a0f8049873f1fbbaef96c22e971ea9d77
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/SearchControllerV2.java
@@ -6,13 +6,18 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.taobao.TbImgUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -30,6 +35,7 @@
import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult;
import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail;
import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.BusinessSystemService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.config.SuperHotSearchService;
@@ -44,11 +50,13 @@
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.Utils;
import com.yeshi.fanli.util.cache.TaoBaoGoodsCacheUtil;
import com.yeshi.fanli.util.dataoke.DaTaoKeApiUtil;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.jd.JDUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoUtil;
import com.yeshi.fanli.util.taobao.SearchFilterUtil;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.vo.brand.TaoBaoShopVO;
@@ -94,6 +102,177 @@
   @Resource
   private DaTaoKeGoodsDetailService daTaoKeGoodsDetailService;
   /**
    * 粘贴板信息推荐
    *
    * @param acceptData
    * @param url
    *            商品链接
    * @param out
    */
   @RequestMapping(value = "getNewGoodsInfo", method = RequestMethod.POST)
   public void getNewGoodsInfo(AcceptData acceptData, String text, PrintWriter out) {
      if (StringUtil.isNullOrEmpty(text)) {
         out.print(JsonUtil.loadFalseResult("值为空"));
         return;
      }
      if (text.length() > 256) {
         out.print(JsonUtil.loadFalseResult("值过长"));
         return;
      }
      TaoBaoGoodsBrief tb = null;
      String URL_REGEX = "(((http|https)://)|(www\\.))[a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6}(:[0-9]{1,4})?(/[a-zA-Z0-9\\&%_\\./-~-]*)?";
      Pattern p = Pattern.compile(URL_REGEX);
      Matcher matcher = p.matcher(text);
      if (!matcher.find()) {// 不包含链接
         // 商品详情
         // 发现
         // 没有链接,标题过长也不处理
         if (text.startsWith("【") && text.contains("】")) {
            int end = text.indexOf("】");
            if (end > 2)
               text = text.substring(1, end);
         }
         LogHelper.test("根据粘贴板推荐:" + text);
         if (text.length() > 80) {
            out.print(JsonUtil.loadFalseResult("值过长"));
            return;
         }
         SearchFilter sf = new SearchFilter();
         sf.setKey(text);
         JSONObject root = new JSONObject();
         TaoBaoSearchResult result = TaoBaoUtil.search(sf);
         if (result != null && result.getTaoBaoGoodsBriefs() != null && result.getTaoBaoGoodsBriefs().size() > 0)
            for (TaoBaoGoodsBrief goods : result.getTaoBaoGoodsBriefs()) {
               // 是属于淘宝联盟商品
               if (goods.getTitle().equalsIgnoreCase(text)) {
                  root.put("type", 2);
                  JSONObject data = new JSONObject();
                  data.put("title", goods.getTitle());
                  root.put("data", data);
                  out.print(JsonUtil.loadTrueResult(root));
                  return;
               }
            }
         // 查询大淘客标题
         List<DaTaoKeDetail> list = daTaoKeGoodsDetailService.listByDtitle(text);
         if (list != null && list.size() > 0) {
            root.put("type", 2);
            JSONObject data = new JSONObject();
            data.put("title", list.get(0).getdTitle());
            root.put("data", data);
            out.print(JsonUtil.loadTrueResult(root));
            return;
         }
         out.print(JsonUtil.loadFalseResult("暂不支持该类型!"));
         return;
      }
      text = matcher.group();
      if (text.contains("ju.taobao.com") || text.contains(".juhuasuan.com")) {// 聚划算
         int index = text.indexOf("item_id");
         if (index < 0) {
            out.println(JsonUtil.loadFalseResult("暂未找到该商品,请稍后再试!"));
            return;
         }
         text = text.substring(index);
         int last = text.indexOf("&");
         String id = "";
         if (last > 0)
            id = text.substring(text.indexOf("=") + 1, text.indexOf("&"));
         else {
            id = text.substring(text.indexOf("=" + 1));
         }
         tb = TaoBaoUtil.isAlimama(id);
         if (tb == null) {
            tb = TaoBaoUtil.parsePhoneTmAndTb(id);
         }
      } else if (text.contains("http://zmnxbc.com")) { // 手机端天猫APP分享
         tb = TaoBaoUtil.parsePhoneShareUrlByTM(text);
      } else if (text.contains("h5.m.taobao") || text.contains("detail.m.tmall") || text.contains("item.taobao")
            || text.contains("detail.tmall")) { // 手机页面和电脑页面
         Map<String, String> map = Utils.parseURL(text);
         String id = "";
         id = map.get("id").replace("}", "");
         tb = TaoBaoUtil.isAlimama(id);
         if (tb == null) {
            tb = TaoBaoUtil.parsePhoneTmAndTb(id);
         }
      } else {
         tb = TaoBaoUtil.parsePhoneShareUrlByTB(text);
      }
      if (tb == null) {
         out.println(JsonUtil.loadFalseResult("暂未找到该商品,请稍后再试!"));
         return;
      }
      JSONObject data = new JSONObject();
      JSONObject taoBaoGoodsJSON = new JSONObject();
      taoBaoGoodsJSON.put("title", tb.getTitle());
      taoBaoGoodsJSON.put("zkPrice", tb.getZkPrice());
      taoBaoGoodsJSON.put("auctionId", tb.getAuctionId());
      taoBaoGoodsJSON.put("url", "http://item.taobao.com/item.htm?id=" + tb.getAuctionId());
      data.put("taoBaoGoodsBrief", taoBaoGoodsJSON);
      if (!StringUtil.isNullOrEmpty(tb.getPictUrl())) {
         if (tb.getImgList() == null)
            tb.setImgList(new ArrayList<>());
         tb.getImgList().add(0, TbImgUtil.getTBSize220Img(tb.getPictUrl()));
      }
      data.put("tbImgs", tb.getImgList());
      JSONObject root = new JSONObject();
      root.put("type", 1);
      root.put("data", data);
      out.print(JsonUtil.loadTrueResult(root));
   }
   /**
    * 搜索候选词
    *
    * @param acceptData
    * @param kw
    * @param out
    */
   @RequestMapping(value = "suggestSearch", method = RequestMethod.POST)
   public void getSugguestSearch(AcceptData acceptData, String kw, Integer goodsType, PrintWriter out) {
      if (goodsType == null) {
         out.print(JsonUtil.loadFalseResult("平台类型不能为空"));
         return;
      }
      List<String> list = null;
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         list = TaoBaoUtil.getSuguestSearch(kw);
      } else if (goodsType == Constant.SOURCE_TYPE_JD) {
         list = JDUtil.suggestSearch(kw);
      } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
         list = PinDuoDuoUtil.suggestSearch(kw);
      }
      if (list == null || list.size() == 0) {
         out.print(JsonUtil.loadFalseResult("暂无建议内容"));
         return;
      }
      JSONArray array = new JSONArray();
      for (String words : list) {
         array.add(words);
      }
      out.print(JsonUtil.loadTrueResult(array));
   }
   /**
    * 搜索-新版
@@ -102,9 +281,8 @@
    * @param kw
    * @param page
    * @param filter
    * @param order
    *            销量由高到低:1 、 价格从高到低:2 、 价格从低到高:3 、 推广量高到低:4(综合默认)、返利比高到低:5
    *            、返利比低到高:6 、推荐20
    * @param order      销量由高到低:1 、 价格从高到低:2 、 价格从低到高:3 、 推广量高到低:4(综合默认)、返利比高到低:5
    *                   、返利比低到高:6 、推荐20
    * @param startprice
    * @param endprice
    * @param fastFilter
@@ -112,10 +290,11 @@
    */
   @RequestMapping(value = "searchGoods")
   public void searchGoods(AcceptData acceptData, String kw, int page, String filter, String order, String startprice,
         String endprice, Double startTkRate, Double endTkRate, String fastFilter, Integer goodsType, PrintWriter out) {
         String endprice, Double startTkRate, Double endTkRate, String fastFilter, Integer goodsType,
         PrintWriter out) {
      String bid = getHistorySearchBid(acceptData);
      // 加入搜索历史记录
      historySearchService.addHistorySearch(kw, bid);
@@ -127,7 +306,7 @@
         out.print(JsonUtil.loadTrueResult(data));
         return;
      }
      if (!StringUtil.isNullOrEmpty(fastFilter)) {
         if (!StringUtil.isNullOrEmpty(filter)) {
            JSONArray filterArray = JSONArray.fromObject(filter);
@@ -143,20 +322,18 @@
      if (goodsType == null) {
         goodsType = Constant.SOURCE_TYPE_TAOBAO;
      }
      // 京东商品
      if (goodsType.intValue() == Constant.SOURCE_TYPE_JD) {
         searchJDGoods(kw, page, filter, order, startprice, endprice, out);
         return;
      }
      // 拼多多商品 TODO
      if (goodsType.intValue() == Constant.SOURCE_TYPE_PDD) {
         // 拼多多商品 TODO
         searchPDDGoods(kw, page, filter, order, startprice, endprice, out);
         return;
      }
      // 是否是推荐
      boolean recommend = false;
@@ -184,13 +361,13 @@
      // 获取推荐词
      List<String> listRecommendWords = new ArrayList<String>();
      // 综合 查询第一页时获取候选词
      if (page == 0) {
      if (page == 1) {
         listRecommendWords = TaoBaoUtil.getSuguestSearch(kw);
         if (listRecommendWords == null || listRecommendWords.size() == 0) {
            listRecommendWords = new ArrayList<String>();
         }
         List<TaoBaoShopVO> listShop =taoBaoShopService.getShopByKey(kw);
         List<TaoBaoShopVO> listShop = taoBaoShopService.getShopByKey(kw);
         if (listShop != null && listShop.size() > 0 && listShop.get(0).getListGoods() != null
               && listShop.get(0).getListGoods().size() > 2) {
            data.put("shop", JsonUtil.getApiCommonGson().toJson(listShop.get(0)));
@@ -204,7 +381,6 @@
      out.print(JsonUtil.loadTrueResult(data));
   }
   private String getHistorySearchBid(AcceptData acceptData) {
      StringBuffer sb = new StringBuffer();
      String link = "#$$$#";
@@ -215,7 +391,6 @@
      return StringUtil.Md5(sb.toString());
   }
   /**
    * 执行搜索-新版
    * 
@@ -410,7 +585,7 @@
      boolean ft = sf.isTmall();
      BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
      BigDecimal shareRate = hongBaoManageService.getShareRate();
      if (fq == 0 && fh == 0 && !ft) {
         if (result != null && taoBaoGoodsBriefs != null)
            for (TaoBaoGoodsBrief bf : taoBaoGoodsBriefs) {
@@ -422,18 +597,18 @@
               list.add(GoodsDetailVOFactory.convertTaoBao(taoBaoGoodsBrief, null, fanLiRate, shareRate));
            }
      }
      Gson gson2 = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
            .excludeFieldsWithoutExposeAnnotation().create();
      data.put("result", gson2.toJson(list));
      data.put("count", result.getTaoBaoHead().getDocsfound());
      return data;
   }
   /**
    * 大淘客商品
    *
    * @param key
    * @param page
    * @param filter
@@ -444,7 +619,6 @@
    */
   private JSONObject searchDaTaoKeGoods(String key, int page, String filter, String order, String startprice,
         String endprice) {
      page = page + 1;
      int sort = DaTaoKeApiUtil.SORT_DEFAULT;
      if ("5".equalsIgnoreCase(order)) {
         sort = DaTaoKeApiUtil.SORT_COMMISSION;
@@ -510,9 +684,9 @@
         }
      }
   }
   /**
    *  京东
    * 京东
    * 
    * @param kw
    * @param page
@@ -522,8 +696,8 @@
    * @param endprice
    * @return
    */
   private void searchJDGoods(String kw, int page, String filter, String order, String startprice,
         String endprice, PrintWriter out) {
   private void searchJDGoods(String kw, int page, String filter, String order, String startprice, String endprice,
         PrintWriter out) {
      JDSearchFilter jdfilter = new JDSearchFilter();
      jdfilter.setKey(SearchFilterUtil.filterSearchContent(kw));
      jdfilter.setPageNo(page);
@@ -536,42 +710,43 @@
      if (!StringUtil.isNullOrEmpty(endprice)) {
         jdfilter.setToPrice(Integer.parseInt(endprice));
      }
      int sort = 1;
      if (!StringUtil.isNullOrEmpty(order)) {
         sort = Integer.parseInt(order);
      }
      switch (sort) {
         case 1: // 销量 desc
            jdfilter.setSort(JDSearchFilter.SORT_DESC);
            jdfilter.setSortName(JDSearchFilter.SORTNAME_ORDER_COUNT_30DAYS);
            break;
         case 2: // 价格—desc
            jdfilter.setSort(JDSearchFilter.SORT_DESC);
            jdfilter.setSortName(JDSearchFilter.SORTNAME_PRICE);
            break;
         case 3: // 价格—asc
            jdfilter.setSort(JDSearchFilter.SORT_ASC);
            jdfilter.setSortName(JDSearchFilter.SORTNAME_PRICE);
            break;
         case 5: // 返利比—asc
            jdfilter.setSort(JDSearchFilter.SORT_DESC);
            jdfilter.setSortName(JDSearchFilter.SORTNAME_COMMISSION_SHARE);
            break;
         default: // 默认:销量 desc
            jdfilter.setSort(JDSearchFilter.SORT_DESC);
            jdfilter.setSortName(JDSearchFilter.SORTNAME_ORDER_COUNT_30DAYS);
            break;
      case 1: // 销量 desc
         jdfilter.setSort(JDSearchFilter.SORT_DESC);
         jdfilter.setSortName(JDSearchFilter.SORTNAME_ORDER_COUNT_30DAYS);
         break;
      case 2: // 价格—desc
         jdfilter.setSort(JDSearchFilter.SORT_DESC);
         jdfilter.setSortName(JDSearchFilter.SORTNAME_PRICE);
         break;
      case 3: // 价格—asc
         jdfilter.setSort(JDSearchFilter.SORT_ASC);
         jdfilter.setSortName(JDSearchFilter.SORTNAME_PRICE);
         break;
      case 5: // 返利比—DESC
         jdfilter.setSort(JDSearchFilter.SORT_DESC);
         jdfilter.setSortName(JDSearchFilter.SORTNAME_COMMISSION_SHARE);
         break;
      default: // 默认:销量 desc
         // jdfilter.setSort(JDSearchFilter.SORT_DESC);
         // jdfilter.setSortName(JDSearchFilter.SORTNAME_ORDER_COUNT_30DAYS);
         break;
      }
      if (!com.yeshi.fanli.util.StringUtil.isNullOrEmpty(filter)) {
         JSONArray array = JSONArray.fromObject(filter);
         for (int i = 0; i < array.size(); i++) {
            String ty = array.optJSONObject(i).optString("type");
             if ("quantype".equalsIgnoreCase(ty)) {
                jdfilter.setHasCoupon(1); // 有券
            if ("quantype".equalsIgnoreCase(ty)) {
               jdfilter.setHasCoupon(1); // 有券
            } else if ("zy".equalsIgnoreCase(ty)) {
               jdfilter.setIsZY(1); // 是否自营
            }
         }
      }
@@ -585,28 +760,28 @@
         if (pageEntity != null) {
            count = pageEntity.getTotalCount();
         }
         List<JDGoods> goodsList = result.getGoodsList();
         if (goodsList != null && goodsList.size() > 0) {
            BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
            BigDecimal shareRate = hongBaoManageService.getShareRate();
            Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                  .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
            for (JDGoods goods: goodsList) {
               GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertJDGoods(goods, null, fanLiRate, shareRate);
            for (JDGoods goods : goodsList) {
               GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertJDGoods(goods, null, fanLiRate,
                     shareRate);
               array.add(gson.toJson(goodsDetailVO));
            }
         }
      }
      data.put("result", array);
      data.put("count", count);
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    *  京东
    * 京东
    * 
    * @param kw
    * @param page
@@ -616,8 +791,8 @@
    * @param endprice
    * @return
    */
   private void searchPDDGoods(String kw, int page, String filter, String order, String startprice,
         String endprice, PrintWriter out) {
   private void searchPDDGoods(String kw, int page, String filter, String order, String startprice, String endprice,
         PrintWriter out) {
      PDDSearchFilter pddfilter = new PDDSearchFilter();
      pddfilter.setKw(SearchFilterUtil.filterSearchContent(kw));
      pddfilter.setPage(page);
@@ -627,38 +802,39 @@
      if (!StringUtil.isNullOrEmpty(order)) {
         sort = Integer.parseInt(order);
      }
      switch (sort) {
         case 1: // 销量 desc
            pddfilter.setSortType(6);
            break;
         case 2: // 价格—desc
            pddfilter.setSortType(4);
            break;
         case 3: // 价格—asc
            pddfilter.setSortType(3);
            break;
         case 5: // 返利比—asc
            pddfilter.setSortType(2);
            break;
         case 6: // 返利比—asc
            pddfilter.setSortType(1);
            break;
         case 20: // 综合排序
            pddfilter.setSortType(0);
            break;
         default: // 默认:销量 desc
            pddfilter.setSortType(6);
            break;
      case 1: // 销量 desc
         pddfilter.setSortType(6);
         break;
      case 2: // 价格—desc
         pddfilter.setSortType(4);
         break;
      case 3: // 价格—asc
         pddfilter.setSortType(3);
         break;
      case 5: // 返利比—asc
         pddfilter.setSortType(2);
         break;
      case 6: // 返利比—asc
         pddfilter.setSortType(1);
         break;
      case 20: // 综合排序
         pddfilter.setSortType(0);
         break;
      default: // 默认:销量 desc
         // pddfilter.setSortType(6);
         break;
      }
      if (!com.yeshi.fanli.util.StringUtil.isNullOrEmpty(filter)) {
         JSONArray array = JSONArray.fromObject(filter);
         for (int i = 0; i < array.size(); i++) {
            String ty = array.optJSONObject(i).optString("type");
             if ("quantype".equalsIgnoreCase(ty)) {
                pddfilter.setHasCoupon(true); // 有券
            if ("quantype".equalsIgnoreCase(ty)) {
               pddfilter.setHasCoupon(true); // 有券
            } else if ("brand".equalsIgnoreCase(ty)) {
               pddfilter.setIsBrand(true); // 是否是品牌
            }
         }
      }
@@ -666,7 +842,7 @@
      int count = 0;
      JSONObject data = new JSONObject();
      JSONArray array = new JSONArray();
      PDDGoodsResult result = PinDuoDuoApiUtil.searchGoods(pddfilter);
      if (result != null) {
         count = result.getTotalCount();
@@ -676,13 +852,14 @@
            BigDecimal shareRate = hongBaoManageService.getShareRate();
            Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                  .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
            for (PDDGoodsDetail goods: goodsList) {
               GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertPDDGoods(goods, null, fanLiRate, shareRate);
            for (PDDGoodsDetail goods : goodsList) {
               GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertPDDGoods(goods, null, fanLiRate,
                     shareRate);
               array.add(gson.toJson(goodsDetailVO));
            }
         }
      }
      data.put("result", array);
      data.put("count", count);
      out.print(JsonUtil.loadTrueResult(data));