谷粒商城实战笔记-131~132-商城业务-商品上架-构造sku检索属性和库存查询

news2024/11/24 1:37:55

文章目录

  • 一,131-商城业务-商品上架-构造sku检索属性
    • 1,开发目标
    • 2,详细设计
      • 2.1,根据spu_id获取所有的规格参数
      • 2.2,根据上一步中查询结果进一步确认是否可搜索
      • 2.3,将可搜索的属性封装到Java模型中
  • 二,132-商城业务-商品上架-远程查询库存&泛型结果封装
    • 1,开发目标
    • 2,详细设计
      • 2.1 调用库存服务的接口
      • 2.2,库存服务根据sku_id查询库存量
      • 2.3,根据查询结果填充模型

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

1,开发目标

这一节的主要内容是完成获取规格属性信息的功能

  • 从数据库中获取与 SPU 关联的所有规格属性。
  • 筛选出可被用于搜索的属性,并转换为 ES 所需的格式。
  • 注意点1:SPU的规格参数是这个SPU下所有SKU公用的,查询一次即可。
  • 注意点2:规程参数分为两类,一类是可搜索的,一类是不可搜索的。这里需要的是可搜索的规格参数。

2,详细设计

  • ① 从pms_product_attr_value表中根据spu_id查出这个spu下所有的属性。
  • ② 根据属性Id从属性表中pms_attr查询属性是否可搜索。
  • ③ 将可搜索的属性信息封装到Es的Java模型中。

2.1,根据spu_id获取所有的规格参数

List<ProductAttrValueEntity> baseAttrs = productAttrValueService.baseAttrList4Spu(spuId);

对应的Service实现非常简单。

	public List<ProductAttrValueEntity> baseAttrList4Spu(Long spuId) {

        List<ProductAttrValueEntity> attrValueEntityList = this.baseMapper.selectList(
                new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));

        return attrValueEntityList;
    }

2.2,根据上一步中查询结果进一步确认是否可搜索

汇总所有属性Id,一次性查询出其中所有可搜索的属性Id。

List<Long> attrIds = baseAttrs.stream().map(ProductAttrValueEntity::getAttrId).collect(Collectors.toList());

        // 查询可搜索的规格属性
        List<Long> searchAttrIds = attrService.selectSearchableAttrs(attrIds);

对应的Service实现如下。

	
    public List<Long> selectSearchableAttrs(List<Long> attrIds) {

        List<Long> searchAttrIds = this.baseMapper.selectSearchAttrIds(attrIds);

        return searchAttrIds;
    }

对应的Sql如下。

<select id="selectSearchAttrIds" resultType="java.lang.Long">

        SELECT attr_id FROM pms_attr WHERE attr_id IN
        <foreach collection="attrIds" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
        AND search_type = 1

</select>

注意,search_type = 1 表示这个属性可搜索。

2.3,将可搜索的属性封装到Java模型中

将前两步的结果结合起来,把spu下所有可搜索的属性封装到Java模型中。

        Set<Long> idSet = new HashSet<>(searchAttrIds);
        List<SkuEsModel.Attrs> attrsList = baseAttrs
                .stream().
                filter(item -> idSet.contains(item.getAttrId()))
                .map(item -> {
                    SkuEsModel.Attrs attrs = new SkuEsModel.Attrs();
                    BeanUtils.copyProperties(item, attrs);
                    return attrs;
                }).collect(Collectors.toList());

在这里插入图片描述

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

1,开发目标

获取库存信息:

  • 通过远程调用库存服务,获取每个 SKU 的库存状态。
  • 库存状态用于确定 SKU 是否有货。

2,详细设计

  • ① 调用库存服务的接口
  • ② 库存服务根据sku_id查询库存量
  • ③ 根据查询结果填充模型

2.1 调用库存服务的接口

通过Feign调用库存服务的接口,并处理返回结果。

		List<Long> skuIdList = skuInfoEntities.stream()
                    .map(SkuInfoEntity::getSkuId)
                    .collect(Collectors.toList());
                    
            R skuHasStock = wareFeignService.getSkuHasStock(skuIdList);
            
            TypeReference<List<SkuHasStockVo>> typeReference = new TypeReference<List<SkuHasStockVo>>() {};
            stockMap = skuHasStock.getData(typeReference).stream()
                    .collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock()));

通过Feign将spu下所有的sku_id传递给库存服务。

2.2,库存服务根据sku_id查询库存量

① ware服务WareSkuController中定义供调用的接口。

	(value = "/hasStock")
    public R getSkuHasStock( List<Long> skuIds) {

        //skuId stock
        List<SkuHasStockVo> vos = wareSkuService.getSkuHasStock(skuIds);

        return R.ok().setData(vos);

    }

对应的Service实现如下。

	
    public List<SkuHasStockVo> getSkuHasStock(List<Long> skuIds) {

        List<SkuHasStockVo> skuHasStockVos = skuIds.stream().map(item -> {
            Long count = this.baseMapper.getSkuStock(item);
            SkuHasStockVo skuHasStockVo = new SkuHasStockVo();
            skuHasStockVo.setSkuId(item);
            skuHasStockVo.setHasStock(count == null?false:count > 0);
            return skuHasStockVo;
        }).collect(Collectors.toList());
        return skuHasStockVos;
    }

对应的Dao层Sql如下,逻辑非常简单,查询可用库存大于0的sku_id。

	<select id="listWareIdHasSkuStock" resultType="java.lang.Long">
        SELECT
            ware_id
        FROM
            wms_ware_sku
        WHERE
            sku_id = #{skuId}
          AND stock - stock_locked > 0
    </select>

2.3,根据查询结果填充模型

调用库存接口查询到结果之后,从响应R中取出数据,注意因为R本质是一个Map,所以需要将Map中的数据序列化为我们需要的类型,这里使用了阿里的FastJson工具包中的TypeReference完成这个任务。

			R skuHasStock = wareFeignService.getSkuHasStock(skuIdList);
            TypeReference<List<SkuHasStockVo>> typeReference = new TypeReference<List<SkuHasStockVo>>() {};
            stockMap = skuHasStock.getData(typeReference).stream()
                    .collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock()));
	public <T> T getData(TypeReference<T> typeReference) {
		Object data = get("data");	//默认是map
		String jsonString = JSON.toJSONString(data);
		T t = JSON.parseObject(jsonString, typeReference);
		return t;
	}

拿到结果之后,在遍历Sku的循环体中填充库存信息。

			// 4.2 设置库存信息
            if (finalStockMap == null) {
                esModel.setHasStock(true);
            } else {
                esModel.setHasStock(finalStockMap.get(sku.getSkuId()));
            }

这样注意从响应中取得结果的方式,是开发中常用的技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL命令行工具的配置和使用

一、Windows启动命令行工具 1.打开Windows的开始菜单&#xff0c;找到安装好的MySQL&#xff0c;点击MySQL 8.0 Command Line Client - Unicode&#xff0c;这个带有Unicode的&#xff0c;是支持中文的&#xff0c;允许在命令行中敲中文。 然后从打开的窗口输入安装MySQL时设置…

【探索Linux】P.45(NAT技术 | NAPT技术)

阅读导航 引言一、NAT技术1. NAT技术引入2. NAT技术简介&#xff08;1&#xff09;基本原理&#xff08;2&#xff09;主要类型&#xff08;3&#xff09;技术优点&#xff08;4&#xff09;技术挑战&#xff08;5&#xff09;应用场景 二、NAPT温馨提示 引言 在上一篇文章中&…

NC 没有重复项数字的全排列

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给出一组数字…

【网络安全入门】学习网络安全必须知道的100 个网络基础知识_网络安全知识入门基础

什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2 OSI 参考模型的层次是什么? 有 7 个 OSI 层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层…

接口测试之python+rquest+unittest分层自动化框架

接口测试之接口po框架 一、新建一个项目 接口自动化框架设计实战&#xff1a; 第一包&#xff1a;config 案例&#xff1a; #登录接口 dl_url http://cms.duoceshi.cn/cms/manage/loginJump.do dl_d {userAccount: admin, loginPwd: 123456} dl_h "Content-Type:app…

IP地址申请SSL证书的详细流程(ip地址实现https访问)

IP地址SSL证书是一种特殊的SSL/TLS证书&#xff0c;它被设计用于保护直接通过IP地址访问的服务。这种证书可以为IP地址提供HTTPS加密和身份验证。 IP地址申请SSL证书的详细流程如下&#xff1a; IP SSL证书-JoySSLhttps://www.joyssl.com/certificate/select/ip_certificate.…

查看pycharm里面的库的版本

1. 点击右下角 点击 2. 点击设置

金蝶云星空与致远 OA 的集成:实现高效流程审批

在当今数字化转型中&#xff0c;企业对于信息化系统的集成需求日益增长。金蝶云星空作为一款强大的企业资源管理系统&#xff0c;致远 OA 作为优秀的协同办公平台&#xff0c;两者的对接集成能够为企业带来更高效、更流畅的业务流程和审批体验。 一、集成的背景与意义 随着企业…

SpringBoot轻松实现邮件发送-copy即用

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru (更多精彩内容可进入主页观看) &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 前言一…

keeplive配置详解与haproxy配置详解

一、keepalive相关知识 1.1 keepalive介绍 keepalive即LVS集群当中的高可用架构&#xff0c;只是针对调度器的高可用。是高可用的HA架构。 keepalive就是基于VRRP协议来实现LVS高可用的方案。 1、组播地址 224.0.0.18&#xff0c;根据组播地址进行通信&#xff0c;主备之间发…

【学习笔记】A2X通信的协议(一)- 核心内容

3GPP TS 24.577 V18.1.0的技术规范&#xff0c;主要定义了5G系统中A2X通信的协议方面&#xff0c;特别是在PC5接口和Uu接口上的A2X服务。以下是文件的核心内容分析&#xff1a; 文档概述与目的&#xff1a; 技术规范背景&#xff1a;文档是3GPP在5G系统&#xff08;5GS&#x…

WEEK 4 周报

这周专题是图论&#xff1a; 目录 这周专题是图论&#xff1a; 树和图的存储及遍历&#xff1a; 存储&#xff1a; 遍历&#xff1a;(每个点只遍历一次&#xff0c;所以需要卡一个布尔数组标记是否已经被遍历) 1.深度优先遍历&#xff1a; 树的重心&#xff1a; 2.宽度…

Apache POl初学

介绍 入门案例 通过POI写入操作 /*** 使用POI操作Excel文件*/ public class POITest {/*** 通过POI创建Excel文件并写入文件内容**/public static void write() throws Exception{//在内存中创建一个Excel文件XSSFWorkbook excel new XSSFWorkbook();//在Excel中创建一个Shee…

麦田物语第十九天

系列文章目录 麦田物语第十九天 文章目录 系列文章目录一、保存和加载场景中的物品二、设置鼠标指针根据物品调整 一、保存和加载场景中的物品 本小节我们想要解决一个问题&#xff0c;就是当我们跳转场景后&#xff0c;在返回之前场景&#xff0c;发现场景中被我们拾取的物品…

md文件转doc文件

目录 起因 实践 python方式安装 安装包安装 转换 后记 起因 近期需要提交一些文件出去&#xff0c;一般都是要word或pdf版的&#xff0c;但是手头只有md格式的&#xff0c;于是需要将md转为doc 实践 问了下度娘&#xff0c;pandoc是个不错的方法&#xff0c;可以通过下…

【C++】:错误处理机制 -- 异常

目录 前言一&#xff0c;C语言传统的处理错误的方式二&#xff0c;C异常的概念三&#xff0c;异常的使用3.1 异常的抛出和匹配原则3.2 在函数调用链中异常栈展开匹配原则3.3 异常的重新抛出3.4 异常规范 四&#xff0c;自定义异常体系五&#xff0c;异常的优缺点 点击跳转至文章…

经典⾯试题,循环中使⽤闭包解决 var 定义函数的问题

⾸先因为 setTimeout 是个异步函数&#xff0c;所有会先把循环全部执⾏完毕&#xff0c;这时候 i 就是 5了&#xff0c;所以会输出6个 5。 解决办法两种&#xff0c;第一种使用闭包 &#xff1a; 第⼆种就是使用 setTimeout 的第三个参数&#xff1a; 第三种就是使用 let 定义 …

Power功效分析之方差原理及案例教程

Power功效分析常用于实验研究时样本量的计算&#xff08;或功效值计算&#xff09;&#xff0c;实验研究中进行方差分析的情况较多&#xff0c;在SPSSAU中单独将方差放成一个计算Power的方法&#xff0c;其具体包括单因素方差/双因素方差和多因素方差&#xff0c;具体如下表格所…

Callable 与 Runnable:多线程编程中的两大接口对比

Callable 与 Runnable&#xff1a;多线程编程中的两大接口对比 1、主要区别1.1 返回值1.2 使用方式 2、适用场景3、示例 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java多线程编程中&#xff0c;Callable和Runnable是两个核心接口&am…

如何打造 BeatBuddy:一款分析你的 Spotify 数据的 Web 应用

欢迎来到雲闪世界&#xff01;我将解释我是如何构建 BeatBuddy 的&#xff0c;这是一款分析您在 Spotify 上收听内容的网络应用。受 Spotify Wrapped 的启发&#xff0c;它旨在解读您当前的心情并提供您可以根据该分析进行调整的建议。 如果你不想阅读所有内容&#xff0c;只想…