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

谷粒商城项目(学习笔记九) 第六章:全文检索——elasticsearch 一、安装elasticsearch 1.拉取镜像 docker pull elasticsearch:7.4.2 2创建容器 注意加权限,不然外部无法访问 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasti 阅读详情

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

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

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

谷粒商城项目(学习笔记七) 第四章:商品服务——商品维护 一、添加商品 1.引入会员服务 在网关中路由会员服务的地址,并开启会员的微服务 - id: member_route uri: lb://gulimall-member predicates: - Path=/api/member/** filters: - RewritePath=/api/(?<segment>.*),/$\.. 阅读详情

相关推荐

没想到,秒杀系统就这么被阿里两份文档给”安排“的明明白白的

前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复。今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道一万都不如满满的干货来的实在,干货都下面了! 介绍 前提:分布式系统,高并发场景 商品A只有100库存,现在有1000或者更多的用户购买。如何保证库存在高并发的场景下是安全的。 预期结果:1.不超卖 2.不少卖 3.下单响应快 4.用户体验好 下单思路: 下单时生成订单,减库存,同时记录库存流水,在这

Java架构师联盟 1147

133、商城业务-商品上架-远程上架接口

/** * 商品上架 * @param spuId */ @Override public void up(Long spuId) { List<SkuInfoEntity> skus = skuInfoService.getSkuBySpuId(spuId); List<Long> skuIdList = skus.stream().map(SkuInfoEntity::getSkuId).co...

pyd1040201698的博客 379

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 788

谷粒商城Es商品上架(1)

谷粒商城Es商品上架

一个菜鸡的博客 891

二次开发vba_CATIA VBA(VBS)二次开发:使用Search批量选择元素

在CATIA二次开发中很多在程序中进行自动交互的方法或函数都需要使用选择集作为参数,将几何元素按照要求批量添加到选择集中也是实现程序自动运行的有效方法。在前面的文章《CATIA使用VBA(VBS)二次开发时用户的交互选择》和《CATIA使用VBA(VBS)二次开发时工程图和草图位置的交互选择函数Indicate2D》中介绍了在CATIA VBA(VBS)二次开发中用户和选择集之间的交互操...

weixin_32497403的博客 1321

侧杆试验 - 高速撞击 - 显式动力学 - ANSYS Workbench

显式动力学是一种时间积分方法,用于在速度很重要时执行动态模拟。显式动力学考虑快速变化的条件或不连续事件,例如自由落体、高速撞击和施加的负载。由于这些“非线性动力学”已集成到模拟中,因此显式动力学是模拟高度瞬态物理现象的首选。有些侧面碰撞是指车辆侧向撞上路边的坚硬物体,如树木或电线杆。这通常是由于驾驶员失去控制、超速、误判拐角或在湿滑路面上打滑造成的。

jianqimingtian的博客 1289

132、商城业务-商品上架-远程查询库存&泛型结果封装

/** * 商品上架 * @param spuId */ @Override public void up(Long spuId) { List<SkuInfoEntity> skus = skuInfoService.getSkuBySpuId(spuId); List<Long> skuIdList = skus.stream().map(SkuInfoEntity::getSkuId)...

pyd1040201698的博客 305

CSP-J/S复赛文件组织与freopen读写全攻略,避免爆零

在信息学竞赛的上机考试中,代码能力固然重要,但文件组织与输入输出重定向往往是决定成败的关键细节。许多选手习惯在线评测环境,对本地文件命名、目录层级和读写方式缺乏系统认知,导致算法正确却因文件名拼写错误或freopen使用不当而遗憾失分。理解评测系统的工作原理,掌握从建立准考证号目录到规范命名源文件,再到使用freopen进行文件流重定向的标准流程,是每位参赛者的必备技能。这种工程化习惯不仅适用于CSP-J/S复赛,也是未来参加NOI等更高水平竞赛的基础。本文从文件组织的底层逻辑出发,结合实战案例,系统讲解考

weixin_32466193的博客 594

89、商品服务-API-新增商品-保存SKU基本信息、sku的图片信息、sku的销售属性信息

1.前言 2. 3. 4. 注意事项\color{red}{注意事项}注意事项 Markdown文字添加颜色

zouxuhang的博客 795

华为无线WiFi实战:基于802.1x与NPS的企业级认证部署指南

本文提供了一份详尽的华为无线WiFi企业级认证部署实战指南。通过整合802.1x协议与Windows NPS服务器,构建基于AD域账号的安全认证体系,彻底解决传统WiFi密码共享带来的安全风险。文章详细拆解了从NPS服务器配置、证书部署到华为AC端RADIUS模板、AAA方案、认证域及VAP模板调用的全流程,并附有终端连接测试与常见故障排查方法,助力企业实现高效、安全的无线网络接入管理。

weixin_29239661的博客 270

Nvidia Isaac Sim图形界面 入门教程 2024(3)

在使用Isaac Sim时,最先接触到的应该是它的图形界面,此处将简单介绍图形界面中常用的一些组件:Isaac Sim的界面的常用内容可以分为几个板块。

m0_56661101的博客 4547

谷粒商城 高级篇 (五) --------- 商品上架

谷粒商城 商品上架相关编写

在森林里麋了鹿 1136

2023年下半年网络工程师案例分析真题答案解析

R1] ip route-static 0.0.0.0 0.0.0.0 GigabitEthemet2/0/1 (3) track (4) R1 to R2 //配置R1的缺省路由,联动BFD使得R1到2的流量优先走R1->S1->R2链路,当此链路发生故障时,流量切换到R1->R3->R2链路上。当同一VLAN内也需要网络隔离时,我们可采用交换机的(2)功能,若在配置了二层隔离后,部分主机有互通的需求,则可在需求主机的网关上配置(3)功能。不需要,MAC地址是数据链路层封装以太帧的地址标识。

鹿鸣天涯 751

89、商品服务-API-新增商品-保存SKU基本信息

//5、保存当前spu对应的所有sku信息; List<Skus> skus = vo.getSkus(); if(skus!=null && skus.size()>0){ skus.forEach(item->{ String defaultImg = ""; for (Images image : item.getImages()) { ..

pyd1040201698的博客 341

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

funfan的博客 3001

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

错误记录:java.lang.IllegalStateException:Duplicate key

错误记录

weixin_47409774的博客 609

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

谷粒商城项目:功能业务逻辑(上架)

1.上架功能 1.1 业务逻辑 商品数据—》保存到ElasticSearch—》可以被检索到 1.2 商品数据保存到ElasticSearch的理由 内存运算 检索性能强大 可以分片存放数据 1.3 常见的保存到ElasticSearch的数据格式 格式一: { skuId:1 spuId:1 skuTitle:小米 price:1000 saleCount:999 attrs[ {

xueguchen的博客 787

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

128 商城业务-商品上架-sku在es中存储模型分析-135商城业务-商品上架-抽取响应结果&上架测试完成 主要踩的坑就是上一篇的博客,当数据放到R中,由于是HashMap结构,数据根本拿不到,具体可以看上一篇博客 https://www.cnblogs.com/dalianpai/p/13155540.html 下面就贴一些主要的代码,后面项目跑起来,在提交到码云上。 ...

qq_29860591的博客 1156

gulimail集成 elasticsearch 并进行商品上架与查询

gulimail集成 elasticsearch 并进行商品上架与查询

yunshang99的博客 646

商品管理系统——商品新增远程调用保存实现部分

一 SpuInfoServiceImpl.java /** * 功能描述:保存商品信息 * * @param vo 待保存的商品信息 * @author cakin * @date 2020/11/8 */ @Transactional @Override public void saveSpuInfo(SpuSaveVo vo) { // 1 保存spu基本信息 pms_spu_info SpuInfoEntity infoEntity = new SpuInfoEntity();

实践求真知 818

131、商城业务-商品上架-构造sku检索属性

/** * 商品上架 * @param spuId */ @Override public void up(Long spuId) { List<SkuInfoEntity> skus = skuInfoService.getSkuBySpuId(spuId); //TODO 4、查询当前sku的所有可以被用来检索的规格属性 List<ProductAttrValueEntity> .

pyd1040201698的博客 425

mysql查询json字段内属性

mysql查询json字段内属性

莫迪134 1351

MySQL_关于JSON数据的查询

MySQL中关于JSON类型数据的查询

weixin_44826433的博客 7318

130、商城业务-商品上架-构造基本数据

/** * 商品上架 * @param spuId * @return */ // /product/spuinfo/{spuId}/up @RequestMapping("/{spuId}/up") public R spuUp(@PathVariable("spuId") Long spuId){ spuInfoService.up(spuId); return R.ok(); } ...

pyd1040201698的博客 296

谷粒商城day69 -全文检索-bulk批量操作导入样本测试数据

1._bulk语法如下 分两部分 上面为索引,下面为数据 2.测试与导入测试数据 测试 测试数据链接如下 https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json 导入测试数据,用以后面的学习 可以看到在bank文档下有一千条数据 ...

JavaCoder_juejue的博客 887

day117-商城业务-检索服务-SearchRequest构建-检索+排序、分页、高亮+聚合&测试

1.DSL语句概览与分析 此篇我要做的就是完成DSL代码层面的实现,大致的结构如下,详细的DSL语句上篇已经贴出来了 包含计算分数的must查询与不计算的filter外面被bool然后最外面被query对象包着 然后是排序,然后是分页,然后是高亮,最后是聚合分析 2.上代码 ...

JavaCoder_juejue的博客 837
上一篇: 谷粒商城day66-分布式基础篇-总结
下一篇: day81-商城业务-整合thymeleaf渲染首页
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

我才是真的封不觉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值