此篇文章算是几篇整合为一篇了
核心代码如下,大致逻辑页面点击SPU上的上架,根据spu查出其下sku以及相关规格属性等等,把各信息封装到
skuEsModels中,然后调用第二部分代码进行上架,也就是保存到ES中,方便后面检索,保存完之后,改库存+改状态
中间一些查库存更新库存的接口没贴出来
@Override
@Transactional
public void spuUp(Long spuId) {
List<SkuInfoEntity> skuInfoEntitys = skuInfoService.getSkusBySpuId(spuId);
//获取skuId与是否有库存map
List<Long> skuIdList = skuInfoEntitys.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());
Map<Long, Boolean> skuHasStockMap = null;
try {
R<List<SkuHasStockVo>> r = skuWareFeignService.skusHasStock(skuIdList);
List<SkuHasStockVo> skuHasStockVos = ((List<Map>) (r.get("data"))).stream().map(data -> {
SkuHasStockVo skuHasStockVo = new SkuHasStockVo();
skuHasStockVo.setSkuId(NumberUtils.toLong(data.get("skuId").toString()));
skuHasStockVo.setHasStock((Boolean) data.get("hasStock"));
return skuHasStockVo;
}).collect(Collectors.toList());
skuHasStockMap = skuHasStockVos.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, SkuHasStockVo::getHasStock));
System.out.println("111");
}catch(Exception e) {
log.error("库存查询服务出现异常,原因:" + e);
}
//4.因为sku的规格属性都是继承SPU的,所以根据spuid查询出当前sku所有可以被检索的规格属性
List<ProductAttrValueEntity> attrValueEntities = attrValueService.baseAttrlistforspu(spuId);
List<SkuEsModel.Attrs> attrs = attrValueEntities.stream().map(attrValueEntitie -> {
AttrEntity attrEntity = attrService.getById(attrValueEntitie.getAttrId());
if (attrEntity.getSearchType() == 1) {
SkuEsModel.Attrs attrss = new SkuEsModel.Attrs();
BeanUtils.copyProperties(attrEntity,attrss);
return attrss;
}
return null;
}).collect(Collectors.toList());
Map<Long, Boolean> finalSkuHasStockMap = skuHasStockMap;
List<SkuEsModel> upProducts = skuInfoEntitys.stream().map(skuInfoEntity -> {
SkuEsModel skuEsModel = new SkuEsModel();
BeanUtils.copyProperties(skuInfoEntity, skuEsModel);
//对比不同的属性,开始设置
skuEsModel.setSkuPrice(skuInfoEntity.getPrice());
skuEsModel.setSkuImg(skuInfoEntity.getSkuDefaultImg());
//1.发送远程调用,查看商品是否有库存
if(finalSkuHasStockMap == null){
skuEsModel.setHasStock(true);
}else{
Boolean hasStock = finalSkuHasStockMap.get(skuInfoEntity.getSkuId());
skuEsModel.setHasStock(hasStock);
}
//2.热度评分
skuEsModel.setHotScore(0L);
//3.设置品牌与分类相关信息
BrandEntity brandEntity = brandService.getById(skuInfoEntity.getBrandId());
skuEsModel.setBrandImg(brandEntity.getLogo());
skuEsModel.setBrandName(brandEntity.getName());
CategoryEntity categoryEntity = categoryService.getById(skuInfoEntity.getCatalogId());
skuEsModel.setCatelogName(categoryEntity.getName());
skuEsModel.setAttrs(attrs);
return skuEsModel;
}).collect(Collectors.toList());
// 5.将数据发送给search服务进行保存
R r = searchFeignService.productUp(upProducts);
// 6.上架成功修改状态
if(r.getCode() == 0){
baseMapper.updateSpuStatusById(spuId, ProductConstant.StatusEnum.PRODUCT_UP.getCode());
}else{
//todo 调用失败? 重复调用? 接口幂等性,重试机制?
}
}
将数据保存进ES中
@Override
public Boolean productUp(List<SkuEsModel> skuEsModels) throws IOException {
//1.给es中建立索引:product, 添加映射关系
BulkRequest bulkRequest = new BulkRequest();
//给es中保存数据
skuEsModels.stream().forEach( skuEsModel -> {
IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX);
indexRequest.id(skuEsModel.getSkuId().toString());
String jsonString = JSON.toJSONString(skuEsModel);
indexRequest.source(jsonString, XContentType.JSON);
bulkRequest.add(indexRequest);
});
//获取返回结果
BulkResponse bulk = highLevelClient.bulk(bulkRequest, ElasticConfiguration.COMMON_OPTIONS);
List<String> collect = Arrays.stream(bulk.getItems()).map(item -> {
return item.getId();
}).collect(Collectors.toList());
//如果
boolean hasFailures = bulk.hasFailures();
if(hasFailures){
log.error("商品上架错误,{}",collect);
}
return hasFailures;
}
结果可以看到上架状态变为已上架说明上架成功