Ver Fonte

feat(search): 为AI搜索功能添加横幅推荐

- 在AiSearchController中引入StoreBanner相关实体和服务
- 添加StoreBannerService依赖注入到AI搜索控制器
- 实现根据匹配结果的业务板块名称获取横幅推荐功能
- 新增StoreBannerService接口方法getBannerByAISearch用于AI搜索推荐
- 实现StoreBannerServiceImpl中的getBannerByAISearch方法支持关键词搜索
- 添加横幅状态过滤、排序和模块名称匹配逻辑
- 将横幅推荐结果集成到AI搜索响应中返回
fcw há 1 mês atrás
pai
commit
3df51d70ba

+ 12 - 4
alien-store/src/main/java/shop/alien/store/controller/AiSearchController.java

@@ -20,17 +20,16 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.LifeBlacklist;
-import shop.alien.entity.store.StoreImg;
-import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.*;
+import shop.alien.entity.store.vo.StoreBannerVo;
 import shop.alien.entity.store.vo.StoreInfoVo;
-import shop.alien.entity.store.CommonRating;
 import shop.alien.mapper.CommonRatingMapper;
 import shop.alien.mapper.LifeBlacklistMapper;
 import shop.alien.mapper.StoreImgMapper;
 import shop.alien.mapper.StoreUserMapper;
 import shop.alien.store.annotation.TrackEvent;
 import shop.alien.store.service.CommonRatingService;
+import shop.alien.store.service.StoreBannerService;
 import shop.alien.store.service.StoreImgService;
 import shop.alien.store.service.StoreInfoService;
 import shop.alien.entity.store.vo.StoreBusinessStatusVo;
@@ -65,6 +64,7 @@ public class AiSearchController {
 
     private final RestTemplate restTemplate;
     private final StoreImgService storeImgService;
+    private final StoreBannerService storeBannerService;
     private final CommonRatingService commonRatingService;
     private final CommonRatingMapper commonRatingMapper;
     private final StoreInfoService storeInfoService;
@@ -124,6 +124,14 @@ public class AiSearchController {
 //            relatedResults.addAll(relatedResult);
             jsonObject1.put("matchedRecords", matchedResult);
             jsonObject1.put("relatedRecords", relatedResult);
+            // 根据matchedResult中的business_section_name去插入到storeBanners中
+            List<String> sectionNames = matchedResult.stream()
+                    .map(StoreInfoVo::getBusinessSectionName)
+                    .filter(StringUtils::isNotBlank)
+                    .distinct()
+                    .collect(Collectors.toList());
+            List<StoreBannerVo> storeBanners = storeBannerService.getBannerByAISearch(sectionNames);
+            jsonObject1.put("storeBanners", storeBanners);
 
 
             jsonObject1.put("total", jsonObject.get("total"));

+ 10 - 0
alien-store/src/main/java/shop/alien/store/service/StoreBannerService.java

@@ -7,6 +7,8 @@ import shop.alien.entity.store.StoreBanner;
 import shop.alien.entity.store.dto.StoreBannerDto;
 import shop.alien.entity.store.vo.StoreBannerVo;
 
+import java.util.List;
+
 /**
  * Banner表 服务类
  *
@@ -34,5 +36,13 @@ public interface StoreBannerService extends IService<StoreBanner> {
      * @return 分页数据
      */
     IPage<StoreBannerVo> pageList(String moduleCode, String moduleName, String status, Integer pageNum, Integer pageSize);
+
+    /**
+     * 根据关键词搜索 Banner
+     *
+     * @param keyword 关键词
+     * @return 搜索结果
+     */
+    List<StoreBannerVo> getBannerByAISearch(List<String> keyword);
 }
 

+ 22 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreBannerServiceImpl.java

@@ -15,6 +15,10 @@ import shop.alien.entity.store.vo.StoreBannerVo;
 import shop.alien.mapper.StoreBannerMapper;
 import shop.alien.store.service.StoreBannerService;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * Banner表 服务实现类
  *
@@ -78,6 +82,24 @@ public class StoreBannerServiceImpl extends ServiceImpl<StoreBannerMapper, Store
         return this.page(page, wrapper).convert(this::toVo);
     }
 
+    @Override
+    public List<StoreBannerVo> getBannerByAISearch(List<String> keyword) {
+        // 去重:过滤空白并按关键词去重
+        List<String> distinctKeywords = (keyword == null || keyword.isEmpty())
+                ? Collections.emptyList()
+                : keyword.stream().filter(StringUtils::isNotBlank).distinct().collect(Collectors.toList());
+
+        LambdaQueryWrapper<StoreBanner> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreBanner::getStatus, "1")
+                .orderByAsc(StoreBanner::getSort)
+                .orderByDesc(StoreBanner::getCreatedTime);
+        // 无关键词时查全部 banner,有关键词时按 module_name 过滤
+        if (distinctKeywords != null && !distinctKeywords.isEmpty()) {
+            wrapper.in(StoreBanner::getModuleName, distinctKeywords);
+        }
+        return this.list(wrapper).stream().map(this::toVo).collect(Collectors.toList());
+    }
+
     private StoreBannerVo toVo(StoreBanner banner) {
         StoreBannerVo vo = new StoreBannerVo();
         BeanUtils.copyProperties(banner, vo);