ERP 的流程驱动思维——为什么是”单据链”而不是”表格”
这一篇解释了 ERP 最核心的设计哲学:为什么 ERP 用”单据链”来管理业务,而不是一张 Excel 表格。理解了这个,后续所有模块的学习都会更容易。
一、Excel 能做什么,不能做什么
如果你之前用过 Excel 管理业务,你可能会觉得:“生产了 100 个产品 A,BOM 展开需要钢材 200kg、塑料 50kg,我直接在表格里记一下不就行了?”这当然是可行的。但当业务复杂起来,问题就出现了: 问题 1:数据分散,对不上账
- 生产表格里记了”计划生产 100 个产品 A”
- 采购表格里记了”买了 200kg 钢材”
- 仓库表格里记了”钢材入库 200kg”
- 但财务问”这批采购花了多少钱”,没有人知道
- 采购员可以先下单再补生产计划吗?(不合理,但表格拦不住)
- 仓库可以先把货入库再登记吗?(不合理,但表格拦不住)
- 发现入库的钢材有问题,你想查”这批钢材是哪个采购订单买的、对应哪个生产订单、什么时候到的”——Excel 里要翻好几张表才能拼出答案
- 任何人都能改任何一张表,改错了不知道谁改的、什么时候改的
二、ERP 的”单据链”思维
ERP 的核心设计是:每一笔业务都是一个”单据”,单据之间有上下游关系,形成一条”链”。 以 AperBio ERP 为例:生产订单(MO) ──▶ 生产计划单(MP) ──▶ 采购计划单(PP) ──▶ 请购单(PR) ──▶ 采购订单(PO)
│
▼
到货单(AN) ──▶ 送检单(SI) ──▶ 检验单(QC)
│
┌──────────┴──────────┐
▼ ▼
入库单(GRN) 不合格品单(DEF)
│ │
▼ ▼
出库单(GI) 退货单(RTN)
这条链里的每个环节,都是一个独立的、有状态的、可追溯的单据。
2.1 为什么是”单据”而不是”行”
在 Excel 里,你只需要一行数据:”采购钢材 200kg”。 在 ERP 里,这 200kg 钢材背后是一整套单据链:- 它来自哪个生产订单?
- 对应哪个生产计划单?
- 对应哪个采购计划单?
- 请购单号是什么?
- 采购订单号是什么?
- 供应商是谁?
- 什么时候到的货?
- 送检了吗?检验合格了吗?
- 什么时候入库的?
2.2 单据的三大属性
每个 ERP 单据都有三个核心属性: 属性 1:状态(State)单据有明确的生命周期状态。以采购订单为例:
草稿 → 待审核 → 已审核 → 执行中 → 全部到货 → 关闭
每个状态决定了这张单据能做什么操作、不能做什么操作。草稿态可以修改,已审核态锁定,全部到货后自动关闭。
属性 2:关联(Relation)每张单据都记录”从哪里来”和”到哪里去”。这保证了数据链不断裂:
- 采购订单记录
source_pr_id(来自哪个请购单) - 入库单记录
source_qc_id(来自哪个检验单) - 检验单记录
source_si_id(来自哪个送检单)
下游单据的数量不能超过上游单据的余量。这是 ERP 防止业务失控的核心机制:
采购订单数量 ≤ 请购单数量 - 已采购数量
到货单数量 ≤ 采购订单数量 - 已到货数量
送检数量 ≤ 到货单数量 - 已送检数量
入库数量 ≤ 检验合格数量 - 已入库数量
三、用实例理解”单据链”
假设你是一家生物制药公司的生产计划员,现在要安排生产一批”产品 A”,计划生产 100 个。第 1 步:创建生产订单
你在系统里创建一张生产订单:- 产品:A01-001,产品 A
- 数量:100 个
- BOM 版本:V2.0(系统自动关联)
- 钢材 R01:200kg
- 塑料 R02:51.5kg
- 螺丝 R03:808 个
- 铝材 R04:162.5kg
第 2 步:生成生产计划单
你选中需要计划的物料,生成一张生产计划单:- 生产计划单号:MP-2407-0001
- 关联生产订单:MO-2407-0001
- 物料:钢材 200kg + 塑料 51.5kg + 螺丝 808 个 + 铝材 162.5kg
第 3 步:生成采购计划单
你汇总多个生产计划的需求,生成一张采购计划单:- 采购计划单号:PP-2407-0001
- 关联生产计划单:MP-2407-0001
- 物料:钢材 200kg + 塑料 51.5kg + 螺丝 808 个 + 铝材 162.5kg
第 4 步:生成请购单
采购计划单审核后,你生成请购单:- 请购单号:PR-2407-0001
- 关联采购计划单:PP-2407-0001
- 物料:钢材 200kg + 塑料 51.5kg + 螺丝 808 个 + 铝材 162.5kg
第 5 步:生成采购订单
采购员在请购单上点击”生成采购订单”,系统自动创建:- 采购订单号:PO-2407-0001
- 关联请购单:PR-2407-0001
- 供应商:ABC 供应商
- 物料:钢材 200kg + 塑料 51.5kg + 螺丝 808 个 + 铝材 162.5kg
第 6 步:到货登记
供应商送货来了,仓库收到 200kg 钢材 + 51.5kg 塑料 + 808 个螺丝 + 162.5kg 铝材,登记到货单:- 到货单号:AN-2407-0001
- 关联采购订单:PO-2407-0001
第 7 步:发起送检
仓库管理员审核到货单后,发起送检:- 送检单号:SI-2407-0001
- 关联到货单:AN-2407-0001
第 8 步:执行检验
质检员领取检验任务,执行检验:- 检验单号:QC-2407-0001
- 检验结果:钢材合格 180kg,不合格 20kg;塑料合格 51.5kg;螺丝合格 808 个;铝材合格 162.5kg
第 9 步:入库
仓库管理员基于检验合格的物料创建入库单:- 入库单号:GRN-2407-0001
- 关联检验单:QC-2407-0001
- 钢材入库 180kg,塑料入库 51.5kg,螺丝入库 808 个,铝材入库 162.5kg
- 库存台账自动更新
第 10 步:不合格品处理
不合格品单登记 20kg 不合格钢材,选择”退回供应商”,生成退货单:- 不合格品单号:DEF-2407-0001
- 退货单号:RTN-2407-0001
- 退货数量:20kg,采购订单未到货余量恢复 20kg
第 11 步:闭环
此时这条单据链从生产订单到入库/退货全部走完。你可以在系统里查看完整的链路:MO-2407-0001 → MP-2407-0001 → PP-2407-0001 → PR-2407-0001 → PO-2407-0001
→ AN-2407-0001 → SI-2407-0001 → QC-2407-0001
├── GRN-2407-0001(入库钢材180kg+塑料51.5kg+螺丝808个+铝材162.5kg)
└── DEF-2407-0001 → RTN-2407-0001(退货钢材20kg)
这就是 ERP 的”单据链”思维。 相比 Excel,它保证了:
- 业务有流程约束(不能跳过任何环节)
- 数据有完整追溯(任何一步都能找到上下游)
- 数量有硬约束(不能超额采购/入库)
- 操作有权限控制(不同角色做不同事)
四、”单据链” vs “表格思维” 的核心差异
| 维度 | 表格思维 | 单据链思维 |
|---|---|---|
| 数据组织 | 按科目分类(采购表、库存表、生产表) | 按业务流程组织(一张单据贯穿全链路) |
| 约束机制 | 靠人工自觉(填对了就行) | 靠系统硬约束(状态机 + 数量校验) |
| 追溯能力 | 需要人工关联多张表 | 单据自动携带上游 ID,一键穿透查询 |
| 异常处理 | 发现错误后难以补救 | 支持退货、拒收、冲销、变更等标准异常流程 |
| 权限控制 | 整张表可编辑或不可编辑 | 按角色、按单据状态、按数据范围精细控制 |
五、为什么要理解”单据链”
很多开发者刚开始做 ERP 时,会习惯性地用”表格思维”去设计:“我来建一张表存采购订单,再建一张表存入库单,查询的时候 JOIN 一下不就行了?”这当然能工作,但会带来很多问题:
- 状态怎么管理?(采购订单从创建到关闭有哪些状态?)
- 数量约束怎么做?(如何防止超采?)
- 追溯怎么做?(如何从入库单找到对应的生产订单?)
- 异常怎么处理?(退货、拒收、冲销怎么记录?)
这是「ERP 业务知识系列」第 2 篇,系列共 15 篇。