package com.yeshi.fanli.controller.h5; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.yeshi.utils.JsonUtil; import org.yeshi.utils.taobao.TbImgUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.recommend.RecommendBanner; import com.yeshi.fanli.entity.bus.recommend.RecommendSection; import com.yeshi.fanli.entity.bus.recommend.RecommendSectionGoods; import com.yeshi.fanli.entity.bus.share.UserShareGoodsHistory; import com.yeshi.fanli.entity.bus.su.recommend.SuperRecommendBanner; import com.yeshi.fanli.entity.bus.su.recommend.SuperRecommendSection; import com.yeshi.fanli.entity.system.System; import com.yeshi.fanli.entity.taobao.PidUser; import com.yeshi.fanli.entity.taobao.TBPid; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.TaoBaoLink; import com.yeshi.fanli.entity.taobao.TaoBaoUnionConfig; import com.yeshi.fanli.entity.taobao.TaoKeAppInfo; import com.yeshi.fanli.exception.ShareGoodsException; import com.yeshi.fanli.exception.share.UserShareGoodsRecordException; import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException; import com.yeshi.fanli.service.inter.config.ConfigService; import com.yeshi.fanli.service.inter.config.SystemConfigService; import com.yeshi.fanli.service.inter.config.SystemService; import com.yeshi.fanli.service.inter.goods.RecommendSectionGoodsService; import com.yeshi.fanli.service.inter.goods.ShareGoodsService; import com.yeshi.fanli.service.inter.goods.SuperRecommendBannerService; import com.yeshi.fanli.service.inter.goods.SuperRecommendSectionService; import com.yeshi.fanli.service.inter.goods.TaoBaoGoodsBriefService; import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService; import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService; import com.yeshi.fanli.service.inter.user.ScanHistoryService; import com.yeshi.fanli.service.inter.user.TBPidService; import com.yeshi.fanli.service.inter.user.UserShareGoodsGroupService; import com.yeshi.fanli.util.AESUtil; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.ThreadUtil; import com.yeshi.fanli.util.Utils; import com.yeshi.fanli.util.taobao.TaoBaoUtil; import com.yeshi.fanli.util.taobao.TaoKeApiUtil; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @Controller @RequestMapping("api/h5/v1/webRecommend") public class H5RecommendController { @Resource private H5ControllerUtil h5ControllerUtil; @Resource private SuperRecommendBannerService superRecommendBannerService; @Resource private SuperRecommendSectionService superRecommendSectionService; @Resource private HongBaoManageService hongBaoManageService; @Resource private RecommendSectionGoodsService recommendSectionGoodsService; @Resource private RedisManager redisManager; @Resource private SystemService systemService; @Resource private ConfigService configService; @Resource private SystemConfigService systemConfigService; @Resource private TaoBaoGoodsBriefService taoBaoGoodsBriefService; @Resource private ScanHistoryService scanHistoryService; @Resource private TBPidService tbPidService; @Resource private ShareGoodsService shareGoodsService; @Resource private TaoBaoUnionConfigService taoBaoUnionConfigService; @Resource private UserShareGoodsGroupService userShareGoodsGroupService; /** * * 方法说明: 推荐轮播商品信息 * * @author mawurui createTime 2018年5月11日 上午11:13:47 * @param acceptData * @param out */ @RequestMapping(value = "getRecommenBanner", method = RequestMethod.GET) public void getRecommendBanner(AcceptData acceptData, String callback, PrintWriter out) { System system = systemService.getSystem("WEB", Constant.systemCommonConfig.getH5PackageName()); JSONObject json = new JSONObject(); if (system == null) { out.print(JsonUtil.loadFalseResult(1, H5ControllerUtil.NOSYSTEM)); return; } List superRecommendBanners = superRecommendBannerService .getSuperRecommendBannersBySystem(system); List list = null; for (SuperRecommendBanner superRecommendBanner : superRecommendBanners) { if (list == null) { list = new ArrayList(); } RecommendBanner recommendBanner = superRecommendBanner.getRecommendBanner(); // 淘特价暂时修改 if (system.getId() == 7) { recommendBanner.getJumpDetail().setActivity(recommendBanner.getJumpDetail().getActivity() .replace("com.yeshi.ec.rebate.myapplication", "com.yeshi.ec.taospecial")); } list.add(recommendBanner); } if (list == null) { json.put("code", "1"); json.put("msg", H5ControllerUtil.NODATA); out.print(json); java.lang.System.out.println("json-" + json); return; } json.put("code", 0); JSONObject data = new JSONObject(); data.put("count", list.size()); Gson gson = new Gson(); data.put("data", gson.toJson(list)); json.put("data", data); // jsonp方式返回 out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(json))); return; } /** * * 方法说明: 推荐商品列表 * * @author mawurui createTime 2018年5月11日 上午11:26:03 * @param acceptData * @param index * @param out */ @RequestMapping(value = "getRecommendSection", method = RequestMethod.GET) public void getRecommendSection(AcceptData acceptData, String callback, PrintWriter out) { System system = systemService.getSystem("WEB", Constant.systemCommonConfig.getH5PackageName()); if (system == null) { out.print(JsonUtil.loadFalseResult(1, H5ControllerUtil.NOSYSTEM)); return; } List superRecommendSectionList = superRecommendSectionService .getSuperRecommendSectionBySystemId(system.getId()); List recommendSectionList = null; for (SuperRecommendSection superRecommendSection : superRecommendSectionList) { if (recommendSectionList == null) { recommendSectionList = new ArrayList(); } RecommendSection recommendSection = superRecommendSection.getRecommendSection(); // 暂时改变淘特价的跳转地址 if (system.getId() == 7) { recommendSection.setJumpUrl(recommendSection.getJumpUrl().replace("column.html", "column_ttj.html")); } recommendSectionList.add(recommendSection); } if (recommendSectionList == null) { out.print(JsonUtil.loadFalseResult(1, H5ControllerUtil.NODATA)); return; } Utils.sort(recommendSectionList); int size = recommendSectionList.size(); List recommendSectionGoodsList = null; JSONObject data = new JSONObject(); data.put("count", size); JSONArray dataArr = new JSONArray(); JSONObject validData = null; Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder()) .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create(); BigDecimal proportion = hongBaoManageService.getFanLiRate(); Map> map = recommendSectionGoodsService.getAllSectionGoodsMap(); for (int i = 0; i < size; i++) { validData = new JSONObject(); RecommendSection recommendSection = recommendSectionList.get(i); recommendSectionGoodsList = map.get(recommendSection.getId()); if (recommendSectionGoodsList == null) { continue; } Utils.sort(recommendSectionGoodsList); if (recommendSection.getCounts() < recommendSectionGoodsList.size()) { recommendSectionGoodsList = recommendSectionGoodsList.subList(0, recommendSection.getCounts()); } validData.put("count", recommendSectionGoodsList.size()); validData.put("recommendSection", gson.toJson(recommendSection)); // 替换TaoBaoGoodsBrief JSONArray array = new JSONArray(); Gson gson2 = new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); for (RecommendSectionGoods rss : recommendSectionGoodsList) { JSONObject obj = JSONObject.fromObject(gson2.toJson(rss)); String json = gson.toJson(TaoBaoUtil.getTaoBaoGoodsBriefExtra( gson2.fromJson(obj.optJSONObject("taoBaoGoodsBrief").toString(), TaoBaoGoodsBrief.class), proportion.toString(), "")); obj.put("taoBaoGoodsBrief", json); array.add(obj); } validData.put("recommendSectionGoodsList", array); dataArr.add(validData); } data.put("data", dataArr); String result = JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)); if (Constant.IS_OUTNET) redisManager.cacheCommonString("client-api-getRecommendSection", result, 3 * 60); out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(result))); return; } /** * * 方法说明: 获取商品详情 * * @author mawurui createTime 2018年5月11日 上午11:37:02 * @param acceptData * @param id * @param uid * @param out */ @SuppressWarnings("unused") @RequestMapping(value = "getGoodsDetail", method = RequestMethod.GET) public void getGoodsDetail(final AcceptData acceptData, final String id, String uid, String callback, PrintWriter out) { long begin = java.lang.System.currentTimeMillis(); if (StringUtil.isNullOrEmpty(id)) { out.print(JsonUtil.loadFalseResult(1, "请上传id")); return; } if (!StringUtil.isNullOrEmpty(uid)) { uid = AESUtil.decrypt(uid, Constant.UIDAESKEY); } TaoBaoGoodsBrief goods = null; String token = null; if (!StringUtil.isNullOrEmpty(uid)) { // 查询是否有分享记录 UserShareGoodsHistory shareHistory = null; try { shareHistory = shareGoodsService.getShareGoodsHistoryDetail(Long.parseLong(uid), Long.parseLong(id)); } catch (NumberFormatException e) { e.printStackTrace(); } catch (ShareGoodsException e) { e.printStackTrace(); } if (shareHistory != null) {// 有分享记录 token = shareHistory.getTkCode(); goods = redisManager.getTaoBaoGoodsTemp(Long.parseLong(id)); if (goods == null) try { goods = TaoKeApiUtil.searchGoodsDetail(Long.parseLong(id)); } catch (NumberFormatException e) { e.printStackTrace(); } catch (TaobaoGoodsDownException e) { e.printStackTrace(); } } else {// 没有分享记录,需要直接分享 List configList = taoBaoUnionConfigService .getConfigByTypeCache(PidUser.TYPE_SHARE_GOODS); String pid = null; TBPid tbPid = tbPidService.getTBPid(Long.parseLong(uid), PidUser.TYPE_SHARE_GOODS); if (tbPid != null) pid = tbPid.getPid(); else { pid = configList.get(0).getDefaultPid(); } // 获取 TaoKeAppInfo app = new TaoKeAppInfo(); app.setAdzoneId(pid.split("_")[3]); app.setAppKey(configList.get(0).getAppKey()); app.setAppSecret(configList.get(0).getAppSecret()); app.setPid(pid); try { goods = TaoKeApiUtil.searchGoodsDetail(Long.parseLong(id), app); } catch (NumberFormatException e) { e.printStackTrace(); } catch (TaobaoGoodsDownException e) { e.printStackTrace(); } if (goods != null) { String url = goods.getAuctionUrl(); if (!StringUtil.isNullOrEmpty(goods.getCouponLink())) { url = goods.getCouponLink(); } token = TaoKeApiUtil.getTKToken(goods.getPictUrl(), goods.getTitle(), url); } } } else { List configList = taoBaoUnionConfigService .getConfigByTypeCache(PidUser.TYPE_SHARE_GOODS); String pid = configList.get(0).getDefaultPid(); TaoKeAppInfo app = new TaoKeAppInfo(); app.setAdzoneId(pid.split("_")[3]); app.setAppKey(configList.get(0).getAppKey()); app.setAppSecret(configList.get(0).getAppSecret()); app.setPid(pid); try { goods = TaoKeApiUtil.searchGoodsDetail(Long.parseLong(id), app); } catch (NumberFormatException e) { e.printStackTrace(); } catch (TaobaoGoodsDownException e) { e.printStackTrace(); } if (goods != null) { String url = goods.getAuctionUrl(); if (!StringUtil.isNullOrEmpty(goods.getCouponLink())) { url = goods.getCouponLink(); } token = TaoKeApiUtil.getTKToken(goods.getPictUrl(), goods.getTitle(), url); } } if (goods == null) { out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("商品信息获取失败"))); return; } if (StringUtil.isNullOrEmpty(token)) { out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("口令生成失败"))); return; } // 券后价 BigDecimal afterCouponPrice = TaoBaoUtil.getAfterUseCouplePrice(goods); TaoBaoLink link = new TaoBaoLink(); link.setTaoToken(token); JSONObject data = new JSONObject(); data.put("title", goods.getTitle()); if (goods.getImgList() == null) goods.setImgList(new ArrayList<>()); goods.getImgList().add(0, TbImgUtil.getTBSizeImg(goods.getPictUrl(), 300)); data.put("imgs", goods.getImgList()); data.put("quanPrice", afterCouponPrice); data.put("zkPrice", goods.getZkPrice()); data.put("shareContent", "长按复制本段文字,打开【手机淘宝】即可领取【特别优惠券】购买下单,"); data.put("token", link.getTaoToken()); data.put("quan", !StringUtil.isNullOrEmpty(goods.getCouponInfo())); data.put("reservePrice", goods.getReservePrice()); data.put("shopType", goods.getUserType() == 1 ? 2 : 1); out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data))); final String tempUid = uid; ThreadUtil.run(new Runnable() { @Override public void run() { try { if (!StringUtil.isNullOrEmpty(tempUid)) userShareGoodsGroupService.updateBrowseRecord(Long.parseLong(tempUid), Long.parseLong(id), 1); } catch (NumberFormatException e) { e.printStackTrace(); } catch (UserShareGoodsRecordException e) { e.printStackTrace(); } } }); return; } }