package com.leyou.service;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.leyou.client.BrandClient;
import com.leyou.client.CategoryClient;
import com.leyou.client.GoodsClient;
import com.leyou.client.SpecificationClient;
import com.leyou.item.pojo.*;
import com.leyou.pojo.*;
import com.leyou.repository.GoodsRepository;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.util.*;
/**
* @Author: TianCi.Xiong
* @Description:
* @Date: Created in 2019-11-07 22:20
*/
@Service
public class SearchService {
@Autowired
private CategoryClient categoryClient;
@Autowired
private GoodsClient goodsClient;
@Autowired
private SpecificationClient specificationClient;
@Autowired
private BrandClient brandClient;
@Autowired
private GoodsRepository goodsRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
private ObjectMapper mapper = new ObjectMapper();
private static final Logger logger = LoggerFactory.getLogger(SearchService.class);
/**
* 将Spu转变为Goods
*
* @param spu
* @return
* @throws IOException
*/
public Goods buildGoods(Spu spu) throws IOException {
// 创建goods对象
Goods goods = new Goods();
// 查询商品分类名称
List<String> names = this.categoryClient.queryNameByIds(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()));
// 查询sku
List<Sku> skus = this.goodsClient.querySkusBySpuId(spu.getId());
// 查询详情
SpuDetail spuDetail = this.goodsClient.querySpuDetailBySpuId(spu.getId());
// 查询规格参数
List<SpecParam> params = this.specificationClient.querySpecParam(null, spu.getCid3(), true, null);
// 处理sku,仅封装id、价格、标题、图片,并获得价格集合
List<Long> prices = new ArrayList<>();
List<Map<String, Object>> skuList = new ArrayList<>();
skus.forEach(sku -> {
prices.add(sku.getPrice());
Map<String, Object> skuMap = new HashMap<>();
skuMap.put("id", sku.getId());
skuMap.put("title", sku.getTitle());
skuMap.put("price", sku.getPrice());
skuMap.put("image", StringUtils.isBlank(sku.getImages()) ? "" : StringUtils.split(sku.getImages(), ",")[0]);
skuList.add(skuMap);
});
// 处理规格参数
Map<String, Object> genericSpecs = mapper.readValue(spuDetail.getGenericSpec(), new TypeReference<Map<String, Object>>() {
});
Map<String, Object> specialSpecs = mapper.readValue(spuDetail.getSpecialSpec(), new TypeReference<Map<String, Object>>() {
});
// 获取可搜索的规格参数
Map<String, Object> searchSpec = new HashMap<>();
// 过滤规格模板,把所有可搜索的信息保存到Map中
Map<String, Object> specMap = new HashMap<>();
params.forEach(p -> {
if (p.getSearching()) {
if (p.getGeneric()) {
String value = genericSpecs.get(p.getId().toString()).toString();
if (p.getNumeric()) {
value = chooseSegment(value, p);
}
specMap.put(p.getName(), StringUtils.isBlank(value) ? "其它" : value);
} else {
specMap.put(p.getName(), specialSpecs.get(p.getId().toString()));
}
}
});
goods.setId(spu.getId());
goods.setSubTitle(spu.getSubTitle());
goods.setBrandId(spu.getBrandId());
goods.setCid1(spu.getCid1());
goods.setCid2(spu.getCid2());
goods.setCid3(spu.getCid3());
goods.setCreateTime(spu.getCreateTime());
goods.setAll(spu.getTitle() + " " + StringUtils.join(names, " "));
goods.setPrice(prices);
goods.setSkus(mapper.writeValueAsString(skuList));
goods.setSpecs(specMap);
return goods;
}
private String chooseSegment(String value, SpecParam p) {
double val = NumberUtils.toDouble(value);
String result = "其它";
// 保存数值段
for (String segment : p.getSegments().split(",")) {
String[] segs = segment.split("-");
// 获取数值范围
double begin = NumberUtils.toDouble(segs[0]);
double end = Double.MAX_VALUE;
if (segs.length == 2) {
end = NumberUtils.toDouble(segs[1]);
}
// 判断是否在范围内
if (val >= begin && val < end) {
if (segs.length == 1) {
result = segs[0] + p.getUnit() + "以上";
} else if (begin == 0) {
result = segs[1] + p.getUnit() + "以下";
} else {
result = segment + p.getUnit();
}
break;
}
}
return result;
}
/**
* 搜索商品
*
* @param request
* @return
*/
public SearchResult search(SearchRequest request) {
// 判断是否有搜索条件,如果没有,直接返回null。不允许搜索全部商品
if (StringUtils.isBlank(request.getKey())) {
return null;
}
// 1、初始化自定义查询构建器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//QueryBuilder basicQuery = QueryBuilders.matchQuery("all", request.getKey()).operator(Operator.AND);
BoolQueryBuilder boolQueryBuilder = buildBooleanQueryBuilder(request);
// 1.1、基本查询
//queryBuilder.withQuery(basicQuery);
queryBuilder.withQuery(boolQueryBuilder);
// 通过sourceFilter设置返回的结果字段,我们只需要id、subTitle、skus
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id", "subTitle", "skus"}, null));
// 1.2.分页排序
// 获取分页参数
Integer page = request.getPage();
Integer size = request.getSize();
// 添加分页
queryBuilder.withPageable(PageRequest.of(page - 1, size));
// 1.3、聚合
// 聚合名称
String categoryAggName = "categories"; // 商品分类聚合名称
String brandAggName = "brands"; // 品牌聚合名称
// 对商品分类进行聚合
queryBuilder.addAggregation(AggregationBuilders.terms(categoryAggName).field("cid3"));
// 对品牌进行聚合
queryBuilder.addAggregation(AggregationBuilders.terms(brandAggName).field("brandId"));
// 2、查询,获取结果
Aggregate
没有合适的资源?快使用搜索试试~ 我知道了~
java商城项目后台管理系统.zip
共160个文件
java:122个
xml:20个
yml:11个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 148 浏览量
2023-08-16
15:03:25
上传
评论
收藏 328KB ZIP 举报
温馨提示
java商城项目后台管理系统.zip
资源推荐
资源详情
资源评论
收起资源包目录
java商城项目后台管理系统.zip (160个子文件)
mvnw.cmd 6KB
.gitignore 332B
item.html 34KB
maven-wrapper.jar 47KB
SearchService.java 15KB
GoodsService.java 9KB
CookieUtils.java 6KB
OrderController.java 6KB
IdWorker.java 6KB
GoodsController.java 5KB
MavenWrapperDownloader.java 5KB
OrderService.java 4KB
CartService.java 4KB
PayHelper.java 4KB
SpecificationController.java 4KB
UserService.java 4KB
JwtUtils.java 4KB
BrandController.java 4KB
SpecificationService.java 3KB
CategoryController.java 3KB
BrandService.java 3KB
RsaUtils.java 3KB
SmsUtils.java 3KB
AuthController.java 3KB
UserController.java 3KB
GoodsService.java 3KB
LoginFilter.java 3KB
ElasticsearchTest.java 2KB
JsonUtils.java 2KB
GoodsHtmlService.java 2KB
UploadService.java 2KB
LoginInterceptor.java 2KB
LoginInterceptor.java 2KB
FdfsTest.java 2KB
GoodsListener.java 2KB
GoodsListener.java 2KB
JwtTest.java 2KB
CartController.java 2KB
SmsListener.java 2KB
CategoryService.java 2KB
Order.java 2KB
RedisTest.java 2KB
JwtProperties.java 2KB
GoodsApi.java 2KB
LeyouCorsConfiguration.java 2KB
SpecificationApi.java 1KB
GlobalCorsConfig.java 1KB
SwaggerConfig.java 1KB
UploadController.java 1KB
Goods.java 1KB
AuthService.java 1KB
BrandMapper.java 1KB
GoodsController.java 1KB
PayConfig.java 1KB
OrderStatus.java 1KB
SearchController.java 1KB
MvcConfig.java 1KB
User.java 1KB
MvcConfig.java 1KB
ObjectUtils.java 1KB
SearchResult.java 1KB
JwtProperties.java 1KB
JwtProperties.java 1013B
JwtProperties.java 1008B
SearchRequest.java 895B
Spu.java 854B
CodecUtils.java 852B
BrandApi.java 761B
OrderDetail.java 760B
Sku.java 757B
CategoryClientTest.java 724B
LyOrderApplication.java 672B
CategoryMapper.java 670B
NumberUtils.java 637B
LyItemServiceApplication.java 628B
Category.java 624B
FastClientImporter.java 610B
IdWorkerConfig.java 605B
SpuDetail.java 598B
PayProperties.java 598B
SpecParam.java 596B
LyApiGatewayApplication.java 588B
LyGoodsWebApplication.java 587B
LyUserApplication.java 586B
LyCartApplication.java 584B
LyAuthApplication.java 583B
LySearchApplication.java 583B
CategoryApi.java 582B
SmsProperties.java 570B
PageResult.java 567B
SpuBo.java 543B
Brand.java 543B
LyUploadServiceApplication.java 514B
SpecGroup.java 506B
LyRegistryApplication.java 503B
Stock.java 486B
Cart.java 451B
IdWorkerProperties.java 431B
FilterProperties.java 419B
ThreadUtils.java 412B
共 160 条
- 1
- 2
资源评论
GeekyGuru
- 粉丝: 1726
- 资源: 1099
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功