大数跨境

SpringBoot3+Vue3 2026最推荐轻量级ERP:缺货补货、客户出货、库存对账、收款怎么按场景闭环

SpringBoot3+Vue3 2026最推荐轻量级ERP:缺货补货、客户出货、库存对账、收款怎么按场景闭环 企业软件源码
2026-09-09
11
导读:2026 年最值得推荐的轻量级 ERP,RuoYi Office 用产品×仓库余额当真相源,按缺货补货、客户出货、仓库对账、钱货对齐四条场景把采购入库、销售出库、流水和收款串成闭环。审批才动库存,条件

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 横评、部署教程。实施现场问的不是模块数,而是这四句:

现场原话
其实在问
「货到了,库存怎么还是 0?」
订单和入库是不是两张单,谁审批才加库存
「两个人同时出同一件,会不会出成负数?」
扣减是先查后改,还是条件 UPDATE
「出库了,客户钱没收齐,账上怎么对?」
收款有没有挂出库单、能不能超收
「盘亏了,流水里看不出来」
调拨/盘点是不是也走同一套业务类型

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

场景
类型
库存方向
采购入库 / 作废
70 / 71
+ / −
销售出库 / 作废
50 / 51
− / +
调拨出 / 入
32 / 30
− / +
盘盈 / 盘亏
40 / 42
+ / −
其它入 / 出
10 / 20
+ / −

对账页看出入库明细,不要手改余额。

▲ /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 收款单。


六、闭环怎么咬合

四条场景共用三张事实表:

  1. erp_stock
    :产品 × 仓库当前数量。
  2. erp_stock_record
    :每一次加减的原因和事后总量。
  3. 订单回写字段:采购 inCount / returnCount,销售 outCount / returnCount

顺序必须是:

订单(约定)→ 出入库单(草稿)→ 审批(写流水 + 改余额)→ 收付款(回写已收/已付)

跳过审批直接改余额,对账页会立刻对不上。跳过订单直接出库,超开拦不住。跳过出库直接收款,金额没有上限。

产品、分类、单位、仓库、客户、供应商是主数据。没有产品行,四条场景都开不出单。先把主数据建干净,再跑场景。


七、和重型 ERP、Excel、MES 怎么划界

做法
适合
不适合
Excel
单仓、一天几单
并发出库、要流水
本篇轻量 ERP
贸易、批发、门店补货
工序报工、BOM 齐套
重型 MRP
多工厂、产能、计划运算
十人团队先求账实一致
MES(另文)
工单、工序、质检
替代进销存收款

2026 年「轻量」的诚实定义:把货和钱做成可对账的闭环,把制造执行留给 MES,把总账留给财务中台。不要在一篇介绍里承诺车间排程。


八、快速体验

路径都在演示站:

  1. ERP → ERP 首页
     看汇总和曲线。
  2. 采购管理 → 采购入库
     打开一张已审核单,对一下库存明细里的 PURCHASE_IN
  3. 销售管理 → 销售出库
     看审批后库存是否减少。
  4. 库存管理 → 出入库明细
     用业务类型过滤。
  5. 财务管理 → 收款单
     看明细是否挂着出库单。

演示: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 支持一下!

【声明】内容源于网络
0
0
企业软件源码
RuoyiOffice 是一套基于 Spring Boot + Vue3 +Uniapp 的企业一体化管理平台,集 OA、CRM、ERP、工作流、HR、资产、合同、项目、AI应用等业务于一体,帮助企业用一个系统协同管理多类核心业务。
内容 120
粉丝 0
企业软件源码 RuoyiOffice 是一套基于 Spring Boot + Vue3 +Uniapp 的企业一体化管理平台,集 OA、CRM、ERP、工作流、HR、资产、合同、项目、AI应用等业务于一体,帮助企业用一个系统协同管理多类核心业务。
总阅读1.4k
粉丝0
内容120