day80-商城业务-商品上架--构造基本数据+构造sku检索属性+远程查询库存+远程上架接口+抽取响应结果

此篇文章算是几篇整合为一篇了

核心代码如下,大致逻辑页面点击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;
    }

结果可以看到上架状态变为已上架说明上架成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值