• 谷粒商城商品上架(二十)


    128 商城业务-商品上架-sku在es中存储模型分析-135 商城业务-商品上架-抽取响应结果&上架测试完成

    主要踩的坑就是上一篇的博客,当数据放到R中,由于是HashMap结构,数据根本拿不到,具体可以看上一篇博客

    https://www.cnblogs.com/dalianpai/p/13155540.html

     下面就贴一些主要的代码,后面项目跑起来,在提交到码云上。

    GET /product/_search
    
    
    
    PUT product
    {
      "mappings":{
        "properties": {
          "skuId":{
            "type":"long"
          },
          "spuId":{
            "type":"keyword"
          },
          "skuTitle":{
            "type":"text",
            "analyzer": "ik_smart"
          },
          "skuPrice":{
            "type":"keyword"
          },
          "skuImg":{
            "type":"keyword",
            "index":false,
            "doc_values":false
          },
          "saleCount":{
            "type":"long"
          },
          "hasStock":{
            "type":"boolean"
          },
          "hasScore":{
            "type":"long"
          },
          "brandId":{
            "type":"long"
          },
          "catalogId":{
            "type":"long"
          },
          "brandName":{
            "type":"keyword",
            "index":false,
            "doc_values":false
          },
          "brandImg":{
            "type":"keyword",
            "index":false,
            "doc_values":false        
          },
          "catalogName":{
            "type":"keyword",
            "index":false,
            "doc_values":false          
          },
          "attrs":{
            "type":"nested",
            "properties": {
              "attrId":{
                "type":"long"
              },
              "attrName":{
                  "type":"keyword",
                  "index":false,
                  "doc_values":false   
              },
              "attrValue":{
                "type":"keyword"
              }
            }
          }
        }
      }
    }

    上传的主方法

      @Override
        public void up(Long spuId) {
            List<SkuInfoEntity>   skuInfoEntities =skuInfoService.getSkusBySpuId(spuId);
           // List<SkuEsModel> uoProducts = new ArrayList<>();
            List<Long> skuIdList = skuInfoEntities.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());
    
            List<ProductAttrValueEntity> baseAttrs = attrValueService.baseAttrlistforspu(spuId);
            List<Long> attrIds = baseAttrs.stream().map(ProductAttrValueEntity::getAttrId).collect(Collectors.toList());
            List<Long> searchAttrIds = attrService.selectSearchAttrIds(attrIds);
    
            Set<Long> idSet = new HashSet<>(searchAttrIds);
            List<SkuEsModel.Attrs> attrsList = baseAttrs.stream().filter(item -> idSet.contains(item.getAttrId()))
                    .map(item -> {
                        SkuEsModel.Attrs attrs1 = new SkuEsModel.Attrs();
                        BeanUtils.copyProperties(item, attrs1);
                        return attrs1;
                    }).collect(Collectors.toList());
    
            //Feign的远程调用
            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, SkuHasStockVo::getHasStock));
            System.out.println(stockMap);
                    }catch (Exception e){
                log.error("库存远程调用异常,原因:{}",e);
            }
            Map<Long, Boolean> finalStockMap = stockMap;
            List<SkuEsModel> upProducts = skuInfoEntities.stream().map(sku -> {
                SkuEsModel esModel = new SkuEsModel();
                BeanUtils.copyProperties(sku, esModel);
                esModel.setSkuPrice(sku.getPrice());
                esModel.setSkuImg(sku.getSkuDefaultImg());
    
                //查询品牌和信息的名字
                BrandEntity brandEntity = brandService.getById(esModel.getBrandId());
                esModel.setBrandName(brandEntity.getName());
                esModel.setBrandImg(brandEntity.getLogo());
    
                CategoryEntity categoryEntity = categoryService.getById(esModel.getCatalogId());
                esModel.setCatalogName(categoryEntity.getName());
    
                esModel.setAttrs(attrsList);
    
                esModel.setHotScore(0L);
                if(finalStockMap !=null){
                    esModel.setHasStock(finalStockMap.get(sku.getSkuId()));
                }else{
                    esModel.setHasStock(true);
                }
    
                return esModel;
            }).collect(Collectors.toList());
    
            //将数据存到es中
            R r = searchFeignService.productStatusUp(upProducts);
            if(r.getCode() ==0){
                //修改上架的状态
                baseMapper.updateSpuStatus(spuId, ProductConstant.StatusEnum.SPU_UP.getCode());
            }else{
    
            }
    
        }
    
    
    
    }

    最好把每个服务的超时时间设置一下,不然第一次调用或者断点,很容易超时

    feign:
      client:
        config:
          service-product:
            readTimeout: 6000
            connectTimeout: 6000
            loggerLevel: FULL  

     下面的代码就是ES插入的代码

    @RequestMapping("/search/save")
    @RestController
    @Slf4j
    public class ElasticSaveController {
    
        @Autowired
        ProductSaveService productSaveService;
    
        @PostMapping("/product")
        public R productStatusUp(@RequestBody List<SkuEsModel> skuEsModels) {
            Boolean b = null;
            try {
                b = productSaveService.productStatusUp(skuEsModels);
            } catch (IOException e) {
                log.error("ElasticSaveController商品上架异常;{}",e);
                return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(),BizCodeEnume.PRODUCT_UP_EXCEPTION.getMessage());
            }
            if(!b){
                return R.ok();
            }else{
                return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(),BizCodeEnume.PRODUCT_UP_EXCEPTION.getMessage());
            }
    
        }
    }
    @Slf4j
    @Service
    public class ProductSaveServiceImpl implements ProductSaveService {
    
        @Autowired
        RestHighLevelClient restHighLevelClient;
        @Override
        public Boolean productStatusUp(List<SkuEsModel> skuEsModels) throws IOException {
               //1.先给es创建索引
            //BulkRequest bulkRequest, RequestOptions options
            BulkRequest bulkRequest = new BulkRequest();
            for (SkuEsModel model:skuEsModels){
                IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX);
                indexRequest.id(model.getSkuId().toString());
                String s = JSON.toJSONString(model);
                indexRequest.source(s, XContentType.JSON);
                bulkRequest.add(indexRequest);
            }
            BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
    
            //
    
            boolean b = bulk.hasFailures();
            List<String> collect = Arrays.stream(bulk.getItems()).map(item -> {
                return item.getId();
            }).collect(Collectors.toList());
            log.info("商品上架成功:{}",collect);
    
            return b;
        }
    }

    配置类

    /**
     * @author WGR
     * @create 2020/6/16 -- 17:16
     */
    @Configuration
    public class GulimallElasticSearchConfig {
    
        public static final RequestOptions COMMON_OPTIONS;
        static {
            RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
    //        builder.addHeader("Authorization", "Bearer " + TOKEN);
    //        builder.setHttpAsyncResponseConsumerFactory(
    //                new HttpAsyncResponseConsumerFactory
    //                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
            COMMON_OPTIONS = builder.build();
        }
    
        @Bean
        public RestHighLevelClient esRestClient(){
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("192.168.1.119", 9200, "http")));
            return client;
        }
    }

    仓库的服务类

        @Override
        public List<SkuHasStockVo> getSkusHasStock(List<Long> skuIds) {
            List<SkuHasStockVo> hasStockVoList = skuIds.stream().map(id -> {
                SkuHasStockVo vo = new SkuHasStockVo();
                Long count = baseMapper.getSkuStock(id);
                vo.setSkuId(id);
                vo.setHasStock(count ==null ?false:count > 0);
                return vo;
            }).collect(Collectors.toList());
            return hasStockVoList;
        }

    修改后的R类

    public class R extends HashMap<String, Object> {
        private static final long serialVersionUID = 1L;
    
        public R setData(Object data) {
            put("data", data);
            return this;
        }
    
        ///利用fastjson进行逆转
        public <T> T getData(TypeReference<T> typeReference){
            Object data = get("data");//默认是map
            String s = JSON.toJSONString(data);
            T t = JSON.parseObject(s, typeReference);
            return t;
        }

     部分截图

     

     

  • 相关阅读:
    Git Revert用法
    C语言------数据输入、输出函数
    C语言------运算符和表达式
    jsp九大内置对象
    三层结构下的多表查询,实体类写法
    String类型中"=="和"equals"的区别
    创建对象数组,给数组赋值(两种理解思路)
    Vbs整人代码
    设计模式之单例
    事务
  • 原文地址:https://www.cnblogs.com/dalianpai/p/13160099.html
Copyright © 2020-2023  润新知