谷粒商城实战笔记-281-商城业务-订单服务-锁定库存

news2024/11/14 20:31:59

文章目录

  • 一,锁定库存的基本逻辑
  • 二,具体实现

创建订单时,有一个非常重要的步骤,就是锁定库存,或者称之为预占库存。

尽管还没有卖出去,但是因为订单已经创建,所以要确保这个订单对应商品是有库存的,就需要提前告知库存服务,需要准备多少库存,库存服务就会在当前库存基础上减去一部分库存,避免超卖。

一,锁定库存的基本逻辑

在这里插入图片描述

根据图片,锁定库存的逻辑可以概括为以下几个步骤:

  1. 商品尝试锁库存:这是库存锁定流程的开始,系统尝试对商品进行库存锁定。
  2. 增强版逻辑:增加了一些额外的判断或处理步骤。
  3. 撤销:在库存锁定过程中,如果遇到某些条件不满足,系统会执行撤销操作,释放已锁定的库存。
  4. 全部锁定:在某些情况下,系统可能会执行全部库存的锁定操作。
  5. 全部回滚:如果全部锁定操作失败或遇到问题,系统会执行全部回滚,即撤销所有已执行的锁定操作。
  6. 失败:在尝试锁定库存的过程中,如果遇到问题导致无法完成锁定,系统会标记为失败。
  7. 成功:如果库存锁定操作成功完成,系统会标记为成功。
  8. 修改锁定状态:在锁定过程中,系统可能需要根据实际情况修改库存的锁定状态。
  9. 返回:完成锁定或解锁操作后,系统会返回到上一步或初始状态。

这个过程看起来是一个自动化的库存管理流程,涉及到库存的锁定、解锁、状态修改等操作,并在操作过程中会有成功或失败的反馈。

二,具体实现

public boolean orderLockStock(WareSkuLockVo vo) {

        /**
         * 保存库存工作单详情信息
         * 追溯
         */
        WareOrderTaskEntity wareOrderTaskEntity = new WareOrderTaskEntity();
        wareOrderTaskEntity.setOrderSn(vo.getOrderSn());
        wareOrderTaskEntity.setCreateTime(new Date());
        wareOrderTaskService.save(wareOrderTaskEntity);


        //1、按照下单的收货地址,找到一个就近仓库,锁定库存
        //2、找到每个商品在哪个仓库都有库存
        List<OrderItemVo> locks = vo.getLocks();

        List<SkuWareHasStock> collect = locks.stream().map((item) -> {
            SkuWareHasStock stock = new SkuWareHasStock();
            Long skuId = item.getSkuId();
            stock.setSkuId(skuId);
            stock.setNum(item.getCount());
            //查询这个商品在哪个仓库有库存
            List<Long> wareIdList = wareSkuDao.listWareIdHasSkuStock(skuId);
            stock.setWareId(wareIdList);

            return stock;
        }).collect(Collectors.toList());

        //2、锁定库存
        for (SkuWareHasStock hasStock : collect) {
            boolean skuStocked = false;
            Long skuId = hasStock.getSkuId();
            List<Long> wareIds = hasStock.getWareId();

            if (org.springframework.util.StringUtils.isEmpty(wareIds)) {
                //没有任何仓库有这个商品的库存
                throw new NoStockException(skuId);
            }

            //1、如果每一个商品都锁定成功,将当前商品锁定了几件的工作单记录发给MQ
            //2、锁定失败。前面保存的工作单信息都回滚了。发送出去的消息,即使要解锁库存,由于在数据库查不到指定的id,所有就不用解锁
            for (Long wareId : wareIds) {
                //锁定成功就返回1,失败就返回0
                Long count = wareSkuDao.lockSkuStock(skuId,wareId,hasStock.getNum());
                if (count == 1) {
                    skuStocked = true;
                    WareOrderTaskDetailEntity taskDetailEntity = WareOrderTaskDetailEntity.builder()
                            .skuId(skuId)
                            .skuName("")
                            .skuNum(hasStock.getNum())
                            .taskId(wareOrderTaskEntity.getId())
                            .wareId(wareId)
                            .lockStatus(1)
                            .build();
                    wareOrderTaskDetailService.save(taskDetailEntity);

                    //TODO 告诉MQ库存锁定成功
                    StockLockedTo lockedTo = new StockLockedTo();
                    lockedTo.setId(wareOrderTaskEntity.getId());
                    StockDetailTo detailTo = new StockDetailTo();
                    BeanUtils.copyProperties(taskDetailEntity,detailTo);
                    lockedTo.setDetailTo(detailTo);
//                    rabbitTemplate.convertAndSend("stock-event-exchange","stock.locked",lockedTo);
                    break;
                } else {
                    //当前仓库锁失败,重试下一个仓库
                }
            }

            if (skuStocked == false) {
                //当前商品所有仓库都没有锁住
                throw new NoStockException(skuId);
            }
        }

        //3、肯定全部都是锁定成功的
        return true;
    }

orderLockStock 的方法为订单锁定库存。

  1. 保存库存工作单信息:

    • 创建一个新的 WareOrderTaskEntity 实体,并设置订单号 (orderSn) 和创建时间。
    • 保存这个实体到数据库。
  2. 查询并准备锁定库存的信息:

    • 获取传入的 WareSkuLockVo 对象中的 locks 列表,该列表包含需要锁定的商品信息。
    • 遍历 locks 列表,为每个商品创建一个 SkuWareHasStock 对象,其中包含商品 ID (skuId)、需要锁定的数量 (num) 以及拥有该商品库存的仓库列表 (wareIdList)。
  3. 锁定库存:

    • 遍历准备好的 SkuWareHasStock 对象列表。
    • 对于每个商品,检查是否有任何仓库有此商品的库存。如果没有,则抛出 NoStockException 异常。
    • 尝试在每个有库存的仓库中锁定商品:
      • 如果锁定成功(返回值为 1),则设置 skuStockedtrue,并保存一条库存锁定详情记录至数据库。
      • 创建一个消息对象 (StockLockedTo) 并填充相关信息,准备发送给消息队列以通知其他服务库存已锁定。
      • 如果所有尝试锁定的仓库都失败,则最终抛出 NoStockException 异常。
  4. 返回结果:

    • 如果所有商品的库存都成功锁定,则方法返回 true

这个方法实现了从接收库存锁定请求开始,经过库存锁定和状态记录,到最后通过消息队列通知其他服务库存锁定成功的一系列流程。

同时,它还处理了异常情况,如当商品没有库存时会抛出异常来确保系统的健壮性和一致性。

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

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

相关文章

最后一波,漂亮、简洁的登录页面模板分享,拿来即用(三)

文章目录 前言一、很有质感的jQuery登录模板二、纯CSS实现的清凉风格的登录三、基于layui的后台管理登录模板四、jQuery个性化登录模板五、带下雪背景的登录注册页面 前言 在做管理系统的时候&#xff0c;有时为了做一个漂亮简洁的登录页面&#xff0c;对应擅长搞后端开发的老…

15行为型设计模式——责任链模式

一、责任链模式简介 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;也叫职责链模式或者职责连锁模式。用于处理请求的多个对象&#xff0c;以实现请求的分发和处理。它的核心思想是将请求的处理职责链式地传递给多个对象…

NRP-Z24功率探头RS/NRP-Z23详情参数NRP-Z21功率传感器

USB 功率传感器&#xff1a; NRP-Z11 频率范围&#xff1a;10 MHz - 8 GHz 功率范围&#xff1a;-67 dBm to 23 dBm. NRP-Z21 频率范围&#xff1a;10 MHz - 18 GHz 功率范围&#xff1a;-67 dBm to 23 dBm. NRP-Z22 频率范围&#xff1a;10 MHz - 18 GHz 功率范围&#xff…

Java:简述类的加载机制-双亲委派

类加载的机制过程分为以下&#xff1a;加载、验证、准备、解析、初始化等。 在第一步的加载环节&#xff0c;Java类加载器有四种&#xff1a;Bootstrap类加载器、Extention 类加载器、Application类加载器、Custom自定义类加载器&#xff0c;其中会涉及“双亲委派”模式。 一…

Linux 安装Mysql保姆级教程

一、检查环境 我们登录服务器,查看之前是否安装过mysql rpm -qa | grep mysql 由于我之前安装过,所以这里是有数据的 如果需要删除重新下载,可以使用 rpm -e mysql57-community-release-el7-10.noarch.rpm 二、安装 1、下载 接下来下载安装包 wget -i -c http:/…

CAM Back Again论文详解

论文名称&#xff1a;Large Kernel CNNs from a Weakly Supervised ObjectLocalization Perspective 论文地址&#xff1a;[2403.06676] CAM Back Again: Large Kernel CNNs from a Weakly Supervised Object Localization Perspective (arxiv.org) 出发点 据报道&#xff0c…

通配符证书的简介和申请方法

通配符证书是一种SSL证书&#xff0c;它利用域名字段中的通配符&#xff08;*&#xff09;来指示&#xff0c;允许用户在一个证书中关联多个顶级域名及其子域&#xff0c;从而简化证书管理流程&#xff0c;节省成本和时间。以下是通配符证书的简介和申请方法的详细说明&#xf…

微信小程序开发--详情【开发一次 多端覆盖】

目录 1、准备工作 了解 uni-app : 准备开发工具&#xff1a; 下载 &#xff1a; 安装完成后&#xff0c;打开这个开发者工具&#xff1a; 对微信小程序进行配置&#xff1a; 使用开发工具HBuilderX:&#xff1a; 先安装终端插件 2、初始化一个demo 创建项目&#xff1…

分类预测|基于麻雀优化核极限学习机的数据分类预测Matlab程序SSA-KELM 多特征输入多类别输出 含基础KELM

分类预测|基于麻雀优化核极限学习机的数据分类预测Matlab程序SSA-KELM 多特征输入多类别输出 含基础KELM 文章目录 前言分类预测|基于麻雀优化核极限学习机的数据分类预测Matlab程序SSA-KELM 多特征输入多类别输出 含基础KELM 一、SSA-KELM模型SSA-KELM 分类预测的详细原理和流…

软考 -- 软件设计师 -- 二轮复习(1) -- 计算机系统基础知识错题集和重点知识(持续更新)

软考 – 软件设计师 – 二轮复习(1) – 计算机系统基础知识错题集和重点知识(持续更新) 文章目录 软考 -- 软件设计师 -- 二轮复习(1) -- 计算机系统基础知识错题集和重点知识(持续更新)前言一、CPU二、内存编址计算三、原码、反码、补码、移码计算四、浮点数 前言 考试时间&a…

led台灯对眼睛好不好?护眼台灯怎么选对眼睛好?收下这份攻略

随着年级的升高与学业内容的日益丰富&#xff0c;学生们待在书桌前的时间却越来越长。同时电子产品的广泛普及&#xff0c;让我国青少年的用眼负担显著增加。权威机构预测&#xff0c;到2050年&#xff0c;全球近视人群将达到惊人的49.49亿人&#xff0c;患病率高达52%。这一严…

MySQL编译安装

1.源码包地址 2.编译/安装 3.设置环境变量 4.初始化/登录 地址: MYSQL源码包下载 右键复制链接 使用wget 下载到/usr/local/src下 再使用rpm –ivh 安装 --这个时候跳转到 cd /root/rpmbuild/SOURCES 使用ll查看有什么东西 yum -y install gcc gcc-c ncurses ncurses-d…

java设计模式day01--(类之间的关系、软件设计原则、单例设计模式)

视频网址&#xff1a;s1.设计模式-课程介绍_哔哩哔哩_bilibili 1&#xff0c;设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构…

Apache RocketMQ 批处理模型演进之路

作者&#xff1a;谷乂 RocketMQ 的目标&#xff0c;是致力于打造一个消息、事件、流一体的超融合处理平台。这意味着它需要满足各个场景下各式各样的要求&#xff0c;而批量处理则是流计算领域对于极致吞吐量要求的经典解法&#xff0c;这当然也意味着 RocketMQ 也有一套属于自…

ImportError: DLL load failed while importing _wrapper: 找不到指定的模块

今天使用pyinstaller打包好脚本,执行打包好的程序后,出现如下的报错: 这个问题花了我一个上午,在网上查找相关的解决方法,然而不知道是我的搜索方式有问题,还是这个资料比较少,找了很久,只找到了一篇极度相关的文章:https://blog.csdn.net/weixin_46457351/article/d…

C Primer Plus第十五章编程练习,仅供参考

第十五章编程练习 本章第一个编程练习的内容是让我们将二进制字符串转换为一个数值&#xff0c;传递字符串指针&#xff0c;逻辑并不复杂&#xff0c;完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> #include<string.h> #include<math.h> in…

从C向C++28——设计模式

一.设计模式 1.设计模式理解 ​ C程序设计模式是针对在C编程中常见问题的通用、可重用的解决方案。设计模式主要是在软件工程领域&#xff0c;特别是在面向对象编程中发展起来的&#xff0c;它们提供了一种标准的术语和解决方案&#xff0c;可以帮助程序员更好地设计软件架构…

豆包 MarsCode试用体验

1.前言 豆包 MarsCode 是一款为你提供了AI编程助手和云端集成开发环境来协助你完成编程任务的产品。 2.功能介绍 2.1.豆包 MarsCode 编程助手 豆包 MarsCode 编程助手是豆包旗下的 AI 编程助手&#xff0c;提供以智能代码补全为代表的 AI 功能。它支持主流的编程语言和 IDE…

Luma AI,让你的视频像电影一样精彩!附带使用教程

Luma 视频生成 API 对接说明 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平…

tomcat实验

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat 具有处理HTML页面的功能&#xff0c;它还是一个Servlet和JSP容器。 下载文件 安装javajdk 解压 …