谷粒商城-基础篇-Day09-整合Ware服务

news2024/11/20 11:38:15

整合Ware服务

将服务注册到nacos中

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-ware
@MapperScan("com.atguigu.gulimall.ware.dao")//mybatis包扫描
@SpringBootApplication
@EnableDiscoveryClient//开启服务发现
@EnableTransactionManagement //开启事务管理

在这里插入图片描述

修改网关路由

        - id: ware
          uri: lb://gulimall-ware
          predicates:
            - Path=/api/ware/**
          filters:
            - RewritePath=/api/(?<segment>/?.*), /$\{segment}


仓库维护的模糊查询

在WareInfoController中

    @RequestMapping("/list")
   // @RequiresPermissions("ware:wareinfo:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = wareInfoService.queryPageByConfitions(params);

        return R.ok().put("page", page);
    }

编写queryPageByConfitions(params)方法

    @Override
    public PageUtils queryPageByConfitions(Map<String, Object> params) {
        QueryWrapper<WareInfoEntity> wareInfoEntityQueryWrapper = new QueryWrapper<>();

        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(key)){
            wareInfoEntityQueryWrapper.eq("id",key)
                    .or().like("name",key)
                    .or().like("address",key)
                    .or().like("areacode",key);
        }

        IPage<WareInfoEntity> page = this.page(
                new Query<WareInfoEntity>().getPage(params),
                wareInfoEntityQueryWrapper
        );

        return new PageUtils(page);


    }

商品库存的模糊查询

实现效果:

在这里插入图片描述

在WareSkuController中

 /**
  * 列表
  */
 @RequestMapping("/list")
// @RequiresPermissions("ware:waresku:list")
 public R list(@RequestParam Map<String, Object> params){
     PageUtils page = wareSkuService.queryPageByConditions(params);

     return R.ok().put("page", page);
 }

编写queryPageByConditions(params)方法

    @Override
    public PageUtils queryPageByConditions(Map<String, Object> params) {
        QueryWrapper<WareSkuEntity> wareSkuEntityQueryWrapper = new QueryWrapper<>();

//        wareId: 123,//仓库id
//         skuId: 123//商品id
        String wareId = (String) params.get("wareId");
        if (!StringUtils.isEmpty(wareId)){
            wareSkuEntityQueryWrapper.eq("ware_id",wareId);
        }
        String skuId = (String) params.get("skuId");
        if (!StringUtils.isEmpty(skuId)){
            wareSkuEntityQueryWrapper.eq("sku_id",skuId);
        }


        IPage<WareSkuEntity> page = this.page(
                new Query<WareSkuEntity>().getPage(params),
                wareSkuEntityQueryWrapper
        );

        return new PageUtils(page);
    }

采购需求的模糊查询

使用新增创建一个采购需求

并进行模糊查询

在PurchaseDetailController中

    @RequestMapping("/list")
   // @RequiresPermissions("ware:purchasedetail:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = purchaseDetailService.queryPageByConditions(params);

        return R.ok().put("page", page);
    }

创建方法queryPageByConditions(params);

    @Override
    public PageUtils queryPageByConditions(Map<String, Object> params) {
//        key:'华为',//检索关键字
//        status:0,//状态
//        wareId:1,//仓库id

        QueryWrapper<PurchaseDetailEntity> purchaseDetailEntityQueryWrapper = new QueryWrapper<>();

        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(key)){
            purchaseDetailEntityQueryWrapper.and((queryWrapper)->{
                queryWrapper.eq("id",key).or().eq("sku_id",key);

            });
        }
        String status = (String) params.get("status");
        if (!StringUtils.isEmpty(status)){
            purchaseDetailEntityQueryWrapper.eq("status",status);
        }
        String wareId = (String) params.get("wareId");
        if (!StringUtils.isEmpty(wareId)){
            purchaseDetailEntityQueryWrapper.eq("ware_id",wareId);
        }


        IPage<PurchaseDetailEntity> page = this.page(
                new Query<PurchaseDetailEntity>().getPage(params),
                purchaseDetailEntityQueryWrapper
        );

        return new PageUtils(page);


    }

合并采购需求

点击合并页面会发送一个请求

一、查询采购单

在这里插入图片描述

在PurchaseController中

    @RequestMapping("/unreceive/list")
    // @RequiresPermissions("ware:purchase:list")
    public R Unreceivelist(@RequestParam Map<String, Object> params){
        PageUtils page = purchaseService.queryPageUnreceive(params);

        return R.ok().put("page", page);
    }

编写queryPageUnreceive(params)方法

    @Override
    public PageUtils queryPageUnreceive(Map<String, Object> params) {
        IPage<PurchaseEntity> page = this.page(
                new Query<PurchaseEntity>().getPage(params),
                new QueryWrapper<PurchaseEntity>().eq("status",0).or().eq("status",1)
        );

        return new PageUtils(page);


    }

效果展示
在这里插入图片描述

二、合并采购单

点击合并,发送请求

在这里插入图片描述

创建一个vo对象接受参数

@Data
public class MergeVo {
    
  private Long purchaseId; //整单id
    
  private List<Long> items; //合并项集合
}

在PurchseController中

    @RequestMapping("/merge")
    // @RequiresPermissions("ware:purchase:delete")
    public R merge(@RequestBody MergeVo mergeVo){
        
        purchaseService.mergePurchase(mergeVo);

        return R.ok();
    }

编写mergePurchase(mergeVo)方法

    @Transactional
    @Override
    public void mergePurchase(MergeVo mergeVo) {
        Long purchaseId = mergeVo.getPurchaseId();
        //判断要合并到的采购单是否存在
        if (purchaseId==null){
            //需要创建一个采购单
            PurchaseEntity purchaseEntity = new PurchaseEntity();
            purchaseEntity.setCreateTime(new Date());
            purchaseEntity.setUpdateTime(new Date());
            purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());
            this.save(purchaseEntity);
            //新建完采购单后,就有采购单id
            purchaseId=purchaseEntity.getId();
            
        }
            //合并到这个采购单
            List<Long> items = mergeVo.getItems();

            Long finalPurchaseId = purchaseId;

            List<PurchaseDetailEntity> collect = items.stream().map(i -> {
                PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
                purchaseDetailEntity.setId(i);
                purchaseDetailEntity.setPurchaseId(finalPurchaseId);
                purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode());
                return purchaseDetailEntity;
            }).collect(Collectors.toList());

            //进行更新就可以
            purchaseDetailService.updateBatchById(collect);
            //修改更新时间,采购单id
            PurchaseEntity purchaseEntity = new PurchaseEntity();
            purchaseEntity.setId(purchaseId);
            purchaseEntity.setUpdateTime(new Date());
            this.updateById(purchaseEntity);

        }

    

}

并将原来的创建采购单的方法也设置创建事件和更新时间

  @RequestMapping("/save")
  //@RequiresPermissions("ware:purchase:save")
  public R save(@RequestBody PurchaseEntity purchase){

      purchase.setCreateTime(new Date());
      purchase.setUpdateTime(new Date());
      
purchaseService.save(purchase);

      return R.ok();
  }

创建一个枚举类用来存放订单的状态

public class WareConstant {

    public enum  PurchaseStatusEnum{
        CREATED(0,"新建"),ASSIGNED(1,"已分配"),
        RECEIVE(2,"已领取"),FINISH(3,"已完成"),
        HASERROR(4,"有异常");
        private int code;
        private String msg;

        PurchaseStatusEnum(int code,String msg){
            this.code = code;
            this.msg = msg;
        }

        public int getCode() {
            return code;
        }

        public String getMsg() {
            return msg;
        }
    }


    public enum  PurchaseDetailStatusEnum{
        CREATED(0,"新建"),ASSIGNED(1,"已分配"),
        BUYING(2,"正在采购"),FINISH(3,"已完成"),
        HASERROR(4,"采购失败");
        private int code;
        private String msg;

        PurchaseDetailStatusEnum(int code,String msg){
            this.code = code;
            this.msg = msg;
        }

        public int getCode() {
            return code;
        }

        public String getMsg() {
            return msg;
        }
    }
}

领取采购单

使用postman模拟人工领取采购单http://localhost:88/api/ware/purchase/received在这里插入图片描述

在PurchaseController中

    @PostMapping("received")
    public R received(@RequestBody List<Long> ids){
        purchaseService.receiverByIds(ids);
return R.ok();
    }
    
  @Override
    public void receiverByIds(List<Long> ids) {
        //修改采购单的状态
        List<PurchaseEntity> purchaseEntity= ids.stream().map((id) -> {
            PurchaseEntity byId = this.getById(id);
            return byId;
            //过滤出status为0或1的
        }).filter((item)->{
            if (item.getStatus()==WareConstant.PurchaseStatusEnum.CREATED.getCode()||
                    item.getStatus()==WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode()){
                return true;
            }
            return  false;
        }).collect(Collectors.toList());

        //修改他的状态
        purchaseEntity.forEach(item->{
            item.setUpdateTime(new Date());
            item.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode());
           this.updateById(item);
            //改变采购需求的状态
            List<PurchaseDetailEntity> entities=purchaseDetailService.listDetailByPuchersId(item.getId());

            List<PurchaseDetailEntity> collect = entities.stream().map(entity -> {
                PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
                purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode());
                purchaseDetailEntity.setId(entity.getId());
                return purchaseDetailEntity;
            }).collect(Collectors.toList());

            purchaseDetailService.updateBatchById(collect);
        });








    }


}

创建方法List listDetailByPuchersId(Long id);

   @Override
    public List<PurchaseDetailEntity>  listDetailByPuchersId(Long id) {
        //查询采购需求的状态
        List<PurchaseDetailEntity> purchase_id = this.list(new QueryWrapper<PurchaseDetailEntity>().eq("purchase_id", id));

        return purchase_id;
    }

效果展示:
在这里插入图片描述

在这里插入图片描述

完成采购

使用postman发送请求http://localhost:88/api/ware/purchase/done

{
   "id": 1,
   "items": [
       {"itemId":1,"status":3,"reason":""},

      {"itemId":2,"status":4,"reason":"无货"}
       
       ]
}

在PurchaseController中

///ware/purchase/done
@PostMapping("/done")
public R done(@RequestBody PurchaseDoneVo purchaseDoneVo){
    purchaseService.done(purchaseDoneVo);
    return R.ok();
}

编写done(purchaseDoneVo)方法

@Override
    public void done(PurchaseDoneVo purchaseDoneVo) {
        Long id = purchaseDoneVo.getId();
        //1、改变采购需求的状态
        Boolean flag=true;

        List<PurchaseDetailEntity> purchaseDetailEntityList=new ArrayList<>();

        List<PurchaseItemDoneVo> items = purchaseDoneVo.getItems();
        for (PurchaseItemDoneVo item : items) {
            PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
            if (item.getStatus()==WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode()){
                //失败的
                flag=false;
                purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode());
            }
            else{
                //已完成
                purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.FINISH.getCode());
                //3、将成功采购的入库
                  //传参:采购单id,采购数量,仓库id
                PurchaseDetailEntity byId = purchaseDetailService.getById(item.getItemId());
                Long skuId = byId.getSkuId();
                Integer skuNum = byId.getSkuNum();
                Long wareId = byId.getWareId();

                wareSkuService.addStock(skuId,skuNum,wareId);




            }
            purchaseDetailEntity.setId(item.getItemId());
            purchaseDetailEntityList.add(purchaseDetailEntity);
        }
        purchaseDetailService.updateBatchById(purchaseDetailEntityList);


        //2、改变采购单的状态--通过上面的flag决定这个采购单的状态
        PurchaseEntity purchaseEntity=new PurchaseEntity();
        purchaseEntity.setId(id);
        purchaseEntity.setStatus(flag?WareConstant.PurchaseStatusEnum.FINISH.getCode():WareConstant.PurchaseStatusEnum.HASERROR.getCode());
        purchaseEntity.setUpdateTime(new Date());
        this.updateById(purchaseEntity);



    }


编写addStock(Long skuId, Integer skuNum, Long wareId)方法

@Transactional
@Override
public void addStock(Long skuId, Integer skuNum, Long wareId) {


    List<WareSkuEntity> list = this.list(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));

    if (list==null||list.size()==0){
        //如果没有则需要新增
        WareSkuEntity wareSkuEntity=new WareSkuEntity();
        wareSkuEntity.setSkuId(skuId);
        wareSkuEntity.setWareId(wareId);
        wareSkuEntity.setStock(skuNum);
        wareSkuEntity.setStockLocked(0);
        //skuname没有设置
        try {
            R info = productFeignService.info(skuId);
            if (info.getCode() == 0) {
                //查询成功
                Map<String, Object> skuInfo = (Map<String, Object>) info.get("skuInfo");

                wareSkuEntity.setSkuName((String) skuInfo.get("skuName"));
            }

        }catch (Exception e){

        }

        this.baseMapper.insert(wareSkuEntity);
    }
    else{
        //如果库存中有skuId和wareId,则直接update
        this.baseMapper.addStock(skuId,skuNum,wareId);
    }


}

由于设置spuName需要调用查询name

远程调用

@FeignClient("gulimall-product")
public interface ProductFeignService {

    //查询sku信息
    @RequestMapping("/product/skuinfo/info/{skuId}")
   R info(@PathVariable("skuId") Long skuId);
}

获取spu规格

当点击规格页面报错则需要在src/router/index.js添加

在这里插入图片描述

 { path: '/product-attrupdate', component: _import('modules/product/attrupdate'), name: 'attr-update', meta: { title: '规格维护', isTab: true } }

在AttrController中

@GetMapping("/base/listforspu/{spuId}")
public  R getSpu(@PathVariable("spuId") Long spuId){
    List<ProductAttrValueEntity> list=productAttrValueService.baseAttrListForSpu(spuId);
    return R.ok().put("data",list);
}

编写baseAttrListForSpu(spuId);方法

@Override
public List<ProductAttrValueEntity> baseAttrListForSpu(Long spuId) {

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


}

规格维护

在AttrController中

    ///product/attr/update/{spuId}
    @PostMapping("/update/{spuId}")
    public R updateSpu(@PathVariable("spuId") Long spuId,
                        @RequestBody List<ProductAttrValueEntity> entityList){
        productAttrValueService.updateBySpuId(spuId,entityList);
return R.ok();
    }

编写方法updateBySpuId(spuId,entityList)

    @Override
    public void updateBySpuId(Long spuId, List<ProductAttrValueEntity> entityList) {
        //先将存在的删除,然后在新增
        this.baseMapper.delete(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id",spuId));
        List<ProductAttrValueEntity> collect = entityList.stream().map((item) -> {
            item.setSpuId(spuId);
            return item;
        }).collect(Collectors.toList());
        this.saveBatch(collect);
    }

}

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

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

相关文章

进入内存,透彻理解数据类型存在的意义,整形在内存中存储,大小端字节序,浮点型在内存中存储

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习C进阶、数据结构、算法、JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01;&#x1f4dc;所属专栏&#xff1a;C语言✈往期博文回顾&#xff1a;【Java基础篇…

Java——》AtomicInteger源码分析

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Java——》AtomicInteger源码分析一、测试用例二、…

Java基础学习笔记(一)面向对象

序言&#xff1a;主要记录一下java的学习笔记&#xff0c;用作面试复习&#xff0c;参考的学习资料是尚硅谷Java网课链接 面向对象是P39~P69内容 文章目录一、类和对象二、传值方式三、静态与静态代码块四、包五、构造方法六、继承与构造方法七、多态八、方法的重载与重写8.1 …

[JAVA安全]CVE-2022-33980命令执行漏洞分析

前言 在 i春秋的漏洞靶标上看见了此漏洞&#xff0c;所以前来分析一下漏洞原理&#xff0c;比较也是去年 7月的漏洞。 漏洞描述&#xff1a;Apache官方发布安全公告&#xff0c;修复了一个存在于Apache Commons Configuration 组件的远程代码执行漏洞&#xff0c;漏洞编号&am…

Linux驱动

Linux驱动 驱动 1.驱动课程大纲  内核模块  字符设备驱动  中断 2.ARM裸机代码和驱动有什么区别&#xff1f;  共同点&#xff1a;都能够操作硬件 (都操作寄存器)  不同点&#xff1a;  裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的框架格…

FastReport .NET 2023.1.8 Crack

FastReport .NET适用于 .NET 6、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可以在 Microsoft Visual Studio 2022 和 JetBrains Rider 中使用。 快速报告.NET 利用 .NET 6、.NET Core、Blazor、ASP.NET、MVC、Windows Forms 和 Mono 数据表示领域专家…

前端入门笔记07 —— js应用

DOM基础 document object model 基本操作 增删改查 查&#xff1a; document成员函数传入 id class tagName等内容获取DOM节点css选择去查询节点获取的DOM对象访问DOM对象的成员 let domResult; domResult document.getElementsByTagName(li); //返回一个类数组对象 Node…

Electron对在线网站做数据交互方案,实现在线网站判断Electron调用自定义接口通讯

(防盗镇楼)本文地址:https://blog.csdn.net/cbaili/article/details/128651549 前言 最近在撸VUE,想要实现一份代码既能构建Web又能构建Electron应用 并且能够判断环境是浏览器还是Electron,随后在Electron中做一些特定的事情 以往的Electron通信依靠IPC通信完成,但是发布到…

2023年,“新一代”固定资产管理平台——支持低代码平台

固定资产是各企业和工厂的主要生产要素&#xff0c;占企业整体资金比例较重&#xff0c;而且随着企业的发展&#xff0c;实物资产的数量和员工日益增多&#xff0c;固定资产的重要性日益凸显。如何高效管理这些实物资产也成了企业管理者经常考虑的问题。单纯依靠人工表格管理固…

python(一) 字符串基本用法

python&#xff08;一&#xff09; 字符串基本用法 目录1.环境安装2. 变量介绍3.变量的命名规则4. 字符串 String 基础4.1 title() 修改单词的大小写 title()4.2 upper() : 将字符串全部改为大写4.3 lower(): 将字符串全部改为小写4.4 字符串的拼接 合并字符串5. 使用制表符或者…

关于抖音年前活动的需求与思考

目录 一、前言 二、需求1 1、后端需求 2、前端需求 三、领取抽卡次数需求 1、后端需求 2、前端需求 四、必得现金红包需求 五、送重复卡需求 1、后端需求 2、前端需求 六、幸运抽奖需求 1、抽奖功能 1.1、首次(或多次)3张节气卡 抽奖 1.2、非首次或多次后5张节气…

【阶段三】Python机器学习14篇:机器学习项目实战:支持向量机分类模型

本篇的思维导图: 项目实战(支持向量机分类模型) 项目背景 目前各大新闻网站很多,网站上的消息也是各式各样,本项目通过建立支持向量机分类模型进行新闻文本分类。 数据收集 所需要的数据文件如下百度云盘链接: 链接:https://pan.baidu.com/s/1Zj-uTt_wdRcmDt3aumZ…

Java加解密(七)数字签名

目录数字签名1 定义2 数字签名特点3 应用场景4 JDK支持的信息摘要算法5 Bouncy Castle 支持的信息摘要算法6 算法调用示例数字签名 1 定义 数字签名&#xff08;digital signature&#xff09;是一种电子签名&#xff0c;也可以表示为一种数学算法&#xff0c;通常用于验证消…

【强训】Day06

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 不要二2. 把字符串转换成整数答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 关于抽象类与最终类&#xff0c;下列说法错误的是&#xff1f; A 抽象类能被继承&#xff0c;最终…

C语言零基础项目:六边形扫雷寻宝模式,详细思路+源码分享

程序简介六边形扫雷&#xff0c;寻宝模式&#xff0c;稍稍介绍一下。他也是要把所有安全的地方点出来。他没有扫雷模式的消零算法。每一个安全的点都需要单独挖出来&#xff0c;一次显示一个格子。添加了生命值的概念&#xff0c;也就是说存在一定的容错。显示的数字有别于扫雷…

亚马逊云科技 2022 re:Invent 观察 | 天下武功,唯快不破

引子“天下武功&#xff0c;无坚不摧&#xff0c;唯快不破”&#xff0c;相信大家对星爷电影《功夫》中的这句话耳熟能详。实际上&#xff0c;“天下武功&#xff0c;唯快不破”最早出自古龙先生的著名武侠小说《小李飞刀》&#xff1a;“小李飞刀&#xff0c;例无虚发&#xf…

LeetCode(String) 2325. Decode the Message

1.问题 You are given the strings key and message, which represent a cipher key and a secret message, respectively. The steps to decode message are as follows: Use the first appearance of all 26 lowercase English letters in key as the order of the substit…

React生命周期详解

React 类组件生命周期 React 有两个重要阶段 render 阶段和 commit 阶段&#xff0c;React 在调和( render )阶段会深度遍历 React fiber 树&#xff0c;目的就是发现不同( diff )&#xff0c;不同的地方就是接下来需要更新的地方&#xff0c;对于变化的组件&#xff0c;就会执…

Linux杂谈之java命令

一 java &#xff08;1&#xff09;基本解读 ① JAVA8 官方命令行参数 linux版的java 重点关注&#xff1a; java、javac、jar、keytool 这三个参数学习方式&#xff1a; 通过man java和官方文档快速学习 如何在官网搜索 java的命令行参数用法 ② 语法格式 ③ 描述 1)…

Java开发为何深入人心 ?我来带你解开 Spring、IoC、DI 的秘密~

目录 一、什么是Spring? 1.1、什么是容器&#xff1f; 1.2、IoC是什么&#xff1f; 1.3、IoC带来了什么好处&#xff1f; 二、什么是DI&#xff1f; 2.1、IoC和DI有什么关系&#xff1f; 一、什么是Spring? 一句概括&#xff0c;Spring 是包含了众多⼯具⽅法的 IoC 容器…