From 78f633d1f43fc2f3c8927bc8bf686bb5809619c0 Mon Sep 17 00:00:00 2001 From: liujiang <569804566@qq.com> Date: Sat, 12 Jul 2025 00:24:06 +0800 Subject: [PATCH] =?UTF-8?q?master=EF=BC=9AAPP=E5=AE=9E=E5=8A=9B=E8=B4=A8?= =?UTF-8?q?=E9=80=A0=E3=80=81=E5=95=86=E5=93=81=E6=A6=9C=E3=80=81=E5=9B=BE?= =?UTF-8?q?=E6=90=9C=E7=83=AD=E6=A6=9C=E7=AD=89=E5=8A=9F=E8=83=BD=E5=AE=8C?= =?UTF-8?q?=E5=96=84=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xkt/PictureSearchController.java | 9 +- .../web/controller/xkt/WebsiteController.java | 6 +- .../xkt/vo/storeProd/StoreProdViewVO.java | 2 + .../xkt/vo/website/AppStrengthSearchVO.java | 16 ++++ .../controller/DailyTaskController.java | 12 +++ .../java/com/ruoyi/quartz/task/XktTask.java | 17 +++- .../mapper/quartz/DailySaleProductMapper.xml | 36 ++++---- .../app/prod/APPProdCateTop3DTO.java | 8 +- .../advertRound/app/prod/APPProdSaleDTO.java | 1 - .../dto/storeProduct/StoreProdViewDTO.java | 4 +- .../xkt/dto/website/AppStrengthSearchDTO.java | 16 ++++ .../ruoyi/xkt/service/IWebsiteAPPService.java | 3 +- .../impl/PictureSearchServiceImpl.java | 12 ++- .../service/impl/WebsiteAPPServiceImpl.java | 83 +++++++++++++------ .../resources/mapper/StoreProductMapper.xml | 8 +- 15 files changed, 168 insertions(+), 65 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/website/AppStrengthSearchVO.java create mode 100644 xkt/src/main/java/com/ruoyi/xkt/dto/website/AppStrengthSearchDTO.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/PictureSearchController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/PictureSearchController.java index cfd658ae4..53f9819c2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/PictureSearchController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/PictureSearchController.java @@ -12,10 +12,7 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -41,8 +38,8 @@ public class PictureSearchController extends XktBaseController { .searchProductByPic(BeanUtil.toBean(searchVO, SearchRequestDTO.class).setNum(20)), StoreProdViewVO.class)); } - @ApiOperation(value = "图搜热款列表", httpMethod = "POST", response = R.class) - @PostMapping("/hot") + @ApiOperation(value = "图搜热款列表", httpMethod = "GET", response = R.class) + @GetMapping("/hot") public R> searchHotList() { return R.ok(BeanUtil.copyToList(picSearchService.listImgSearchTopProduct(), StoreProdViewVO.class)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java index 8728a93f1..49721d95c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/WebsiteController.java @@ -19,6 +19,7 @@ import com.ruoyi.web.controller.xkt.vo.advertRound.pc.newProd.*; import com.ruoyi.web.controller.xkt.vo.advertRound.pc.store.PCStoreMidBannerVO; import com.ruoyi.web.controller.xkt.vo.advertRound.pc.store.PCStoreTopBannerVO; import com.ruoyi.web.controller.xkt.vo.advertRound.picSearch.PicSearchAdvertVO; +import com.ruoyi.web.controller.xkt.vo.website.AppStrengthSearchVO; import com.ruoyi.web.controller.xkt.vo.website.IndexSearchVO; import com.ruoyi.web.controller.xkt.vo.website.StoreSearchVO; import com.ruoyi.xkt.dto.BasePageDTO; @@ -35,6 +36,7 @@ import com.ruoyi.xkt.dto.advertRound.pc.PCSearchDTO; import com.ruoyi.xkt.dto.advertRound.pc.index.PCIndexRecommendDTO; import com.ruoyi.xkt.dto.advertRound.pc.newProd.PCNewRecommendDTO; import com.ruoyi.xkt.dto.advertRound.pc.store.PCStoreRecommendDTO; +import com.ruoyi.xkt.dto.website.AppStrengthSearchDTO; import com.ruoyi.xkt.dto.website.IndexSearchDTO; import com.ruoyi.xkt.dto.website.StoreSearchDTO; import com.ruoyi.xkt.service.IWebsiteAPPService; @@ -269,8 +271,8 @@ public class WebsiteController extends XktBaseController { @ApiOperation(value = "APP 实力质造专题页 档口列表", notes = "只需要传分页参数即可", httpMethod = "POST", response = R.class) @PostMapping("/app/strength/store") - public R> getAppStrengthStorePage(@Validated @RequestBody IndexSearchVO searchVO) { - return R.ok(websiteAPPService. getAppStrengthStorePage(BeanUtil.toBean(searchVO, IndexSearchDTO.class))); + public R> getAppStrengthStorePage(@Validated @RequestBody AppStrengthSearchVO searchVO) { + return R.ok(websiteAPPService. getAppStrengthStorePage(BeanUtil.toBean(searchVO, AppStrengthSearchDTO.class))); } @ApiOperation(value = "APP 商品榜 销量列表", httpMethod = "GET", response = R.class) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProd/StoreProdViewVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProd/StoreProdViewVO.java index 6e87aa202..a1aa2d87f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProd/StoreProdViewVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeProd/StoreProdViewVO.java @@ -14,6 +14,8 @@ import java.util.List; @Data public class StoreProdViewVO { + @ApiModelProperty(value = "会员等级") + private Integer memberLevel; @ApiModelProperty(value = "搜索次数") private Long imgSearchCount; @ApiModelProperty(value = "同款商品数量") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/website/AppStrengthSearchVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/website/AppStrengthSearchVO.java new file mode 100644 index 000000000..0485b5213 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/website/AppStrengthSearchVO.java @@ -0,0 +1,16 @@ +package com.ruoyi.web.controller.xkt.vo.website; + +import com.ruoyi.web.controller.xkt.vo.BasePageVO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class AppStrengthSearchVO extends BasePageVO { + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java index 584394ae0..478b7db71 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java @@ -120,6 +120,18 @@ public class DailyTaskController extends BaseController { return R.ok(); } + @PostMapping("/redis/store-memeber") + public R saveStoreMemberToRedis(SysJob sysJob) { + task.saveStoreMemberToRedis(); + return R.ok(); + } + + @PostMapping("/daily-prod-top-sale") + public R dailyProdTopSale(SysJob sysJob) { + task.dailyProdTopSale(); + return R.ok(); + } + diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java index b6182385d..4fe606d69 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java @@ -91,7 +91,6 @@ public class XktTask { final StoreProductMapper storeProdMapper; final DailyProdTagMapper dailyProdTagMapper; final StoreProductCategoryAttributeMapper cateAttrMapper; - final StoreProductStatisticsMapper prodStatMapper; final EsClientWrapper esClientWrapper; final AdvertMapper advertMapper; final AdvertRoundMapper advertRoundMapper; @@ -509,7 +508,7 @@ public class XktTask { return; } // 获取 商品销售、商品浏览量、商品收藏量、商品下载量 - List statisticsList = this.prodStatMapper.selectList(new LambdaQueryWrapper() + List statisticsList = this.storeProdStatMapper.selectList(new LambdaQueryWrapper() .eq(StoreProductStatistics::getDelFlag, Constants.UNDELETED)); // 商品浏览量、下载量 Map prodStatMap = statisticsList.stream().collect(Collectors.toMap(StoreProductStatistics::getStoreProdId, Function.identity())); @@ -728,10 +727,22 @@ public class XktTask { expireList.forEach(x -> redisCache.deleteObject(CacheConstants.STORE_MEMBER + x.getId())); } + /** + * 将档口会员存到redis中 + */ + public void saveStoreMemberToRedis() { + List memberList = this.storeMemberMapper.selectList(new LambdaQueryWrapper() + .eq(StoreMember::getDelFlag, Constants.UNDELETED)); + if (CollectionUtils.isEmpty(memberList)) { + return; + } + memberList.forEach(x -> redisCache.setCacheObject(CacheConstants.STORE_MEMBER + x.getStoreId(), x)); + } + /** * 凌晨2:50 更新APP商品销量榜、分类商品销量榜 */ - public void dailyProdSale() { + public void dailyProdTopSale() { final Date oneMonthAgo = java.sql.Date.valueOf(LocalDate.now().minusMonths(1)); final Date now = java.sql.Date.valueOf(LocalDate.now()); // 销量前100的ID列表,直接放到redis中 diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml index c252ea182..1cb03b7e3 100644 --- a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml @@ -132,50 +132,56 @@ diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdCateTop3DTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdCateTop3DTO.java index d0e1ede07..74218664c 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdCateTop3DTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdCateTop3DTO.java @@ -27,14 +27,14 @@ public class APPProdCateTop3DTO { @Data @Accessors(chain = true) public static class APPPCTProdDTO { - @ApiModelProperty(value = "1推广图") - private Integer displayType; + @ApiModelProperty(value = "主图") + private String mainPicUrl; @ApiModelProperty(value = "排序") private Integer orderNum; @ApiModelProperty(value = "档口ID") private Long storeId; - @ApiModelProperty(value = "推广图路径") - private String fileUrl; + @ApiModelProperty(value = "商品货号") + private String prodArtNum; } } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdSaleDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdSaleDTO.java index 46aa6db10..1003119c2 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdSaleDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/app/prod/APPProdSaleDTO.java @@ -14,7 +14,6 @@ import java.util.List; */ @Data @Accessors(chain = true) -@JsonInclude(JsonInclude.Include.NON_NULL) public class APPProdSaleDTO { @ApiModelProperty(value = "会员等级") diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdViewDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdViewDTO.java index efcf3bccf..ab1339e22 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdViewDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdViewDTO.java @@ -16,6 +16,8 @@ import java.util.List; @Accessors(chain = true) public class StoreProdViewDTO { + @ApiModelProperty(value = "档口会员级别") + private Integer memberLevel; @ApiModelProperty(value = "搜索次数") private Integer imgSearchCount; @ApiModelProperty(value = "同款商品数量") @@ -38,7 +40,5 @@ public class StoreProdViewDTO { private Long storeId; @ApiModelProperty(value = "档口名称") private String storeName; -// @ApiModelProperty(value = "档口标签列表") -// private List storeTagList; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/website/AppStrengthSearchDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/website/AppStrengthSearchDTO.java new file mode 100644 index 000000000..8110563b0 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/website/AppStrengthSearchDTO.java @@ -0,0 +1,16 @@ +package com.ruoyi.xkt.dto.website; + +import com.ruoyi.xkt.dto.BasePageDTO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class AppStrengthSearchDTO extends BasePageDTO { + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteAPPService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteAPPService.java index 150290c24..f20addd89 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteAPPService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IWebsiteAPPService.java @@ -10,6 +10,7 @@ import com.ruoyi.xkt.dto.advertRound.app.prod.APPProdSaleDTO; import com.ruoyi.xkt.dto.advertRound.app.strength.APPStrengthProdDTO; import com.ruoyi.xkt.dto.advertRound.app.strength.APPStrengthStoreDTO; import com.ruoyi.xkt.dto.es.ESProductDTO; +import com.ruoyi.xkt.dto.website.AppStrengthSearchDTO; import com.ruoyi.xkt.dto.website.IndexSearchDTO; import java.io.IOException; @@ -111,7 +112,7 @@ public interface IWebsiteAPPService { * @param searchDTO 搜索入参 * @return Page */ - Page getAppStrengthStorePage(IndexSearchDTO searchDTO); + Page getAppStrengthStorePage(AppStrengthSearchDTO searchDTO); /** * APP 商品榜 销量前100 商品列表 diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java index 10e3ce40e..0190c995d 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/PictureSearchServiceImpl.java @@ -11,6 +11,7 @@ import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.xkt.domain.PictureSearch; +import com.ruoyi.xkt.domain.StoreMember; import com.ruoyi.xkt.domain.SysFile; import com.ruoyi.xkt.dto.advertRound.picSearch.PicSearchAdvertDTO; import com.ruoyi.xkt.dto.picture.ProductImgSearchCountDTO; @@ -113,7 +114,13 @@ public class PictureSearchServiceImpl implements IPictureSearchService { return picSearchHotList; } // 重新缓存数据到redis - return this.cacheImgSearchTopProduct(); + picSearchHotList = this.cacheImgSearchTopProduct(); + picSearchHotList.forEach(x -> { + // 查询档口会员等级 + StoreMember member = this.redisCache.getCacheObject(CacheConstants.STORE_MEMBER + x.getStoreId()); + x.setMemberLevel(ObjectUtils.isNotEmpty(member) ? member.getLevel() : null); + }); + return picSearchHotList; } @@ -133,7 +140,8 @@ public class PictureSearchServiceImpl implements IPictureSearchService { storeProdViewAttrList = storeProdViewAttrList.stream().map(x -> { //根据主图搜索同类商品 List pmList = pictureService.searchProductByPicKey(x.getMainPicUrl(), 1000); - return x.setSameProdCount(pmList.size()).setImgSearchCount(ObjectUtils.defaultIfNull(searchCountMap.get(x.getStoreProdId()), 0)); + return x.setTags(StrUtil.split(x.getTagStr(), ",")).setSameProdCount(pmList.size()) + .setImgSearchCount(ObjectUtils.defaultIfNull(searchCountMap.get(x.getStoreProdId()), 0)); }) .sorted(Comparator.comparing(StoreProdViewDTO::getImgSearchCount).reversed()) .limit(100) diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteAPPServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteAPPServiceImpl.java index 7db3304ed..e1b3dff79 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteAPPServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsiteAPPServiceImpl.java @@ -33,6 +33,7 @@ import com.ruoyi.xkt.dto.es.ESProductDTO; import com.ruoyi.xkt.dto.storeProduct.StoreProdPriceAndMainPicAndTagDTO; import com.ruoyi.xkt.dto.storeProduct.StoreProdPriceAndMainPicDTO; import com.ruoyi.xkt.dto.useSearchHistory.UserSearchHistoryDTO; +import com.ruoyi.xkt.dto.website.AppStrengthSearchDTO; import com.ruoyi.xkt.dto.website.IndexSearchDTO; import com.ruoyi.xkt.enums.AdBiddingStatus; import com.ruoyi.xkt.enums.AdDisplayType; @@ -327,13 +328,22 @@ public class WebsiteAPPServiceImpl implements IWebsiteAPPService { if (CollectionUtils.isEmpty(keyList)) { return Page.empty(searchDTO.getPageSize(), searchDTO.getPageNum()); } + List storeIdList = keyList.stream().map(key -> { + StoreMember member = this.redisCache.getCacheObject(key); + return member.getStoreId().toString(); + }).collect(Collectors.toList()); // 设置档口 - searchDTO.setStoreIdList(new ArrayList<>(keyList)); + searchDTO.setStoreIdList(storeIdList); Page page = this.search(searchDTO); if (CollectionUtils.isEmpty(page.getList())) { return Page.empty(searchDTO.getPageSize(), searchDTO.getPageNum()); } List list = BeanUtil.copyToList(page.getList(), APPStrengthProdDTO.class); + // 设置档口会员等级 + list.forEach(x -> { + StoreMember storeMember = this.redisCache.getCacheObject(CacheConstants.STORE_MEMBER + x.getStoreId()); + x.setMemberLevel(ObjectUtils.isNotEmpty(storeMember) ? storeMember.getLevel() : null); + }); return new Page<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), list); } @@ -345,15 +355,19 @@ public class WebsiteAPPServiceImpl implements IWebsiteAPPService { */ @Override @Transactional(readOnly = true) - public Page getAppStrengthStorePage(IndexSearchDTO searchDTO) { + public Page getAppStrengthStorePage(AppStrengthSearchDTO searchDTO) { // 获取有哪些会员档口 Collection keyList = this.redisCache.scanKeys(CacheConstants.STORE_MEMBER + "*"); if (CollectionUtils.isEmpty(keyList)) { return Page.empty(searchDTO.getPageSize(), searchDTO.getPageNum()); } + List storeIdList = keyList.stream().map(key -> { + StoreMember member = this.redisCache.getCacheObject(key); + return member.getStoreId(); + }).collect(Collectors.toList()); PageHelper.startPage(searchDTO.getPageNum(), searchDTO.getPageSize()); List storeList = this.storeMapper.selectList(new LambdaQueryWrapper() - .eq(Store::getDelFlag, Constants.UNDELETED).in(Store::getId, new ArrayList<>(keyList)) + .eq(Store::getDelFlag, Constants.UNDELETED).in(Store::getId, storeIdList) .orderByDesc(Store::getStoreWeight)); if (CollectionUtils.isEmpty(storeList)) { return Page.empty(searchDTO.getPageSize(), searchDTO.getPageNum()); @@ -368,6 +382,11 @@ public class WebsiteAPPServiceImpl implements IWebsiteAPPService { List list = storeList.stream().map(store -> BeanUtil.toBean(store, APPStrengthStoreDTO.class) .setFocus(focusStoreIdMap.containsKey(store.getId()))) .collect(Collectors.toList()); + // 设置档口会员等级 + list.forEach(x -> { + StoreMember storeMember = this.redisCache.getCacheObject(CacheConstants.STORE_MEMBER + x.getStoreId()); + x.setMemberLevel(ObjectUtils.isNotEmpty(storeMember) ? storeMember.getLevel() : null); + }); return Page.convert(new PageInfo<>(list)); } @@ -380,11 +399,11 @@ public class WebsiteAPPServiceImpl implements IWebsiteAPPService { @Transactional(readOnly = true) public List getAppProdSaleTop100List() throws IOException { // 从redis中获取销量前100的商品 - List top100ProdList = redisCache.getCacheObject(CacheConstants.TOP_50_SALE_PROD); - if (CollectionUtils.isEmpty(top100ProdList)) { + List top50ProdList = redisCache.getCacheObject(CacheConstants.TOP_50_SALE_PROD); + if (CollectionUtils.isEmpty(top50ProdList)) { return Collections.emptyList(); } - List prodIdList = top100ProdList.stream().map(DailyStoreProdSaleDTO::getStoreProdId).map(String::valueOf).collect(Collectors.toList()); + List prodIdList = top50ProdList.stream().map(DailyStoreProdSaleDTO::getStoreProdId).map(String::valueOf).collect(Collectors.toList()); // 构建入参 IndexSearchDTO searchDTO = new IndexSearchDTO(); searchDTO.setProdIdList(prodIdList); @@ -400,14 +419,17 @@ public class WebsiteAPPServiceImpl implements IWebsiteAPPService { .eq(UserFavorites::getDelFlag, Constants.UNDELETED).in(UserFavorites::getStoreProdId, prodIdList) .eq(UserFavorites::getUserId, userId)).stream().collect(Collectors .toMap(x -> x.getStoreProdId().toString(), Function.identity())); - return top100ProdList.stream() + return top50ProdList.stream() .filter(x -> ObjectUtils.isNotEmpty(esProdMap.get(x.getStoreProdId().toString()))) - .map(x -> BeanUtil.toBean(esProdMap.get(x.getStoreProdId().toString()), APPProdSaleDTO.class) - // 是否为档口会员 - .setMemberLevel(redisCache.getCacheObject(CacheConstants.STORE_MEMBER + x.getStoreId())) - // 是否收藏商品 - .setCollectProd(ObjectUtils.isNotEmpty(collectMap.get(x.getStoreProdId().toString())) - ? Boolean.TRUE : Boolean.FALSE)) + .map(x -> { + StoreMember storeMember = this.redisCache.getCacheObject(CacheConstants.STORE_MEMBER + x.getStoreId()); + return BeanUtil.toBean(esProdMap.get(x.getStoreProdId().toString()), APPProdSaleDTO.class) + // 是否为档口会员 + .setMemberLevel(ObjectUtils.isNotEmpty(storeMember) ? storeMember.getLevel() : null) + // 是否收藏商品 + .setCollectProd(ObjectUtils.isNotEmpty(collectMap.get(x.getStoreProdId().toString())) + ? Boolean.TRUE : Boolean.FALSE); + }) .collect(Collectors.toList()); } @@ -419,22 +441,22 @@ public class WebsiteAPPServiceImpl implements IWebsiteAPPService { @Override @Transactional(readOnly = true) public List getAppCateProdSaleTop3List() throws IOException { - List cateSaleTop100ProdList = redisCache.getCacheObject(CacheConstants.CATE_TOP_50_SALE_PROD); - if (CollectionUtils.isEmpty(cateSaleTop100ProdList)) { + List cateSaleTop50ProdList = redisCache.getCacheObject(CacheConstants.CATE_TOP_50_SALE_PROD); + if (CollectionUtils.isEmpty(cateSaleTop50ProdList)) { return new ArrayList<>(); } // 商品分类ID 和 分类名称的map - Map prodCateNameMap = cateSaleTop100ProdList.stream().collect(Collectors - .toMap(DailyStoreProdSaleDTO::getProdCateId, DailyStoreProdSaleDTO::getProdCateName)); + Map prodCateNameMap = cateSaleTop50ProdList.stream().collect(Collectors + .toMap(DailyStoreProdSaleDTO::getProdCateId, DailyStoreProdSaleDTO::getProdCateName, (s1, s2) -> s2)); // 每一个分类ID与分类销量前3 的商品ID列表 Map> cateProdIdMap = new HashMap<>(); // 所有的商品销量榜 List prodIdList = new ArrayList<>(); - cateSaleTop100ProdList.stream().collect(Collectors.groupingBy(DailyStoreProdSaleDTO::getProdCateId)) + cateSaleTop50ProdList.stream().collect(Collectors.groupingBy(DailyStoreProdSaleDTO::getProdCateId)) .forEach((prodCateId, list) -> { // 每一个分类销量前3 的 id 列表 List top3ProdIdList = list.stream().sorted(Comparator.comparing(DailyStoreProdSaleDTO::getCount).reversed()) - .limit(3).map(String::valueOf).collect(Collectors.toList()); + .limit(3).map(DailyStoreProdSaleDTO::getStoreProdId).map(String::valueOf).collect(Collectors.toList()); prodIdList.addAll(top3ProdIdList); cateProdIdMap.put(prodCateId, top3ProdIdList); }); @@ -448,17 +470,28 @@ public class WebsiteAPPServiceImpl implements IWebsiteAPPService { // ES 中存的 商品信息 Map esProdMap = page.getList().stream().collect(Collectors.toMap(ESProductDTO::getStoreProdId, Function.identity())); // 商品分类销量map - Map cateCountMap = cateSaleTop100ProdList.stream().collect(Collectors + Map cateCountMap = cateSaleTop50ProdList.stream().collect(Collectors .groupingBy(DailyStoreProdSaleDTO::getProdCateId, Collectors.summingInt(DailyStoreProdSaleDTO::getCount))); // 按照cateCountMap 的 value 倒序排,并且只取key 的集合 List cateIdList = cateCountMap.entrySet().stream().sorted(Map.Entry.comparingByValue().reversed()) .map(Map.Entry::getKey).collect(Collectors.toList()); // 每一个分类前3的列表 - return cateIdList.stream().map(prodCateId -> new APPProdCateTop3DTO() - .setProdCateId(prodCateId).setProdCateName(prodCateNameMap.get(prodCateId)) - .setProdList(CollectionUtils.isEmpty(cateProdIdMap.get(prodCateId)) ? new ArrayList<>() - : BeanUtil.copyToList(cateProdIdMap.get(prodCateId).stream() - .map(esProdMap::get).collect(Collectors.toList()), APPProdCateTop3DTO.APPPCTProdDTO.class))) + return cateIdList.stream().map(prodCateId -> { + APPProdCateTop3DTO cateTop3DTO = new APPProdCateTop3DTO().setProdCateId(prodCateId).setProdCateName(prodCateNameMap.get(prodCateId)); + List top3ProdIdList = cateProdIdMap.get(prodCateId); + if (CollectionUtils.isEmpty(top3ProdIdList)) { + return cateTop3DTO; + } + List tempList = new ArrayList<>(); + for (int i = 0; i < top3ProdIdList.size(); i++) { + ESProductDTO esProd = esProdMap.get(top3ProdIdList.get(i)); + if (ObjectUtils.isEmpty(esProd)) { + continue; + } + tempList.add(BeanUtil.toBean(esProd, APPProdCateTop3DTO.APPPCTProdDTO.class).setOrderNum(i + 1)); + } + return cateTop3DTO.setProdList(tempList); + }) .collect(Collectors.toList()); } diff --git a/xkt/src/main/resources/mapper/StoreProductMapper.xml b/xkt/src/main/resources/mapper/StoreProductMapper.xml index 749899032..78d8c046b 100644 --- a/xkt/src/main/resources/mapper/StoreProductMapper.xml +++ b/xkt/src/main/resources/mapper/StoreProductMapper.xml @@ -190,10 +190,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" MIN( spcp.price ) AS price FROM store_product sp - LEFT JOIN store_product_file spf ON sp.id = spf.store_prod_id AND spf.del_flag = 0 AND spf.file_type = 1 AND spf.order_num = 1 - LEFT JOIN sys_file sf ON spf.file_id = sf.id - LEFT JOIN store s ON sp.store_id = s.id - LEFT JOIN store_product_color_price spcp ON sp.id = spcp.store_prod_id AND spcp.del_flag = 0 + JOIN store_product_file spf ON sp.id = spf.store_prod_id AND spf.del_flag = 0 AND spf.file_type = 1 AND spf.order_num = 1 + JOIN sys_file sf ON spf.file_id = sf.id + JOIN store s ON sp.store_id = s.id + JOIN store_product_color_price spcp ON sp.id = spcp.store_prod_id AND spcp.del_flag = 0 LEFT JOIN daily_prod_tag dpt ON sp.id = dpt.store_prod_id AND dpt.del_flag = 0 WHERE sp.del_flag = 0