谷粒商城【成神路】-【7】——库存系统

目录

🧈1.仓库维护 

🍟🍟1.1配置网关陆游规则

🍟🍟1.2修改模糊查询  

🥞2.仓库库存

🍿3.采购需需求 

🍟🍟3.1采购的模糊检索 

🍟🍟3.2合并采购单 

🍟🍟3.3领取采购单 

🍟🍟3.4完成采购 

 🌭4.spu规格

🍟🍟4.1 获取spu规格 

🍟🍟4.2更新spu规格


1.仓库维护 

开打界面查看发送的请求路径,因为我们配置类网关,所以目前报错

  • 将库存服务启动,注册到nacos服务中心 

1.1配置网关陆游规则

配置完网关之后,我们再次刷新页面,就可以查询到结果,包括新增,修改和删除共功能,以为之前逆向工程已经生成好后端接口 

1.2修改模糊查询 

点击查询,发送请求,根据请求路径找到相应的controller,并对相应的service方法添加模糊查询

1.controller

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

2.service 

@Overridepublic PageUtils queryPage(Map<String, Object> params) {QueryWrapper<WareInfoEntity> wrapper = new QueryWrapper<>();String key = (String) params.get("key");if (!StringUtils.isEmpty(key)) {wrapper.eq("id", key).or().like("name", key).or().like("address", key).or().eq("areacode", key);}IPage<WareInfoEntity> page = this.page(new Query<WareInfoEntity>().getPage(params),wrapper);return new PageUtils(page);}

3.添加日志,并查看sql语句 

2.仓库库存

在service上拼接条件,添加两个模糊查询 

@Overridepublic PageUtils queryPage(Map<String, Object> params) {QueryWrapper<WareSkuEntity> wrapper = new QueryWrapper<>();String skuId =(String) params.get("skuId");if (!StringUtils.isEmpty(skuId)){wrapper.eq("sku_id",skuId);}String wareId =(String) params.get("wareId");if (!StringUtils.isEmpty(wareId)){wrapper.eq("ware_id",wareId);}IPage<WareSkuEntity> page = this.page(new Query<WareSkuEntity>().getPage(params),wrapper);return new PageUtils(page);}

3.采购需需求 

3.1采购的模糊检索 

1.controller

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

2.service

@Overridepublic PageUtils queryPage(Map<String, Object> params) {QueryWrapper<PurchaseDetailEntity> wrapper = new QueryWrapper<>();String key = (String) params.get("key");if (!StringUtils.isEmpty(key)){wrapper.and((w)->{w.eq("purchase_id",key).or().eq("sku_id",key);});}String status = (String) params.get("status");if (!StringUtils.isEmpty(status)){wrapper.eq("status",status);}String wareId = (String) params.get("wareId");if (!StringUtils.isEmpty(wareId)){wrapper.eq("ware_id",wareId);}IPage<PurchaseDetailEntity> page = this.page(new Query<PurchaseDetailEntity>().getPage(params),wrapper);return new PageUtils(page);}

3.2合并采购单 

1.controller

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

2.service

    @Transactional@Overridepublic void mergePurchase(MergeVo mergeVo) {Long purchaseId = mergeVo.getPurchaseId();if (purchaseId == null) {//1.新建PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATE.getCode());purchaseEntity.setCreateTime(new Date());purchaseEntity.setUpdateTime(new Date());this.save(purchaseEntity);purchaseId = purchaseEntity.getId();}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.3领取采购单 

使用postman发送采购请求

 

1.controller

@PostMapping("/received")public R  received(@RequestBody List<Long> ids){purchaseService.received(ids);return R.ok();}

2.service

 @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.CREATE.getCode() ||item.getStatus() == WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()) {return true;}return false;}).map(item -> {item.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode());return item;}).collect(Collectors.toList());//2.改变采购单的状态this.updateBatchById(collect);//3.改变采购项的状态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);});}

3.4完成采购 

1.controller

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

2.service

    @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);if (info.getCode() == 0) {Map<String, Object> data = (Map<String, Object>) info.get("skuInfo");skuEntity.setSkuName((String) data.get("skuName"));}} catch (Exception e) {}wareSkuDao.insert(skuEntity);} else {wareSkuDao.addStock(skuId, wareId, skuNum);}}

 4.spu规格

点击不显示的,修改前端页面:src --->index.js

添加:

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

 

4.1 获取spu规格 

1.controller

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

2.service

@Overridepublic List<ProductAttrValueEntity> baseAttrListForSpu(Long spuId) {List<ProductAttrValueEntity> entities = this.baseMapper.selectList(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));return entities;}

4.2更新spu规格

1.controller

  @PostMapping("/update/{spuId}")public R updateSpuAttr(@PathVariable("spuId") Long spuId,@RequestBody List<ProductAttrValueEntity> entities){productAttrValueService.updateSpuAttr(spuId,entities);return R.ok();}

2.service

@Transactional@Overridepublic void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities) {//1.删除spuId之前对应的所有属性this.baseMapper.delete(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id",spuId));List<ProductAttrValueEntity> collect = entities.stream().map(item -> {item.setSpuId(spuId);return item;}).collect(Collectors.toList());this.saveBatch(collect);}

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

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

相关文章

system V——进程间通信

上一篇博客中我介绍了system V进程间通信中的内存共享&#xff0c;但是其中还有两 种通信方式&#xff1a;消息队列、和信号量&#xff0c;接下来我将简单介绍一下&#xff0c;消息队列和 信号量以及操作系统是如何看待system V进程间通信的。1. 消息队列 a. 大致介绍 消息队…

4核8G服务器配置性能怎么样?12M带宽配置服务器能干什么?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

CVE-2012-1823 漏洞复现

CVE-2012-1823 PHP SAPI 与运行模式 首先&#xff0c;介绍一下PHP的运行模式。 下载PHP源码&#xff0c;可以看到其中有个目录叫sapi。sapi在PHP中的作用&#xff0c;类似于一个消息的“传递者”&#xff0c;比如在《Fastcgi协议分析 && PHP-FPM未授权访问漏洞 &…

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安

文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性&#xff01;感谢神州租车气温与游玩地点总体花费 游玩过程出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州…

工业自动化监控界面与网页、移动UI大相径庭,不能机械照搬。

工业自动化系统监控界面与网页UI、移动UI设计的不同之处主要体现在以下几个方面&#xff1a; 设备和数据展示&#xff1a;工业自动化系统监控界面需要展示大量的设备状态和实时数据&#xff0c;如传感器数据、设备运行状态等。相比之下&#xff0c;网页UI和移动UI设计更注重内容…

【开源】JAVA+Vue.js实现衣物搭配系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣物收藏模块 三、系统设计3.1 用例设计3.2 E-R图设计3.3 数据库设计3.3.1 衣物档案表3.3.2 衣物搭配表3.3.3 衣物收藏表 四、系统实现4.1 登录页4.2 衣物档案模块4.3 衣物搭配模块4.4…

(已解决)Vue routes的 children使用(小白来看,包会!)

前言 分析链接&#xff1a;Vueelement ui实现好看的个人中心_vue个人信息页面代码-CSDN博客 使用了很多vue深层知识&#xff0c;简化并且做到自己的项目上面 对小白很有帮助&#xff0c;因为我就是小白&#xff0c;才搞明白。 最核心的就是routes的 children使用&#xff0c…

C++入门(上)

文章目录 1:什么是C2.C的发展史3:C关键字(C98)4:命名空间4.1:命名空间的概念4.2:命名空间的定义4.3:命名空间的使用4.3.1加命名空间的名称以及域作用限定符4.3.2:使用using将命名空间中某个成员引入4.3.3:使用using namespace 命名空间名称展开命名空间代码1代码2 5:C输入与输出…

pytorch常用激活函数笔记

1. relu函数&#xff1a; 公式&#xff1a; 深层网络内部激活函数常用这个 import matplotlib.pyplot as pltdef relu_fun(x):if x>0:return xelse:return 0x np.random.randn(10) y np.arange(10)plt.plot(y,x)for i ,t in enumerate(x):x[i] relu_fun(t) plt.p…

《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2024 年 6 款最佳 PDF 编辑器,您可以免费获得

PDF 作为与 Windows、iOS、Linux 和各种其他操作系统兼容的安全文档格式而享有盛誉。这种广泛的兼容性使 PDF 成为一种流行的选择&#xff0c;几乎每个用户都会在不同的环境中遇到 PDF 文件。无论是合同、发票、电子书、信用卡对账单、银行对账单、税务表格还是保险文件&#x…

算法学习——LeetCode力扣字符串篇

算法学习——LeetCode力扣字符串篇 344. 反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地…

精读《js 模块化发展》

1 引言 如今&#xff0c;Javascript 模块化规范非常方便、自然&#xff0c;但这个新规范仅执行了 2 年&#xff0c;就在 4 年前&#xff0c;js 的模块化还停留在运行时支持&#xff0c;10 年前&#xff0c;通过后端模版定义、注释定义模块依赖。对经历过来的人来说&#xff0c;…

二叉树和堆(优先队列)

前言&#xff1a; 本章会讲解二叉树及其一些相关练习题&#xff0c;和堆是什么。 二叉树&#xff1a; 二叉树的一些概念&#xff1a; 一棵二叉树是有限节点的集合&#xff0c;该集合可能为空。二叉树的特点是每一个节点最多有两个子树&#xff0c;即二叉树不存在度大于2的节点…

酷开科技荣获“消费者服务之星”称号后的未来展望

恭喜酷开科技荣获2023年第四季度黑猫平台“消费者服务之星”称号&#xff01;这是对酷开科技长期以来坚持用户至上、用心服务的肯定和认可。作为OTT行业的佼佼者&#xff0c;酷开科技一直秉承着“以用户为中心”的服务理念&#xff0c;不断追求卓越品质&#xff0c;为用户提供更…

模型 PMF(产品市场契合度)

系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。产品与市场高度契合。 1 PMF(Product Market Fit)产品市场契合度 的应用 1.1 PMF在创业过程中的应用-Vincy公司的产品PartnerShare 实现PMF需要企业深入了解目标市场的需求和用户的反馈&…

C++入门学习(二十七)跳转语句—continue语句

当在循环中遇到continue语句时&#xff0c;它会跳过当前迭代剩余的代码块&#xff0c;并立即开始下一次迭代。这意味着continue语句用于跳过循环中特定的执行步骤&#xff0c;而不是完全终止循环。 直接看一下下面的代码更清晰&#xff1a; 与上一节的break语句可以做一下对比…

Learn LaTeX 015 - LaTex Typeset 抄录

https://www.douyin.com/user/self?modal_id7306721102380764453&showTabpost GitHub address: https://github.com/yasenstar/learn_latex Gitee address: https://gitee.com/yasenstar/learn_latex

亚信安慧AntDB零故障割接方案的实践

亚信安慧AntDB秉持着为客户提供最佳数据库解决方案的理念&#xff0c;不断探索并创新&#xff0c;最近取得了重大的突破。他们成功地研发出一种先进的数据库割接方案&#xff0c;实现了不停服、零故障的数据库割接操作&#xff0c;有效地将替换所带来的业务影响降至最低。 这一…