库存管理

1. 仓库列表维护

1.1 注册中心配置

首先我们需要把库存服务注册到注册中心中。

然后在nacos中发现注册的服务

1.2 网关路由配置

客户端首先访问的都是网关服务,所以需要配置对应的路由规则

就可以完成对仓库列表的处理了

1.3 关键字查询

然后实现仓库列表的关键字查询

2.商品库存管理

添加对应的检索条件

效果展示

3.采购流程

完整的采购流程

3.1 采购需求维护

3.2 采购需求合并

3.2.1 查询分配的采购单

合并采购需求时我们需要把这些采购需求合并到一个采购单中,所以首先需要创建采购单

然后在整合时我们需要查询出状态为 新建 或者 已分配 的采购单

对应的需要创建接口

然后就可以实现整合处理了。

3.2.2 采购需求合并

接收传递的信息创建对应的VO对象

@Data
public class MergeVO {//{ purchaseId: this.purchaseId, items: items }private Long purchaseId;private List<Long> items;
}

创建对应的枚举类型的常量

package com.msb.common.constant;/*** 库存模块的常量**/
public class WareConstant {/*** 采购单状态*/public enum PurchaseStatusEnum{CREATED(0,"新建"),ASSIGED(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,"新建"),ASSIGED(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;}}
}

添加对应的接口

然后在service中完成对应的业务处理

    /*** 完成采购需求的合单操作* @param mergeVO* @return*/@Transactional@Overridepublic Integer merge(MergeVO mergeVO) {Long purchaseId = mergeVO.getPurchaseId();if(purchaseId == null){// 新建采购单PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());purchaseEntity.setCreateTime(new Date());purchaseEntity.setUpdateTime(new Date());this.save(purchaseEntity);purchaseId = purchaseEntity.getId();}// 整合菜单需求单List<Long> items = mergeVO.getItems();final long finalPurchaseId = purchaseId;List<PurchaseDetailEntity> list = items.stream().map(i -> {PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();// 更新每一条 需求单的 采购单编号detailEntity.setId(i);detailEntity.setPurchaseId(finalPurchaseId);detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGED.getCode());return detailEntity;}).collect(Collectors.toList());detailService.updateBatchById(list);// 更新对应的采购单的更新时间PurchaseEntity entity = new PurchaseEntity();entity.setId(purchaseId);entity.setUpdateTime(new Date());this.updateById(entity);return null;}

3.3 领取采购单

采购单合单完成后,采购人员需要对应的领取采购单来执行后续的流程

先创建对应的领取采购单的接口

    /*** 领取采购单* [2,3,4]* @return*/@PostMapping("/receive")public R receive(@RequestBody List<Long> ids){purchaseService.received(ids);return R.ok();}

在service中实现领取采购单的业务

   /*** 领取采购单* @param ids*/@Transactional@Overridepublic void received(List<Long> ids) {// 1.领取的采购单的状态只能是新建或者已分配的采购单 其他的是不能领取的List<PurchaseEntity> list = ids.stream().map(id -> {return this.getById(id);}).filter(item -> {if (item.getStatus() == WareConstant.PurchaseStatusEnum.CREATED.getCode() ||item.getStatus() == WareConstant.PurchaseStatusEnum.ASSIGED.getCode()) {return true;}return false;}).map(item->{item.setUpdateTime(new Date()); // 设置更新时间// 更新采购单的状态为 已领取item.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode());return item;}).collect(Collectors.toList());// 2.更新采购单的状态为 已领取this.updateBatchById(list);// 3.更新采购项的状态为 正在采购for (Long id : ids) {// 根据采购单id 找到对应的采购项对象List<PurchaseDetailEntity> detailEntities = detailService.listDetailByPurchaseId(id);List<PurchaseDetailEntity> collect = detailEntities.stream().map(item -> {PurchaseDetailEntity entity = new PurchaseDetailEntity();entity.setId(item.getId());entity.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode());return entity;}).collect(Collectors.toList());// 批量更新采购项detailService.updateBatchById(collect);}}

postman发送请求测试

数据状态更新

搞定

3.4 完成采购操作

3.4.1 VO对象

创建对应的VO对象来接收传递的数据

/*** 采购项的VO数据*/
@Data
public class PurchaseItemDoneVO {private Long itemId;private Integer status;private String reason;
}
/*** 采购单的VO数据*/
@Data
public class PurchaseDoneVO {private Long id;private List<PurchaseItemDoneVO> items;}

3.4.2 OpenFeign配置

OpenFeign的配置-在商品入库的时候我们需要通过OpenFegin来调用商品服务的接口来查询sku的名称

@FeignClient("mall-product")
public interface ProductFeignService {/*** 当然我们也可以通过网关来调用商品服务* @param skuId* @return*/@RequestMapping("/product/skuinfo/info/{skuId}")public R info(@PathVariable("skuId") Long skuId);
}

在启动类中添加Enable注解

不要忘了添加对应的依赖

3.4.3 业务代码实现

首先是Controller接口的创建

然后对应的service逻辑的处理

    @Transactional@Overridepublic void done(PurchaseDoneVO vo) {// 获取采购单编号Long id = vo.getId();// 2.改变采购项的状态Boolean flag = true; // 记录采购的状态 默认为 完成// 获取所有的采购项List<PurchaseItemDoneVO> items = vo.getItems();List<PurchaseDetailEntity> list = new ArrayList<>();for (PurchaseItemDoneVO item : items) {PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();if(item.getStatus() == WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode()){// 该采购项采购出现了问题flag = false;detailEntity.setStatus(item.getStatus());}else{// 采购项采购成功detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.FINISH.getCode());// 3.将采购成功的采购项进入库操作// 跟进采购项编号查询出对应的采购项详情PurchaseDetailEntity detailEntity1 = detailService.getById(item.getItemId());wareSkuService.addStock(detailEntity1.getSkuId(),detailEntity1.getWareId(),detailEntity1.getSkuNum());}detailEntity.setId(item.getItemId());//detailService.updateById(detailEntity);list.add(detailEntity);}detailService.updateBatchById(list); // 批量更新 采购项// 1.改变采购单的状态PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setId(id);purchaseEntity.setStatus(flag?WareConstant.PurchaseStatusEnum.FINISH.getCode(): WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode());purchaseEntity.setUpdateTime(new Date());this.updateById(purchaseEntity);}

然后就是入库的逻辑操作

    /*** 入库操作* @param skuId 商品编号* @param wareId 仓库编号* @param skuNum  采购商品的数量*/@Overridepublic void addStock(Long skuId, Long wareId, Integer skuNum) {// 判断是否有改商品和仓库的入库记录List<WareSkuEntity> list = skuDao.selectList(new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));if(list == null || list.size() == 0){// 如果没有就新增商品库存记录WareSkuEntity entity = new WareSkuEntity();entity.setSkuId(skuId);entity.setWareId(wareId);entity.setStock(skuNum);entity.setStockLocked(0);try {// 动态的设置商品的名称R info = productFeignService.info(skuId); // 通过Feign远程调用商品服务的接口Map<String,Object> data = (Map<String, Object>) info.get("skuInfo");if(info.getCode() == 0){entity.setSkuName((String) data.get("skuName"));}}catch (Exception e){}skuDao.insert(entity); // 插入商品库存记录}else{// 如果有就更新库存skuDao.addStock(skuId,wareId,skuNum);}}

然后对应的Dao接口和Mapper的SQL代码

@Mapper
public interface WareSkuDao extends BaseMapper<WareSkuEntity> {void addStock(@Param("skuId") Long skuId, @Param("wareId") Long wareId, @Param("skuNum") Integer skuNum);
}
    <insert id="addStock">UPDATE wms_ware_sku SET stock=stock+#{skuNum} WHERE sku_id=#{skuId} AND ware_id=#{wareId}</insert>

3.4.4 PostMan测试

最后通过PostMan来测试完成操作

{"id":3,"items":[{"itemId":4,"status":3,"reason":""},{"itemId":5,"status":3,"reason":""}]
}

商品库存

采购单

采购项

4.阶段性总结

4.1 分布式的概念

微服务(SpringCloudAlibaba)

注册中心,配置中心,远程调用,网关,负载均衡,链路追踪…

4.2 技术栈

SpringBoot2.4.12 SpringCloud MyBatis-Plus MySQL Vue ElementUI 人人fast,阿里云对象存储

4.3 环境

Docker Linux Vagrant MySQL Redis 人人开源

4.4 开发规范

数据校验JSR303 全局跨域 R全局统一返回,全局异常处理 枚举状态 业务状态,VO、DTO、PO划分,逻辑删除,Lombok

【第八篇】商城系统-库存管理相关推荐

  1. 简洁商城系统后台管理模板

    简介: 简洁商城系统后台管理模板,简单,大气,全套模板,包括登录.旅游管理.系统管理.信息管理等后台模板页面. 网盘下载地址: http://kekewangLuo.cc/irUA8YyDkwp0 图 ...

  2. 通用的商城系统后台管理ui框架模板

    通用的商城系统后台管理ui框架模板 https://download.csdn.net/download/billhepeng/11927563 素材来源于网络

  3. 数商云SCM供应链协同系统库存管理解决方案,助力家居建材企业库存精细化管理

    继农业经济.工业经济之后,以数字技术为核心驱动力量的数字经济成为数字时代的主要经济形态.一直被视为"距离互联网最远"行业之一的家居建材行业,当前也正随着外部环境的变动与行业生态的发 ...

  4. 交通运输行业S2B2C商城系统一体化管理,加快S2B2C平台供应链流转

    随着全球化经济飞速发展,在互联网时代发展背景下,推进传统产业的数字化转型是必然趋势,只有有效的与互联网相结合,才能满足如今消费者对交通运输行业服务的需求. 交通运输行业数字化转型的"四个难点 ...

  5. 【第四篇】商城系统-品牌管理实现

    业务开发-基础业务-品牌管理   本篇文章详细介绍了品牌管理的功能实现. 品牌管理 1. 品牌管理基本操作 首先完成品牌的基本的操作.就是通过renren-fast-generator项目不光能生成表 ...

  6. 第十二篇 Android 系统电话管理机制一--工厂模式和代理模式

    http://blog.csdn.net/goohong/article/details/7983558 转载于:https://www.cnblogs.com/soft-design/p/37671 ...

  7. 浅谈数商云S2B2C商城系统业务一体化管理功能在医疗器械行业的应用

    近些年,随着医疗器械行业的快速发展,医疗器械市场规模也随之日益提升,根据公开数据统计,2021年我国医疗器械市场规模为9630亿元,同比增长31.18%,预计2022年将突破万亿大关.但与此同时,医疗 ...

  8. 供应商寄售库存管理_【论文解读】物流联合外包下库存管理模式对供应链运作的影响...

    物流联合外包下库存管理模式对供应链运作的影响 作者:冯颖,林晴,张景雄,张炎治  目录  1 引言 2 问题描述 3 数学模型 4 协调模型 5 数值算例 6 结论 1 引言 传统库存管理模式下,供应 ...

  9. 物流行业SaaS多租用商城系统:提升企业物流管理效率,实现高效协同

    如今,随着互联网技术的不断发展,中国物流行业也迎来了智慧化转型升级的发展机遇,传统的物流运作模式已经难以满足物流企业的市场发展需求,而基于多租户SaaS模式的物流服务平台则能够很好地满足企业信息化建设 ...

最新文章

  1. 开源教程 「nlp-tutorial」!用百行代码搞定各类NLP模型
  2. ajax实现简单计算器,一个简单的jQuery计算器实现了连续计算功能
  3. URAL 1471 Tree
  4. 用Git向gitHub上传项目
  5. Richardson RazorSQL中文版
  6. DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
  7. 找不到QtDir变量的解决办法, 同时不需要经过编译就可以使用qt 库
  8. Python_Mix*OS模块,序列化模块种的json,pickle
  9. 火车头采集php源码不同,防火车头采集的功能
  10. python中的_init_的使用
  11. 并发模型之——共享内存模型(线程与锁)理论篇
  12. 明天 | 2021单细胞组学国际研讨会(线上)【附直播链接】
  13. Linux 命令(54)—— trap 命令(builtin)
  14. 利用LVM管理磁盘系统
  15. cvLaplace() 拉普拉斯变换
  16. python分数计算器_python计算器实现过程
  17. win7定时关机命令_WIN7系统还有用吗?怎么随时切换WIN7/10?
  18. 图像算法学习 - 计算图像均方差(MES),峰值信噪比(PSNR)
  19. Qt启动进程ping网址
  20. 2019/12/31 教养

热门文章

  1. MSF for MAC 百度云下载链接
  2. python 调用谷歌翻译
  3. 让Windows 2000/XP自动关机
  4. ZTE-H608B开路由设置方法
  5. 广义表深度递归算法的问题
  6. Qt编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)
  7. 桌面图标显示异常修复
  8. 51单片机电子秤(HX711模块 + LCD1602)
  9. js产品详情:鼠标经过放大镜效果
  10. 教师资格证(中学)需要准备多长时间?