制造业进销存系统架构演进:库存一致性与多仓协同设计
制造业进销存系统的核心挑战不是"记录"而是"一致性保证"。
记录采购入库和销售出库谁都能做,但保证库存数据准确、口径一致、流程可追溯才是真正的设计难点。当SKU从800增长到5000、仓库从一个扩展到三个时,单表直算式库存(入库减出库)的并发漏洞和追溯缺陷会集中爆发。
本文从系统设计角度,回顾制造业进销存系统三年间三个版本的演进过程:
- V1单表直算的并发安全问题
- V2单据驱动的性能瓶颈(百万级单据查询性能急剧下降)
- V3按领域拆分的库存核心服务架构(统一API:增加、锁定、释放、扣减)
重点讨论库存一致性方案(锁定机制+乐观锁双保险、部分到货处理、多仓调拨在途库存)和成本核算三种方式的实现。
引言:一套"草台班子"系统的诞生
三年前我们工厂刚上ERP时,进销存模块是最不被重视的部分。老板觉得采购、销售、库存这些事Excel也能管,没必要搞复杂。于是最初的进销存就是几个简单的增删改查页面——采购入库录一张单,销售出库录一张单,库存就是入库减出库。
这套草台班子系统跑了不到一年就撑不住了。SKU从800个涨到5000个,仓库从一个变三个,供应商从50家变成200家。
问题集中爆发:
- 库存数字永远不准,采购部看系统说有货结果仓库找不到
- 销售部下单了发现仓库实际数量不够
- 月底盘点差异率高达15%,财务对账成了一场噩梦
回头看,最大的教训是:进销存系统的核心不是"记录"而是"一致性保证"。记录谁都会做,但保证数据准确、口径一致、流程可追溯才是真正的挑战。
系统架构的三个版本
V1:单表直算——天真到不可原谅
最初的库存逻辑就是一张库存表,字段包括SKU编号、仓库、数量。每次入库加数量,出库减数量。没有事务控制,没有并发保护,没有单据状态管理。
结果就是一旦并发操作或者程序异常中断,库存数字就错了,而且查都查不出来错在哪里。
这个版本用了半年就被推翻了。教训是:永远不要用"直接改数字"的方式管理库存,必须通过单据驱动,每笔变动都有来源单据可追溯。
V2:单据驱动——基本可用但扩展性差
第二版引入了完整的单据体系:采购入库单、销售出库单、生产领料单、成品入库单、调拨单、盘点单、退货单。每张单据走"新建-审核-过账"三步流程,过账时更新库存。库存变动有了完整的单据链路,追溯不再困难。
但这个版本有个致命问题:所有单据存在同一张表里,用document_type区分类型。随着业务增长单据量暴增到百万级,查询性能急剧下降。而且不同单据的字段差异很大,硬塞在一张表里要么字段冗余要么不够用。
V3:按领域拆分——终于像样了
第三版按业务领域拆分为独立的单据模块,每个模块有自己的表结构和业务逻辑,但共享同一套库存核心服务。
库存服务对外提供统一的API:
- 增加库存
- 锁定库存
- 释放锁定
- 扣减库存
所有单据模块调用这些API操作库存,库存变动全部记录在独立的库存流水表中。
这套架构运行了一年多,库存准确率从85%提升到99.5%以上,而且扩展性很好。新增一种业务类型只需要新建一个单据模块,调用库存API就行,核心逻辑完全不用动。
核心数据模型设计
库存主表inventory_main设计是整个系统的心脏。
字段包括SKU编号、仓库编号、现有库存量、锁定库存量、可用库存量(等于现有减锁定)、安全库存量、最大库存量。每次库存变动同时更新现有库存和库存流水,这两个操作在同一个数据库事务中完成,保证原子性。
库存流水表inventory_transaction记录每一笔变动的完整信息:
- 关联单据类型、单据编号
- 变动前库存、变动数量、变动后库存
- 操作人、操作时间
- 变动类型(入库出库调拨盘点调整)
有了变动前和变动后数量,审计时可以完整还原任何时刻的库存状态。
单据拆分方面,采购入库、销售出库、生产领料等各有独立的表结构。这些表共享一些设计模式:都有单头(单号、日期、供应商或客户、总金额)和明细(SKU、数量、单价、小计),单头和明细是主从关系,明细表通过单据编号关联。
库存一致性:最难的设计挑战
库存一致性是进销存系统的命脉,也是我们踩坑最多的地方。
并发锁定问题:两个销售员同时查到某SKU有100个库存,各下了80个的订单,超卖了。解决方案是引入库存锁定机制——下单时先锁定库存(锁定量增加、可用量减少),出库时将锁定转为实际扣减。锁定操作用数据库行锁加乐观锁双保险,并发冲突时重试三次,仍失败则提示库存不足。
部分到货问题:采购单下了1000个零件,供应商分三批到货。每次到货做部分入库,部分入库不影响采购单的整体状态。系统维护每个采购单的已收数量、待收数量,全部收齐自动关闭。如果供应商少发,需要做差异处理——要么催补要么按实际收货结算。
多仓调拨的在途库存:A仓调拨100个到B仓,A仓出库时减库存,但B仓还没收到。这100个就是"在途库存",既不在A仓也不在B仓。我们在库存主表增加了在途库存字段,调拨出库时A仓减库存同时在途增加,调拨入库时B仓加库存同时在途减少。
成本核算:被低估的复杂度
进销存不只是管数量,还要管金额。同一个SKU不同批次采购价格可能不同,发出时按什么价格算成本?
我们实现了三种成本核算方式:
- 先进先出(FIFO):标准件用
- 加权平均:大部分原材料用
- 指定批次:精密零部件用(可追溯)
成本核算的核心是每次入库记录实际采购成本(含运费分摊、关税等),出库时按核算方式自动计算成本。系统维护每个SKU的成本明细账,每一笔入库出库都更新账面成本。
月底结账时财务可以一键导出进销存报表,和总账对账差异控制在万分之一以内。
几条实战经验
数据清洗比想象中重要得多。 上系统前必须把物料主数据清洗干净——同一个零件不能有两个编码,规格描述要统一,单位要统一。我们花了整整一个月做数据清洗,过程中发现了大量重复编码和错误数据。如果不做这一步,系统上线就是灾难。
报表要提前设计。 业务部门用的报表不是技术部门想象的报表。我们犯过的错是按自己理解的口径做了报表,结果业务说不对。正确做法是把业务部门现有的Excel报表全部收集起来,逐一在系统里实现,然后再优化。
搭贝低代码平台在搭建采购审批和库存查询界面时帮了大忙,业务人员参与设计的过程比预期顺利很多。
常见问题
Q1:低代码搭建进销存系统要多久?
搭贝低代码搭建进销存系统,采购管理、销售管理、库存管理核心模块2到3周上线。完整的多仓调拨、成本核算、供应商管理,整体约1到2个月。
关键是前期的数据清洗和流程梳理不要省,这部分花的时间往往比开发还长。
Q2:进销存和ERP是什么关系?
进销存是ERP的核心模块之一,小企业可以只上进销存不加完整ERP。但如果涉及生产计划(MRP)、车间管理、质量管控,就需要完整的ERP系统。
进销存和ERP共享物料主数据和供应商客户主数据,接口设计要提前规划好。
Q3:库存总是不准怎么办?
库存不准通常有三个原因:
- 单据录入不及时导致账实不同步
- 没有库存锁定机制导致超卖
- 盘点差异没有及时处理
这三个问题互相加剧,形成恶性循环。建议引入每日循环盘点机制——系统每天自动抽取20到30个SKU进行盘点,一个月覆盖全部SKU,差异当天查清。
Q4:多仓库怎么管理库存分配?
系统需要支持仓库级别的库存独立管理,同时提供全局库存视图。销售下单时系统按规则推荐发货仓库——优先从有库存的最近仓库发货。
调拨在途库存单独标识不影响可用库存计算,确保不会重复分配。
Q5:进销存系统的并发性能要求高吗?
中等规模制造企业(年产值1亿以下)日单据量通常在几百到一两千张,对数据库并发要求不高。日常操作完全可以用单机数据库搞定。
但月底结账和批量盘点时会有集中操作,建议数据库做读写分离,报表查询走从库不影响主库写入性能。
Q6:供应商管理需要哪些功能?
核心是:
- 供应商档案管理(资质、联系方式、付款条件)
- 报价管理(历史报价记录和比价)
- 交付评价(准时率、合格率、响应速度)
- 应付账款管理
其中报价管理和交付评价是最有价值的两个模块。好的供应商管理能帮采购降本5%到10%,主要是通过比价和供应商竞争实现的。
Q7:系统上线后最需要注意什么?
前三个月是磨合期,最需要注意的是数据质量和用户习惯。
建议安排专人每天检查关键数据——库存差异率、单据完整率、录入及时率。发现问题立即修正不要拖延。用户使用上要确保所有操作走系统不走线下,否则系统数据永远是滞后的。
Q8:进销存需要做数据看板吗?
非常需要。核心看板指标包括:
- 库存周转率
- 呆滞库存占比
- 缺货率
- 采购及时率
- 销售毛利分析
这些数据以前藏在Excel里没人看,系统化之后成了管理层决策的重要依据。建议按角色定制看板——老板看经营数据,采购看供应商和到货情况,仓库看库存异常。
关于架构设计的一些反思
回头看这三年的进销存系统演进,最重要的架构决策其实只有一个:把库存操作和单据管理彻底解耦。
早期版本把库存计算逻辑写在各个单据模块里(采购入库改库存、销售出库改库存),导致每加一种新单据类型就要动库存逻辑,代码耦合严重,修改一处影响全局。
V3版本的核心改进是引入了库存服务层。所有库存操作——增加、锁定、释放、扣减——都通过库存服务的统一接口完成。单据模块只管自己的业务逻辑(比如采购入库单管供应商、收货、质检),库存变动统一调用库存服务。
这样库存逻辑只有一处实现,正确性有保障,单据模块也可以自由扩展互不影响。
如果让我重新来过,我会从第一天就用这个架构。不要因为"现在业务简单没必要"就跳过分层设计,因为业务迟早会变复杂,到时重构的成本远大于一开始就做对。

浙公网安备 33010602011771号