From f8e9517b9ac645c0c50f2cf3efc1450145edd5b9 Mon Sep 17 00:00:00 2001
From: liujiang <569804566@qq.com>
Date: Sat, 4 Oct 2025 23:17:12 +0800
Subject: [PATCH] =?UTF-8?q?master=EF=BC=9A=E6=A1=A3=E5=8F=A3=E6=8E=A8?=
=?UTF-8?q?=E8=8D=90=E5=95=86=E5=93=81=E5=8A=9F=E8=83=BD=E5=AE=8C=E5=96=84?=
=?UTF-8?q?=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mapper/quartz/DailySaleProductMapper.xml | 26 +++++++++++
.../xkt/mapper/DailySaleProductMapper.java | 10 +++++
.../xkt/mapper/StoreProductFileMapper.java | 5 +++
.../impl/StoreHomepageServiceImpl.java | 45 ++++++++++++++++++-
4 files changed, 85 insertions(+), 1 deletion(-)
diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml
index 1cb03b7e3..b1605b729 100644
--- a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml
+++ b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml
@@ -184,6 +184,32 @@
count DESC;
+
diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java
index dff8814b3..f09ddb8b7 100644
--- a/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java
+++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java
@@ -7,6 +7,7 @@ import com.ruoyi.xkt.dto.dailySale.DailySaleProdDTO;
import com.ruoyi.xkt.dto.dailyStoreProd.DailyStoreProdSaleDTO;
import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO;
import com.ruoyi.xkt.dto.store.StoreIndexSaleTop10ResDTO;
+import com.ruoyi.xkt.dto.storeHomepage.StoreRecommendResDTO;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
@@ -93,4 +94,13 @@ public interface DailySaleProductMapper extends BaseMapper {
*/
List prodCateSaleTop50List(@Param("oneMonthAgo") Date oneMonthAgo, @Param("yesterday") Date yesterday);
+ /**
+ * 获取当前档口销量最好的10件商品作为默认的推荐商品
+ *
+ * @param storeId 档口ID
+ * @param fiveDaysAgo 5天前
+ * @param yesterday 昨天
+ * @return
+ */
+ List selectStoreDefaultRecommendList(@Param("storeId") Long storeId, @Param("fiveDaysAgo") Date fiveDaysAgo, @Param("yesterday") Date yesterday);
}
diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductFileMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductFileMapper.java
index 7ac9f4e2a..161a5bc47 100644
--- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductFileMapper.java
+++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductFileMapper.java
@@ -21,6 +21,11 @@ import java.util.List;
@Repository
public interface StoreProductFileMapper extends BaseMapper {
+ /**
+ * 根据商品ID删除所有文件
+ *
+ * @param storeProdId 商品ID
+ */
void updateDelFlagByStoreProdId(Long storeProdId);
/**
diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreHomepageServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreHomepageServiceImpl.java
index bc06ee14e..09d745fe2 100644
--- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreHomepageServiceImpl.java
+++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreHomepageServiceImpl.java
@@ -23,6 +23,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.time.LocalDate;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -47,6 +48,8 @@ public class StoreHomepageServiceImpl implements IStoreHomepageService {
final StoreProductFileMapper prodFileMapper;
final StoreProductCategoryAttributeMapper prodCateAttrMapper;
final StoreCertificateMapper storeCertMapper;
+ final DailySaleProductMapper dailySaleProdMapper;
+ final DailyProdTagMapper dailyProdTagMapper;
/**
* 获取档口首页各个部分的图信息
@@ -164,7 +167,11 @@ public class StoreHomepageServiceImpl implements IStoreHomepageService {
.eq(StoreHomepage::getStoreId, storeId).eq(StoreHomepage::getDelFlag, Constants.UNDELETED)
.eq(StoreHomepage::getFileType, HomepageType.STORE_RECOMMENDED.getValue()));
if (CollectionUtils.isEmpty(recommendList)) {
- return Collections.emptyList();
+ final Date yesterday = java.sql.Date.valueOf(LocalDate.now().minusDays(1));
+ final Date fiveDaysAgo = java.sql.Date.valueOf(LocalDate.now().minusDays(6));
+ // 如果档口未设置推荐商品,则筛选销量最好的10条商品
+ List dailySaleTop10ProdList = this.dailySaleProdMapper.selectStoreDefaultRecommendList(storeId, fiveDaysAgo, yesterday);
+ return CollectionUtils.isEmpty(dailySaleTop10ProdList) ? Collections.emptyList() : this.getDefaultRecommendList(storeId, dailySaleTop10ProdList);
}
// 商品价格、主图、标签等
List attrList = this.storeProdMapper.selectPriceAndMainPicAndTagList(recommendList.stream()
@@ -183,6 +190,42 @@ public class StoreHomepageServiceImpl implements IStoreHomepageService {
.collect(Collectors.toList());
}
+ /**
+ * 获取默认的推荐推荐商品
+ *
+ * @param storeId 档口ID
+ * @param dailySaleTop10ProdList 近5日销量排名前10的商品
+ * @return List
+ */
+ private List getDefaultRecommendList(Long storeId, List dailySaleTop10ProdList) {
+ // 获取商品标签
+ List prodTagList = this.dailyProdTagMapper.selectList(new LambdaQueryWrapper()
+ .eq(DailyProdTag::getStoreId, storeId).eq(DailyProdTag::getDelFlag, Constants.UNDELETED)
+ .in(DailyProdTag::getStoreProdId, dailySaleTop10ProdList.stream().map(StoreRecommendResDTO::getStoreProdId).collect(Collectors.toList())));
+ Map> tagMap = CollectionUtils.isEmpty(prodTagList) ? new HashMap<>()
+ : prodTagList.stream().collect(Collectors.groupingBy(x -> x.getStoreProdId().toString(), Collectors.mapping(DailyProdTag::getTag, Collectors.toList())));
+ // 获取商品主图及视频等
+ List prodFileList = this.prodFileMapper.selectList(new LambdaQueryWrapper()
+ .eq(StoreProductFile::getStoreId, storeId).eq(StoreProductFile::getDelFlag, Constants.UNDELETED).eq(StoreProductFile::getOrderNum, ORDER_NUM_1)
+ .in(StoreProductFile::getStoreProdId, dailySaleTop10ProdList.stream().map(StoreRecommendResDTO::getStoreProdId).collect(Collectors.toList()))
+ .in(StoreProductFile::getFileType, Arrays.asList(FileType.MAIN_PIC.getValue(), FileType.MAIN_PIC_VIDEO.getValue())));
+ // 档口商品主图map
+ Map mainPicMap = prodFileList.stream().filter(x -> Objects.equals(x.getFileType(), FileType.MAIN_PIC.getValue()))
+ .collect(Collectors.toMap(x -> x.getStoreProdId().toString(), StoreProductFile::getFileId));
+ // 档口商品视频map
+ Map videoMap = prodFileList.stream().filter(x -> Objects.equals(x.getFileType(), FileType.MAIN_PIC_VIDEO.getValue()))
+ .collect(Collectors.toMap(x -> x.getStoreProdId().toString(), StoreProductFile::getFileId));
+ List fileList = this.fileMapper.selectList(new LambdaQueryWrapper().eq(SysFile::getDelFlag, Constants.UNDELETED)
+ .in(SysFile::getId, prodFileList.stream().map(StoreProductFile::getFileId).collect(Collectors.toList())));
+ Map fileMap = CollectionUtils.isEmpty(fileList) ? new HashMap<>() : fileList.stream().collect(Collectors.toMap(SysFile::getId, SysFile::getFileUrl));
+ dailySaleTop10ProdList.forEach(x -> {
+ x.setTags(tagMap.getOrDefault(x.getStoreProdId(), new ArrayList<>()));
+ x.setMainPicUrl(fileMap.get(mainPicMap.get(x.getStoreProdId())));
+ x.setHasVideo(videoMap.containsKey(x.getStoreProdId()));
+ });
+ return dailySaleTop10ProdList;
+ }
+
/**
* 档口首页模板一返回数据
*