注: 没怎么仔细测试bug,可能代码有很多问题(大体没啥问题)
gulimail 连接 Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目_哔哩哔哩_bilibili
上架:
controller 层
@PostMapping("/{spuId}/up")
/*@RequiresPermissions("product:spuinfodesc:list")*/
public R spuUp(@PathVariable("spuId")Long spuId){
spuInfoService.up(spuId);
return R.ok();
}
注:spu类似于 华为手机;sku类似于一个具体型号 pro 蓝色4+36的
entity层
@Data
public class SkuEsModel {
private Long skuId;
private Long spuId;
private String skuTitle; //商品标题
private BigDecimal skuPrice;//商品价格
private String skuImg; //商品图片
private Long saleCount;// 销量
private Boolean hasStock; //是否上架。首页只需要知道是否有没有货就行。不需要知道还有多少
private Long hotScore; //热度评分
private Long brandId; //商品品牌id
private String brandName;//商品品牌名
private String brandImg;
private Long catalogId; // 商品所属分类id
private String catalogName;// 商品所属分类名
private List<Attrs> attrs;
@Data
public static class Attrs{
private Long attrId;
private String attrName; ;//属性名 类似于颜色,内存等
private String attrValue;// 属性值
}
}
service 层(接口实现类)
@Override
public void up(Long spuId) {
List<SkuInfoEntity> skuInfoEntities=
skuInfoService.getSkusBySpuId(spuId);
List<Long> collect = skuInfoEntities.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());
//TODO 查询允许被检索的属性 (spu)
//获取spu属性值
List<ProductAttrValueEntity> productAttrValueEntities = attrValueService.list(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));
// 得到 spu 属性id 集合
List<Long> attrIds = productAttrValueEntities.stream().map(attr -> {
return attr.getAttrId();
}).collect(Collectors.toList());
//根据 spu 属性id 集合 查询 允许被es检索的属性
List<Long> searchIds=attrService.selectSearchAttrIds(attrIds);
// 根据被查出 允许被检索到的属性id 查出属性值值并赋值 给 SkuEsModel.Attrs
Set<Long> set=new HashSet(searchIds);
List<SkuEsModel.Attrs> attrs = productAttrValueEntities.stream().filter(attr -> {
return set.contains(attr.getAttrId());
}).map(item -> {
SkuEsModel.Attrs attr = new SkuEsModel.Attrs();
BeanUtils.copyProperties(item, attr);
return attr;
}).collect(Collectors.toList());
List<SkuEsModel.Attrs> a =new ArrayList<>();
Map<Long, Boolean> mp =null;
try {
//远程查询库存
R skuHasStockMe = wareFeignService.getSkuHasStockMe(collect);
TypeReference<Map<Long,Boolean>> typeReference=new TypeReference<Map<Long,Boolean>>(){};
mp = skuHasStockMe.getData(typeReference);
}catch (Exception e){
log.error("库存服务调用异常: ",e);
}
//2、封装每个sku的信息
Map<Long, Boolean> finalStockMap = mp;
List<SkuEsModel> skuEsModels = skuInfoEntities.stream().map(sku -> {
// TODO 查询允许被检索的属性 (sku)
SkuEsModel skuEsModel = new SkuEsModel();
BeanUtils.copyProperties(sku, skuEsModel);
skuEsModel.setSkuPrice(sku.getPrice());
skuEsModel.setSkuImg(sku.getSkuDefaultImg());
//TODO 2、热度评分。0
skuEsModel.setHotScore(0L);
//TODO 3、查询品牌和分类的名字信息
BrandEntity brandEntity = brandService.getById(sku.getBrandId());
skuEsModel.setBrandName(brandEntity.getName());
skuEsModel.setBrandImg(brandEntity.getLogo());
CategoryEntity categoryEntity = categoryService.getById(sku.getCatalogId());
skuEsModel.setCatalogName(categoryEntity.getName());
//设置可搜索属性 List<Attrs>
skuEsModel.setAttrs(attrs);
skuEsModel.setHasStock(finalStockMap==null?false:finalStockMap.get(sku.getSkuId()));
return skuEsModel;
}).collect(Collectors.toList());
// 将查询到的属性赋值给es
R r = esFeignService.productStatusUp(skuEsModels);
//获取是否调用成功
Integer code =(Integer) r.get("code");
if(code!=null && code==0){
//TODO 远程调用成功
// 修改上架状态
baseMapper.updateSpuStatus(spuId, ProductConstant.StatusEnum.SPU_UP.getCode());
}else {
// TODO 远程调用方失败
}
}
商品上架至es
使用spirng cloud feign调用es 模块进行上传(这里不细说)
controller 层
@PostMapping("/product")
public R productStatusUp(@RequestBody List<SkuEsModel> skuEsModelS){
try {
productSaveService.productStatusUp(skuEsModelS);
} catch (IOException e) {
e.printStackTrace();
log.error("商品上架错误",e);
return R.error( BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(),BizCodeEnume.PRODUCT_UP_EXCEPTION.getMsg());
}
return R.ok();
}
servcie层(实现类)
@Autowired
RestHighLevelClient restHighLevelClient;
@Value("${es.product.i