- controller
2.to
3.Serviceimpl
@Override
public void up(Long spuId) {
//1.查出当前spuid对应的所有sku信息、品牌的名字
List<SkuInfoEntity> skus = skuInfoService.getSkusBySpuId(spuId);
//组装需要的数据
//查出当前sku的所有可以被用来检索的规格属性
List<ProductAttrValueEntity> baseAttrs = productAttrValueService.baseAttrListforspu(spuId);
List<Long> attrIds = baseAttrs.stream().map((attr) -> {
return attr.getAttrId();
}).collect(Collectors.toList());
List<Long> searchAttrIds = attrService.selectSearchAttrIds(attrIds);//查出所有可以用来检索的属性id
//从baseAttrs中过滤出属于searchAttrIds的内容
//先把searchAttrIds转为set
Set<Long> idSet = new HashSet<>(searchAttrIds);
List<SkuEsModel.Attrs> collect = baseAttrs.stream().filter((baseAttr) -> {
return idSet.contains(baseAttr.getAttrId());//然后过滤
}).map((item) -> {
SkuEsModel.Attrs attrs = new SkuEsModel.Attrs();//属性对拷
BeanUtils.copyProperties(item, attrs);
return attrs;
}).collect(Collectors.toList());//收集成list 然后封装进skuEsModel
List<Long> skuIdList = skus.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());
//远程调用,从库存系统查询是否有库存
Map<Long, Boolean> stockMap = null;
try {//远程调用不稳定
R r = wareFeignService.getSkusHasStock(skuIdList);
TypeReference<List<SkuHasStockVo>> typeReference = new TypeReference<List<SkuHasStockVo>>() {
};
stockMap = r.getData(typeReference).stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, (item) -> {
return item.getHasStock();
}));
}catch(Exception e){
}
//2.封装每个sku的信息
Map<Long, Boolean> finalStockMap = stockMap;
List<SkuEsModel> upProducts = skus.stream().map((sku)->{
SkuEsModel skuEsModel = new SkuEsModel();
BeanUtils.copyProperties(sku,skuEsModel);
//属性名字不对应的一一设置
skuEsModel.setSkuPrice(sku.getPrice());
skuEsModel.setSkuImg(sku.getSkuDefaultImg());
//设置品牌名和品牌图片
BrandEntity brand = brandService.getById(sku.getBrandId());
skuEsModel.setBrandName(brand.getName());
skuEsModel.setBranImg(brand.getLogo());
//设置检索属性
CategoryEntity categoryEntity = categoryService.getById(sku.getCatalogId());
skuEsModel.setCatelogName(categoryEntity.getName());
skuEsModel.setAttrs(collect);
//设置热度评分
skuEsModel.setHotScore(0L);
//远程调用,从库存系统查询是否有库存
//在外面调用wareFeignService拿到结果集合
if(finalStockMap == null){
skuEsModel.setHasStock(true);
}else{
skuEsModel.setHasStock(finalStockMap.get(sku.getSkuId()));
}
return skuEsModel;
}).collect(Collectors.toList());
//发送给es
R r = searchFeignService.productStatusUp(upProducts);
if (r.getCode() == 0){
baseMapper.updateSpuStatus(spuId, ProductConstant.StatusEnum.SPU_UP.getCode());
}else{
//TODO 接口幂等性?
}
}