feat(新增): 搜索商品
This commit is contained in:
parent
619f774f52
commit
178f2d04fb
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue