SpringBoot3+Vue3 2026最推荐轻量级ERP:缺货补货、客户出货、库存对账、收款怎么按场景闭环
🌐 文档地址:https://ruoyioffice.com
📦 源码1·GitHub:https://github.com/yuqing2026/ruoyi-office
📦 源码2·GitCode:https://gitcode.com/zhouzhongyan/ruoyi-office
📦 源码3·Gitee:https://gitee.com/yqzy1688/ruoyi-office
💬 微信:17156169080(备注「RuoYi Office」)
仓库里还剩 3 件,销售同时开了两张出库单;供应商货到了,入库没审,账上却已经加过。2026 年中小企业要的不是 SAP 式大而全,而是四条日常场景能闭环。RuoYi Office 的轻量 ERP 把真相钉在「产品 × 仓库」余额上:采购入库审批才加库存,销售出库审批才减库存,收款挂出库单且不能超收。
▲ 中心是产品×仓库余额。补货 → 出货 → 收款 → 对账再转回补货,四条场景共用一本流水;经营看板回收金额、待办和预警
引言:轻量级 ERP 到底轻在哪
搜「2026 轻量级 ERP」,常见三种文:功能目录(采购销售库存财务列完就结束)、国外 SaaS 横评、部署教程。实施现场问的不是模块数,而是这四句:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
RuoYi Office 的答案很窄:轻量是进销存 + 往来收款,不是制造 MRP。 车间工单、报工、质检在 MES,另文再讲。本篇只把货和钱四条场景跑通。
技术栈锚点:Spring Boot 3.5 + Vue3 Vben + MyBatis-Plus。下文代码只写类名和方法。
一、先看经营看板:六个数字带你下钻
老板早上打开的不是采购列表,是 ERP → ERP 首页。今日 / 本月 / 本年可以切。六张卡不是手填 KPI:销售额、采购额来自已审核出入库(减退货),待审核 / 待出库 / 待入库 / 库存预警来自单据状态和产品×仓库余额。中间是近 6 / 12 月双折线,右侧待办点进去带筛选。底栏是快捷入口、缺货明细、最近单据。
▲ /erp/home:六张 KPI、销售/采购趋势、待办、快捷入口、库存预警、最近单据。点数字下钻到对应列表,首页本身不改库存
移动端对应 /pages-statistics/erp/home/index。改库存的入口在后面四条场景。
二、场景 1:缺货补货 —— 订单约定,入库才加
货不够,先开采购订单,约定买多少。货进仓库,再开采购入库,选那张订单,明细回写 inCount。订单不加库存。入库审批才加。
▲ /erp/purchase/in 点详情。表头挂供应商与订单号,明细带仓库。未审核时库存还没动
审批通过时,每条明细写一条 PURCHASE_IN(70) 流水,数量为正:
Integer bizType = approve? ErpStockRecordBizTypeEnum.PURCHASE_IN.getType(): ErpStockRecordBizTypeEnum.PURCHASE_IN_CANCEL.getType();items.forEach(item -> {BigDecimal count = approve ? item.getCount() : item.getCount().negate();stockRecordService.createStockRecord(new StockRecordCreateReq(item.getProductId(), item.getWarehouseId(), count,bizType, item.getInId(), item.getId(), purchaseIn.getNo()));});
反审批走 PURCHASE_IN_CANCEL。已经付过款的入库单不能反审,避免钱货各改各的。
反审批拦付款:
if (!approve && purchaseIn.getPaymentPrice().compareTo(BigDecimal.ZERO) > 0) {throw exception(PURCHASE_IN_PROCESS_FAIL_EXISTS_PAYMENT);}
场景里记住两句话:采购订单是合同意向,采购入库是仓库事实。付款单挂入库金额,不能超过入库总额。
三、场景 2:客户出货 —— 选单出库,审批才减
客户要货,先有销售订单。仓管按单开销售出库,选订单带出明细,再选仓库。出库审批才减库存,并回写订单 outCount,防止超开。
▲ /erp/sale/out 详情。表头客户与订单,明细数量审批后变负数流水
出库审批把数量取负,业务类型 SALE_OUT(50);反审批用 SALE_OUT_CANCEL 加回来:
Integer bizType = approve? ErpStockRecordBizTypeEnum.SALE_OUT.getType(): ErpStockRecordBizTypeEnum.SALE_OUT_CANCEL.getType();items.forEach(item -> {BigDecimal count = approve ? item.getCount().negate() : item.getCount();stockRecordService.createStockRecord(new StockRecordCreateReq(item.getProductId(), item.getWarehouseId(), count,bizType, item.getOutId(), item.getId(), saleOut.getNo()));});
已经收过款的出库单不能反审。收款金额不能大于出库总额——这是场景 4 的门。
前端点「审批」走 updateSaleOutStatus,状态值 20 是通过。列表页可以反审批,但仓库和财务同时在线时,先看收款栏是不是已经 > 0。
四、场景 3:仓库对账 —— 一本流水,多种原因
调拨、盘盈、盘亏、其它出入库,看起来像杂事,其实和采购销售共用同一张余额表。差别只在 bizType:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
对账页看出入库明细,不要手改余额。
▲ /erp/stock/record 是本篇唯一列表。每行有 bizType、本次 count、变动后 totalCount、单据号
扣减防超卖不在 Service 里先读再写,而在 Mapper 的条件更新:减库存时带 count >= 要减的绝对值,更新行数为 0 就抛「库存不足」。
if (count.compareTo(BigDecimal.ZERO) < 0) {if (!negativeEnable) {updateWrapper.ge(ErpStockDO::getCount, count.abs());}updateWrapper.setSql("count = count - " + count.abs());}int rows = stockMapper.update(null, updateWrapper);if (rows == 0) {throw exception(STOCK_COUNT_NEGATIVE2, productName, warehouseName);}
默认不允许负库存。演示或盘点纠偏若要临时放开,改 NEGATIVE_STOCK_COUNT_ENABLE,不要在页面上手改余额数字。
调拨一次写两条流水:源仓 MOVE_OUT,目标仓 MOVE_IN。盘点按实盘与账面差生成盘盈或盘亏,同样先流水、再改余额。
五、场景 4:钱货对齐 —— 收款挂出库,不能超收
货出了,钱没进,应收停在出库单的 receiptPrice。财务开收款单,勾销售出库(或销售退货),累计收款不能超过出库总额。
▲ /erp/finance/receipt 点「新增收款单」。明细用「添加销售出库单」挂单,合计收款不能超过出库总额
if (receiptPrice.compareTo(saleOut.getTotalPrice()) > 0) {throw exception(SALE_OUT_FAIL_RECEIPT_PRICE_EXCEED, receiptPrice, saleOut.getTotalPrice());}saleOutMapper.updateById(new ErpSaleOutDO().setId(id).setReceiptPrice(receiptPrice));
采购侧对称:付款挂入库,paymentPrice 不能超过入库总额。已收款的出库、已付款的入库都不能反审——先冲收款/付款,再动货。
这就是「轻量财务」:不是总账科目,是往来挂在进销存单据上。要账龄、FIFO 核销,走财务应收应付模块,不要塞进 ERP 收款单。
六、闭环怎么咬合
四条场景共用三张事实表:
erp_stock:产品 × 仓库当前数量。 erp_stock_record:每一次加减的原因和事后总量。 -
订单回写字段:采购 inCount/returnCount,销售outCount/returnCount。
顺序必须是:
订单(约定)→ 出入库单(草稿)→ 审批(写流水 + 改余额)→ 收付款(回写已收/已付)
跳过审批直接改余额,对账页会立刻对不上。跳过订单直接出库,超开拦不住。跳过出库直接收款,金额没有上限。
产品、分类、单位、仓库、客户、供应商是主数据。没有产品行,四条场景都开不出单。先把主数据建干净,再跑场景。
七、和重型 ERP、Excel、MES 怎么划界
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026 年「轻量」的诚实定义:把货和钱做成可对账的闭环,把制造执行留给 MES,把总账留给财务中台。不要在一篇介绍里承诺车间排程。
八、快速体验
路径都在演示站:
ERP → ERP 首页看汇总和曲线。 采购管理 → 采购入库打开一张已审核单,对一下库存明细里的 PURCHASE_IN。销售管理 → 销售出库看审批后库存是否减少。 库存管理 → 出入库明细用业务类型过滤。 财务管理 → 收款单看明细是否挂着出库单。
演示:https://ruoyioffice.com/web/(账号 admin / admin123)
结语
轻量级 ERP 不是模块墙,是四条每天都在发生的场景共用一本库存账。缺货就入库审批后加,出货就出库审批后减,对账看流水,收款挂出库且不超收。车间那条线以后单独讲。
💡 想要体验 RuoYi Office 的强大功能?
🌐 在线演示:https://ruoyioffice.com/web/(账号 admin / admin123)
📦 源码仓库:GitHub:https://github.com/yuqing2026/ruoyi-office | GitCode:https://gitcode.com/zhouzhongyan/ruoyi-office | Gitee:https://gitee.com/yqzy1688/ruoyi-office
💬 技术咨询:添加微信 17156169080,备注「RuoYi Office」
⭐ 如果觉得不错,请给个 Star 支持一下!

