yujian
2019-12-10 c8041ec0544bf122e6819e6bf698997ccbf30aaf
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/RecommendController.java
@@ -41,6 +41,7 @@
import com.yeshi.fanli.entity.bus.user.Order;
import com.yeshi.fanli.entity.bus.user.ShamUser;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserMoneyExtra;
import com.yeshi.fanli.entity.common.ImageInfo;
import com.yeshi.fanli.entity.common.JumpDetail;
import com.yeshi.fanli.entity.common.JumpDetailV2;
@@ -52,6 +53,7 @@
import com.yeshi.fanli.entity.taobao.ClientTBPid;
import com.yeshi.fanli.entity.taobao.PidUser;
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.TaoBaoGoodsBriefExtra;
import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult;
@@ -80,18 +82,27 @@
import com.yeshi.fanli.service.inter.goods.SuperRecommendSpecialService;
import com.yeshi.fanli.service.inter.goods.TaoBaoCouponService;
import com.yeshi.fanli.service.inter.goods.TaoBaoGoodsBriefService;
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.SuperSpecialService;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
import com.yeshi.fanli.service.inter.lable.QualityFlashSaleService;
import com.yeshi.fanli.service.inter.lable.QualityGoodsService;
import com.yeshi.fanli.service.inter.money.UserMoneyExtraService;
import com.yeshi.fanli.service.inter.monitor.MonitorService;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.service.inter.order.ShareGoodsActivityOrderService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.taobao.TLJBuyGoodsService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoGoodsUpdateService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoShopService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService;
import com.yeshi.fanli.service.inter.taobao.dataoke.DaTaoKeGoodsDetailService;
import com.yeshi.fanli.service.inter.tlj.ConfigTaoLiJinService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinOriginService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinRecordService;
import com.yeshi.fanli.service.inter.user.ShamUserService;
import com.yeshi.fanli.service.inter.user.TBPidService;
import com.yeshi.fanli.service.inter.user.UserCustomSettingsService;
@@ -99,17 +110,22 @@
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.VersionUtil;
import com.yeshi.fanli.util.cache.TaoBaoGoodsCacheUtil;
import com.yeshi.fanli.util.factory.MonitorFactory;
import com.yeshi.fanli.util.taobao.TaoBaoCouponUtil;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import com.yeshi.fanli.util.taobao.TaoLiJinUtil;
import com.yeshi.fanli.vo.goods.taobao.TLJBuyHongBaoVO;
import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
import com.yeshi.fanli.vo.tlj.SpreadHongBao;
import com.yeshi.fanli.vo.user.UserSettingsVO;
import net.sf.json.JSONArray;
@@ -223,6 +239,33 @@
   @Resource
   private TaoBaoShopService taoBaoShopService;
   @Resource
   private DaTaoKeGoodsDetailService daTaoKeGoodsDetailService;
   @Resource
   private UserMoneyExtraService userMoneyExtraService;
   @Resource
   private UserTaoLiJinOriginService userTaoLiJinOriginService;
   @Resource
   private ConfigTaoLiJinService configTaoLiJinService;
   @Resource
   private DeviceSexService deviceSexService;
   @Resource
   private UserTaoLiJinRecordService userTaoLiJinRecordService;
   @Resource
   private RecommendGoodsDeleteHistoryService recommendGoodsDeleteHistoryService;
   @Resource
   private HomeRecommendGoodsService homeRecommendGoodsService;
   @Resource
   private TLJBuyGoodsService tljBuyGoodsService;
   @RequestMapping(value = "getHonestList")
   public void getHonestList(AcceptData acceptData, PrintWriter out) {
@@ -571,7 +614,7 @@
      // 获取淘客参数
      ClientTBPid clientTBPid = null;
      if (simpleGoods.getMaterialLibType() != null && simpleGoods.getMaterialLibType() == 1) {
      if (TaoBaoUtil.isSpecialGoods(simpleGoods.getMaterialLibType())) {
         String pid = TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT;
         clientTBPid = new ClientTBPid(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
               pid.split("_")[2], pid.split("_")[3]);
@@ -618,7 +661,7 @@
         taoBaoGoodsBriefExtra.setAuctionUrl(tb.getAuctionUrl());
         if (uid != null && !"".equals(uid.trim())) {
            CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(Long.parseLong(uid),
                  Long.parseLong(id));
                  Long.parseLong(id), Constant.SOURCE_TYPE_TAOBAO);
            data.put("collection", collectionGoods != null ? true : false);
         }
@@ -878,7 +921,7 @@
      // 判断收藏
      if (!StringUtil.isNullOrEmpty(uid)) {
         CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(Long.parseLong(uid),
               Long.parseLong(id));
               Long.parseLong(id), Constant.SOURCE_TYPE_TAOBAO);
         data.put("collected", collectionGoods != null ? true : false);
      } else
         data.put("collected", false);
@@ -1030,7 +1073,7 @@
         return;
      }
      List<TaoBaoGoodsBrief> goodsList = TaoKeApiUtil.getRelationGoodsRecommend(id, 6);
      List<TaoBaoGoodsBrief> goodsList = TaoKeApiUtil.guessLikeByAuctionId(id, 6);
      if (goodsList == null)
         goodsList = new ArrayList<>();
@@ -1145,6 +1188,7 @@
   // 获取浏览记录
   @RequestMapping(value = "getscanhistory", method = RequestMethod.POST)
   public void getScanHistory(AcceptData acceptData, String uid, int page, PrintWriter out) {
      if (page < 0) {
         out.print(JsonUtil.loadFalseResult(1, "page不小于0"));
         return;
@@ -1156,49 +1200,61 @@
         out.print(JsonUtil.loadFalseResult(1, "不存在该系统"));
         return;
      }
      List<ScanHistoryV2> list = scanHistoryV2Service.getScanHistoryByDeviceOrUid(
            StringUtil.isNullOrEmpty(uid) ? null : Long.parseLong(uid), acceptData.getDevice(), page, 20);
      long count = scanHistoryV2Service.getCountByDeviceOrUid(
            StringUtil.isNullOrEmpty(uid) ? null : Long.parseLong(uid), acceptData.getDevice());
      JSONObject data = new JSONObject();
      data.put("count", count);
      JSONArray array = new JSONArray();
      try {
      GsonBuilder gsonBuilder = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder());
      gsonBuilder.excludeFieldsWithoutExposeAnnotation();
      gsonBuilder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
         @Override
         public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) {
            if (value == null) {
               return new JsonPrimitive("");
            } else {
               return new JsonPrimitive(value.getTime() + "");
         List<ScanHistoryV2> list = scanHistoryV2Service.getScanHistoryByDeviceOrUid(
               StringUtil.isNullOrEmpty(uid) ? null : Long.parseLong(uid), acceptData.getDevice(), page, 20,
               Constant.SOURCE_TYPE_TAOBAO);
         long count = scanHistoryV2Service.getCountByDeviceOrUid(
               StringUtil.isNullOrEmpty(uid) ? null : Long.parseLong(uid), acceptData.getDevice(),
               Constant.SOURCE_TYPE_TAOBAO);
         JSONObject data = new JSONObject();
         data.put("count", count);
         JSONArray array = new JSONArray();
         GsonBuilder gsonBuilder = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder());
         gsonBuilder.excludeFieldsWithoutExposeAnnotation();
         gsonBuilder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
            @Override
            public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) {
               if (value == null) {
                  return new JsonPrimitive("");
               } else {
                  return new JsonPrimitive(value.getTime() + "");
               }
            }
         });
         Gson gson = gsonBuilder.create();
         if (list != null) {
            BigDecimal proportion = manageService.getFanLiRate();
            for (ScanHistoryV2 sh : list) {
               TaoBaoGoodsBrief goods = TaoBaoUtil.convert(sh.getCommonGoods());
               goods.setId(sh.getId());
               TaoBaoGoodsBriefExtra extra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goods, proportion.toString(), "");
               extra.setCreatetime(sh.getCreateTime());
               array.add(gson.toJson(extra));
            }
         }
      });
      Gson gson = gsonBuilder.create();
      if (list != null) {
         BigDecimal proportion = manageService.getFanLiRate();
         for (ScanHistoryV2 sh : list) {
            TaoBaoGoodsBrief goods = TaoBaoUtil.convert(sh.getCommonGoods());
            goods.setId(sh.getId());
            TaoBaoGoodsBriefExtra extra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goods, proportion.toString(), "");
            extra.setCreatetime(sh.getCreateTime());
            array.add(gson.toJson(extra));
         }
         data.put("data", array);
         out.print(JsonUtil.loadTrueResult(data));
         return;
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
         JSONObject data = new JSONObject();
         data.put("data", new JSONArray());
         data.put("count", 0);
         out.print(JsonUtil.loadTrueResult(data));
      }
      data.put("data", array);
      out.print(JsonUtil.loadTrueResult(data));
      return;
   }
   @RequestMapping(value = "deletescanhistory", method = RequestMethod.POST)
   public void deleteScanHistory(AcceptData acceptData, String type, String uid, String ids, PrintWriter out) {
      BusinessSystem sys = businessSystemService.getBusinessSystem(acceptData.getPlatform(),
            acceptData.getPackages());
      if (sys == null) {
         out.print(JsonUtil.loadFalseResult(1, "系统不存在"));
         return;
@@ -1248,16 +1304,16 @@
       * 防止请求频率过高
       * 
       */
      if (Constant.IS_OUTNET) {
         String key = "linkParse-" + acceptData.getDevice() + "-" + id;
      // if (Constant.IS_OUTNET) {
      String key = "linkParse-" + acceptData.getDevice() + "-" + id;
         String value = redisManager.getCommonString(key);
         if (!StringUtil.isNullOrEmpty(value)) {
            out.print(JsonUtil.loadFalseResult(11, "请求频率限制"));
            return;
         }
         redisManager.cacheCommonString(key, "1", 5);// 5s间隔
      String value = redisManager.getCommonString(key);
      if (!StringUtil.isNullOrEmpty(value)) {
         out.print(JsonUtil.loadFalseResult(11, "请求频率限制"));
         return;
      }
      redisManager.cacheCommonString(key, "1", 5);// 5s间隔
      // }
      TaoBaoGoodsBrief goods = null;
      try {
         goods = redisManager.getTaoBaoGoodsBrief(Long.parseLong(id));
@@ -1291,7 +1347,67 @@
         HttpServletRequest request, PrintWriter out) {
      int pageSize = Constant.PAGE_SIZE;
      JSONArray array = new JSONArray();
      Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder()).create();
      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) {
            }
         }
         BigDecimal rate = hongBaoManageService.getFanLiRate();
         for (TaoBaoGoodsBrief goods : goodsList) {
            TaoBaoGoodsBriefExtra extra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goods, rate + "", null);
            if (page < 3)
               extra.setRecommend(true);
            try {
               array.add(gson.toJson(extra));
            } catch (Exception e) {
               e.printStackTrace();
               System.out.println(new Gson().toJson(goods));
            }
         }
         if (page == 1) {
            List<TLJBuyGoods> list = null;
            try {
               list = homeRecommendGoodsService.getZiGouLiJianHotGoods(acceptData.getDevice());
            } catch (Exception e) {
            }
            if (list != null && list.size() > 0)
               for (int i = list.size() - 1; i >= 0; i--) {
                  TLJBuyGoods goods = list.get(i);
                  TaoBaoGoodsBriefExtra extra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goods.getGoods(),
                        TaoBaoConstant.OWN_BUY_WITHOUT_FANLI_RATE + "", null);
                  String hongBao = TaoBaoUtil.getGoodsHongBaoInfo(goods.getGoods(),
                        TaoBaoConstant.OWN_BUY_WITHOUT_FANLI_RATE);
                  TLJBuyHongBaoVO vo = new TLJBuyHongBaoVO();
                  vo.setLeft(goods.getLeftHongBaoCount());
                  vo.setMoney(hongBao);
                  vo.setTagName("付款立减 " + hongBao);
                  vo.setTip("");
                  vo.setTotal(goods.getTotalHongBaoCount());
                  extra.setTljBuyHongBao(vo);
                  extra.setPictureTag(new ClientTextStyleVO("立减TOP" + (i + 1), "#E5005C", "#FCE431", null));
                  extra.setRecommend(true);
                  extra.setSpreadMoney(vo.getTagName());
                  array.add(0, gson.toJson(extra));
               }
         }
         JSONObject data = new JSONObject();
         data.put("data", array);
         data.put("count", 1000);
         out.print(JsonUtil.loadTrueResult(data));
         return;
      }
      // 从推荐来
      if (page <= 1) {
         array.clear();
@@ -1303,14 +1419,33 @@
            if (result != null && result.getTaoBaoGoodsBriefs() != null) {
               // 筛选
               List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
               List<TaoBaoGoodsBriefExtra> goodsList = new ArrayList<>();
               for (TaoBaoGoodsBrief goods : result.getTaoBaoGoodsBriefs()) {
                  if (!StringUtil.isNullOrEmpty(goods.getCouponInfo()) && goods.getCouponAmount() != null
                        && goods.getCouponAmount().compareTo(new BigDecimal("5")) >= 0
                        && goods.getBiz30day() > 1000 && !StringUtil.isNullOrEmpty(goods.getPictUrlWhite()))
                     goodsList.add(goods);
               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())) {
                        TaoBaoGoodsBriefExtra extra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goods,
                              proportion.toString(), "");
                        extra.setRecommend(true);
                        goodsList.add(extra);
                     }
                  }
               try {
                  monitorService.addClientAPIMonitor(MonitorFactory.createClientAPI(request, 0,
                        (int) (java.lang.System.currentTimeMillis() - startTime), "推荐数量:" + goodsList.size()));
@@ -1320,8 +1455,8 @@
               Collections.shuffle(goodsList);
               goodsList = goodsList.size() > 20 ? goodsList.subList(0, 20) : goodsList;
               for (TaoBaoGoodsBrief goods : goodsList) {
                  array.add(gson.toJson(TaoBaoUtil.getTaoBaoGoodsBriefExtra(goods, proportion.toString(), "")));
               for (TaoBaoGoodsBriefExtra goods : goodsList) {
                  array.add(gson.toJson(goods));
               }
            } else {
               try {
@@ -1573,8 +1708,11 @@
   @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);
         JSONObject root = specialService.listCacheSpecialToIndex(acceptData, deviceSex);
         // 2、顶部轮播图
         List<SwiperPicture> topPicList = getSwiperByCard("index_top");
@@ -1602,8 +1740,8 @@
         if ("ios".equalsIgnoreCase(platform)) {
            root.put("htmlLink", configService.get("index_html_link_ios"));
         }
         root.put("spikeGoods",  getSpikeGoodsContent(acceptData));
         root.put("spikeGoods", getSpikeGoodsContent(acceptData));
         out.print(JsonUtil.loadTrueResult(root));
      } catch (Exception e) {
@@ -1687,8 +1825,8 @@
      nextTime.set(Calendar.MILLISECOND, 0);
      JSONArray array = null;
      String timekey = "spikeGoods_hour";
      String cachekey = "spikeGoodsList";
      String timekey = String.format("spikeGoods_hour-%s-%s", acceptData.getPlatform(), acceptData.getVersion());
      String cachekey = String.format("spikeGoodsList-%s-%s", acceptData.getPlatform(), acceptData.getVersion());
      String timeValue = redisManager.getCommonString(timekey);
      if (timeValue == null || !timeValue.equals(hour + "")) {
@@ -1699,7 +1837,7 @@
            array = JSONArray.fromObject(cacheValue);
         }
      }
      JumpDetailV2 jumpDetail = jumpDetailV2Service.getByTypeCache("web");
      if (array == null) {
         array = new JSONArray();
@@ -1714,25 +1852,43 @@
         }
         /* 遍历列表数据 */
         for (QualityFactory qualityFactory : listGoods) {
         for (QualityFactory qualityFactory : listGoods) {
            TaoBaoGoodsBrief taoBaoGoodsBrief = qualityFactory.getTaoBaoGoodsBrief();
            if (taoBaoGoodsBrief == null) {
               continue;
            }
            array.add(gson
            JSONObject goods = new JSONObject();
            goods.put("goods", gson
                  .toJson(TaoBaoUtil.getTaoBaoGoodsBriefExtra(taoBaoGoodsBrief, proportion.toString(), null)));
            goods.put("jumpDetail", jumpDetail);
            JSONObject params = new JSONObject();
            params.put("url", configService.get("spike_goods_link") + "?id=" + taoBaoGoodsBrief.getAuctionId());
            goods.put("params", params);
            // 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.getTimeInMillis() - java.lang.System.currentTimeMillis();
      JSONObject root = new JSONObject();
      root.put("time", nextTime.getTimeInMillis());
      root.put("endTime", endTime > 0? endTime : 0);
      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);
      return root;
   }
@@ -1745,13 +1901,7 @@
    */
   @RequestMapping(value = "getSpikeGoods")
   public void getSpikeGoods(AcceptData acceptData, PrintWriter out) {
      JSONObject params = new JSONObject();
      params.put("url", configService.get("spike_goods_link"));
      JumpDetailV2 jumpDetail = jumpDetailV2Service.getByTypeCache("web");
      JSONObject root = getSpikeGoodsContent(acceptData);
      root.put("params", params);
      root.put("jumpDetail", jumpDetail);
      out.print(JsonUtil.loadTrueResult(root));
   }
@@ -1766,13 +1916,9 @@
    * @param out
    */
   @RequestMapping(value = "getgoodsinfo", method = RequestMethod.POST)
   public void getGoodsInfo(AcceptData acceptData, String id, String uid, String from, PrintWriter out) {
   public void getGoodsInfo(AcceptData acceptData, Long id, Long uid, String from, PrintWriter out) {
      if ("0".equalsIgnoreCase(uid)) {
         uid = "";
      }
      if (StringUtil.isNullOrEmpty(id)) {
      if (id == null) {
         out.print(JsonUtil.loadFalseResult(1, "请上传id"));
         return;
      }
@@ -1816,14 +1962,14 @@
      if (!convertInServer) {
         try {
            goods = taoBaoGoodsCacheUtil.getCommonTaoBaoGoodsInfo(Long.parseLong(id));
            goods = taoBaoGoodsCacheUtil.getCommonTaoBaoGoodsInfo(id);
            if (goods == null) {
               TaoKeAppInfo app = new TaoKeAppInfo();
               app.setAppKey(TaoBaoConstant.TAOBAO_COMMON_APPKEY);
               app.setAppSecret(TaoBaoConstant.TAOBAO_COMMON_APPSECRET);
               app.setPid(TaoBaoConstant.TAOBAO_COMMON_PID);
               app.setAdzoneId(TaoBaoConstant.TAOBAO_COMMON_PID.split("_")[3]);
               goods = TaoKeApiUtil.searchGoodsDetail(Long.parseLong(id), app);
               goods = TaoKeApiUtil.searchGoodsDetail(id, app);
               final TaoBaoGoodsBrief finalGoods = goods;
               if (goods != null) {
                  ThreadUtil.run(new Runnable() {
@@ -1838,7 +1984,7 @@
            // 商品下架
            ThreadUtil.run(new Runnable() {
               public void run() {
                  taoBaoGoodsUpdateService.offlineTaoBaoGoods(Long.parseLong(id));
                  taoBaoGoodsUpdateService.offlineTaoBaoGoods(id);
               }
            });
@@ -1855,7 +2001,7 @@
         app.setPid(clientPid);
         try {
            goods = TaoKeApiUtil.searchGoodsDetail(Long.parseLong(id), app);
            goods = TaoKeApiUtil.searchGoodsDetail(id, app);
            if (goods != null) {
               ticket.put("clickUrl", goods.getAuctionUrl());
               // 测试使用
@@ -1877,7 +2023,7 @@
         } catch (TaobaoGoodsDownException e) {
            ThreadUtil.run(new Runnable() {
               public void run() {
                  taoBaoGoodsUpdateService.offlineTaoBaoGoods(Long.parseLong(id));
                  taoBaoGoodsUpdateService.offlineTaoBaoGoods(id);
               }
            });
         }
@@ -1923,19 +2069,24 @@
      if (!StringUtil.isNullOrEmpty(tb.getPictUrlWhite()))
         finalImgList.add(0, tb.getPictUrlWhite());
      // 大淘客商品过滤
      try {
         goods = daTaoKeGoodsDetailService.filterTaoBaoGoods(goods);
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
      }
      JSONObject goodsJson = new JSONObject();
      goodsJson.put("auctionId", tb.getAuctionId());
      goodsJson.put("imgList", finalImgList);
      goodsJson.put("title", tb.getTitle());
      goodsJson.put("userType", tb.getUserType() == 1 ? 2 : 1);
      goodsJson.put("price", tb.getReservePrice().toString());
      goodsJson.put("zkPrice", tb.getZkPrice().toString());
      goodsJson.put("zkPrice", MoneyBigDecimalUtil.getWithNoZera(tb.getZkPrice()).toString());
      // 30天销量
      goodsJson.put("saleCount", TaoBaoUtil.getSaleCount(tb.getBiz30day()));
      goodsJson.put("salesCount", TaoBaoUtil.getSaleCount(tb.getBiz30day()));
      // 分享赚
      BigDecimal shareMoney = taoBaoGoodsBriefService.getShareGoodsUserHongBao(tb);
      data.put("shareMoney", "¥" + shareMoney);
@@ -1946,11 +2097,11 @@
      }
      // 判断收藏
      if (StringUtil.isNullOrEmpty(uid)) {
      if (uid == null) {
         data.put("collected", false);
      } else {
         CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(Long.parseLong(uid),
               Long.parseLong(id));
         CollectionGoodsV2 collectionGoods = collectionGoodsV2Service.findByUidAndAuctionId(uid, id,
               Constant.SOURCE_TYPE_TAOBAO);
         data.put("collected", collectionGoods != null ? true : false);
      }
@@ -1976,10 +2127,12 @@
      String hongBao = null;
      // 获取券信息
      if (!StringUtil.isNullOrEmpty(tb.getCouponInfo())) {
      if (!StringUtil.isNullOrEmpty(tb.getCouponInfo()) && tb.getCouponAmount() != null
            && tb.getCouponAmount().compareTo(new BigDecimal(0)) > 0 && tb.getCouponEffectiveStartTime() != null
            && tb.getCouponEffectiveEndTime() != null) {
         BigDecimal quanPrice = TaoBaoUtil.getAfterUseCouplePrice(tb);
         JSONObject couponInfo = new JSONObject();
         couponInfo.put("couponPrice", quanPrice.toString());
         couponInfo.put("couponPrice", MoneyBigDecimalUtil.getWithNoZera(quanPrice).toString());
         if (from != null && from.equals("miandan")) {
            // 免单商品
@@ -1987,14 +2140,16 @@
         }
         String token = "";
         if (!StringUtil.isNullOrEmpty(tb.getCouponLink())) {
         if (!StringUtil.isNullOrEmpty(tb.getCouponLink())
               && VersionUtil.greaterThan_1_5_60(acceptData.getPlatform(), acceptData.getVersion())) {
            token = redisManager.getCommonTaoToken(tb.getAuctionId());
            if (StringUtil.isNullOrEmpty(token)) {
               token = TaoKeApiUtil.getTKToken(tb.getPictUrl(), tb.getTitle(), tb.getCouponLink());
               redisManager.saveCommonTaoToken(tb.getAuctionId(), token);
            }
         }
         tb.setCouponLinkTaoToken(token);
         if (!VersionUtil.greaterThan_1_5_60(acceptData.getPlatform(), acceptData.getVersion()))
            tb.setCouponLinkTaoToken(token);
         // 服务端转链
         // if (convertInServer &&
@@ -2006,11 +2161,15 @@
         // tb.getAuctionId() + ""));
         // }
         couponInfo.put("couponAmount", NumberUtil.subZeroAndDot(tb.getCouponAmount().toString()));
         couponInfo.put("couponAmount", MoneyBigDecimalUtil.getWithNoZera(tb.getCouponAmount()).toString());
         couponInfo.put("couponTime", "使用期限:" + tb.getCouponEffectiveStartTime().replace("-", ".") + "-"
               + tb.getCouponEffectiveEndTime().replace("-", "."));
         // 券的口令
         couponInfo.put("couponToken", token);
         if (VersionUtil.greaterThan_1_5_60(acceptData.getPlatform(), acceptData.getVersion()))
            couponInfo.put("couponToken", "");
         else
            couponInfo.put("couponToken", token);
         goodsJson.put("couponInfo", couponInfo);
         if (tb.getBiz30day() >= 1000) {
@@ -2022,13 +2181,13 @@
      // 红包
      if (hongBao == null) {
         BigDecimal proportion = manageService.getFanLiRate();
         if ("taolijin".equalsIgnoreCase(from))
            proportion = manageService.getTLJShareRate(System.currentTimeMillis());
         hongBao = TaoBaoUtil.getGoodsHongBaoInfo(tb, proportion);
      }
      goodsJson.put("hongBao", hongBao);
      List<ClientTextStyleVO> labels = new ArrayList<>();
      labels.add(new ClientTextStyleVO("标签内容", "#F14242"));
      labels.add(new ClientTextStyleVO("标签内容", "#00FF00"));
      goodsJson.put("labels", labels);
      data.put("tbPidInfo", clientTBPid);
@@ -2057,39 +2216,44 @@
         } else {
            tbShopInfo.setUserType("0");
         }
         String shopLink = tbShopInfo.getShopUrl();
         if (StringUtil.isNullOrEmpty(shopLink)) {
            tbShopInfo.setShopUrl(TaoBaoUtil.getShopLink(tbShopInfo.getUserId()));
         }
      }
      // 店铺
      if (("android".equalsIgnoreCase(acceptData.getPlatform()) && Integer.parseInt(acceptData.getVersion()) >= 40)
            || ("ios".equalsIgnoreCase(acceptData.getPlatform())
                  && Integer.parseInt(acceptData.getVersion()) >= 49)) {
      // 店铺1.5.4及以后版本
      if (VersionUtil.greaterThan_1_5_40(acceptData.getPlatform(), acceptData.getVersion())) {
         TaoBaoShop shop = taoBaoShopService.getTaoBaoShop(goods.getAuctionId(), goods.getSellerId());
         if (shop != null)
         if (shop != null) {
            String shopLink = shop.getShopLink();
            if (StringUtil.isNullOrEmpty(shopLink)) {
               shop.setShopLink(TaoBaoUtil.getShopLink(shop.getId()));
            }
            goodsJson.put("shopInfo", shop);
         }
      } else {
         goodsJson.put("shopInfo", tbShopInfo);
      }
      goodsJson.put("fanliValid",Math.random()>0.5? true:false);// 是否有返利
      // 分享路径
      String shareUrl = String.format("%s?id=" + tb.getAuctionId(), Constant.systemCommonConfig.getAppShareInfoUrl());
      // 是否加入选品库: 0未加入 1 已加入
      boolean storageState = false;
      if (uid != null && uid.trim().length() > 0) {
         storageState = userGoodsStorageService.isExistStorage(Long.parseLong(uid), Long.parseLong(id));
      if (uid != null) {
         storageState = userGoodsStorageService.isExistStorage(uid, id, Constant.SOURCE_TYPE_TAOBAO);
      }
      data.put("storageState", storageState);
      data.put("shareUrl", shareUrl);
      data.put("goods", goodsJson);
      data.put("shareUsers", listShareUser);
      data.put("couponUsers", listCouponUser);
      data.put("detailWebUrl", "http://apph5.yeshitv.com/apppage/goods_img.html?id=" + id);
      data.put("noRebateHelpLink", configService.get("no_rebate_help_link"));
      String noRebateHelpLink = null;
      // 商品链接
      String h5Url = String.format("http://%s%s?id=%s&appType=flq", configService.getH5Host(),
            Constant.systemCommonConfig.getShareGoodsPagePath(), tb.getAuctionId() + "");
@@ -2097,6 +2261,117 @@
         data.put("h5Url", HttpUtil.getShortLink(h5Url));
      } catch (Exception e) {
         data.put("h5Url", h5Url);
      }
      // 是否有返利
      boolean fanliValid = true;
      // 资金类型 1-返 2-奖
      int moneyType = 1;
      // 推广红包
      if (from != null && from.equals("taolijin")) {
         // 计算推广红包
         String warningRate = configTaoLiJinService.getValueByKey("warning_value", null);
         BigDecimal spreadMoney = TaoLiJinUtil.getSpreadMoney(warningRate, goods);
         // 推广红包 不能小于1
         if (spreadMoney.compareTo(new BigDecimal(1.1)) < 0) {
            out.print(JsonUtil.loadFalseResult(2, "商品不存在"));
            return;
         }
         // 是否为新用户
         boolean isNewUser = userInfoExtraService.isNewUser(uid);
         if (isNewUser) {
            // 判定为老用户: 新人只要使用了新人红包,也就是那1块钱,那么,他看到的分享爆款中的商品-就只能分享。
            long countRecord = userTaoLiJinRecordService.countRecordByUid(uid);
            if (countRecord > 0) {
               isNewUser = false;
            }
         }
         SpreadHongBao spreadHongBao = new SpreadHongBao();
         if (isNewUser) {
            spreadHongBao.setMoney("1");
         } else {
            spreadHongBao.setMoney(spreadMoney.toString());
            moneyType = 2;
            fanliValid = false;
            ClientTextStyleVO textStyleVO1 = new ClientTextStyleVO();
            textStyleVO1.setContent("分享");
            textStyleVO1.setColor("#666666");
            ClientTextStyleVO textStyleVO2 = new ClientTextStyleVO();
            textStyleVO2.setContent("赚奖金");
            textStyleVO2.setColor("#F14242");
            ClientTextStyleVO textStyleVO3 = new ClientTextStyleVO();
            textStyleVO3.setContent(",好友");
            textStyleVO3.setColor("#666666");
            ClientTextStyleVO textStyleVO4 = new ClientTextStyleVO();
            textStyleVO4.setContent("领红包!");
            textStyleVO4.setColor("#F14242");
            List<ClientTextStyleVO> listText = new ArrayList<ClientTextStyleVO>();
            listText.add(textStyleVO1);
            listText.add(textStyleVO2);
            listText.add(textStyleVO3);
            listText.add(textStyleVO4);
            data.put("listTip", listText);
         }
         spreadHongBao.setTip("当日领取,当日内使用,过期失效");
         goodsJson.put("spreadHongBao", spreadHongBao);
         // 用户剩余可以淘礼金验证
         UserMoneyExtra userMoneyExtra = userMoneyExtraService.selectByPrimaryKey(uid);
         if (userMoneyExtra == null || userMoneyExtra.getTlj() == null) {
            data.put("userHongbao", new BigDecimal(0).setScale(2).toString());
         } else {
            data.put("userHongbao", userMoneyExtra.getTlj().setScale(2).toString());
         }
         noRebateHelpLink = configTaoLiJinService.getValueByKey("share_goods_help_link", null);
         if (Constant.IS_TEST) {
            fanliValid = true;
            goodsJson.put("shareValid", false);
            JSONObject tljNum = new JSONObject();
            tljNum.put("percent", "80");
            tljNum.put("num", "8825");
            goodsJson.put("tljNum", tljNum);
         }
      } else if (from != null && from.equals("taolijin_buy")) {
         noRebateHelpLink = configService.get("zigoulijian_nofanli_help");
         // 查询分享库
         TLJBuyGoods buyGoods = tljBuyGoodsService.selectByAuctionIdAndDay(goods.getAuctionId(),
               TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyy-MM-dd"));
         if (buyGoods == null) {
            out.print(JsonUtil.loadFalseResult(2, "自购立减红包过期"));
            return;
         }
         fanliValid = true;
         goodsJson.put("shareValid", false);
         String tljHongBao = TaoBaoUtil.getGoodsHongBaoMoney(goods, new BigDecimal(70)).toString();
         TLJBuyHongBaoVO vo = new TLJBuyHongBaoVO();
         vo.setLeft(buyGoods.getLeftHongBaoCount());
         vo.setMoney(tljHongBao);
         vo.setTagName("付款立减 ¥" + tljHongBao);
         vo.setTip("当日领取,当日内使用,过期失效");
         vo.setTotal(buyGoods.getTotalHongBaoCount());
         goodsJson.put("tljBuyHongBao", vo);
         moneyType = 2;
      }
      goodsJson.put("moneyType", moneyType);
      goodsJson.put("fanliValid", fanliValid);
      data.put("goods", goodsJson);
      if (!StringUtil.isNullOrEmpty(noRebateHelpLink)) {
         data.put("noRebateHelpLink", noRebateHelpLink);
      } else {
         data.put("noRebateHelpLink", configService.get("no_rebate_help_link"));
      }
      // 取消分享活动
@@ -2119,15 +2394,12 @@
      out.print(JsonUtil.loadTrueResult(data));
      final String tempUid = uid;
      final TaoBaoGoodsBrief goodsInfo = tb;
      ThreadUtil.run(new Runnable() {
         public void run() {
            // 添加浏览记录
            try {
               scanHistoryV2Service.addScanHistory(
                     StringUtil.isNullOrEmpty(tempUid) ? null : Long.parseLong(tempUid), acceptData.getDevice(),
                     goodsInfo);
               scanHistoryV2Service.addScanHistory(uid, acceptData.getDevice(), goodsInfo);
            } catch (Exception e) {
               e.printStackTrace();
            }
@@ -2193,119 +2465,83 @@
   @RequestMapping(value = "getgoodsderivation", method = RequestMethod.POST)
   public void getRecommendGoods(AcceptData acceptData, long id, PrintWriter out) {
      BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
            acceptData.getPackages());
      if (system == null) {
         out.print(JsonUtil.loadFalseResult(1, "系统不存在"));
         return;
      }
      List<TaoBaoGoodsBrief> goodsList = TaoKeApiUtil.getRelationGoodsRecommend(id, 10);
      // 初始化
      if (goodsList == null) {
         goodsList = new ArrayList<TaoBaoGoodsBrief>();
      }
      BigDecimal proportion = manageService.getFanLiRate();
      List<TaoBaoGoodsBriefExtra> listExtra = new ArrayList<TaoBaoGoodsBriefExtra>();
      TaoKeAppInfo app = new TaoKeAppInfo();
      app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
      app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
      app.setAdzoneId(TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT.split("_")[3]);
      app.setPid(TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT);
      List<Long> ids = new ArrayList<>();
      for (TaoBaoGoodsBrief goods : goodsList)
         ids.add(goods.getAuctionId());
      try {
         goodsList = TaoKeApiUtil.getBatchGoodsInfo(ids);
      } catch (TaoKeApiException e1) {
         e1.printStackTrace();
      } catch (TaobaoGoodsDownException e1) {
         e1.printStackTrace();
         List<TaoBaoGoodsBrief> goodsList = TaoKeApiUtil.guessLikeByAuctionId(id, 10);
         // 初始化
         if (goodsList == null) {
            goodsList = new ArrayList<TaoBaoGoodsBrief>();
         }
         BigDecimal proportion = manageService.getFanLiRate();
         List<TaoBaoGoodsBriefExtra> listExtra = new ArrayList<TaoBaoGoodsBriefExtra>();
         TaoKeAppInfo app = new TaoKeAppInfo();
         app.setAppKey(TaoBaoConstant.TAOBAO_AUTH_APPKEY);
         app.setAppSecret(TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
         app.setAdzoneId(TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT.split("_")[3]);
         app.setPid(TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT);
         List<Long> ids = new ArrayList<>();
         for (TaoBaoGoodsBrief goods : goodsList)
            ids.add(goods.getAuctionId());
         try {
            goodsList = TaoKeApiUtil.getBatchGoodsInfo(ids);
         } catch (TaoKeApiException e1) {
            e1.printStackTrace();
         } catch (TaobaoGoodsDownException e1) {
            e1.printStackTrace();
         }
         if (goodsList != null && goodsList.size() > 0)
            goodsList.parallelStream().forEach(goods -> {
               if (goods != null) {
                  // 获取详情
                  TaoBaoGoodsBrief taoBaoGoodsBrief = null;
                  try {
                     taoBaoGoodsBrief = taoBaoGoodsCacheUtil.getCommonTaoBaoGoodsInfo(goods.getAuctionId());
                  } catch (Exception e) {
                     e.printStackTrace();
                  }
                  if (taoBaoGoodsBrief == null) {
                     TaoBaoGoodsBrief newGoods = TaoKeApiUtil.specialConvertCoupon(goods.getAuctionId(), app);
                     goods.setCouponInfo(newGoods.getCouponInfo());
                     goods.setCouponLink(newGoods.getCouponLink());
                     goods.setTkRate(newGoods.getTkRate());
                     taoBaoGoodsBrief = goods;
                  }
                  if (taoBaoGoodsBrief != null) {
                     listExtra.add(
                           TaoBaoUtil.getTaoBaoGoodsBriefExtra(taoBaoGoodsBrief, proportion.toString(), ""));
                  }
               }
            });
         List<TaoBaoGoodsBrief> listQuality = new ArrayList<TaoBaoGoodsBrief>();
         // 取偶数个数据
         if (listExtra.size() % 2 != 0) {
            listExtra.remove(listExtra.size() - 1);
         }
         if (listQuality.size() % 2 != 0) {
            listQuality.remove(listQuality.size() - 1);
         }
         JSONObject data = new JSONObject();
         data.put("listQuality", JsonUtil.getApiCommonGson().toJson(listExtra));
         data.put("listGuess", JsonUtil.getApiCommonGson().toJson(listQuality));
         out.print(JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JSONObject data = new JSONObject();
         data.put("listQuality", new JSONArray());
         data.put("listGuess", new JSONArray());
         out.print(JsonUtil.loadTrueResult(data));
      }
      if (goodsList != null)
         goodsList.parallelStream().forEach(goods -> {
            // 获取详情
            TaoBaoGoodsBrief taoBaoGoodsBrief = null;
            try {
               taoBaoGoodsBrief = taoBaoGoodsCacheUtil.getCommonTaoBaoGoodsInfo(goods.getAuctionId());
            } catch (Exception e) {
               e.printStackTrace();
            }
            if (taoBaoGoodsBrief == null) {
               TaoBaoGoodsBrief newGoods = TaoKeApiUtil.specialConvertCoupon(goods.getAuctionId(), app);
               goods.setCouponInfo(newGoods.getCouponInfo());
               goods.setCouponLink(newGoods.getCouponLink());
               goods.setTkRate(newGoods.getTkRate());
               taoBaoGoodsBrief = goods;
            }
            if (taoBaoGoodsBrief != null) {
               listExtra.add(TaoBaoUtil.getTaoBaoGoodsBriefExtra(taoBaoGoodsBrief, proportion.toString(), ""));
            }
         });
      List<TaoBaoGoodsBrief> listQuality = new ArrayList<TaoBaoGoodsBrief>();
      // 删除推荐
      //
      // try {
      // List<QualityFactory> listRecommend =
      // qualityGoodsService.recommendByAuctionId(id);
      //
      // if (listRecommend != null && listRecommend.size() > 1) {
      // for (QualityFactory quality : listRecommend) {
      //
      // TaoBaoGoodsBrief taoBaoGoodsBrief = quality.getTaoBaoGoodsBrief();
      // if (taoBaoGoodsBrief == null) {
      // continue;
      // }
      //
      // int biz30day = taoBaoGoodsBrief.getBiz30day();
      // if (biz30day >= 10000) {
      // double sales = biz30day;
      // String salesCountMidea = String.format("%.1f", sales / 10000);
      // taoBaoGoodsBrief.setSalesCount(salesCountMidea + "万");
      // } else {
      // taoBaoGoodsBrief.setSalesCount(biz30day + "");
      // }
      //
      // // 改变图片尺寸
      // String pictUrl = taoBaoGoodsBrief.getPictUrl();
      // if (!StringUtil.isNullOrEmpty(pictUrl) &&
      // !pictUrl.contains("320x320")) {
      // taoBaoGoodsBrief.setPictUrl(TbImgUtil.getTBSize320Img(pictUrl));
      // }
      //
      // listQuality.add(TaoBaoUtil.getTaoBaoGoodsBriefExtra(taoBaoGoodsBrief,
      // proportion.toString(), null));
      // }
      // }
      // } catch (Exception e2) {
      // e2.printStackTrace();
      // }
      // 取偶数个数据
      if (listExtra.size() % 2 != 0) {
         listExtra.remove(listExtra.size() - 1);
      }
      if (listQuality.size() % 2 != 0) {
         listQuality.remove(listQuality.size() - 1);
      }
      JSONObject data = new JSONObject();
      data.put("listQuality", JsonUtil.getApiCommonGson().toJson(listExtra));
      data.put("listGuess", JsonUtil.getApiCommonGson().toJson(listQuality));
      out.print(JsonUtil.loadTrueResult(data));
   }
   /**
@@ -2315,32 +2551,36 @@
    * @param out
    */
   @RequestMapping(value = "getSpecialActivities")
   public void getSpecialActivities(AcceptData acceptData, Long uid, PrintWriter out) {
   public void getSpecialActivities(AcceptData acceptData, Long uid, PrintWriter out, String callback) {
      int platformCode = Constant.getPlatformCode(acceptData.getPlatform());
      List<Special> listSpecial = specialService.listByVersion(0, Integer.MAX_VALUE, "special_activities",
            platformCode, Integer.parseInt(acceptData.getVersion()));
      BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
            acceptData.getPackages());
      if (system == null) {
         out.print(JsonUtil.loadFalseResult(1, "系统不存在"));
         return;
      List<Special> list = new ArrayList<Special>();
      if (listSpecial != null) {
         list.addAll(listSpecial);
      }
      try {
         // 专题活动
         String specialCard = "special_activities";
      for (int i = 0; i < list.size(); i++) {
         Special special = list.get(i);
         List<Special> listSpecial = specialService.listPageBySystemAndCard(0, Integer.MAX_VALUE, specialCard,
               system.getId());
         if (listSpecial == null) {
            listSpecial = new ArrayList<Special>();
         JumpDetailV2 jumpDetail = special.getJumpDetail();
         if (jumpDetail != null) {
            jumpDetail.setNeedLogin(special.isJumpLogin());
            special.setJumpDetail(jumpDetail);
         }
         JSONObject root = new JSONObject();
         root.put("special", JsonUtil.getApiCommonGson().toJson(listSpecial));
         out.print(JsonUtil.loadTrueResult(root));
      } catch (Exception e) {
         e.printStackTrace();
         String name = special.getName();
         if (StringUtil.isNullOrEmpty(name)) {
            continue;
         }
      }
      JSONObject root = new JSONObject();
      root.put("special", JsonUtil.getApiCommonGson().toJson(list));
      if (StringUtil.isNullOrEmpty(callback))
         out.print(JsonUtil.loadTrueResult(root));
      else
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(root));
   }
}