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

配置服务中心

  cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: guliware

在网关配置路由转发

guligateway .yml配置文件

        - id: ware_routeuri: lb://guliwarepredicates:- Path=/api/guliware/**filters:- RewritePath=/api/(?<segment>.*),/$\{segment}

解决仓库维护页面模糊查询功能

WareInfoController.java

    @RequestMapping("/list")public R list(@RequestParam Map<String, Object> params){PageUtils page = wareInfoService.queryPage(params);return R.ok().put("page", page);}

WareInfoController.java

    @Overridepublic PageUtils queryPage(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);}

查询库存&&创建采购需求

在这里插入图片描述

解决查询库存模糊查询问题
    @RequestMapping("/list")public R list(@RequestParam Map<String, Object> params){PageUtils page = wareSkuService.queryPage(params);return R.ok().put("page", page);}
 @Overridepublic PageUtils queryPage(Map<String, Object> params) {/*** skuId: 1* wareId: 2*/QueryWrapper<WareSkuEntity> queryWrapper = new QueryWrapper<>();String skuId = (String) params.get("skuId");if(!StringUtils.isEmpty(skuId)){queryWrapper.eq("sku_id",skuId);}String wareId = (String) params.get("wareId");if(!StringUtils.isEmpty(wareId)){queryWrapper.eq("ware_id",wareId);}IPage<WareSkuEntity> page = this.page(new Query<WareSkuEntity>().getPage(params),queryWrapper);return new PageUtils(page);}
创建采购需求-人工发出/自动化采购

解决采购需求模糊检索

    /*** 列表*/@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params){PageUtils page = purchaseDetailService.queryPage(params);return R.ok().put("page", page);}
@Overridepublic PageUtils queryPage(Map<String, Object> params) {/*** status: 0,//状态*    wareId: 1,//仓库id*/QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<PurchaseDetailEntity>();String key = (String) params.get("key");if(!StringUtils.isEmpty(key)){//purchase_id  sku_idqueryWrapper.and(w->{w.eq("purchase_id",key).or().eq("sku_id",key);});}String status = (String) params.get("status");if(!StringUtils.isEmpty(status)){//purchase_id  sku_idqueryWrapper.eq("status",status);}String wareId = (String) params.get("wareId");if(!StringUtils.isEmpty(wareId)){//purchase_id  sku_idqueryWrapper.eq("ware_id",wareId);}IPage<PurchaseDetailEntity> page = this.page(new Query<PurchaseDetailEntity>().getPage(params),queryWrapper);return new PageUtils(page);}

合并采购单
在这里插入图片描述
1.查询未领取的采购单
PurchaseController.java

@RequestMapping("/unreceive/list")//@RequiresPermissions("ware:purchase:list") 分页查询public R unreceivelist(@RequestParam Map<String, Object> params){PageUtils page = purchaseService.queryPageUnreceivePurchase(params);return R.ok().put("page", page);}

PurchaseServiceImpl.java

    @Overridepublic PageUtils queryPageUnreceivePurchase(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);}

2.合并采购需求 有采购单则根据采购单合并,没有则创建新的采购单进行合并
创建mergeVo 包含采购项和采购单的id

@Data
public class MergeVo {private Long purchaseId; //整单idprivate List<Long> items;//[1,2,3,4] //合并项集合
}

PurchaseController.java

    @PostMapping("/merge")public R merge(@RequestBody MergeVo mergeVo){purchaseService.mergePurchase(mergeVo);return R.ok();}

PurchaseServiceImpl.java

@Transactional@Overridepublic void mergePurchase(MergeVo mergeVo) {Long purchaseId = mergeVo.getPurchaseId();if(purchaseId == null){//1、如果没有采购单 新建一个PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());purchaseEntity.setCreateTime(new Date());purchaseEntity.setUpdateTime(new Date());this.save(purchaseEntity);purchaseId = purchaseEntity.getId();}//TODO 确认采购单状态是0,1才可以合并List<Long> items = mergeVo.getItems();Long finalPurchaseId = purchaseId;List<PurchaseDetailEntity> collect = items.stream().map(i -> {PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();detailEntity.setId(i);detailEntity.setPurchaseId(finalPurchaseId);//设置状态码detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode());return detailEntity;}).collect(Collectors.toList());//批量改变订单状态detailService.updateBatchById(collect);//更新修改时间PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setId(purchaseId);purchaseEntity.setUpdateTime(new Date());this.updateById(purchaseEntity);}

3.采购人员(员工端APP)领取采购单
PurchaseController.java

    /*** 领取采购单*List<Long> ids 要领取的采购单的id*/@PostMapping("/received")public R received(@RequestBody List<Long> ids){purchaseService.received(ids);return R.ok();}

PurchaseServiceImpl.java

/**** @param ids 采购单id*/@Overridepublic void received(List<Long> ids) {//1、确认当前采购单是新建或者已分配状态List<PurchaseEntity> collect = ids.stream().map(id -> {PurchaseEntity byId = this.getById(id);return byId;}).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、改变采购项的状态//根据每个采购单id找到具体采购项collect.forEach((item)->{List<PurchaseDetailEntity> entities = detailService.listDetailByPurchaseId(item.getId());List<PurchaseDetailEntity> detailEntities = entities.stream().map(entity -> {PurchaseDetailEntity entity1 = new PurchaseDetailEntity();entity1.setId(entity.getId());entity1.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode());return entity1;}).collect(Collectors.toList());detailService.updateBatchById(detailEntities);});}

PurchaseDetailServiceImpl.java

    @Overridepublic List<PurchaseDetailEntity> listDetailByPurchaseId(Long id) {List<PurchaseDetailEntity> purchaseId = this.list(new QueryWrapper<PurchaseDetailEntity>().eq("purchase_id", id));return purchaseId;}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.完成采购功能
PurchaseController.java

 @PostMapping("/done")public R finish(@RequestBody PurchaseDoneVo doneVo){purchaseService.done(doneVo);return R.ok();}

创建相关Vo PurchaseDoneVo PurchaseItemDoneVo
PurchaseServiceImpl.java

在这里插入代码片

WareSkuServiceImpl.java
向仓库里加入采购的商品

配置商品服务分页插件

@EnableTransactionManagement
@MapperScan("com/edu/npu/gulimall/guliware/dao")
@Configuration
public class WareMyBatisConfig {//引入分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
//        paginationInterceptor.setOverflow(true);
//        // 设置最大单页限制数量,默认 500 条,-1 不受限制
//        paginationInterceptor.setLimit(1000);return paginationInterceptor;}
}

调用远程服务获取新增商品的名称

@FeignClient("guliproduct")
public interface ProductFeignService {/***      /product/skuinfo/info/{skuId}***   1)、让所有请求过网关;*          1、@FeignClient("guligateway"):给guligateway所在的机器发请求*          2、/api/guliproduct/skuinfo/info/{skuId}*   2)、直接让后台指定服务处理*          1、@FeignClient("guliproduct")*          2、/guliproduct/skuinfo/info/{skuId}** @return*/@RequestMapping("/guliproduct/skuinfo/info/{skuId}")public R info(@PathVariable("skuId") Long skuId);
}

改变采购后的商品库存

    @Overridepublic void addStock(Long skuId, Long wareId, Integer skuNum) {//1、判断如果还没有这个库存记录 -> 新增操作List<WareSkuEntity> entities = wareSkuDao.selectList(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));if(entities == null || entities.size() == 0){WareSkuEntity skuEntity = new WareSkuEntity();skuEntity.setSkuId(skuId);skuEntity.setStock(skuNum);skuEntity.setWareId(wareId);skuEntity.setStockLocked(0);//TODO 远程查询sku的名字,如果失败,整个事务无需回滚//1、自己catch异常//TODO 还可以用什么办法让异常出现以后不回滚?高级try {R info = productFeignService.info(skuId);Map<String,Object> data = (Map<String, Object>) info.get("skuInfo");if(info.getCode() == 0){skuEntity.setSkuName((String) data.get("skuName"));}}catch (Exception e){}wareSkuDao.insert(skuEntity);}else{wareSkuDao.addStock(skuId,wareId,skuNum);}}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java、SpringBoot中配置接口文档,knife4j、swagger

Java、SpringBoot中配置接口文档&#xff0c;knife4j、swagger knife配置 官网&#xff1a;https://doc.xiaominfo.com/ 我这里以最新版的为例&#xff0c;SpringBoot版本是3.0.0以上的 需要注意的是自动集成了swagger&#xff0c;每个SpringBoot版本会对应其knfie版本&…

Java实现非对称加密【详解】

Java实现非对称加密 1. 简介2. 非对称加密算法--DH&#xff08;密钥交换&#xff09;3. 非对称加密算法--RSA非对称加密算法--EIGamal5. 总结6 案例6.1 案例16.2 案例26.3 案例3 1. 简介 公开密钥密码学&#xff08;英语&#xff1a;Public-key cryptography&#xff09;也称非…

实习知识整理6:前后端利用ajax数据传输的四种方式

方式1&#xff1a;前端发送key/value(String字符串)&#xff0c;后台返回文本 前端&#xff1a; <input id"test1" type"button" value"前端发送key/value(String字符串)&#xff0c;后台返回文本"/> $(function() {$("#test1&quo…

R语言 | 组学各类图形绘制资源

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 写在前面 今天分享在GitHub中找到的教程资源&#xff0c;此教程是来自iMeta期刊及“农心生信工作室”的作品。发表在GitHub中&#xff0c;大家可以自行下载。 包含了21个图形的绘制&#xff0c;我大体看了一下…

超全面!8 种互联网常用生命周期完整指南~

什么是生命周期&#xff1f; 百度给出的定义是&#xff1a;生命周期就是指一个对象的生老病死。 生命周期的概念应用很广泛&#xff0c;特别是在政治、经济、环境、技术、社会等诸多领域经常出现&#xff0c;其基本涵义可以通俗地理解为“从摇篮到坟墓”的整个过程。对于某个…

百度网盘win11端扫一扫登录二维码无法显示问题的解决方法

百度网盘win11端扫一扫登录二维码无法显示问题的解决方法 文章目录 问题描述解决方法1、打开Edge 设置2、进入Reset settings页面3、单击重置按钮&#xff1a;4、重新打开百度网盘APP 问题描述 今天在win11端扫描登录百度云网盘时&#xff0c;二维码无法加载出来&#xff0c;具…

第十三章 常用类(包装类和 String 相关类)

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据类型的转换 &#xff08;1&#xff09;jdk5 前的手动装箱和拆箱方式 publ…

基于电商场景的高并发RocketMQ实战-NameServer内存中核心数据模型分析、内核级Producer发送消息流程

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

基于Matlab/Simulink不平衡电网工况下级联H桥光伏并网逆变器仿真模型

本次更新的内容为级联H桥光伏并网逆变器相关的控制&#xff0c;后面会针对储能系统在级联H桥拓扑上的应用进行分享。由于传统发电造成的环境污染问题和光伏电池板价格持续创新低&#xff0c;太阳能从众多种类的可再生能源中拔地而起&#xff0c;因而光伏逆变器成为国内外学者和…

分布式锁功效初探——以电商问题为例

文章目录 电商库存问题单机处理-Sychronized多机器处理-分布式锁入门级别&#xff0c;用redis实现&#xff0c;setnx问题1&#xff1a;逻辑可能异常&#xff0c;造成死锁问题2&#xff1a;机器宕机问题3&#xff1a;锁一直失效&#xff0c;乱套锁续命 redisson分布式丢锁问题主…

前菜---二叉树+堆的小练习

目录 前言&#x1f3dc;️ 1. 二叉树性质总结⛱️ 1.2 性质3⏰ 2. 二叉树性质小练习&#x1f3d5;️ 3. 答案解析&#x1f4a1; 4. 堆概念结构小练习&#x1fa94; 5. 答案解析&#x1f9ff; 6. 前/中/后/层序遍历小练习&#x1f52b; 7. 答案解析&#x1f9fa; 后语…

C++中的内存锁定

内存锁定(memory locking)是确保进程保留在主内存中并且免于分页的一种方法。在实时环境中&#xff0c;系统必须能够保证将进程锁定在内存中&#xff0c;以减少数据访问、指令获取、进程之间的缓冲区传递等的延迟。锁定内存中进程的地址空间有助于确保应用程序的响应时间满足实…