admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/RecommendControllerV2.java
@@ -1,905 +1,1017 @@
package com.yeshi.fanli.controller.client.v2;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.yeshi.utils.JsonUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.dto.ConfigParamsDTO;
import com.yeshi.fanli.dto.dataoke.DingDongTime;
import com.yeshi.fanli.dto.jd.JDSearchResult;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.dto.pdd.PDDGoodsResult;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.homemodule.Special;
import com.yeshi.fanli.entity.bus.homemodule.SwiperPicture;
import com.yeshi.fanli.entity.common.JumpDetailV2;
import com.yeshi.fanli.entity.jd.JDGoods;
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.DaTaoKeDetailV2;
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.count.HongBaoV2CountService;
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;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.jd.JDGoodsService;
import com.yeshi.fanli.service.inter.lable.QualityFlashSaleService;
import com.yeshi.fanli.service.inter.lable.QualityGoodsService;
import com.yeshi.fanli.service.inter.monitor.MonitorService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.pdd.PDDGoodsService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoGoodsUpdateService;
import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailService;
import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailV2Service;
import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsService;
import com.yeshi.fanli.tag.PageEntity;
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.TimeUtil;
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.DaTaoKeUtil;
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.goods.SpikeTimeVO;
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
import com.yeshi.fanli.vo.search.SearchKeyTOPVO;
import com.yeshi.fanli.vo.search.SearchKeyVO;
import com.yeshi.fanli.vo.tlj.ReduceHongBao;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("api/v2/recommend")
public class RecommendControllerV2 {
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private QualityGoodsService qualityGoodsService;
   @Resource
   private RedisManager redisManager;
   @Resource
   private HomeRecommendGoodsService homeRecommendGoodsService;
   @Resource
   private ConfigService configService;
   @Resource
   private MonitorService monitorService;
   @Resource
   private QualityFlashSaleService qualityFlashSaleService;
   @Resource
   private DaTaoKeGoodsDetailService daTaoKeGoodsDetailService;
   @Resource
   private RecommendGoodsDeleteHistoryService recommendGoodsDeleteHistoryService;
   @Resource
   private JumpDetailV2Service jumpDetailV2Service;
   @Resource
   private DeviceSexService deviceSexService;
   @Resource
   private SpecialService specialService;
   @Resource
   private SwiperPictureService swiperPictureService;
   @Resource
   private JDGoodsService jdGoodsService;
   @Resource
   private PDDGoodsService pddGoodsService;
   @Resource
   private TaoBaoGoodsUpdateService taoBaoGoodsUpdateService;
   @Resource
   private DaTaoKeGoodsDetailV2Service daTaoKeGoodsDetailV2Service;
   @Resource
   private DaTaoKeGoodsService daTaoKeGoodsService;
   @Resource
   private HongBaoV2CountService hongBaoV2CountService;
   /**
    * 新版推荐专题管理(1.5.3)
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "getRecommendIndex")
   public void getRecommendIndex(AcceptData acceptData, Long uid, PrintWriter out) {
      try {
         // 获取设备定义性别
         int deviceSex = deviceSexService.getDeviceSex(acceptData.getDevice());
         // 1、专题模块
         JSONObject root = specialService.listCacheSpecialToIndex(acceptData, deviceSex);
         // 2、顶部轮播图
         List<SwiperPicture> oldtopPicList = swiperPictureService.getByBannerCardAndVersion("index_top",
               acceptData.getPlatform(), Integer.parseInt(acceptData.getVersion()));
         List<SwiperPicture> topPicList = new ArrayList<>();
         if (oldtopPicList != null && oldtopPicList.size() > 0)
            topPicList.addAll(oldtopPicList);
         root.put("topPicList", JsonUtil.getApiCommonGson().toJson(topPicList));
         // 3、邀请有奖
         List<SwiperPicture> invitePicList = null;
         if ("ios".equalsIgnoreCase(acceptData.getPlatform())
               && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()))) {
            // 如果IOS当前版本处于审核状态就不返回
         } else {
            invitePicList = swiperPictureService.getByBannerCardAndVersion("index_invite", acceptData.getPlatform(),
                  Integer.parseInt(acceptData.getVersion()));
         }
         if (invitePicList == null) {
            invitePicList = new ArrayList<SwiperPicture>();
         }
         root.put("invitePicList", JsonUtil.getApiCommonGson().toJson(invitePicList));
         // 4、IOS的底部网页链接
         String platform = acceptData.getPlatform();
         if ("ios".equalsIgnoreCase(platform)) {
            root.put("htmlLink", configService.get("index_html_link_ios"));
         }
         root.put("spikeGoods", getSpikeGoodsContent(acceptData));
         if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion()))
            root.put("scoreExchange", getScoreExchangeInfo(acceptData));
         if (VersionUtil.greaterThan_2_0(acceptData.getPlatform(), acceptData.getVersion()))
            root.put("searchDiscovery", getSearchDiscoveryInfo(acceptData));
         out.print(JsonUtil.loadTrueResult(root));
      } catch (Exception e) {
         out.print(JsonUtil.loadFalseResult(1, "获取数据失败"));
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
   }
   /**
    * 限时秒杀 1.5.3
    *
    * @param acceptData
    * @param out
    */
   @RequestMapping(value = "getSpikeGoods")
   public void getSpikeGoods(AcceptData acceptData, PrintWriter out) {
      JSONObject root = getSpikeGoodsContent(acceptData);
      out.print(JsonUtil.loadTrueResult(root));
   }
   private JSONObject getSpikeGoodsContent(AcceptData acceptData) {
      long nowTime = System.currentTimeMillis();
      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(nowTime);
      List<DingDongTime> dtoList = DaTaoKeUtil.getDingDongQiangTime(calendar);
      int dateNum = Integer.parseInt(TimeUtil.getGernalTime(nowTime, "ddHH"));
      String timeStr = null;
      int nextPos = 0;
      for (int i = 0; i < dtoList.size() - 1; i++) {
         if (dateNum >= Integer.parseInt(dtoList.get(i).getTime())
               && dateNum < Integer.parseInt(dtoList.get(i + 1).getTime())) {
            timeStr = dtoList.get(i).getTime();
            nextPos = i + 1;
            break;
         }
      }
      if (timeStr == null)
         timeStr = dtoList.get(dtoList.size() - 1).getTime();
      long nextTime = nowTime + 1000 * 60 * 60L;// 默认为1小时
      if (nextPos < dtoList.size()) {
         nextTime = TimeUtil.convertToTimeTemp(
               TimeUtil.getGernalTime(nowTime, "yyyyMM") + dtoList.get(nextPos).getTime(), "yyyyMMddHH");
      }
      JSONArray array = null;
      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());
      Calendar nowCalendar = Calendar.getInstance();
      nowCalendar.setTimeInMillis(nowTime);
      int hour = nowCalendar.get(Calendar.HOUR_OF_DAY);
      String timeValue = redisManager.getCommonString(timekey);
      if (timeValue == null || !timeValue.equals(hour + "")) {
         redisManager.cacheCommonString(timekey, hour + "", 60 * 30);
      } else {
         String cacheValue = redisManager.getCommonString(cachekey);
         if (!StringUtil.isNullOrEmpty(cacheValue)) {
            array = JSONArray.fromObject(cacheValue);
         }
      }
      JumpDetailV2 jumpDetail = null;
      if (VersionUtil.greaterThan_2_0_2(acceptData.getPlatform(), acceptData.getVersion())) {
         jumpDetail = jumpDetailV2Service.getByTypeCache("spike_goods_list");
      } else {
         jumpDetail = jumpDetailV2Service.getByTypeCache("web");
      }
      if (array == null) {
         array = new JSONArray();
         BigDecimal fanLiRate = hongBaoManageService.getFanLiRate();
         BigDecimal shareRate = hongBaoManageService.getShareRate();
         Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
               .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
         // 缓存中不存在
         List<DaTaoKeDetailV2> listGoods = daTaoKeGoodsDetailV2Service.getDingDongQiangData(timeStr);
         if (listGoods == null) {
            listGoods = new ArrayList<>();
         }
         if (listGoods != null && listGoods.size() > 3)
            listGoods = listGoods.subList(0, 3);
         /* 遍历列表数据 */
         ConfigParamsDTO configParamsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
               acceptData.getVersion());
         for (DaTaoKeDetailV2 detail : listGoods) {
            TaoBaoGoodsBrief taoBaoGoodsBrief = TaoBaoUtil.convert(detail);
            if (taoBaoGoodsBrief == null) {
               continue;
            }
            GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(taoBaoGoodsBrief, configParamsDTO);
            JSONObject params = new JSONObject();
            params.put("url", configService.get("spike_goods_link") + "?id=" + taoBaoGoodsBrief.getAuctionId());
            JSONObject goods = new JSONObject();
            goods.put("goods", gson.toJson(detailVO));
            goods.put("params", params);
            goods.put("jumpDetail", jumpDetail);
            // 1.5.4及以后返回
            if (VersionUtil.greaterThan_1_5_40(acceptData.getPlatform(), acceptData.getVersion())) {
               array.add(goods);
            } else {
               array.add(goods.optJSONObject("goods"));
            }
         }
         // 缓存半个小时
         redisManager.cacheCommonString(cachekey, array.toString(), 60 * 30);
      }
      // 获取今天的数据
      Long endTime = nextTime - nowTime;
      JSONObject root = new JSONObject();
      if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion())) {
         root.put("time", nextTime);
         root.put("endTime", endTime > 0 ? endTime : 0);
         JSONArray imgArray = new JSONArray();
         if (array != null)
            for (int i = 0; i < array.size(); i++) {
               imgArray.add(array.optJSONObject(i).optJSONObject("goods").optString("picUrl"));
            }
         root.put("imgList", imgArray);
         JSONObject params = new JSONObject();
         params.put("url", configService.get("spike_goods_link"));
         root.put("params", params);
         root.put("jumpDetail", jumpDetail);
         root.put("name", "限时秒杀");
         root.put("desc", "整点更新,好物抢购");
      } else {
         root.put("time", nextTime);
         root.put("endTime", endTime > 0 ? endTime : 0);
         root.put("listgoods", array);
         JSONObject params = new JSONObject();
         params.put("url", configService.get("spike_goods_link"));
         root.put("params", params);
         root.put("jumpDetail", jumpDetail);
      }
      root.put("time", nextTime);
      root.put("endTime", endTime > 0 ? endTime : 0);
      root.put("listgoods", array);
      return root;
   }
   /**
    * 限时秒杀列表
    *
    * @param acceptData
    * @param page
    * @param auctionId
    * @param time
    * @param out
    */
   @RequestMapping("getSpikTime")
   public void getSpikTime(AcceptData acceptData, PrintWriter out) {
      List<DingDongTime> timeList = DaTaoKeUtil.getDingDongQiangTime(Calendar.getInstance());
      List<SpikeTimeVO> list = new ArrayList<SpikeTimeVO>();
      for (int i = 0; i < timeList.size(); i++) {
         SpikeTimeVO spikeTime1 = new SpikeTimeVO();
         spikeTime1.setTime(timeList.get(i).getTime().subSequence(2, 4) + ":00");
         if (timeList.get(i).getState() <= 0)
            spikeTime1.setState("进行中");
         else
            spikeTime1.setState("即将开始");
         if (timeList.get(i).getState() == 0)
            spikeTime1.setChecked(true);
         spikeTime1.setRequestTime(timeList.get(i).getTime());
         list.add(spikeTime1);
      }
      JSONObject data = new JSONObject();
      data.put("count", list.size());
      data.put("list", list);
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 限时秒杀列表
    *
    * @param acceptData
    * @param page
    * @param auctionId
    * @param time
    * @param out
    */
   @RequestMapping("getSpikeGoodsList")
   public void getSpikeGoodsList(AcceptData acceptData, Integer page, Long goodsId, String qtime, PrintWriter out) {
      List<DaTaoKeDetailV2> detailList0 = daTaoKeGoodsDetailV2Service.getDingDongQiangData(qtime);
      if (detailList0 == null)
         detailList0 = new ArrayList<>();
      List<DaTaoKeDetailV2> detailList = new ArrayList<>();
      detailList.addAll(detailList0);
      JSONArray array = new JSONArray();
      if (page == 1 && goodsId != null && detailList != null) {
         for (int i = 0; i < detailList.size(); i++) {
            if (detailList.get(i).getGoodsId().longValue() == goodsId) {
               DaTaoKeDetailV2 goods = detailList.get(i);
               detailList.remove(i);
               detailList.add(0, goods);
               break;
            }
         }
      }
      Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
            .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
      if (detailList != null) {
         ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
               acceptData.getVersion());
         for (DaTaoKeDetailV2 detail : detailList) {
            array.add(gson.toJson(GoodsDetailVOFactory.convertTaoBao(TaoBaoUtil.convert(detail), paramsDTO)));
         }
      }
      JSONObject data = new JSONObject();
      data.put("count", detailList.size());
      data.put("list", array);
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 金币兑换信息
    *
    * @param acceptData
    * @return
    */
   private JSONObject getScoreExchangeInfo(AcceptData acceptData) {
      JSONObject root = new JSONObject();
      JSONArray array = new JSONArray();
      array.add("http://img.flqapp.com/resource/integral/integral_home_icon_2.png");
      array.add("http://img.flqapp.com/resource/integral/integral_home_icon_1.png");
      root.put("imgList", array);
      JSONObject params = new JSONObject();
      params.put("balanceMore", true);
      root.put("params", params);
      root.put("jumpDetail", jumpDetailV2Service.getByTypeCache("integralExchange",
            Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion())));
      root.put("name", "金币兑换");
      root.put("desc", "每日签到,惊喜不停");
      root.put("tagImg", "http://img.flqapp.com/resource/score_exchange_tag.png");
      return root;
   }
   /**
    * 金币兑换信息
    *
    * @param acceptData
    * @return
    */
   private JSONObject getSearchDiscoveryInfo(AcceptData acceptData) {
      JSONArray array = new JSONArray();
      String keys = configService.getSearchDiscoveryKeys();
      if (!StringUtil.isNullOrEmpty(keys)) {
         JSONArray arrayKeys = JSONArray.fromObject(keys);
         for (int i = 0; i < arrayKeys.size(); i++) {
            String name = arrayKeys.get(i).toString();
            JSONObject params = new JSONObject();
            params.put("content", name);
            SearchKeyVO keyVO = new SearchKeyVO();
            keyVO.setName(name);
            keyVO.setParams(params.toString());
            array.add(keyVO);
         }
      }
      JSONObject params = new JSONObject();
      params.put("url", configService.get("search_discovery_h5_link"));
      JSONObject root = new JSONObject();
      root.put("picture", "http://img.flqapp.com/resource/home_search_found.png");
      root.put("params", params);
      root.put("jumpDetail", jumpDetailV2Service.getByTypeCache("web",
            Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion())));
      root.put("jumpResult", jumpDetailV2Service.getByTypeCache("search_goods_result",
            Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion())));
      root.put("keyList", array);
      return root;
   }
   /**
    * 首页底部商品推荐
    *
    * @param acceptData
    * @param out
    */
   @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;
      }
      try {
         if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
            taoBaoGuessUserLikeByDevice(acceptData, page, request, out);
            return;
         }
         if (goodsType == Constant.SOURCE_TYPE_JD) {
            getIndexJDGoods(acceptData, page, out);
            return;
         }
         if (goodsType == Constant.SOURCE_TYPE_PDD) {
            getIndexPDDGoods(acceptData, page, out);
            return;
         }
         out.print(JsonUtil.loadFalseResult("商品类型错误"));
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
         JSONObject data = new JSONObject();
         data.put("list", new JSONArray());
         data.put("count", 0);
         out.print(JsonUtil.loadTrueResult(data));
      }
   }
   /**
    * 根据设备信息获取猜你喜欢的内容
    *
    * @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);
         if (page < 4) {// 前三页加入更新
            try {
               taoBaoGoodsUpdateService.addUpdateQueueAsync(goodsList);
            } catch (Exception e) {
            }
         }
         ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
               acceptData.getVersion());
         for (TaoBaoGoodsBrief goods : goodsList) {
            GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(goods, paramsDTO);
            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) {
               BigDecimal rateBuy = TaoBaoConstant.OWN_BUY_WITHOUT_FANLI_RATE;
               ConfigParamsDTO paramsBuy = new ConfigParamsDTO(rateBuy, rateBuy, Constant.MAX_REWARD_RATE,
                     hongBaoManageService.getVIPFanLiRate());
               for (int i = list.size() - 1; i >= 0; i--) {
                  TLJBuyGoods goods = list.get(i);
                  GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(goods.getGoods(), paramsBuy);
                  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) {
                  ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
                        acceptData.getVersion());
                  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, paramsDTO);
                        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,acceptData.getPlatform(),acceptData.getVersion());
         array.addAll(localArray);
      } else {// 从精选库来
         array = qualityGoodsService.getRecommendToIndexV2((page - 1) * pageSize, pageSize,acceptData.getPlatform(),acceptData.getVersion());
         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));
   }
   /**
    * 京东首页商品
    *
    * @param acceptData
    * @param page
    * @param out
    */
   private void getIndexJDGoods(AcceptData acceptData, int page, PrintWriter out) {
      JDSearchResult result = jdGoodsService.getIndexJDGoods(page);
      long count = 0;
      JSONObject data = new JSONObject();
      JSONArray array = new JSONArray();
      if (result != null) {
         PageEntity pageEntity = result.getPageEntity();
         if (pageEntity != null) {
            count = pageEntity.getTotalCount();
         }
         List<JDGoods> goodsList = result.getGoodsList();
         if (goodsList != null && goodsList.size() > 0) {
            ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
                  acceptData.getVersion());
            Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                  .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
            for (JDGoods goods : goodsList) {
               GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertJDGoods(goods, paramsDTO);
               array.add(gson.toJson(goodsDetailVO));
            }
         }
      }
      data.put("list", array);
      data.put("count", count);
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 爆款排行商品-实时热销榜
    *
    * @param acceptData
    * @param page
    * @param out
    */
   private void getIndexPDDGoods(AcceptData acceptData, int page, PrintWriter out) {
      PDDGoodsResult result = pddGoodsService.getTopGoodsList(page, 1);
      int count = 0;
      JSONArray array = new JSONArray();
      if (result != null) {
         count = result.getTotalCount();
         Gson gson = JsonUtil.getApiCommonGson();
         List<PDDGoodsDetail> goodsList = result.getGoodsList();
         if (goodsList != null && goodsList.size() > 0) {
            ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
                  acceptData.getVersion());
            for (PDDGoodsDetail goods : goodsList) {
               GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertPDDGoods(goods, paramsDTO);
               array.add(gson.toJson(goodsDetailVO));
            }
         }
      }
      JSONObject data = new JSONObject();
      data.put("list", array);
      data.put("count", count);
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 搜索发现列表
    *
    * @param acceptData
    * @param uid
    * @param page
    * @param out
    */
   @RequestMapping(value = "getSearchDiscoveryTop")
   public void getSearchDiscoveryTop(AcceptData acceptData, Long uid, Integer page, String callback, PrintWriter out) {
      int count = 0;
      List<SearchKeyTOPVO> list = new ArrayList<SearchKeyTOPVO>();
      String keys = configService.getSearchDiscoveryKeys();
      if (!StringUtil.isNullOrEmpty(keys)) {
         JSONArray arrayKeys = JSONArray.fromObject(keys);
         if (arrayKeys != null && arrayKeys.size() > 0) {
            count = arrayKeys.size();
            ConfigParamsDTO paramsDTO = hongBaoManageService.getShowComputeRate(acceptData.getPlatform(),
                  acceptData.getVersion());
            int j = 1;
            for (int i = (page - 1) * 3; i < arrayKeys.size(); i++) {
               if (j > 3)
                  break;
               String words = arrayKeys.get(i).toString();
               List<GoodsDetailVO> listGoods = new ArrayList<GoodsDetailVO>();
               List<DaTaoKeDetailV2> listTaoKe = daTaoKeGoodsService.getSearchDiscoveryGoods(words);
               if (listTaoKe != null && listTaoKe.size() > 0) {
                  for (DaTaoKeDetailV2 daTaoKeDetailV2 : listTaoKe) {
                     listGoods.add(
                           GoodsDetailVOFactory.convertTaoBao(TaoBaoUtil.convert(daTaoKeDetailV2), paramsDTO));
                     if (listGoods.size() >= 3)
                        break;
                  }
               }
               SearchKeyTOPVO keyTOPVO = new SearchKeyTOPVO();
               keyTOPVO.setName(words);
               keyTOPVO.setListGoods(listGoods);
               list.add(keyTOPVO);
               j++;
            }
         }
      }
      GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
      Gson gson = gsonBuilder.create();
      JSONObject data = new JSONObject();
      data.put("count", count);
      data.put("list", gson.toJson(list));
      if (!StringUtil.isNullOrEmpty(callback)) {
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } else
         out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 获取专题渠道活动
    *
    * @param acceptData
    * @param uid
    * @param callback
    * @param out
    */
   @RequestMapping(value = "getSpecialChannelActivity")
   public void getSpecialChannelActivity(AcceptData acceptData, Long uid, String callback, PrintWriter out) {
      int platformCode = Constant.getPlatformCode(acceptData.getPlatform());
      List<Special> list = specialService.listByPlaceKey("special_channel_activity", platformCode,
            Integer.parseInt(acceptData.getVersion()));
      long time = System.currentTimeMillis();
      // 删除尚未启用的过期的
      for (int i = 0; i < list.size(); i++) {
         Special special = list.get(i);
         if (special.getState() == 1L) {
            list.remove(i--);
         } else {
            if (special.getStartTime() != null && special.getEndTime() != null)
               special.setTimeTask(true);
            else
               special.setTimeTask(false);
            if (special.isTimeTask()) {
               if (time < special.getStartTime().getTime() || time > special.getEndTime().getTime()) {
                  list.remove(i--);
               } else// 设置倒计时
               {
                  special.setCountDownTime((special.getEndTime().getTime() - time) / 1000);
               }
            }
         }
      }
      GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
      Gson gson = gsonBuilder.create();
      JSONObject data = new JSONObject();
      data.put("count", list.size());
      data.put("list", gson.toJson(list));
      if (!StringUtil.isNullOrEmpty(callback)) {
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } else
         out.print(JsonUtil.loadTrueResult(data));
   }
   /**
    * 获取专题渠道活动
    *
    * @param acceptData
    * @param uid
    * @param callback
    * @param out
    */
   @RequestMapping(value = "getGuide")
   public void getGuide(AcceptData acceptData, Long uid, PrintWriter out) {
      String tips = null;
      if (uid == null || uid <= 0) {
         tips = configService.get("tip_guide_new_user");
      } else {
         long rebateOrder = hongBaoV2CountService.countRebateOrder(uid);
         long shareOrInviteOrder = hongBaoV2CountService.countShareOrInviteOrder(uid);
         if (rebateOrder + shareOrInviteOrder >= 3) {
            // 熟客版
         } else if (rebateOrder <= 0 && shareOrInviteOrder <= 0) {
            // 新人版
            tips = configService.get("tip_guide_new_user");
         } else if (rebateOrder > 0 && shareOrInviteOrder <= 0) {
            // 省钱版
            tips = configService.get("tip_guide_save_money");
         } else {
            // 赚钱版
            tips = configService.get("tip_guide_share_invite");
         }
      }
      if (StringUtil.isNullOrEmpty(tips)) {
         out.print(JsonUtil.loadFalseResult("暂无提示"));
         return;
      }
      JSONObject data = JSONObject.fromObject(tips);
      out.print(JsonUtil.loadTrueResult(data));
   }
}
package com.yeshi.fanli.controller.client.v2;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.dto.GoodsMoneyConfigParamsDTO;
import com.yeshi.fanli.dto.common.CommonContentResult;
import com.yeshi.fanli.dto.common.CommonContentTypeEnum;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.lijin.manager.GoodsLijinMnager;
import com.yeshi.fanli.service.inter.goods.CommonTemplateContentService;
import com.yeshi.goods.facade.dto.taobao.dataoke.DingDongTime;
import com.yeshi.fanli.dto.jd.JDSearchResult;
import com.yeshi.fanli.dto.pdd.PDDGoodsDetail;
import com.yeshi.fanli.dto.pdd.PDDGoodsResult;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.homemodule.Special;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.common.JumpDetailV2;
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.entity.taobao.TLJBuyGoods;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult;
import com.yeshi.goods.facade.entity.taobao.dataoke.DaTaoKeDetailV2;
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.count.HongBaoV2CountService;
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;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.jd.JDGoodsService;
import com.yeshi.fanli.service.inter.lable.QualityFlashSaleService;
import com.yeshi.fanli.service.inter.lable.QualityGoodsService;
import com.yeshi.fanli.service.inter.monitor.MonitorService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.pdd.PDDGoodsService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoGoodsUpdateService;
import com.yeshi.goods.facade.service.DaTaoKeGoodsDetailV2Service;
import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsService;
import com.yeshi.common.entity.PageEntity;
import com.yeshi.fanli.util.*;
import com.yeshi.fanli.util.factory.MonitorFactory;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.taobao.DaTaoKeUtil;
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.goods.SpikeTimeVO;
import com.yeshi.fanli.vo.homemodule.BannerVO;
import com.yeshi.common.vo.ClientTextStyleVO;
import com.yeshi.fanli.vo.search.SearchKeyTOPVO;
import com.yeshi.fanli.vo.search.SearchKeyVO;
import com.yeshi.fanli.vo.tlj.ReduceHongBao;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.TimeUtil;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
@Controller
@RequestMapping("api/v2/recommend")
public class RecommendControllerV2 {
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @Resource
    private QualityGoodsService qualityGoodsService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private HomeRecommendGoodsService homeRecommendGoodsService;
    @Resource
    private ConfigService configService;
    @Resource
    private MonitorService monitorService;
    @Resource
    private QualityFlashSaleService qualityFlashSaleService;
    @Resource
    private RecommendGoodsDeleteHistoryService recommendGoodsDeleteHistoryService;
    @Resource
    private JumpDetailV2Service jumpDetailV2Service;
    @Resource
    private DeviceSexService deviceSexService;
    @Resource
    private SpecialService specialService;
    @Resource
    private SwiperPictureService swiperPictureService;
    @Resource
    private JDGoodsService jdGoodsService;
    @Resource
    private PDDGoodsService pddGoodsService;
    @Resource
    private TaoBaoGoodsUpdateService taoBaoGoodsUpdateService;
    @Resource
    private DaTaoKeGoodsDetailV2Service daTaoKeGoodsDetailV2Service;
    @Resource
    private DaTaoKeGoodsService daTaoKeGoodsService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    @Resource
    private HongBaoManageService hongBaoManageService;
    @Resource
    private GoodsLijinMnager goodsLijinMnager;
    @Resource
    private CommonTemplateContentService commonTemplateContentService;
    /**
     * 新版推荐专题管理(1.5.3)
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "getRecommendIndex")
    public void getRecommendIndex(AcceptData acceptData, Long uid, PrintWriter out) {
        try {
            // 获取设备定义性别
            int deviceSex = deviceSexService.getDeviceSex(acceptData.getDevice(), acceptData.getSystem());
            // 1、专题模块
            JSONObject root = specialService.listCacheSpecialToIndex(acceptData, deviceSex, acceptData.getSystem());
            // 2、顶部轮播图
            List<BannerVO> oldtopPicList = swiperPictureService.getByBannerCardAndVersion("index_top",
                    acceptData.getPlatform(), Integer.parseInt(acceptData.getVersion()), acceptData.getSystem());
            List<BannerVO> topPicList = new ArrayList<>();
            if (oldtopPicList != null && oldtopPicList.size() > 0)
                topPicList.addAll(oldtopPicList);
            root.put("topPicList", JsonUtil.getApiCommonGson().toJson(topPicList));
            // 3、邀请有奖
            List<BannerVO> invitePicList = null;
            if ("ios".equalsIgnoreCase(acceptData.getPlatform())
                    && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()), acceptData.getSystem())) {
                // 如果IOS当前版本处于审核状态就不返回
            } else {
                invitePicList = swiperPictureService.getByBannerCardAndVersion("index_invite", acceptData.getPlatform(),
                        Integer.parseInt(acceptData.getVersion()), acceptData.getSystem());
            }
            if (invitePicList == null) {
                invitePicList = new ArrayList<BannerVO>();
            }
            root.put("invitePicList", JsonUtil.getApiCommonGson().toJson(invitePicList));
            // 4、IOS的底部网页链接
            String platform = acceptData.getPlatform();
            if ("ios".equalsIgnoreCase(platform)) {
                root.put("htmlLink", configService.getValue(ConfigKeyEnum.indexHtmlLinkIos.getKey(), acceptData.getSystem()));
            }
            root.put("spikeGoods", getSpikeGoodsContent(acceptData));
            if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion()))
                root.put("scoreExchange", getScoreExchangeInfo(acceptData));
            if (VersionUtil.greaterThan_2_0(acceptData.getPlatform(), acceptData.getVersion()))
                root.put("searchDiscovery", getSearchDiscoveryInfo(acceptData));
            out.print(JsonUtil.loadTrueResult(root));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult(1, "获取数据失败"));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }
    /**
     * 特价推荐
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getRecommendIndexTJ")
    public void getRecommendIndexTJ(AcceptData acceptData, Long uid, PrintWriter out) {
        try {
            // 获取设备定义性别
            int deviceSex = deviceSexService.getDeviceSex(acceptData.getDevice(), acceptData.getSystem());
            // 1、专题模块
            JSONObject root = specialService.listCacheSpecialToIndex(acceptData, deviceSex, acceptData.getSystem());
            // 2、顶部轮播图
            List<BannerVO> oldtopPicList = swiperPictureService.getByBannerCardAndVersion("index_top",
                    acceptData.getPlatform(), Integer.parseInt(acceptData.getVersion()), acceptData.getSystem());
            List<BannerVO> topPicList = new ArrayList<>();
            if (oldtopPicList != null && oldtopPicList.size() > 0)
                topPicList.addAll(oldtopPicList);
            root.put("topPicList", JsonUtil.getApiCommonGson().toJson(topPicList));
            // 3、邀请有奖
            List<BannerVO> invitePicList = null;
            if ("ios".equalsIgnoreCase(acceptData.getPlatform())
                    && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()), acceptData.getSystem())) {
                // 如果IOS当前版本处于审核状态就不返回
            } else {
                invitePicList = swiperPictureService.getByBannerCardAndVersion("index_invite", acceptData.getPlatform(),
                        Integer.parseInt(acceptData.getVersion()), acceptData.getSystem());
            }
            if (invitePicList == null) {
                invitePicList = new ArrayList<BannerVO>();
            }
            root.put("invitePicList", JsonUtil.getApiCommonGson().toJson(invitePicList));
            // 4、IOS的底部网页链接
            String platform = acceptData.getPlatform();
            if ("ios".equalsIgnoreCase(platform)) {
                root.put("htmlLink", configService.getValue(ConfigKeyEnum.indexHtmlLinkIos.getKey(), acceptData.getSystem()));
            }
            root.put("spikeGoods", getSpikeGoodsContent(acceptData));
            if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion()))
                root.put("scoreExchange", getScoreExchangeInfo(acceptData));
            if (VersionUtil.greaterThan_2_0(acceptData.getPlatform(), acceptData.getVersion()))
                root.put("searchDiscovery", getSearchDiscoveryInfo(acceptData));
            //今日爆款
            CommonContentResult commonContentResult = commonTemplateContentService.getContentList(CommonContentTypeEnum.pddHotGoodsRank, null, 1, 10, acceptData.getSystem());
            if (commonContentResult != null && commonContentResult.getGoodsList() != null && commonContentResult.getGoodsList().size() > 0) {
                com.alibaba.fastjson.JSONObject hotSale = new com.alibaba.fastjson.JSONObject();
                JumpDetailV2 jumpDetailV2 = new JumpDetailV2();
                jumpDetailV2.setActivity("com.tejia.lijin.app.ui.sellwellcommodity.SellWellGoods");
                hotSale.put("jumpDetail", jumpDetailV2);
                com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject();
                String navs = "[{\"key\":\"pddHotGoodsRank\",\"title\":\"拼多多\"},{\"key\":\"jdHotGoodsRank\",\"title\":\"京东\"},{\"key\":\"tbHotGoodsRank\",\"title\":\"淘宝\"}]";
                params.put("navs", navs.replace("\"","\\"+"\""));
                hotSale.put("params", params);
                Collections.shuffle(commonContentResult.getGoodsList());
                //获取goodsList
                GoodsMoneyConfigParamsDTO configParamsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                        acceptData.getVersion(), acceptData.getSystem());
                List<GoodsDetailVO> goodsList = goodsLijinMnager.loadCommonGoodsMoneyInfo(acceptData.getSystem(), uid, commonContentResult.getGoodsList(), configParamsDTO);
                JSONArray array = new JSONArray();
                Gson gson = new Gson();
                for (GoodsDetailVO vo : goodsList) {
                    array.add(gson.toJson(vo));
                }
                hotSale.put("goodsList", array);
                root.put("hotSales", hotSale);
            }
            out.print(JsonUtil.loadTrueResult(root));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult(1, "获取数据失败"));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }
    /**
     * 限时秒杀 1.5.3
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "getSpikeGoods")
    public void getSpikeGoods(AcceptData acceptData, PrintWriter out) {
        JSONObject root = getSpikeGoodsContent(acceptData);
        out.print(JsonUtil.loadTrueResult(root));
    }
    private JSONObject getSpikeGoodsContent(AcceptData acceptData) {
        long nowTime = System.currentTimeMillis();
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(nowTime);
        List<DingDongTime> dtoList = DaTaoKeUtil.getDingDongQiangTime(calendar);
        int dateNum = Integer.parseInt(TimeUtil.getGernalTime(nowTime, "ddHH"));
        String timeStr = null;
        int nextPos = 0;
        for (int i = 0; i < dtoList.size() - 1; i++) {
            if (dateNum >= Integer.parseInt(dtoList.get(i).getTime())
                    && dateNum < Integer.parseInt(dtoList.get(i + 1).getTime())) {
                timeStr = dtoList.get(i).getTime();
                nextPos = i + 1;
                break;
            }
        }
        if (timeStr == null)
            timeStr = dtoList.get(dtoList.size() - 1).getTime();
        long nextTime = nowTime + 1000 * 60 * 60L;// 默认为1小时
        if (nextPos < dtoList.size()) {
            nextTime = TimeUtil.convertToTimeTemp(
                    TimeUtil.getGernalTime(nowTime, "yyyyMM") + dtoList.get(nextPos).getTime(), "yyyyMMddHH");
        }
        JSONArray array = null;
        String timekey = RedisKeyEnum.getRedisKey(RedisKeyEnum.spikeGoodsHourNew, acceptData.getPlatform() + "-" + acceptData.getVersion());
        String cachekey = RedisKeyEnum.getRedisKey(RedisKeyEnum.spikeGoodsListNew, acceptData.getPlatform() + "-" + acceptData.getVersion());
        Calendar nowCalendar = Calendar.getInstance();
        nowCalendar.setTimeInMillis(nowTime);
        int hour = nowCalendar.get(Calendar.HOUR_OF_DAY);
        String timeValue = redisManager.getCommonString(timekey);
        if (timeValue == null || !timeValue.equals(hour + "")) {
            redisManager.cacheCommonString(timekey, hour + "", 60 * 30);
        } else {
            String cacheValue = redisManager.getCommonString(cachekey);
            if (!StringUtil.isNullOrEmpty(cacheValue)) {
                array = JSONArray.fromObject(cacheValue);
            }
        }
        JumpDetailV2 jumpDetail = null;
        if (VersionUtil.greaterThan_2_0_2(acceptData.getPlatform(), acceptData.getVersion())) {
            jumpDetail = jumpDetailV2Service.getByTypeCache("spike_goods_list",acceptData.getSystem());
        } else {
            jumpDetail = jumpDetailV2Service.getByTypeCache("web",acceptData.getSystem());
        }
        if (array == null) {
            array = new JSONArray();
            Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                    .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
            // 缓存中不存在
            List<DaTaoKeDetailV2> listGoods = daTaoKeGoodsDetailV2Service.getDingDongQiangData(timeStr);
            if (listGoods == null) {
                listGoods = new ArrayList<>();
            }
            if (listGoods != null && listGoods.size() > 3)
                listGoods = listGoods.subList(0, 3);
            /* 遍历列表数据 */
            GoodsMoneyConfigParamsDTO configParamsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                    acceptData.getVersion(), acceptData.getSystem());
            for (DaTaoKeDetailV2 detail : listGoods) {
                TaoBaoGoodsBrief taoBaoGoodsBrief = TaoBaoUtil.convert(detail);
                if (taoBaoGoodsBrief == null) {
                    continue;
                }
                GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(taoBaoGoodsBrief, configParamsDTO);
                JSONObject params = new JSONObject();
                params.put("url", configService.getValue(ConfigKeyEnum.spikeGoodsLink.getKey(), acceptData.getSystem()) + "?id=" + taoBaoGoodsBrief.getAuctionId());
                JSONObject goods = new JSONObject();
                goods.put("goods", gson.toJson(detailVO));
                goods.put("params", params);
                goods.put("jumpDetail", jumpDetail);
                // 1.5.4及以后返回
                if (VersionUtil.greaterThan_1_5_40(acceptData.getPlatform(), acceptData.getVersion())) {
                    array.add(goods);
                } else {
                    array.add(goods.optJSONObject("goods"));
                }
            }
            // 缓存半个小时
            redisManager.cacheCommonString(cachekey, array.toString(), 60 * 30);
        }
        // 获取今天的数据
        Long endTime = nextTime - nowTime;
        JSONObject root = new JSONObject();
        if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion())) {
            root.put("time", nextTime);
            root.put("endTime", endTime > 0 ? endTime : 0);
            JSONArray imgArray = new JSONArray();
            if (array != null)
                for (int i = 0; i < array.size(); i++) {
                    imgArray.add(array.optJSONObject(i).optJSONObject("goods").optString("picUrl"));
                }
            root.put("imgList", imgArray);
            JSONObject params = new JSONObject();
            params.put("url", configService.getValue(ConfigKeyEnum.spikeGoodsLink.getKey(), acceptData.getSystem()));
            root.put("params", params);
            root.put("jumpDetail", jumpDetail);
            root.put("name", "限时秒杀");
            root.put("desc", "整点更新,好物抢购");
        } else {
            root.put("time", nextTime);
            root.put("endTime", endTime > 0 ? endTime : 0);
            root.put("listgoods", array);
            JSONObject params = new JSONObject();
            params.put("url", configService.getValue(ConfigKeyEnum.spikeGoodsLink.getKey(), acceptData.getSystem()));
            root.put("params", params);
            root.put("jumpDetail", jumpDetail);
        }
        root.put("time", nextTime);
        root.put("endTime", endTime > 0 ? endTime : 0);
        root.put("listgoods", array);
        return root;
    }
    /**
     * 限时秒杀列表
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping("getSpikTime")
    public void getSpikTime(AcceptData acceptData, PrintWriter out) {
        List<DingDongTime> timeList = DaTaoKeUtil.getDingDongQiangTime(Calendar.getInstance());
        List<SpikeTimeVO> list = new ArrayList<SpikeTimeVO>();
        for (int i = 0; i < timeList.size(); i++) {
            SpikeTimeVO spikeTime1 = new SpikeTimeVO();
            spikeTime1.setTime(timeList.get(i).getTime().subSequence(2, 4) + ":00");
            if (timeList.get(i).getState() <= 0)
                spikeTime1.setState("进行中");
            else
                spikeTime1.setState("即将开始");
            if (timeList.get(i).getState() == 0)
                spikeTime1.setChecked(true);
            spikeTime1.setRequestTime(timeList.get(i).getTime());
            list.add(spikeTime1);
        }
        JSONObject data = new JSONObject();
        data.put("count", list.size());
        data.put("list", list);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 限时秒杀列表
     *
     * @param acceptData
     * @param page
     * @param out
     */
    @RequestMapping("getSpikeGoodsList")
    public void getSpikeGoodsList(AcceptData acceptData, Integer page, String goodsId, String qtime, PrintWriter out) {
        List<DaTaoKeDetailV2> detailList0 = daTaoKeGoodsDetailV2Service.getDingDongQiangData(qtime);
        if (detailList0 == null)
            detailList0 = new ArrayList<>();
        List<DaTaoKeDetailV2> detailList = new ArrayList<>();
        detailList.addAll(detailList0);
        JSONArray array = new JSONArray();
        if (page == 1 && goodsId != null && detailList != null) {
            for (int i = 0; i < detailList.size(); i++) {
                if ( TaoBaoUtil.isEqual( detailList.get(i).getGoodsId(), goodsId)) {
                    DaTaoKeDetailV2 goods = detailList.get(i);
                    detailList.remove(i);
                    detailList.add(0, goods);
                    break;
                }
            }
        }
        Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
        if (detailList != null) {
            GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                    acceptData.getVersion(), acceptData.getSystem());
            for (DaTaoKeDetailV2 detail : detailList) {
                array.add(gson.toJson(GoodsDetailVOFactory.convertTaoBao(TaoBaoUtil.convert(detail), paramsDTO)));
            }
        }
        JSONObject data = new JSONObject();
        data.put("count", detailList.size());
        data.put("list", array);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 金币兑换信息
     *
     * @param acceptData
     * @return
     */
    private JSONObject getScoreExchangeInfo(AcceptData acceptData) {
        JSONObject root = new JSONObject();
        JSONArray array = new JSONArray();
        array.add("http://img.flqapp.com/resource/integral/integral_home_icon_2.png");
        array.add("http://img.flqapp.com/resource/integral/integral_home_icon_1.png");
        root.put("imgList", array);
        JSONObject params = new JSONObject();
        params.put("balanceMore", true);
        root.put("params", params);
        root.put("jumpDetail", jumpDetailV2Service.getByTypeCache("integralExchange",
                Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion()),acceptData.getSystem()));
        root.put("name", "金币兑换");
        root.put("desc", "每日签到,惊喜不停");
        root.put("tagImg", "http://img.flqapp.com/resource/score_exchange_tag.png");
        return root;
    }
    /**
     * 金币兑换信息
     *
     * @param acceptData
     * @return
     */
    private JSONObject getSearchDiscoveryInfo(AcceptData acceptData) {
        JSONArray array = new JSONArray();
        String keys = configService.getSearchDiscoveryKeys(acceptData.getSystem());
        if (!StringUtil.isNullOrEmpty(keys)) {
            JSONArray arrayKeys = JSONArray.fromObject(keys);
            for (int i = 0; i < arrayKeys.size(); i++) {
                String name = arrayKeys.get(i).toString();
                JSONObject params = new JSONObject();
                params.put("content", name);
                SearchKeyVO keyVO = new SearchKeyVO();
                keyVO.setName(name);
                keyVO.setParams(params.toString());
                array.add(keyVO);
            }
        }
        JSONObject params = new JSONObject();
        params.put("url", configService.getValue(ConfigKeyEnum.searchDiscoveryH5Link.getKey(), acceptData.getSystem()));
        JSONObject root = new JSONObject();
        root.put("picture", "http://img.flqapp.com/resource/home_search_found.png");
        root.put("params", params);
        root.put("jumpDetail", jumpDetailV2Service.getByTypeCache("web",
                Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion()),acceptData.getSystem()));
        root.put("jumpResult", jumpDetailV2Service.getByTypeCache("search_goods_result",
                Constant.getPlatformCode(acceptData.getPlatform()), Integer.parseInt(acceptData.getVersion()),acceptData.getSystem()));
        root.put("keyList", array);
        return root;
    }
    /**
     * 首页底部商品推荐
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "getGoodList")
    public void getGoodList(AcceptData acceptData, Long uid, Integer goodsType, Integer page, HttpServletRequest request,
                            PrintWriter out) {
        if (goodsType == null || page == null) {
            out.print(JsonUtil.loadFalseResult("参数信息不正常"));
            return;
        }
        try {
            if (goodsType == Constant.SOURCE_TYPE_TAOBAO) {
                taoBaoGuessUserLikeByDevice(acceptData, uid, page, request, out);
                return;
            }
            if (goodsType == Constant.SOURCE_TYPE_JD) {
                getIndexJDGoods(acceptData, page, out);
                return;
            }
            if (goodsType == Constant.SOURCE_TYPE_PDD) {
                getIndexPDDGoods(acceptData, page, out);
                return;
            }
            out.print(JsonUtil.loadFalseResult("商品类型错误"));
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
            JSONObject data = new JSONObject();
            data.put("list", new JSONArray());
            data.put("count", 0);
            out.print(JsonUtil.loadTrueResult(data));
        }
    }
    /**
     * 根据设备信息获取猜你喜欢的内容
     *
     * @param acceptData
     * @param page
     * @param request
     * @param out
     */
    public void taoBaoGuessUserLikeByDevice(AcceptData acceptData, Long uid, int page, HttpServletRequest request,
                                            PrintWriter out) {
        int pageSize = Constant.PAGE_SIZE;
        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);
            if (page < 4) {// 前三页加入更新
                try {
                    taoBaoGoodsUpdateService.addUpdateQueueAsync(goodsList);
                } catch (Exception e) {
                }
            }
            GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                    acceptData.getVersion(), acceptData.getSystem());
            List<GoodsDetailVO> voList = goodsLijinMnager.loadTBMoneyInfo(acceptData.getSystem(), uid, goodsList, paramsDTO,false);
            for (GoodsDetailVO vo : voList) {
                if (page < 3)
                    vo.setRecommend(true);
            }
            if (page == 1) {
                List<TLJBuyGoods> list = homeRecommendGoodsService.getZiGouLiJianHotGoods(acceptData.getDevice());
                if (list != null && list.size() > 0) {
                    BigDecimal rateBuy = TaoBaoConstant.OWN_BUY_WITHOUT_FANLI_RATE;
                    GoodsMoneyConfigParamsDTO paramsBuy = new GoodsMoneyConfigParamsDTO(rateBuy, rateBuy, Constant.MAX_REWARD_RATE,
                            hongBaoManageService.getFanLiRate(UserLevelEnum.superVIP, acceptData.getSystem()));
                    for (int i = list.size() - 1; i >= 0; i--) {
                        TLJBuyGoods goods = list.get(i);
                        GoodsDetailVO detailVO = GoodsDetailVOFactory.convertTaoBao(goods.getGoods(), paramsBuy);
                        String hongBao = TaoBaoUtil.getGoodsHongBaoInfo(goods.getGoods(),
                                TaoBaoConstant.OWN_BUY_WITHOUT_FANLI_RATE, false);
                        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);
                        voList.add(0, detailVO);
                    }
                }
            }
            JSONArray array = new JSONArray();
            for (GoodsDetailVO vo : voList) {
                if (acceptData.getSystem() == SystemEnum.yhqjx||acceptData.getSystem() == SystemEnum.hsb) {
                    //暂时不筛选红包
//                    if (!StringUtil.isNullOrEmpty(vo.getMoneyInfo().getHongBaoMoney())) {
                        array.add(gson.toJson(vo));
//                    }
                } else {
                    array.add(gson.toJson(vo));
                }
            }
            JSONObject data = new JSONObject();
            data.put("list", array);
            data.put("count", 1000);
            out.print(JsonUtil.loadTrueResult(data));
            return;
        }
        // 从推荐来
        List<GoodsDetailVO> finalVOList = new ArrayList<>();
        if (page <= 1) {
            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 = daTaoKeGoodsDetailV2Service.filterTaoBaoGoods(gList);
                    } catch (Exception e) {
                    }
                    // 设备推荐
                    if (gList != null) {
                        GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                                acceptData.getVersion(), acceptData.getSystem());
                        List<TaoBaoGoodsBrief> deviceGoodsList = new ArrayList<>();
                        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())) {
                                deviceGoodsList.add(goods);
                            }
                        }
                        List<GoodsDetailVO> voList = goodsLijinMnager.loadTBMoneyInfo(acceptData.getSystem(), uid, deviceGoodsList, paramsDTO,false);
                        for (GoodsDetailVO vo : voList) {
                            vo.setRecommend(true);
                        }
                        goodsList.addAll(voList);
                    }
                    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;
                    finalVOList.addAll(goodsList);
                } else {
                    try {
                        monitorService.addClientAPIMonitor(MonitorFactory.createClientAPI(request, 0,
                                (int) (java.lang.System.currentTimeMillis() - startTime), "无推荐"));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            List<GoodsDetailVO> voList = qualityGoodsService.getRecommendToIndexV2((page - 1) * pageSize, pageSize, acceptData.getPlatform(), acceptData.getVersion(), acceptData.getSystem());
            if (voList != null)
                finalVOList.addAll(voList);
        } else {// 从精选库来
            List<GoodsDetailVO> voList = qualityGoodsService.getRecommendToIndexV2((page - 1) * pageSize, pageSize, acceptData.getPlatform(), acceptData.getVersion(), acceptData.getSystem());
            if (voList == null || voList.size() == 0) {
                out.print(JsonUtil.loadFalseResult("没有更多了"));
                return;
            }
        }
        JSONArray array = new JSONArray();
        for (GoodsDetailVO vo : finalVOList) {
            if (acceptData.getSystem() == SystemEnum.yhqjx||acceptData.getSystem() == SystemEnum.hsb) {
                if (!StringUtil.isNullOrEmpty(vo.getMoneyInfo().getHongBaoMoney())) {
                    array.add(gson.toJson(vo));
                }
            } else {
                array.add(gson.toJson(vo));
            }
        }
        JSONObject data = new JSONObject();
        data.put("list", array);
        data.put("count", 1000);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 京东首页商品
     *
     * @param acceptData
     * @param page
     * @param out
     */
    private void getIndexJDGoods(AcceptData acceptData, int page, PrintWriter out) {
        JDSearchResult result = jdGoodsService.getIndexJDGoods(page, acceptData.getSystem());
        long count = 0;
        JSONObject data = new JSONObject();
        JSONArray array = new JSONArray();
        if (result != null) {
            PageEntity pageEntity = result.getPageEntity();
            if (pageEntity != null) {
                count = pageEntity.getTotalCount();
            }
            List<JDGoods> goodsList = result.getGoodsList();
            if (goodsList != null && goodsList.size() > 0) {
                GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                        acceptData.getVersion(), acceptData.getSystem());
                Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                        .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
                for (JDGoods goods : goodsList) {
                    GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertJDGoods(goods, paramsDTO);
                    array.add(gson.toJson(goodsDetailVO));
                }
            }
        }
        data.put("list", array);
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 爆款排行商品-实时热销榜
     *
     * @param acceptData
     * @param page
     * @param out
     */
    private void getIndexPDDGoods(AcceptData acceptData, int page, PrintWriter out) {
        PDDGoodsResult result = pddGoodsService.getTopGoodsList(page, 1);
        int count = 0;
        JSONArray array = new JSONArray();
        if (result != null) {
            count = result.getTotalCount();
            Gson gson = JsonUtil.getApiCommonGson();
            List<PDDGoodsDetail> goodsList = result.getGoodsList();
            if (goodsList != null && goodsList.size() > 0) {
                GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                        acceptData.getVersion(), acceptData.getSystem());
                for (PDDGoodsDetail goods : goodsList) {
                    GoodsDetailVO goodsDetailVO = GoodsDetailVOFactory.convertPDDGoods(goods, paramsDTO);
                    array.add(gson.toJson(goodsDetailVO));
                }
            }
        }
        JSONObject data = new JSONObject();
        data.put("list", array);
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 搜索发现列表
     *
     * @param acceptData
     * @param uid
     * @param page
     * @param out
     */
    @RequestMapping(value = "getSearchDiscoveryTop")
    public void getSearchDiscoveryTop(AcceptData acceptData, Long uid, Integer page, String callback, PrintWriter out) {
        int count = 0;
        List<SearchKeyTOPVO> list = new ArrayList<SearchKeyTOPVO>();
        String keys = configService.getSearchDiscoveryKeys(acceptData.getSystem());
        if (!StringUtil.isNullOrEmpty(keys)) {
            JSONArray arrayKeys = JSONArray.fromObject(keys);
            if (arrayKeys != null && arrayKeys.size() > 0) {
                count = arrayKeys.size();
                GoodsMoneyConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                        acceptData.getVersion(), acceptData.getSystem());
                int j = 1;
                for (int i = (page - 1) * 3; i < arrayKeys.size(); i++) {
                    if (j > 3)
                        break;
                    String words = arrayKeys.get(i).toString();
                    List<GoodsDetailVO> listGoods = new ArrayList<GoodsDetailVO>();
                    List<DaTaoKeDetailV2> listTaoKe = daTaoKeGoodsService.getSearchDiscoveryGoods(words);
                    if (listTaoKe != null && listTaoKe.size() > 0) {
                        for (DaTaoKeDetailV2 daTaoKeDetailV2 : listTaoKe) {
                            listGoods.add(
                                    GoodsDetailVOFactory.convertTaoBao(TaoBaoUtil.convert(daTaoKeDetailV2), paramsDTO));
                            if (listGoods.size() >= 3)
                                break;
                        }
                    }
                    SearchKeyTOPVO keyTOPVO = new SearchKeyTOPVO();
                    keyTOPVO.setName(words);
                    keyTOPVO.setListGoods(listGoods);
                    list.add(keyTOPVO);
                    j++;
                }
            }
        }
        GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
        Gson gson = gsonBuilder.create();
        JSONObject data = new JSONObject();
        data.put("count", count);
        data.put("list", gson.toJson(list));
        if (!StringUtil.isNullOrEmpty(callback)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } else
            out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 获取专题渠道活动
     *
     * @param acceptData
     * @param uid
     * @param callback
     * @param out
     */
    @RequestMapping(value = "getSpecialChannelActivity")
    public void getSpecialChannelActivity(AcceptData acceptData, Long uid, String callback, PrintWriter out) {
        int platformCode = Constant.getPlatformCode(acceptData.getPlatform());
        List<Special> list = specialService.listByPlaceKey("special_channel_activity", platformCode,
                Integer.parseInt(acceptData.getVersion()), acceptData.getSystem());
        long time = System.currentTimeMillis();
        // 删除尚未启用的过期的
        for (int i = 0; i < list.size(); i++) {
            Special special = list.get(i);
            if (special.getState() == 1L) {
                list.remove(i--);
            } else {
                if (special.getStartTime() != null && special.getEndTime() != null) {
                    if (time < special.getStartTime().getTime() || time > special.getEndTime().getTime()) {
                        list.remove(i--);
                    } else// 设置倒计时
                    {
                        special.setCountDownTime((special.getEndTime().getTime() - time) / 1000);
                    }
                }
            }
        }
        GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
        Gson gson = gsonBuilder.create();
        JSONObject data = new JSONObject();
        data.put("count", list.size());
        data.put("list", gson.toJson(list));
        if (!StringUtil.isNullOrEmpty(callback)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } else
            out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 获取专题渠道活动
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getGuide")
    public void getGuide(AcceptData acceptData, Long uid, PrintWriter out) {
        String tips = null;
        if (uid == null || uid <= 0) {
            tips = configService.getValue(ConfigKeyEnum.tipGuideNewUser.getKey(), acceptData.getSystem());
        } else {
            long rebateOrder = hongBaoV2CountService.countRebateOrder(uid);
            long shareOrInviteOrder = hongBaoV2CountService.countShareOrInviteOrder(uid);
            if (rebateOrder + shareOrInviteOrder >= 3) {
                // 熟客版
            } else if (rebateOrder <= 0 && shareOrInviteOrder <= 0) {
                // 新人版
                tips = configService.getValue(ConfigKeyEnum.tipGuideNewUser.getKey(), acceptData.getSystem());
            } else if (rebateOrder > 0 && shareOrInviteOrder <= 0) {
                // 省钱版
                tips = configService.getValue(ConfigKeyEnum.tipGuideSaveMoney.getKey(), acceptData.getSystem());
            } else {
                // 赚钱版
                tips = configService.getValue(ConfigKeyEnum.tipGuideShareInvite.getKey(), acceptData.getSystem());
            }
        }
        if (StringUtil.isNullOrEmpty(tips)) {
            out.print(JsonUtil.loadFalseResult("暂无提示"));
            return;
        }
        JSONObject data = JSONObject.fromObject(tips);
        out.print(JsonUtil.loadTrueResult(data));
    }
}