前端点击商品,携带skuid跳转到商品详情页
后端接收
/**
* 展示当前sku的详情
* @param skuId
* @return
*/
@GetMapping("/{skuId}.html")
public String skuItem(@PathVariable("skuId") Long skuId, Model model) throws ExecutionException, InterruptedException {
System.out.println("准备查询" + skuId + "详情");
SkuItemVo vos = skuInfoService.item(skuId);
model.addAttribute("item",vos);
return "item";
}
调用item方法查询,数据封装到SkuItemVo ,存到model传给前端页面item.html。
item方法
//查询商品详情,采用异步
@Override
public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {
SkuItemVo skuItemVo = new SkuItemVo();
//第一个异步任务,先查询基础sku属性
CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {
//1、sku基本信息的获取 pms_sku_info
SkuInfoEntity skuInfoEntity = this.getById(skuId);
skuItemVo.setInfo(skuInfoEntity);
return skuInfoEntity;
}, threadPoolExecutor);
//通过查到的sku信息获取到spuid,进行下一步查询,这里用到异步,要先查出sku信息,再进行下一步查询
CompletableFuture<Void> saleFuture = infoFuture.thenAcceptAsync((res) -> {
//3、获取spu的销售属性组合 就是 4+128G这种 数据库表pms_sku_sale_attr_value
List<SkuItemSaleAttrVo> saleAttrVos =
skuSaleAttrValueService.getSaleAttrBySpuId(res.getSpuId());
skuItemVo.setSaleAttr(saleAttrVos);
}, threadPoolExecutor);
//通过查到的sku信息获取到spuid,进行下一步查询,这里用到异步,要先查出sku信息,再进行下一步查询
CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((res) -> {
//4、通过spuid获取spu的介绍 pms_spu_info_desc
SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getById(res.getSpuId());
skuItemVo.setDesc(spuInfoDescEntity);
}, threadPoolExecutor);
//通过查到的sku信息获取到spuid,进行下一步查询,这里用到异步,要先查出sku信息,再进行下一步查询
CompletableFuture<Void> baseAttrFuture = infoFuture.thenAcceptAsync((res) -> {
//5、获取spu的规格参数信息
List<SpuItemAttrGroupVo> attrGroupVos =
attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(),
res.getCatalogId());
skuItemVo.setGroupAttrs(attrGroupVos);
}, threadPoolExecutor);
//这里图片信息和前面的查询无关,所以直接运行就行。
CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
//2、获取图片信息
List<SkuImagesEntity> skuImagesEntities = skuImagesService.getImagesBySkuId(skuId);
skuItemVo.setImages(skuImagesEntities);
}, threadPoolExecutor);
//allof 等待所有任务都完成,然后返回skuItemVo
CompletableFuture.allOf(saleFuture,descFuture,baseAttrFuture,imageFuture).get();
return skuItemVo;
}