feat(新增): 搜索商品

This commit is contained in:
bunny 2024-04-09 10:06:56 +08:00
parent 619f774f52
commit 178f2d04fb
15 changed files with 285 additions and 0 deletions

View File

@ -14,6 +14,7 @@
<file url="file://$PROJECT_DIR$/model/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/model/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/model/src/main/resources-filtered" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/service-client/service-activity-client/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/service-client/service-product-client/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/service-client/service-region-client/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/service-client/service-search-client/src/main/java" charset="UTF-8" />

View File

@ -17,6 +17,7 @@
<module>service-region-client</module>
<module>service-user-client</module>
<module>service-search-client</module>
<module>service-activity-client</module>
</modules>
<properties>

View File

@ -0,0 +1,23 @@
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu</groupId>
<artifactId>service-client</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>service-activity-client</artifactId>
<packaging>jar</packaging>
<name>service-activity-client</name>
<url>https://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
</dependencies>
</project>

View File

@ -0,0 +1,14 @@
package com.atguigu.ssyx.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.Map;
@FeignClient(value = "service-activity", path = "/api/activity")
public interface ActivityFeignClient { // 根据skuId列表获取促销信息
@PostMapping("inner/findActivity")
Map<Long, List<String>> findActivity(@RequestBody List<Long> skuIdList);
}

View File

@ -0,0 +1,29 @@
package com.atguigu.ssyx.activity.api;
import com.atguigu.ssyx.activity.service.ActivityInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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 java.util.List;
import java.util.Map;
@Api(tags = "促销与优惠券接口")
@RestController
@RequestMapping("/api/activity")
@Slf4j
public class ActivityApiController {
@Autowired
private ActivityInfoService activityInfoService;
@ApiOperation(value = "根据skuId列表获取促销信息")
@PostMapping("inner/findActivity")
public Map<Long, List<String>> findActivity(@RequestBody List<Long> skuIdList) {
return activityInfoService.findActivity(skuIdList);
}
}

View File

@ -1,6 +1,7 @@
package com.atguigu.ssyx.activity.mapper;
import com.atguigu.ssyx.model.activity.ActivityInfo;
import com.atguigu.ssyx.model.activity.ActivityRule;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@ -24,4 +25,12 @@ public interface ActivityInfoMapper extends BaseMapper<ActivityInfo> {
* @return List<Long>
*/
List<Long> selectSkuIdListExist(List<Long> skuIdList);
/**
* * 根据skuId 查询对应规则列表
*
* @param skuId 商品Id
* @return 商品活动列表
*/
List<ActivityRule> findActivityRule(Long skuId);
}

View File

@ -42,4 +42,12 @@ public interface ActivityInfoService extends IService<ActivityInfo> {
* @return 活动列表
*/
List<SkuInfo> findSkuInfoByKeyword(String keyword);
/**
* * 根据skuId列表获取促销信息
*
* @param skuIdList 列表
* @return Map<Long, List < String>>
*/
Map<Long, List<String>> findActivity(List<Long> skuIdList);
}

View File

@ -5,6 +5,7 @@ import com.atguigu.ssyx.activity.mapper.ActivityRuleMapper;
import com.atguigu.ssyx.activity.mapper.ActivitySkuMapper;
import com.atguigu.ssyx.activity.service.ActivityInfoService;
import com.atguigu.ssyx.client.product.ProductFeignClient;
import com.atguigu.ssyx.enums.ActivityType;
import com.atguigu.ssyx.model.activity.ActivityInfo;
import com.atguigu.ssyx.model.activity.ActivityRule;
import com.atguigu.ssyx.model.activity.ActivitySku;
@ -12,6 +13,7 @@ import com.atguigu.ssyx.model.product.SkuInfo;
import com.atguigu.ssyx.vo.activity.ActivityRuleVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -19,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -136,4 +139,53 @@ public class ActivityInfoServiceImpl extends ServiceImpl<ActivityInfoMapper, Act
}
return skuInfoList;
}
/**
* * 根据skuId列表获取促销信息
*
* @param skuIdList 列表
* @return Map<Long, List < String>>
*/
@Override
public Map<Long, List<String>> findActivity(List<Long> skuIdList) {
Map<Long, List<String>> result = new HashMap<>();
// skuIdList遍历得到每个skuId
skuIdList.forEach(skuId -> {
// 根据skuId进行查询查询sku对应活动里面规则列表
List<ActivityRule> activityRuleList =
baseMapper.findActivityRule(skuId);
// 数据封装规则名称
if (!CollectionUtils.isEmpty(activityRuleList)) {
List<String> ruleList = new ArrayList<>();
// 把规则名称处理
for (ActivityRule activityRule : activityRuleList) {
ruleList.add(this.getRuleDesc(activityRule));
}
result.put(skuId, ruleList);
}
});
return result;
}
// 构造规则名称的方法
private String getRuleDesc(ActivityRule activityRule) {
ActivityType activityType = activityRule.getActivityType();
StringBuilder ruleDesc = new StringBuilder();
if (activityType == ActivityType.FULL_REDUCTION) {
ruleDesc
.append("")
.append(activityRule.getConditionAmount())
.append("元减")
.append(activityRule.getBenefitAmount())
.append("");
} else {
ruleDesc
.append("")
.append(activityRule.getConditionNum())
.append("元打")
.append(activityRule.getBenefitDiscount())
.append("");
}
return ruleDesc.toString();
}
}

View File

@ -12,4 +12,21 @@
</foreach>
and now() between info.start_time and info.end_time
</select>
<!-- 根据skuId 查询对应规则列表 -->
<select id="findActivityRule" resultType="com.atguigu.ssyx.model.activity.ActivityRule">
select info.activity_type as activityType,
rule.id,
rule.activity_id,
rule.condition_amount,
rule.condition_num,
rule.benefit_amount,
rule.benefit_discount
from activity_info info
inner join activity_sku sku on sku.activity_id = info.id
inner join activity_rule rule on rule.activity_id = info.id
where sku.sku_id = #{skuId}
and now() between info.start_time and info.end_time
order by rule.condition_amount desc, rule.condition_num desc
</select>
</mapper>

View File

@ -0,0 +1,31 @@
package com.atguigu.ssyx.home.controller;
import com.atguigu.ssyx.client.product.ProductFeignClient;
import com.atguigu.ssyx.client.search.SearchFeignClient;
import com.atguigu.ssyx.common.result.Result;
import com.atguigu.ssyx.model.product.Category;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "商品分类")
@RestController
@RequestMapping("api/home")
public class CategoryApiController {
@Autowired
private ProductFeignClient productFeignClient;
@Autowired
private SearchFeignClient searchFeignClient;
@ApiOperation(value = "获取分类信息")
@GetMapping("category")
public Result<List<Category>> categoryList() {
List<Category> allCategoryList = productFeignClient.findAllCategoryList().getData();
return Result.success(allCategoryList);
}
}

View File

@ -28,6 +28,11 @@
<artifactId>service-product-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>service-activity-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@ -4,9 +4,13 @@ import com.atguigu.ssyx.common.result.Result;
import com.atguigu.ssyx.model.product.SkuInfo;
import com.atguigu.ssyx.model.search.SkuEs;
import com.atguigu.ssyx.search.service.SkuService;
import com.atguigu.ssyx.vo.search.SkuEsQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@ -21,6 +25,20 @@ public class SkuApiController {
@Autowired
private SkuService skuService;
@ApiOperation(value = "搜索商品")
@GetMapping("{page}/{limit}")
public Result<Page<SkuEs>> list(
@ApiParam(name = "page", value = "当前页码", required = true)
@PathVariable Integer page,
@ApiParam(name = "limit", value = "每页记录数", required = true)
@PathVariable Integer limit,
@ApiParam(name = "searchParamVo", value = "查询对象", required = false)
SkuEsQueryVo searchParamVo) {
PageRequest pageRequest = PageRequest.of(page - 1, limit);
Page<SkuEs> pageModel = skuService.search(pageRequest, searchParamVo);
return Result.success(pageModel);
}
@ApiOperation(value = "上架商品")
@GetMapping("inner/upperSku/{skuId}")
public Result<SkuInfo> upperGoods(@PathVariable Long skuId) {

View File

@ -7,4 +7,23 @@ import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
public interface SkuRepository extends ElasticsearchRepository<SkuEs, Long> {
Page<SkuEs> findByOrderByHotScoreDesc(PageRequest pageRequest);
/**
* * 根据分类Id和仓库Id和分页查询
*
* @param categoryId 分类Id
* @param wareId 仓库Id
* @param pageRequest 分页查询
* @return Page<SkuEs>
*/
Page<SkuEs> findByCategoryIdAndWareId(Long categoryId, Long wareId, PageRequest pageRequest);
/**
* * 根据仓库Id和分类Id+keyword查询
*
* @param keyword 关键字
* @param pageRequest 分页信息
* @return 分页结果
*/
Page<SkuEs> findByKeywordAndWareId(String keyword, PageRequest pageRequest);
}

View File

@ -1,6 +1,9 @@
package com.atguigu.ssyx.search.service;
import com.atguigu.ssyx.model.search.SkuEs;
import com.atguigu.ssyx.vo.search.SkuEsQueryVo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import java.util.List;
@ -25,4 +28,13 @@ public interface SkuService {
* @return 查询的商品
*/
List<SkuEs> findHotSkuList();
/**
* * 搜索商品
*
* @param pageRequest 分页参数
* @param searchParamVo 分页查询参数
* @return 分页结果
*/
Page<SkuEs> search(PageRequest pageRequest, SkuEsQueryVo searchParamVo);
}

View File

@ -1,19 +1,26 @@
package com.atguigu.ssyx.search.service.impl;
import com.atguigu.ssyx.client.ActivityFeignClient;
import com.atguigu.ssyx.client.product.ProductFeignClient;
import com.atguigu.ssyx.common.context.BaseContext;
import com.atguigu.ssyx.enums.SkuType;
import com.atguigu.ssyx.model.product.Category;
import com.atguigu.ssyx.model.product.SkuInfo;
import com.atguigu.ssyx.model.search.SkuEs;
import com.atguigu.ssyx.search.repository.SkuRepository;
import com.atguigu.ssyx.search.service.SkuService;
import com.atguigu.ssyx.vo.search.SkuEsQueryVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class SkuServiceImpl implements SkuService {
@ -21,6 +28,8 @@ public class SkuServiceImpl implements SkuService {
private SkuRepository skuRepository;
@Autowired
private ProductFeignClient productFeignClient;
@Autowired
private ActivityFeignClient activityFeignClient;
/**
* 上架商品
@ -76,4 +85,41 @@ public class SkuServiceImpl implements SkuService {
Page<SkuEs> pageModel = skuRepository.findByOrderByHotScoreDesc(pageRequest);
return pageModel.getContent();
}
/**
* * 搜索商品
*
* @param pageRequest 分页参数
* @param vo 分页查询参数
* @return 分页结果
*/
@Override
public Page<SkuEs> search(PageRequest pageRequest, SkuEsQueryVo vo) {
Page<SkuEs> pageModel = null;
// 想vo中设置wareId当前登录用户的仓库Id
vo.setWareId(BaseContext.getWareId());
// 根据SpringData命令规则定义方法进行条件查询
String keyword = vo.getKeyword();
if (StringUtils.isEmpty(keyword)) {
// 根据分类Id和仓库Id和分页查询
pageModel = skuRepository.findByCategoryIdAndWareId(vo.getCategoryId(), vo.getWareId(), pageRequest);
} else {
// 根据仓库Id和分类Id+keyword查询
pageModel = skuRepository.findByKeywordAndWareId(vo.getKeyword(), pageRequest);
}
List<SkuEs> content = pageModel.getContent();
if (!CollectionUtils.isEmpty(content)) {
List<Long> skuIdList = content.stream().map(SkuEs::getId).collect(Collectors.toList());
Map<Long, List<String>> skuIdRuleListMap = activityFeignClient.findActivity(skuIdList);
if (skuIdRuleListMap != null) {
content.forEach(skuEs -> {
skuEs.setRuleList(skuIdRuleListMap.get(skuEs.getId()));
});
}
}
return pageModel;
}
}