yujian
2019-07-19 8222e8b237c5dfb0affcdc03335bfadc06403bf8
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/RecommendControllerV2.java
@@ -6,13 +6,18 @@
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
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;
@@ -20,11 +25,15 @@
import com.yeshi.fanli.entity.bus.homemodule.SwiperPicture;
import com.yeshi.fanli.entity.bus.lable.QualityFactory;
import com.yeshi.fanli.entity.common.JumpDetailV2;
import com.yeshi.fanli.entity.taobao.SearchFilter;
import com.yeshi.fanli.entity.taobao.TLJBuyGoods;
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult;
import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetail;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.goods.recommend.HomeRecommendGoodsService;
import com.yeshi.fanli.service.inter.goods.recommend.RecommendGoodsDeleteHistoryService;
import com.yeshi.fanli.service.inter.homemodule.DeviceSexService;
import com.yeshi.fanli.service.inter.homemodule.SpecialService;
@@ -37,11 +46,17 @@
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.fanli.util.Utils;
import com.yeshi.fanli.util.VersionUtil;
import com.yeshi.fanli.util.factory.MonitorFactory;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
import com.yeshi.fanli.vo.goods.OtherInfo;
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
import com.yeshi.fanli.vo.tlj.ReduceHongBao;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@@ -58,6 +73,9 @@
   @Resource
   private RedisManager redisManager;
   @Resource
   private HomeRecommendGoodsService homeRecommendGoodsService;
   
   @Resource
   private ConfigService configService;
@@ -142,97 +160,6 @@
      }
   }
   
   /**
    * 根据设备信息获取猜你喜欢的内容
    *
    * @param acceptData
    * @param imei
    *            -Android的IMEI信息
    * @param idfa
    *            -IOS的idfa广告标识信息
    */
   @RequestMapping(value = "guessLikeByDevice")
   public void guessUserLikeByDevice(AcceptData acceptData, String imei, String idfa, int page,
         HttpServletRequest request, PrintWriter out) {
      int pageSize = Constant.PAGE_SIZE;
      JSONArray array = new JSONArray();
      Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder()).create();
      // 从推荐来
      if (page <= 1) {
         array.clear();
         BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
         BigDecimal shareRate = hongBaoManageService.getShareRate();
         if (!StringUtil.isNullOrEmpty(imei) || !StringUtil.isNullOrEmpty(idfa)) {
            long startTime = java.lang.System.currentTimeMillis();
            TaoBaoSearchResult result = TaoKeApiUtil.guessDeviceLike(page, 50, imei, idfa);
            if (result != null && result.getTaoBaoGoodsBriefs() != null) {
               // 筛选
               List<GoodsDetailVO> goodsList = new ArrayList<GoodsDetailVO>();
               List<TaoBaoGoodsBrief> gList = recommendGoodsDeleteHistoryService
                     .filterGoods(acceptData.getDevice(), result.getTaoBaoGoodsBriefs());
               // filter
               try {
                  gList = daTaoKeGoodsDetailService.filterTaoBaoGoods(gList);
               } catch (Exception e) {
               }
               // 设备推荐
               if (gList != null)
                  for (TaoBaoGoodsBrief goods : gList) {
                     if (!StringUtil.isNullOrEmpty(goods.getCouponInfo()) && goods.getCouponAmount() != null
                           && goods.getCouponAmount().compareTo(new BigDecimal("5")) >= 0
                           && goods.getBiz30day() > 1000
                           && !StringUtil.isNullOrEmpty(goods.getPictUrlWhite())) {
                        GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(goods, null, fanLiRate, shareRate);
                        detailVO.setRecommend(true);
                        goodsList.add(detailVO);
                     }
                  }
               try {
                  monitorService.addClientAPIMonitor(MonitorFactory.createClientAPI(request, 0,
                        (int) (java.lang.System.currentTimeMillis() - startTime), "推荐数量:" + goodsList.size()));
               } catch (Exception e) {
                  e.printStackTrace();
               }
               Collections.shuffle(goodsList);
               goodsList = goodsList.size() > 20 ? goodsList.subList(0, 20) : goodsList;
               for (GoodsDetailVO goods : goodsList) {
                  array.add(gson.toJson(goods));
               }
            } else {
               try {
                  monitorService.addClientAPIMonitor(MonitorFactory.createClientAPI(request, 0,
                        (int) (java.lang.System.currentTimeMillis() - startTime), "无推荐"));
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         }
         JSONArray localArray = qualityGoodsService.getRecommendToIndexV2((page - 1) * pageSize, pageSize);
         array.addAll(localArray);
      } else {// 从精选库来
         array = qualityGoodsService.getRecommendToIndexV2((page - 1) * pageSize, pageSize);
         if (array == null) {
            out.print(JsonUtil.loadFalseResult("没有更多了"));
            return;
         }
      }
      JSONObject data = new JSONObject();
      data.put("data", array);
      data.put("count", 1000);
      out.print(JsonUtil.loadTrueResult(data));
   }
   
   /**
@@ -286,8 +213,8 @@
      nextTime.set(Calendar.MILLISECOND, 0);
      JSONArray array = null;
      String timekey = String.format("spikeGoods_hour-%s-%s", acceptData.getPlatform(), acceptData.getVersion());
      String cachekey = String.format("spikeGoodsList-%s-%s", acceptData.getPlatform(), acceptData.getVersion());
      String timekey = String.format("spikeGoods_hour_new-%s-%s", acceptData.getPlatform(), acceptData.getVersion());
      String cachekey = String.format("spikeGoodsList_new-%s-%s", acceptData.getPlatform(), acceptData.getVersion());
      String timeValue = redisManager.getCommonString(timekey);
      if (timeValue == null || !timeValue.equals(hour + "")) {
@@ -361,19 +288,204 @@
   
   
   /**
    * 京东专题
    * 首页底部商品推荐
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "getJDSpecial")
   public void getJDSpecial(AcceptData acceptData, PrintWriter out) {
      JSONObject root = getSpikeGoodsContent(acceptData);
   @RequestMapping(value = "getGoodList")
   public void getGoodList(AcceptData acceptData, Integer goodsType, Integer page,
         HttpServletRequest request, PrintWriter out) {
      if (goodsType == null || page == null) {
         out.print(JsonUtil.loadFalseResult("参数信息不正常"));
         return;
      }
      if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
         taoBaoGuessUserLikeByDevice(acceptData, page, request, out);
         return;
      }
      if (goodsType == Constant.SOURCE_TYPE_JD) {
      }
      if (goodsType == Constant.SOURCE_TYPE_PDD) {
      }
      List<QualityFactory> listQuery = qualityGoodsService.listFreeGoods((page - 1) * 20, 20);
      if (listQuery == null) {
         listQuery = new ArrayList<QualityFactory>();
      }
      JSONArray array = new JSONArray();
      if (listQuery.size() > 0) {
         Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
               .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
         BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
         BigDecimal shareRate = hongBaoManageService.getShareRate();
         for (QualityFactory qualityFactory : listQuery) {
            TaoBaoGoodsBrief goods = qualityFactory.getTaoBaoGoodsBrief();
            if (goods == null) {
               continue;
            }
            array.add(gson.toJson(GoodsDetailVOFactory.convertTaoBao(goods, null, fanLiRate, shareRate)));
         }
      }
      long count = qualityGoodsService.countFreeGoods();
      JSONObject root = new JSONObject();
      root.put("count", count);
      root.put("list", array);
      out.print(JsonUtil.loadTrueResult(root));
   }
   
   
   
   /**
    * 根据设备信息获取猜你喜欢的内容
    *
    * @param acceptData
    * @param imei
    *            -Android的IMEI信息
    * @param idfa
    *            -IOS的idfa广告标识信息
    */
   public void taoBaoGuessUserLikeByDevice(AcceptData acceptData, int page, HttpServletRequest request, PrintWriter out) {
      int pageSize = Constant.PAGE_SIZE;
      JSONArray array = new JSONArray();
      Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder()).create();
      String idfa = acceptData.getIdfa();
      String imei = acceptData.getImei();
      if (VersionUtil.greaterThan_1_5_70(acceptData.getPlatform(), acceptData.getVersion())) {
         List<TaoBaoGoodsBrief> goodsList = homeRecommendGoodsService.listGoodsByPage(null, acceptData.getDevice(),
               imei, idfa, page);
         BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
         BigDecimal shareRate = hongBaoManageService.getShareRate();
         for (TaoBaoGoodsBrief goods : goodsList) {
            GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(goods, null, fanLiRate, shareRate);
            if (page < 3)
               detailVO.setRecommend(true);
            try {
               array.add(gson.toJson(detailVO));
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
         if (page == 1) {
            List<TLJBuyGoods> list = homeRecommendGoodsService.getZiGouLiJianHotGoods(acceptData.getDevice());
            if (list != null && list.size() > 0)
               for (int i = list.size() - 1; i >= 0; i--) {
                  TLJBuyGoods goods = list.get(i);
                  BigDecimal rateBuy = TaoBaoConstant.OWN_BUY_WITHOUT_FANLI_RATE;
                  GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(goods.getGoods(), null, rateBuy, rateBuy);
                  String hongBao = TaoBaoUtil.getGoodsHongBaoInfo(goods.getGoods(),TaoBaoConstant.OWN_BUY_WITHOUT_FANLI_RATE);
                  ReduceHongBao reduceHongBao = new ReduceHongBao();
                  reduceHongBao.setLeft(goods.getLeftHongBaoCount());
                  reduceHongBao.setMoney(hongBao);
                  reduceHongBao.setName("付款立减 ");
                  reduceHongBao.setTip("");
                  reduceHongBao.setTotal(goods.getTotalHongBaoCount());
                  OtherInfo otherInfo = new OtherInfo();
                  otherInfo.setReduceHongBao(reduceHongBao);
                  detailVO.setOtherInfo(otherInfo);
                  detailVO.setPictureTag(new ClientTextStyleVO("立减TOP" + (i + 1), "#E5005C", "#FCE431", null));
                  detailVO.setRecommend(true);
                  array.add(0, gson.toJson(detailVO));
               }
         }
         JSONObject data = new JSONObject();
         data.put("list", array);
         data.put("count", 1000);
         out.print(JsonUtil.loadTrueResult(data));
         return;
      }
      // 从推荐来
      if (page <= 1) {
         array.clear();
         if (!StringUtil.isNullOrEmpty(imei) || !StringUtil.isNullOrEmpty(idfa)) {
            long startTime = java.lang.System.currentTimeMillis();
            TaoBaoSearchResult result = TaoKeApiUtil.guessDeviceLike(page, 50, imei, idfa);
            if (result != null && result.getTaoBaoGoodsBriefs() != null) {
               // 筛选
               List<GoodsDetailVO> goodsList = new ArrayList<>();
               List<TaoBaoGoodsBrief> gList = recommendGoodsDeleteHistoryService
                     .filterGoods(acceptData.getDevice(), result.getTaoBaoGoodsBriefs());
               // filter
               try {
                  gList = daTaoKeGoodsDetailService.filterTaoBaoGoods(gList);
               } catch (Exception e) {
               }
               // 设备推荐
               if (gList != null) {
                  BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
                  BigDecimal shareRate = hongBaoManageService.getShareRate();
                  for (TaoBaoGoodsBrief goods : gList) {
                     if (!StringUtil.isNullOrEmpty(goods.getCouponInfo()) && goods.getCouponAmount() != null
                           && goods.getCouponAmount().compareTo(new BigDecimal("5")) >= 0
                           && goods.getBiz30day() > 1000
                           && !StringUtil.isNullOrEmpty(goods.getPictUrlWhite())) {
                        GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(goods, null, fanLiRate, shareRate);
                        detailVO.setRecommend(true);
                        goodsList.add(detailVO);
                     }
                  }
               }
               try {
                  monitorService.addClientAPIMonitor(MonitorFactory.createClientAPI(request, 0,
                        (int) (java.lang.System.currentTimeMillis() - startTime), "推荐数量:" + goodsList.size()));
               } catch (Exception e) {
                  e.printStackTrace();
               }
               Collections.shuffle(goodsList);
               goodsList = goodsList.size() > 20 ? goodsList.subList(0, 20) : goodsList;
               for (GoodsDetailVO goods : goodsList) {
                  array.add(gson.toJson(goods));
               }
            } else {
               try {
                  monitorService.addClientAPIMonitor(MonitorFactory.createClientAPI(request, 0,
                        (int) (java.lang.System.currentTimeMillis() - startTime), "无推荐"));
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         }
         JSONArray localArray = qualityGoodsService.getRecommendToIndexV2((page - 1) * pageSize, pageSize);
         array.addAll(localArray);
      } else {// 从精选库来
         array = qualityGoodsService.getRecommendToIndexV2((page - 1) * pageSize, pageSize);
         if (array == null) {
            out.print(JsonUtil.loadFalseResult("没有更多了"));
            return;
         }
      }
      JSONObject data = new JSONObject();
      data.put("list", array);
      data.put("count", 1000);
      out.print(JsonUtil.loadTrueResult(data));
   }
   
}