master:商城首页销售榜广告植入;

pull/1121/head
liujiang 2025-11-09 12:40:59 +08:00
parent 6703d82699
commit a579310a6f
2 changed files with 51 additions and 5 deletions

View File

@ -31,13 +31,12 @@
dsp.store_id,
s.store_name,
sp.prod_cate_id,
spc.`name` AS prodCateName,
sp.prod_cate_name,
SUM(dsp.sale_num) AS saleNum
FROM
daily_sale_product dsp
JOIN store_product sp ON dsp.store_prod_id = sp.id
JOIN store s ON dsp.store_id = s.id
JOIN sys_product_category spc ON sp.prod_cate_id = spc.id
WHERE
dsp.del_flag = 0
AND dsp.voucher_date BETWEEN #{oneMonthAgo} AND #{now}
@ -46,7 +45,7 @@
dsp.prod_art_num,
dsp.store_id,
sp.prod_cate_id,
spc.`name`
sp.prod_cate_name
</select>

View File

@ -693,10 +693,39 @@ public class WebsitePCServiceImpl implements IWebsitePCService {
}
final Date now = java.sql.Date.valueOf(LocalDate.now());
final Date oneMonthAgo = java.sql.Date.valueOf(LocalDate.now().minusMonths(1));
// 全量的销量统计数据
List<CateSaleRankDTO> cateSaleList = this.dailySaleProdMapper.selectSaleRankList(oneMonthAgo, now);
if (CollectionUtils.isEmpty(cateSaleList)) {
return new ArrayList<>();
}
// 销售榜榜一到榜四的推广
List<AdvertRound> saleRankList = this.advertRoundMapper.selectList(new LambdaQueryWrapper<AdvertRound>()
.isNotNull(AdvertRound::getStoreId).isNotNull(AdvertRound::getProdIdStr)
.ne(AdvertRound::getProdIdStr, "").eq(AdvertRound::getDelFlag, Constants.UNDELETED)
.eq(AdvertRound::getLaunchStatus, AdLaunchStatus.LAUNCHING.getValue()).in(AdvertRound::getTypeId, Arrays.asList(AdType.PC_HOME_SALE_RANK_ONE,
AdType.PC_HOME_SALE_RANK_TWO.getValue(), AdType.PC_HOME_SALE_RANK_THREE.getValue(), AdType.PC_HOME_SALE_RANK_FOUR.getValue())));
// 销量榜一到榜四的推广 key 1 2 3 4 便于后面取数据
Map<Integer, List<AdvertRound>> saleAdvertMap = saleRankList.stream().collect(Collectors.groupingBy(ad -> {
switch (ad.getTypeId()) {
case 3:
return 1;
case 4:
return 2;
case 5:
return 3;
case 6:
return 4;
default:
return ad.getTypeId();
}
}));
// 推广商品ID列表
final List<Long> advertProdIdList = CollectionUtils.isEmpty(saleRankList) ? Collections.emptyList()
: saleRankList.stream().map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList());
// 销售榜推广销量等信息
List<CateSaleRankDTO> advertSaleList = cateSaleList.stream().filter(x -> advertProdIdList.contains(x.getStoreProdId())).collect(Collectors.toList());
Map<Long, CateSaleRankDTO> advertSaleMap = CollectionUtils.isEmpty(advertSaleList) ? new HashMap<>()
: advertSaleList.stream().collect(Collectors.toMap(CateSaleRankDTO::getStoreProdId, Function.identity()));
// 所有二级分类ID map
Map<Long, Long> parCateIdMap = this.getParCateIdMap();
final List<Long> storeProdIdList = cateSaleList.stream().map(CateSaleRankDTO::getStoreProdId).collect(Collectors.toList());
@ -715,10 +744,14 @@ public class WebsitePCServiceImpl implements IWebsitePCService {
// Step 4: 构建返回结果
List<PCIndexMidSalesDTO> retCateOrderList = new ArrayList<>();
for (int i = 0; i < top4CateEntries.size(); i++) {
// 当前销售榜推广
final List<AdvertRound> saleAdvertList = saleAdvertMap.getOrDefault(i + 1, Collections.emptyList());
final List<Long> tempAdvertProdIdList = saleAdvertList.stream().map(AdvertRound::getProdIdStr).map(Long::parseLong).collect(Collectors.toList());
Long cateId = top4CateEntries.get(i).getKey();
List<CateSaleRankDTO> cateDetailList = topSaleMap.getOrDefault(cateId, Collections.emptyList());
// 过滤掉销量为0
cateDetailList = cateDetailList.stream().filter(x -> ObjectUtils.defaultIfNull(x.getSaleNum(), 0) > 0).collect(Collectors.toList());
// 过滤掉销量为0并且根据广告数量决定截取的商品数量
cateDetailList = cateDetailList.stream().filter(x -> ObjectUtils.defaultIfNull(x.getSaleNum(), 0) > 0)
.filter(x -> !tempAdvertProdIdList.contains(x.getStoreProdId())).limit(5 - saleAdvertList.size()).collect(Collectors.toList());
List<PCIndexMidSalesDTO.PCIMSSaleDTO> saleDTOList = new ArrayList<>();
for (int j = 0; j < cateDetailList.size(); j++) {
CateSaleRankDTO dto = cateDetailList.get(j);
@ -734,6 +767,20 @@ public class WebsitePCServiceImpl implements IWebsitePCService {
? prodPriceAndMainPicMap.get(dto.getStoreProdId()).getMainPicUrl() : "");
saleDTOList.add(saleDTO);
}
for (int j = 0; j < saleAdvertList.size(); j++) {
CateSaleRankDTO advertSaleDTO = advertSaleMap.get(Long.parseLong(saleAdvertList.get(j).getProdIdStr()));
// 绑定档口会员等级
StoreMember member = this.redisCache.getCacheObject(CacheConstants.STORE_MEMBER + advertSaleDTO.getStoreId());
PCIndexMidSalesDTO.PCIMSSaleDTO saleDTO = new PCIndexMidSalesDTO.PCIMSSaleDTO().setDisplayType(AdDisplayType.PRODUCT.getValue())
.setStoreId(advertSaleDTO.getStoreId()).setStoreName(advertSaleDTO.getStoreName()).setStoreProdId(advertSaleDTO.getStoreProdId())
.setProdArtNum(advertSaleDTO.getProdArtNum()).setMemberLevel(ObjectUtils.isNotEmpty(member) ? member.getLevel() : null)
.setStoreProdId(advertSaleDTO.getStoreProdId()).setSaleNum(advertSaleDTO.getSaleNum()).setOrderNum(j + 1)
.setPrice(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(advertSaleDTO.getStoreProdId()))
? prodPriceAndMainPicMap.get(advertSaleDTO.getStoreProdId()).getMinPrice() : null)
.setMainPicUrl(ObjectUtils.isNotEmpty(prodPriceAndMainPicMap.get(advertSaleDTO.getStoreProdId()))
? prodPriceAndMainPicMap.get(advertSaleDTO.getStoreProdId()).getMainPicUrl() : "");
saleDTOList.add(saleDTO);
}
retCateOrderList.add(new PCIndexMidSalesDTO().setProdCateId(cateId).setProdCateName(cateIdMap.get(cateId)).setOrderNum(i + 1)
.setParCateId(parCateIdMap.get(cateId)).setSaleList(saleDTOList));
}