当前位置: 首页 > news >正文

Springboot vue仓库管理系统源码Java 前后端分离 WMS仓库管理 BS

Springboot vue仓库管理系统源码Java 前后端分离 WMS仓库管理 BS 功能见详情

最近在折腾一个前后端分离的仓库管理系统,用SpringBoot+Vue搞了套WMS方案。这玩意儿用起来比传统单体架构灵活不少,特别是库存实时更新这块,用WebSocket推数据比轮询舒服多了。先看后端怎么处理入库逻辑:

@PostMapping("/stock-in") public ResponseDto stockIn(@RequestBody StockOperationDto dto) { // 这里有个细节:事务里先锁库存记录防止并发问题 Inventory inventory = inventoryService.lockInventory(ddto.getMaterialId()); inventoryService.addStock(inventory, dto.getQuantity(), dto.getOperator()); // 推送到前端看板 webSocketHandler.sendStockChange(inventory); return ResponseDto.success(inventory.getCurrentStock()); }

这里用了双重保障:数据库行锁+操作日志。之前试过不加锁直接更新,结果测试时两个同时入库的请求直接把库存数搞乱了。日志表设计也花了点心思:

@Entity public class OperationLog { @Id @GeneratedValue(strategy = IDENTITY) private Long id; private String operationType; // IN/OUT/ADJUST @Column(precision = 10, scale = 2) private BigDecimal quantity; @ManyToOne private Operator operator; private LocalDateTime timestamp = LocalDateTime.now(); }

注意这个BigDecimal类型,用double的话金额计算会出精度问题。曾经有个项目因为用了double导致库存金额差了几毛钱,排查到凌晨三点...

前端用Vue3+Pinia状态管理,仓库看板组件是关键。这是库存实时更新的处理:

<script setup> const ws = new WebSocket('wss://yourdomain/ws-stock') watchEffect(() => { ws.onmessage = (event) => { const data = JSON.parse(event.data) if (data.type === 'STOCK_UPDATE') { store.updateInventoryRealTime(data.payload) } } }) </script>

这里有个坑:WebSocket重连机制。刚开始没加心跳检测,网络波动时连接断了不会自动重连。后来加了指数退避重试:

let retries = 0; function connect() { ws = new WebSocket(url); ws.onclose = () => { const timeout = Math.min(1000 * Math.pow(2, retries), 30000); setTimeout(connect, timeout); retries++; } }

权限控制方面,后端用Spring Security做了细粒度控制。比如质检员只能看到质检相关菜单:

@PreAuthorize("hasRole('QUALITY_CHECK') || hasRole('ADMIN')") @GetMapping("/quality-records") public Page<QualityRecord> getQualityRecords(Pageable pageable) { return qualityService.getRecords(pageable); }

前端路由根据权限动态生成,避免硬编码。用了个骚操作:登录后把权限树缓存在IndexedDB里,下次进系统不用重新拉取。

遇到最头疼的问题是条码打印兼容性。不同型号的打印机指令集不一样,最后用了个折中方案:后端生成PDF,让浏览器调用本地打印对话框。虽然不如直接发指令给打印机快,但兼容性无敌。

整个项目搞下来最大的体会是:仓库管理系统最核心的不是技术多牛逼,而是业务逻辑的严密性。比如库存移动必须同时记录操作日志和库存变更,任何一个环节没加事务都可能造成数据不一致。源码里用了Command模式来封装操作命令,方便回滚和审计:

public class StockOutCommand implements InventoryCommand { @Override public void execute() { // 扣减库存 // 生成出库单 // 记录操作日志 } @Override public void undo() { // 恢复库存 // 标记出库单作废 } }

这种设计在后来加撤销功能时省了不少事。前后端分离确实让迭代变快了,但接口版本管理要特别注意。我们给每个接口都加了/v1/前缀,防止前端没更新时调用到新版接口。

http://www.gsyq.cn/news/194475.html

相关文章:

  • 信捷PLC系列:动态分期付款与高级安全解锁机制,保障无限期安全运行至终极解锁
  • Bootstrap v2 教程
  • 如何在React项目中使用Echarts
  • 光伏_混合储能微电网模型 光储微电网模型主要包括发电模块,储能模块,并网模块及控制系统模块
  • JSP Session管理详解
  • 直接上代码!咱们先搞明白怎么用坐标算曼哈顿距离。比如机器人坐标(3,5),任务点(7,2),距离就是|x1-x2|+|y1-y2|=4+3=7
  • 威纶通触摸屏宏指令:简易红绿灯控制程序实战教程
  • 深度学习计算机毕设之基于YOLOv8的人物目标检测和分割(跟踪)
  • 半桥LLC谐振变换器仿真模型,采用变频控制电压闭环控制,完美跟踪给定电压,可实现软开关
  • Numpy 数组操作
  • CST仿真超表面吸波器:全流程编码分束涡旋聚焦极化转换录屏教学
  • 深度学习毕设项目:基于YOLOv8的人物目标检测和分割(跟踪)
  • OpenEnler等Linux系统中安装git工具的方法
  • fast.ai携手AI:对话式工程解锁编程新纪元
  • kotlin协程-热数据通道Channel
  • 手机照片视频太多怎么一键按年月分类整理并批量重命名?照片视频整理神器
  • kotlin协程-冷数据流Flow
  • 医学影像分析中的数据增强具体方法
  • Python 医学影像分析,DICOM读取/分割/可视化全流程
  • 0基础开发学习python工具_____一键打包!用 PyInstaller 将 Python 烟花程序转为 .exe(无需 Python 环境)
  • 深度学习毕设选题推荐:基于YOLOv8的人物目标检测和分割(跟踪)
  • 【Hadoop+Spark+python毕设】起点小说网数据可视化分析系统、计算机毕业设计、包括数据爬取、数据分析、数据可视化、实战教学
  • 计算机深度学习毕设实战-基于YOLOv8的人物目标检测和分割(跟踪)
  • Spring Boot 全局异常处理策略设计(一):异常不只是 try-catch
  • 在敏捷开发中通过DevTestOps缩短软件生命周期
  • 重新理解身份:为什么 SAP Cloud Identity Services 是 SAP BTP 时代的入口与底座
  • 自己写的英文论文维普查重1.28%,学校查重34%,怎么办?
  • CI_CD Pipeline趋势:加速集成与交付
  • 十年编程路:从码农到架构师的心路历程
  • 【Java毕设源码分享】基于springboot+vue的沉浸式戏曲文化体验系统的设计与实现(程序+文档+代码讲解+一条龙定制)