HomeServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. package com.zkh360.api.home.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.zkh360.api.dto.GWResponseEnum;
  4. import com.zkh360.api.dto.GWResponseVO;
  5. import com.zkh360.api.dto.ResponseCode;
  6. import com.zkh360.api.dto.ResultResponse;
  7. import com.zkh360.api.home.dto.*;
  8. import com.zkh360.api.home.service.IHomeService;
  9. import com.zkh360.api.home.util.PedestalResponseMSG;
  10. import com.zkh360.core.exception.ZkhRuntimeException;
  11. import com.zkh360.core.util.ZkhApiUtil;
  12. import com.zkh360.core.util.ZkhGWInvoiceId;
  13. import com.zkh360.core.util.ZkhGWapiEnum;
  14. import com.zkh360.core.util.redis.RedisService;
  15. import lombok.extern.slf4j.Slf4j;
  16. import net.sf.json.JSONArray;
  17. import net.sf.json.JSONObject;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.springframework.beans.BeanUtils;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.beans.factory.annotation.Value;
  22. import org.springframework.http.ResponseEntity;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.web.client.RestTemplate;
  25. import java.util.ArrayList;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.concurrent.CompletableFuture;
  30. import java.util.concurrent.Future;
  31. /**
  32. * 首页实现类
  33. */
  34. @Service
  35. @Slf4j
  36. public class HomeServiceImpl implements IHomeService {
  37. @Autowired
  38. private ZkhApiUtil zkhApiUtil;
  39. @Autowired
  40. private RedisService redisService;
  41. @Value("${zkh.website.url}")
  42. private String domainUrl;
  43. @Autowired
  44. private RestTemplate restTemplate;
  45. @Override
  46. public ResultResponse getHome() throws Exception {
  47. HomeResultDto homeResultDto = new HomeResultDto();
  48. String message = null;
  49. final String invoiceId = getInvoiceId();
  50. //多线程请求官网api
  51. Future<List> futureBannerList = CompletableFuture.supplyAsync(() -> getBanner(restTemplate,invoiceId));
  52. Future<List> futureBrandList = CompletableFuture.supplyAsync(() -> getAuthenticBrand(restTemplate,invoiceId));
  53. Future<List> futureCatalogueList = CompletableFuture.supplyAsync(() -> getCatalogue(restTemplate,invoiceId));
  54. Future<List> futureTopCatalogueList = CompletableFuture.supplyAsync(() -> getTopCatalogue(restTemplate,invoiceId));
  55. Future<List> futureRecommendList = CompletableFuture.supplyAsync(() -> getRecommends(restTemplate,invoiceId));
  56. List<Banner> bannerList = futureBannerList.get();
  57. List<Brand> brandList = futureBrandList.get();
  58. List<FineCategory> catalogueList = futureCatalogueList.get();
  59. List<Category> topCatalogueList = futureTopCatalogueList.get();
  60. List<RecommendProduct> recommends = futureRecommendList.get();
  61. homeResultDto.setBanners(bannerList);
  62. homeResultDto.setBrands(brandList);
  63. homeResultDto.setCategorys(topCatalogueList);
  64. homeResultDto.setFineCategorys(catalogueList);
  65. homeResultDto.setRecommends(recommends);
  66. ResultResponse rs = new ResultResponse();
  67. rs.setStateCode(ResponseCode.CODE_0);
  68. rs.setMessage(message);
  69. rs.setData(homeResultDto);
  70. return rs;
  71. }
  72. /**
  73. * 获取首页banner图
  74. * @return
  75. */
  76. public List<Banner> getBanner(RestTemplate restTemplate,String invoiceId){
  77. List<Banner> bannerList = new ArrayList<>();
  78. List<BannerDto> list = null;
  79. String url = domainUrl + ZkhGWapiEnum.RECOMMENT_BANNER.getApi()+"?access_token="+redisService.get("access_token")+"&userInvoiceId="+invoiceId;
  80. JSONArray result = requestGWApi(restTemplate, url);
  81. if(result != null && result.size()>0) {
  82. String jsonString = JSON.toJSONString(result);
  83. list = JSON.parseArray(jsonString, BannerDto.class);
  84. }
  85. if(list != null && list.size() > 0){
  86. for (BannerDto bannerDto : list) {
  87. Banner banner = new Banner();
  88. BeanUtils.copyProperties(bannerDto,banner);
  89. bannerList.add(banner);
  90. }
  91. }
  92. return bannerList;
  93. }
  94. /**
  95. * 获取正品大牌
  96. * @return
  97. */
  98. public List<Brand> getAuthenticBrand(RestTemplate restTemplate, String invoiceId){
  99. List<Brand> brandList = new ArrayList<>();
  100. List<BannerDto> list = null;
  101. String url = domainUrl + ZkhGWapiEnum.RECOMMENT_BRAND.getApi()+"?access_token="+redisService.get("access_token")+"&userInvoiceId="+invoiceId;
  102. JSONArray result = requestGWApi(restTemplate, url);
  103. if(result != null && result.size()>0) {
  104. String jsonString = JSON.toJSONString(result);
  105. list = JSON.parseArray(jsonString, BannerDto.class);
  106. }
  107. if(list != null && list.size() > 0){
  108. for (BannerDto bannerDto : list) {
  109. Brand brand = new Brand();
  110. brand.setDetail(Integer.parseInt(bannerDto.getDetail()));
  111. brand.setThumbnail(bannerDto.getThumbnail());
  112. String title = bannerDto.getTitle();
  113. brand.setBrandName(title.substring(0,title.indexOf("^")));
  114. brandList.add(brand);
  115. }
  116. }
  117. return brandList;
  118. }
  119. /**
  120. * 获取精选品类
  121. * @return
  122. */
  123. public List<FineCategory> getCatalogue(RestTemplate restTemplate,String invoiceId){
  124. List<FineCategory> catalogueList = new ArrayList<>();
  125. List<BannerDto> list = null;
  126. String url = domainUrl + ZkhGWapiEnum.RECOMMENT_CATALOGUE.getApi()+"?access_token="+redisService.get("access_token")+"&userInvoiceId="+invoiceId;
  127. JSONArray result = requestGWApi(restTemplate, url);
  128. if(result != null && result.size()>0) {
  129. String jsonString = JSON.toJSONString(result);
  130. list = JSON.parseArray(jsonString, BannerDto.class);
  131. }
  132. if(list != null && list.size() > 0){
  133. for (BannerDto bannerDto : list) {
  134. FineCategory fineCategory = new FineCategory();
  135. fineCategory.setId(bannerDto.getId());
  136. fineCategory.setThumbnail(bannerDto.getThumbnail());
  137. fineCategory.setDetail(Integer.parseInt(bannerDto.getDetail()));
  138. String title = bannerDto.getTitle();
  139. int i = title.indexOf("^");
  140. int index = title.indexOf("|");
  141. String titleName = title.substring(0,i);
  142. String subTitle = title.substring(index+1);
  143. fineCategory.setSubTitle(subTitle);
  144. fineCategory.setTitle(titleName);
  145. fineCategory.setTitleName(titleName);
  146. catalogueList.add(fineCategory);
  147. }
  148. }
  149. return catalogueList;
  150. }
  151. /**
  152. * 获取一级目录推荐
  153. * @return
  154. */
  155. public List<Category> getTopCatalogue(RestTemplate restTemplate,String invoiceId){
  156. List<Category> topCatalogueList = new ArrayList<>();
  157. List<BannerDto> list = null;
  158. String url = domainUrl + ZkhGWapiEnum.RECOMMENT_TOPCATALOGUE.getApi()+"?access_token="+redisService.get("access_token")+"&userInvoiceId="+invoiceId;
  159. JSONArray result = requestGWApi(restTemplate, url);
  160. if(result != null && result.size()>0) {
  161. String jsonString = JSON.toJSONString(result);
  162. list = JSON.parseArray(jsonString, BannerDto.class);
  163. }
  164. if(list != null && list.size() > 0){
  165. for (BannerDto bannerDto : list) {
  166. Category category = new Category();
  167. category.setThumbnail(bannerDto.getThumbnail());
  168. int detail = Integer.parseInt(bannerDto.getDetail());
  169. int id = detail < 0 ? 0 : detail;
  170. category.setDetail(id);
  171. String title = bannerDto.getTitle();
  172. category.setTitle(title.substring(0,title.indexOf("^")));
  173. topCatalogueList.add(category);
  174. }
  175. }
  176. return topCatalogueList;
  177. }
  178. /**
  179. *
  180. * 获取热销产品推荐
  181. * @return
  182. */
  183. public List<RecommendProduct> getRecommends(RestTemplate restTemplate,String invoiceId){
  184. List<RecommendProduct> list = new ArrayList<>();
  185. String url = domainUrl + ZkhGWapiEnum.RECOMMENT_PRODUCT.getApi()+"?access_token="+redisService.get("access_token")+"&userInvoiceId="+invoiceId;
  186. log.info("请求官网url===>"+url);
  187. long startTime = System.currentTimeMillis();
  188. ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
  189. String body = responseEntity.getBody();
  190. log.info("耗时 : " + (System.currentTimeMillis() - startTime));
  191. JSONObject resultBody = JSONObject.fromObject(body);
  192. Boolean success = (Boolean)resultBody.get("success");
  193. if(!success){
  194. throw new ZkhRuntimeException((String)resultBody.get("message"));
  195. }
  196. JSONObject result = resultBody.getJSONObject("result");
  197. if(null != result && result.has("content")){
  198. JSONArray content = result.getJSONArray("content");
  199. if(content != null && content.size()>0) {
  200. String s = JSON.toJSONString(content);
  201. list = JSON.parseArray(s,RecommendProduct.class);
  202. }
  203. }
  204. if(list != null && list.size() > 0){
  205. for (RecommendProduct recommend : list) {
  206. recommend.setGoodsThumb(recommend.getLeftImageList().get(0));
  207. }
  208. }
  209. return list;
  210. }
  211. @Override
  212. public ResultResponse changePedestalForJava(PedestalInfo pedestalInfo) {
  213. ResultResponse resultResponse = new ResultResponse();
  214. resultResponse.setStateCode(ResponseCode.CODE_0);
  215. resultResponse.setMessage("修改成功");
  216. if(pedestalInfo.getPassCode().hashCode() != PedestalResponseMSG.PASSCODE){
  217. resultResponse.setStateCode(ResponseCode.CODE_1);
  218. resultResponse.setMessage(PedestalResponseMSG.PASSCODE_WRONG);
  219. return resultResponse;
  220. }
  221. if(!pedestalInfo.getDevice().equals(PedestalResponseMSG.ANDROID) && !pedestalInfo.getDevice().equals(PedestalResponseMSG.IOS)){
  222. resultResponse.setStateCode(ResponseCode.CODE_1);
  223. resultResponse.setMessage(PedestalResponseMSG.DEVICE_WRONG);
  224. return resultResponse;
  225. }
  226. if(!pedestalInfo.getNativeOrH5().equals(PedestalResponseMSG.NATIVE) && !pedestalInfo.getNativeOrH5().equals(PedestalResponseMSG.H5)){
  227. resultResponse.setStateCode(ResponseCode.CODE_1);
  228. resultResponse.setMessage(PedestalResponseMSG.PEDESTAL_WRONG);
  229. return resultResponse;
  230. }
  231. if(pedestalInfo.getDevice().equals(PedestalResponseMSG.ANDROID)){
  232. if(pedestalInfo.getNativeOrH5().equals(PedestalResponseMSG.NATIVE)){
  233. redisService.set(PedestalResponseMSG.PEDESTAL_FOR_ANDRIOD,PedestalResponseMSG.NATIVE_CODE);
  234. }else{
  235. redisService.set(PedestalResponseMSG.PEDESTAL_FOR_ANDRIOD,PedestalResponseMSG.H5_CODE);
  236. }
  237. }
  238. if(pedestalInfo.getDevice().equals(PedestalResponseMSG.IOS)){
  239. if(pedestalInfo.getNativeOrH5().equals(PedestalResponseMSG.NATIVE)){
  240. redisService.set(PedestalResponseMSG.PEDESTAL_FOR_IOS,PedestalResponseMSG.NATIVE_CODE);
  241. }else{
  242. redisService.set(PedestalResponseMSG.PEDESTAL_FOR_IOS,PedestalResponseMSG.H5_CODE);
  243. }
  244. }
  245. return resultResponse;
  246. }
  247. @Override
  248. public ResultResponse getNoticeList() throws Exception {
  249. String url = ZkhGWapiEnum.GLOBALCONFIG_ANNOUNCEMENT.getApi();
  250. GWResponseVO<Object> gwResponseVO = new GWResponseVO<>();
  251. List<Notice> list = new ArrayList<>();
  252. try {
  253. gwResponseVO = zkhApiUtil.callZKHGWGet(url, new HashMap<>(0), null);
  254. }catch (ZkhRuntimeException zkhRuntimeException){
  255. //首页公告配置过期
  256. if(GWResponseEnum.CONFIG_ANNOUNCEMENT.getMessage().equals(zkhRuntimeException.getMessage())){
  257. return new ResultResponse(list);
  258. }
  259. }
  260. //首页公告没有配置
  261. if(gwResponseVO.getResult() == null){
  262. return new ResultResponse(list);
  263. }
  264. String noticeContent = gwResponseVO.getResult().toString();
  265. Notice notice = new Notice();
  266. notice.setNoticeContent(noticeContent);
  267. list.add(notice);
  268. return new ResultResponse(list);
  269. }
  270. @Override
  271. public ResultResponse getBannerInfo(Integer id) throws Exception {
  272. String invoiceId = getInvoiceId();
  273. String url = domainUrl + ZkhGWapiEnum.RECOMMENT_BANNER.getApi()+"?access_token="+redisService.get("access_token")+"&userInvoiceId="+invoiceId;
  274. String html = "";
  275. JSONArray jsonArray = requestGWApi(restTemplate, url);
  276. if(null != jsonArray && jsonArray.size() >0){
  277. for (int i = 0; i < jsonArray.size(); i++) {
  278. JSONObject jsonObject = jsonArray.getJSONObject(i);
  279. if(null != jsonObject && jsonObject.getInt("id") == id){
  280. html = jsonObject.getString("detail");
  281. }
  282. }
  283. }
  284. return new ResultResponse(html);
  285. }
  286. @Override
  287. public ResultResponse changePedestal(String device) throws Exception {
  288. ResultResponse resultResponse = new ResultResponse();
  289. resultResponse.setStateCode(ResponseCode.CODE_0);
  290. resultResponse.setMessage("成功");
  291. Map resultMap = new HashMap();
  292. if(!device.equals(PedestalResponseMSG.ANDROID) && !device.equals(PedestalResponseMSG.IOS)){
  293. resultResponse.setStateCode(ResponseCode.CODE_1);
  294. resultResponse.setMessage(PedestalResponseMSG.DEVICE_WRONG);
  295. return resultResponse;
  296. }
  297. Integer pedestalCode = 1;
  298. if(device.equals(PedestalResponseMSG.ANDROID)){
  299. if(!redisService.exists(PedestalResponseMSG.PEDESTAL_FOR_ANDRIOD)){
  300. pedestalCode = 1;
  301. }else{
  302. pedestalCode = (Integer) redisService.get(PedestalResponseMSG.PEDESTAL_FOR_ANDRIOD);
  303. }
  304. }else{
  305. if(!redisService.exists(PedestalResponseMSG.PEDESTAL_FOR_IOS)){
  306. pedestalCode = 1;
  307. }else{
  308. pedestalCode = (Integer) redisService.get(PedestalResponseMSG.PEDESTAL_FOR_IOS);
  309. }
  310. }
  311. resultMap.put("nativeOrH5",pedestalCode);
  312. resultResponse.setData(resultMap);
  313. return resultResponse;
  314. }
  315. @Override
  316. public JSONArray requestGWApi(RestTemplate restTemplate,String url){
  317. log.info("请求官网url===>"+url);
  318. long startTime = System.currentTimeMillis();
  319. ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
  320. String body = responseEntity.getBody();
  321. log.info("耗时 : " + (System.currentTimeMillis() - startTime));
  322. JSONObject resultBody = JSONObject.fromObject(body);
  323. Boolean success = (Boolean)resultBody.get("success");
  324. if(!success){
  325. throw new ZkhRuntimeException((String)resultBody.get("message"));
  326. }
  327. JSONArray result = resultBody.getJSONArray("result");
  328. return result;
  329. }
  330. //获取发票ID
  331. public String getInvoiceId(){
  332. String invoiceId = null;
  333. String authorization = ZkhGWInvoiceId.getInvoiceId();
  334. if(StringUtils.isNotBlank(authorization)){
  335. invoiceId = redisService.get(authorization).toString();
  336. }
  337. return invoiceId==null?"":invoiceId;
  338. }
  339. }