首页 > 其他分享 >谷粒商城-仓储服务-仓库管理

谷粒商城-仓储服务-仓库管理

时间:2024-07-06 14:29:42浏览次数:18  
标签:数据库 entity item 仓储 谷粒 new 采购 id 商城

1.整合ware服务,获取仓库列表

先把gulimall-ware注册进注册中心(nacos):

添加@EnableDiscoveryClient注解(开启服务发现)加在启动类前

添加@MapperScan("dao包的位置") 添加mybatis-plus的扫描

添加@EnableTransactionManagement注解(启用基于注解的事务管理功能)

然后就像之前一样,根据接口文档来写方法

serviceImpl类里写方法体:

2.商品库存

来到wareskucontroller类里:

添加上条件查询

来写方法体:

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        QueryWrapper<WareSkuEntity> queryWrapper = new QueryWrapper<>();
        String wareId = (String) params.get("wareId");
        if (StringUtils.hasLength(wareId)){
            queryWrapper.eq("ware_id",wareId);
        }
        String skuId = (String) params.get("skuId");
        if (StringUtils.hasLength(skuId)){
            queryWrapper.eq("sku_id",skuId);
        }
        IPage<WareSkuEntity> page = this.page(
                new Query<WareSkuEntity>().getPage(params),
                queryWrapper
        );

        return new PageUtils(page);
    }

3.采购业务

1.业务逻辑:

B2C的商城的业务逻辑一般是由商家采购商品销售给消费者,所以我们就需要有采购的业务.

根据采购需求来购买商品,为商品添加库存.采购需求来源有两个:1.人工添加2.当商品低库存时发出警告,自动生成采购需求

2.先来实现采购需求的条件查询

来到controller

写方法体:

  @Override
    public PageUtils queryPage(Map<String, Object> params) {
        /**
         *  key: '华为',//检索关键字
         *    status: 0,//状态
         *    wareId: 1,//仓库id
         */
        QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<>();
        String key = (String) params.get("key");
        if (StringUtils.hasLength(key)){
            queryWrapper.and(wrapper->{
                wrapper.eq("purchase_id",key).or().eq("sku_id",key);
            });
        }
        String status = (String) params.get("status");
        if (StringUtils.hasLength(status)){
            queryWrapper.eq("status",status);
        }
        String wareId = (String) params.get("wareId");
        if (StringUtils.hasLength(wareId)){
            queryWrapper.eq("ware_id",wareId);
        }
        IPage<PurchaseDetailEntity> page = this.page(
                new Query<PurchaseDetailEntity>().getPage(params),
                queryWrapper
        );

        return new PageUtils(page);
    }

3.合并采购需求

controller:

方法体:

先写一个vo

controller:

方法体:

4.采购人员领取采购单

属于员工手机上app的功能,我们用APIfox来模拟请求

方法体:

    @Override
    public void received(List<Long> ids) {
        //1.确认当前采购单是新建或者已分配状态
        List<PurchaseEntity> collect = ids.stream().map(id -> {
            PurchaseEntity purchaseEntity = this.getById(id);
            return purchaseEntity;
        }).filter(item -> {
            if (item.getStatus() == WareConstant.PurchaseStatusEnum.CREATED.getCode() ||
                    item.getStatus() == WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()) {
                return true;
            }
            return false;
        }).map(item->{
            item.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode());
            item.setUpdateTime(new Date());
            return item;
        }).collect(Collectors.toList());
        //2.改变采购单的状态
        this.updateBatchById(collect);
        //3.改变采购需求的状态
        collect.forEach((item)->{
            List<PurchaseDetailEntity> entities= purchaseDetailService.listDetailByPurchaseId(item.getId());
            List<PurchaseDetailEntity> detailEntities = entities.stream().map(entity -> {
                PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();
                detailEntity.setId(entity.getId());
                detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode());
                return detailEntity;
            }).collect(Collectors.toList());
            purchaseDetailService.updateBatchById(detailEntities);
        });
    }

5.完成采购

先写vo:

来到controller来写方法:

实现类来写方法体

    @Transactional
    @Override
    public void done(PurchaseDoneVo doneVo) {
        Long id = doneVo.getId();//获取采购单id
        //2.改变采购需求的状态
        Boolean flag=true;
        List<PurchaseItemDoneVo> items = doneVo.getItems();//把vo中的采购需求vo取出来组成 items
        List<PurchaseDetailEntity> updateItems = new ArrayList<>();//新建一个采购需求数组,放我们完成的 采购需求
        for (PurchaseItemDoneVo item:items) {//遍历采购需求vo
            PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();
            if (item.getStatus()==WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode()){//判断采购需求
                flag=false;// 当没被完成时设置采购单状态标记为false
                detailEntity.setStatus(item.getStatus());// 把采购需求标记为 采购失败
            }else {//采购成功
                detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.FINISH.getCode());//先设置采购需求 状态为 已完成
                //3.将成功采购的进行入库
                PurchaseDetailEntity entity = purchaseDetailService.getById(item.getItemId());//通过采购需求id 获取到采购需求的实体类,方便拿到入库需要的skuid,wareid,数量
                wareSkuService.addStock(entity.getSkuId(),entity.getWareId(),entity.getSkuNum());//自定义方法入库(添加数据库记录,其中包括当采购需求是库里没有的时新建,已经有的更新)
            }
            detailEntity.setId(item.getItemId());//设置采购需求实体类的id
            updateItems.add(detailEntity);//把上述完成入库或者采购失败的 采购需求 加入之前放完成采购需求的 数组 中
        }
        purchaseDetailService.updateBatchById(updateItems);//来执行更新 采购需求 操作
        //1.改变采购单状态
        PurchaseEntity entity = new PurchaseEntity();
        entity.setId(id);
        entity.setStatus(flag?WareConstant.PurchaseStatusEnum.FINISH.getCode():WareConstant.PurchaseStatusEnum.HASERROR.getCode());
        entity.setUpdateTime(new Date());
        this.updateById(entity);
    }

其中自定义的加库存的方法:

自定义SQL:

细节完善(远程调用product服务的skuinfo功能给库存set上skuName):

先写远程调用:

1.写feign包,在启动类前加@EnableFeignClients开启远程调用

2.调用方法:

Tips:什么是"事务"

事务(Transaction)是数据库管理系统中的一个核心概念,它用于管理一组数据库操作,确保这些操作作为一个不可分割的工作单元来执行,要么全部成功执行,要么在遇到错误时全部回滚(撤销),从而保持数据库的一致性和完整性

通俗点说把对数据库的操作打包成一个事务,这个事务里的操作都成功了,数据库才会真正被加上数据,如果有失败的操作,就会进行数据回滚,不对数据库执行任何操作.

四大特性:(ACID):

原子性(Atomicity):

  • 事务是一个不可分割的工作单位,事务中包含的所有操作要么全部成功,要么全部失败回滚。因此,事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
  • 例如,在银行转账中,从A账户转账到B账户的操作要么全部成功,要么全部失败,不能出现A账户扣款成功但B账户未收到款项的情况。

一致性(Consistency):

  • 事务必须保证数据库的一致性,即事务的执行结果必须使数据库从一个一致性状态转换到另一个一致性状态。事务的执行不能破坏数据库数据的完整性和一致性。
  • 例如,在转账过程中,无论转账是否成功,A账户和B账户的总金额应该保持不变。

隔离性(Isolation):

  • 事务的隔离性确保了多个并发事务之间的隔离,即一个事务的执行不应被其他事务干扰。隔离性要求并发执行的事务之间互不干扰,以保证每个事务的独立性。
  • 数据库事务隔离级别主要分为四种:读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。不同的隔离级别解决了不同程度的并发问题,但也会带来不同的性能开销。

持久性(Durability):

  • 一旦事务被提交,它对数据库的更改就是永久的,即使系统崩溃也不会丢失。持久性确保了事务的结果在提交后能够永久保存在数据库中

标签:数据库,entity,item,仓储,谷粒,new,采购,id,商城
From: https://blog.csdn.net/weixin_62485485/article/details/140220045

相关文章

  • 基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283
     摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理......
  • 基于微信小程序的外卖商城平台设计和实现-UniApp(代码+文档+运行成功)
    随着计算机技术的成熟,互联网的建立,如今,PC平台上有许多关于外卖方面的应用程序,但由于使用时间和地点上的限制,用户在使用上存在着种种不方便,而开发一款外卖商城平台微信小程序,能够有效地解决这个问题。本外卖商城平台微信小程序是针对外卖方面而开发,采用微信开发者......
  • 谷粒商城-商品管理
    1.SPU检索(复杂条件查询)来到spuinfocontroller找到list,来重新写一个分页查询方法来到实现类写方法体(brandId和catelogId记得要排除掉0再拼装查询条件)下图未排除2.SKU检索(价格区间功能)来到skuinfocontroller类里写方法体@OverridepublicPageUtilsque......
  • 谷粒商城学习-11-docker安装redis
    文章目录一,拉取Redis镜像1,搜索Redis的Docker镜像2,拉取Redis镜像3,查看已经拉取的镜像二,创建、启动Redis容器1,创建redis配置文件2,创建及运行Redis容器3,使用dockerps查看运行状态的容器4,验证容器是否可用三,修改Redis配置文件一,拉取Redis镜像1,搜索Redis的Docker镜像......
  • 基于java+springboot+vue实现的宠物商城网站(文末源码+Lw)273
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,商品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的宠物商城网站。本宠物......
  • 2024Faceboo 商城自然流(从入门到精通),玩转脸书商城全闭环(教程+资料)
    摘要:本文旨在为读者提供一个全面的Facebook商城操作指南,从基础知识到高级应用技巧,帮助用户深入理解并有效利用Facebook商城进行跨境电商活动。1.引言介绍Facebook商城的发展历程及其在全球电商领域的影响力。2.Facebook商城概述2.1Facebook平台简介2.2Facebook商城的......
  • 阿里云 SAE 助力修正商城 3 周内提升系统承载能力 20 倍,轻松应对春晚流量
    作者:赵世振、刘松伟、朱坪"从了解阿里云SAE到使用SAE进行应用架构升级共经历3周,这 3周我们系统能承载的QPS从 5000增强到 10万,提升20倍,轻松应对了春晚大促流量洪波。并且,SAE还帮助我们降低了20%的使用成本,研发效率提升40%,应用上线周期缩短40%。———修......
  • springboot+手机商城网站-计算机毕业设计源码201029
    摘 要在信息飞速发展的今天,网络已成为人们重要的信息交流平台。手机店每天都有大量的手机商品需要通过网络发布,为此,本人开发了一个基于springboot手机商城网站。本系统采用跨平台的JAVA语言开发,利用springboot框架进行逻辑控制,MySQL数据库存储数据,最后Tomcat服务器完成发布......
  • WebAPI项目框架仓储模式+导入SqlSuag
    仓储(Respository)是对数据库访问的一个封装解决方案新建Respository文件夹,新建类库Web.Core.IRepository,Web.Core.Repository解决方案新建Services文件夹,新建类库Web.Core.IServices,Web.Core.Services在类库Web.Core.Model下面新建Entity文件夹SqlSugar是国人开发者开发的一......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(Oppo)
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......