SpringBoot3+Vue3 库存盘点:账面和实盘对不上,差异单怎么走审批再调账
🌐 文档地址: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」)
月底仓库抽盘,账面 12 台,货架 10 台。有人直接在库存数字上减 2,出库单和盘点对不上,审计问「谁改的」没人接。RuoYi Office 的物料库存不这么干。账面从库存带出,实盘手填,盈亏写在盘点明细上;这张盘点单就是差异单。点审核,SpringBoot3 才写盘盈入库或盘亏出库流水。库存表只认流水,不认手改。
▲ 上:禁止直接改 erp_stock。下:账面只读、实盘可写、盈亏=实盘−账面;status 到已审核才出现业务类型 40 / 42 的出入库明细
引言:库存盘点难在「谁有权改库存」
物料库存是数量账。盘点要回答的不是「卡片在哪个房间」,是这个 SKU 在这个仓,系统数和货架数差几件,差的部分何时入账。
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
固定资产盘点是另一条链:一物一卡,差异要拆更正 / 盘亏报废 / 盘盈建卡,走 Flowable。那篇已经写过。物料库存不必再拆第二张 BPM 单——差异就在盘点明细的 count 上,审核按钮就是调账。
一、产品能力与特点
库存盘点单是「一次抽盘的账面、实盘和盈亏清单」。谁用:仓管、物控在 ERP → 库存管理 → 库存盘点 新建或打开详情。解决的事:货架数和系统数对不上时,留下可审核、可冲回的单据。
|
|
|
|
|---|---|---|
|
|
|
erp_stock,账面列只读
|
|
|
|
|
|
|
|
|
|
|
|
|
和固定资产差异处理单对照一句就够:卡片台账改的是位置和状态,要单独审批回写;SKU 数量账改的是件数,盘点单审核即可。不要把两套话术抄在同一张菜单里。
二、业务流程怎么串
主路径:新建盘点 → 填实盘看出盈亏 → 审核写流水 → 出入库明细能追到单号。
2.1 新建盘点单,账面从库存来
打开 /erp/stock/check,点新建。表头填盘点时间、备注;明细选仓库和产品。账面库存 stockCount 由当前库存接口带出,不要让仓管手改账面来「做平」。
实际库存 actualCount 才是货架数。盈亏 count = actualCount - stockCount。例如账面 12、实盘 10,盈亏 −2,审核后走盘亏出库。
▲ 盘点单 QCPD20260915000001。主仓库、罗技键盘:账面 0、实盘 3、盈亏 +3。未审核时库存一张未动
状态:盘点单已保存,erp_audit_status=10(未审核),erp_stock 未变。
2.2 主管点审核,这张单就是差异单
列表或详情上的「审批」把状态改成 20。没有第二张「差异处理单」可点——物料差异已经写在明细 count 上。count=0 的行直接跳过,避免盘平行制造空流水。
count>0 写成盘盈入库(业务类型 40),count<0 写成盘亏出库(42)。数量带符号写入 erp_stock_record,库存余额按流水累加。
▲ 同一张 QCPD20260915000001。盈亏仍是 +3。要改实盘必须先反审核,反审核会按相反数量冲流水
状态:status=20,有盈亏的行已有库存流水,biz_no 等于盘点单号。
2.3 出入库明细核对调账
打开 ERP → 库存管理 → 出入库明细(/erp/stock/record)。按盘点单号或业务类型 40 / 42 过滤。这里应能看到产品、仓库、数量和来源单号。对不上就反审核,不要再去库存表改余额。
▲ 出入库明细第一行:罗技键盘、主仓库、盘盈入库、单号 QCPD20260915000001、数量 3。这就是审核写下的流水
状态:库存余额 = 历史流水之和。盘点单是原因,流水是结果。
三、设计怎么落地
3.1 设计思路
|
|
|
|
|---|---|---|
|
|
count
|
|
|
|
|
|
|
|
count==0
|
|
|
|
|
|
|
|
|
|
3.2 表结构
|
|
|
|
|---|---|---|
erp_stock_check |
no
status / total_count
|
|
erp_stock_check_item |
stock_count
actual_count / count
|
|
erp_stock_record |
biz_type
biz_no / count
|
|
erp_stock 是余额快照,不要在盘点过程中直接 UPDATE 它。
3.3 时序图
反审核把 status 拉回 10,并对每一行把当时的 count 取反,业务类型改成 41 或 43。
3.4 核心代码
账面只读、实盘可写。 对应 2.1。盈亏列没有编辑槽,避免人改差异伪装盘平。
{field: 'stockCount',title: '账面库存',minWidth: 80,formatter: 'formatAmount3',},{field: 'actualCount',title: '实际库存',minWidth: 120,fixed: 'right',slots: { default: 'actualCount' },formatter: 'formatAmount3',},{field: 'count',title: '盈亏数量',minWidth: 120,fixed: 'right',formatter: 'formatAmount3',},
审核才出入库,盘平行不写流水。 对应 2.2。approve 用明细 count 原值;反审核取反,并切换作废类型。
stockCheckItems.forEach(stockCheckItem -> {if (stockCheckItem.getCount().compareTo(BigDecimal.ZERO) == 0) {return;}BigDecimal count = approve? stockCheckItem.getCount(): stockCheckItem.getCount().negate();Integer bizType;if (approve) {bizType = count.compareTo(BigDecimal.ZERO) > 0? ErpStockRecordBizTypeEnum.CHECK_MORE_IN.getType(): ErpStockRecordBizTypeEnum.CHECK_LESS_OUT.getType();} else {bizType = count.compareTo(BigDecimal.ZERO) > 0? ErpStockRecordBizTypeEnum.CHECK_MORE_IN_CANCEL.getType(): ErpStockRecordBizTypeEnum.CHECK_LESS_OUT_CANCEL.getType();}stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(stockCheckItem.getProductId(), stockCheckItem.getWarehouseId(), count,bizType, stockCheckItem.getCheckId(), stockCheckItem.getId(), stockCheck.getNo()));});
前端审核只改状态,不自己算库存。 对应 2.2 的按钮。数量账在服务端入账,避免弹窗和列表各算一次。
async function handleUpdateStatus(row: ErpStockCheckApi.StockCheck,status: number,) {const hideLoading = message.loading({content: `确定{status === 20 ? '审批' : '反审批'}成功`);handleRefresh();} finally {hideLoading();}}
业务类型字典要写进实施备忘:40 盘盈入库、41 盘盈入库(作废)、42 盘亏出库、43 盘亏出库(作废)。报表按这四类过滤,不要和采购入库 混在一句「都是入库」。
四、边界与对照
|
|
|
|
|---|---|---|
|
|
count=实盘−账面 |
|
|
|
|
|
|
|
updateStockCheckStatus |
|
|
|
count==0
|
|
|
|
|
|
|
|
|
|
|
|
asset_stocktake_adjust
|
|
|
|
erp_stock_record |
|
传统「盘点结束直接改库存数字」和本方案的差别:前者改完无单,后者每件盈亏都能从出入库明细跳回盘点单号。
五、快速体验
在线演示:https://ruoyioffice.com/web/(账号 admin / admin123)
-
打开 ERP → 库存管理 → 库存盘点( /erp/stock/check)。 -
新建盘点单,选仓库和产品,确认账面库存是带出来的。 -
把实际库存改成和账面不同,看盈亏数量是否等于实盘减账面。 -
保存后点审批,再到 出入库明细 按单号找 40 或 42。 -
点反审批,确认出现 41 或 43,库存回到审核前。 -
不要去产品库存页手工改余额来「盘平」。 -
固定资产盘点请走资产模块的差异处理单,不要在本页找 Flowable。
源码仓库:GitHub:https://github.com/yuqing2026/ruoyi-office | GitCode:https://gitcode.com/zhouzhongyan/ruoyi-office | Gitee:https://gitee.com/yqzy1688/ruoyi-office
相关阅读:资产盘点差异处理(更正 / 盘亏核销 / 盘盈建卡);和本文一个讲卡片,一个讲件数。
常见问题(FAQ)
ERP 库存盘点为什么没有单独的差异审批单?
物料差异是件数,写在盘点明细的盈亏列就够了。再拆一张 Flowable 单,仓管要点两次、实施要配两套菜单,对数量账没有额外信息。需要单独审批回写的是固定资产卡片,走资产差异处理。
账面和实盘对不上,什么时候库存才会变?
保存盘点单不会变。只有把状态从「未审核」改成「已审核」,并且该行 count≠0 时,才写盘盈或盘亏流水。未审核的差异只是草稿。
反审核会把流水删掉吗?
不会。系统再写一条数量相反、类型为作废的流水。审计要看的是「曾经盘盈过、后来冲回」,不是库存数字自己长回去。
盘平的行会不会也出库一次?
不会。count 与 0 比较相等就 return,不调用 createStockRecord。出入库明细里不应出现数量为 0 的盘点行。
RuoYi Office 的库存盘点可以体验吗?
可以。后端 Spring Boot 3.5 + 前端 Vue3,演示站按上面路径新建一张带盈亏的盘点单并审批即可。完整能力与私有化部署咨询商业版。
结语
物料盘点要保住的是可冲回的流水,不是货架上那个口头数字。账面带来、实盘手填、审核入账、反审核冲回。差异单就是这张盘点单本身,不要为了「看起来更正式」再叠一张空审批。
卡片盘点继续用资产模块的三岔回写。两套对象不要合成一个「万能盘点」。
你们仓库现在是改库存数字盘平,还是已经留下盘点单号?欢迎对一下反审核有没有冲得回来。
💡 想要体验 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 支持一下!

