华为 MetaERP 里说的“本体建模”,不是画 E-R 图,而是用业务本体(OWL 类 + 关系 + 公理 + 规则)把库存域的“概念语义”固化下来,作为库存/成本/财务打通的知识底座。
你问的“本体轮建模”,我按“本体驱动建模的一轮完整闭环”来理解:
概念定义 → 关系编织 → 状态公理 → 事件联动 → 推理校验
下面用“芯片物料采购入库→生产领用→销售出库” 这个具体例子走一遍。
一、库存域本体分层(先定边界)
MetaERP 库存域遵循“量/值/证分离”:
层 | 本体归属 | 管什么 |
|---|---|---|
实物层 | Inventory 本体 | 数量、库位、批次、序列号、状态 |
价值层 | Cost 本体 | 标准价、移动加权价、成本层 |
凭证层 | Accounting 本体 | 科目、分录、暂估 |
本体建模只定义“语义”,不写 SQL。
二、定义本体类(Class)
InventoryItem 库存实物项 Material 物料(主数据) InventoryOrg 库存组织 Subinventory 子库 Locator 货位 Lot 批次 Serial 序列号 OnHandQty 在手量 ReservedQty 预留量 InventoryTxn 库存事务 StockStatus 库存状态枚举示例实例:
Material: MAT-IC-001(5G基带芯片)InventoryOrg: 深圳中央仓Subinventory: 原料合格区Lot: L20260601OnHandQty: 1000pcs
三、定义关系(Object Property)
这是“本体轮”区别于普通表模型的关键:
belongsToItem OnHandQty → Material locatedIn OnHandQty → Locator underOrg Locator → InventoryOrg hasLot OnHandQty → Lot hasStatus OnHandQty → StockStatus generatedBy InventoryTxn → BusinessDoc(采购收货单) changesQty InventoryTxn → OnHandQty reserves ReservedQty → OnHandQty costedBy OnHandQty → CostLayer postsTo InventoryTxn → AccountingEntry关系图示意:
采购收货单 ──generatedBy──> 入库事务 入库事务 ──changesQty──> OnHandQty OnHandQty ──belongsToItem──> 基带芯片 OnHandQty ──locatedIn──> 货位A1 OnHandQty ──hasLot──> L20260601 OnHandQty ──costedBy──> 标准成本层(100元)四、定义公理与约束(本体规则)
用类 OWL + 业务规则表达,不让脏数据进模型:
- 唯一性公理
同一个
(Material, InventoryOrg, Subinventory, Locator, Lot)最多存在一个OnHandQty实例 - 数量守恒公理
∀ OnHandQty: availableQty = onHandQty − reservedQty − frozenQty
- 状态约束
StockStatus=冻结时,不能参与销售出库 - 跨域联动公理
入库事务生成后,必须触发 Cost 本体的成本层更新,并生成暂估凭证
- 可追溯公理
任意 OnHandQty 变更,必须存在至少一条
InventoryTxn作为证据
五、用一个完整业务流跑一轮“本体轮”
场景:采购 1000 片芯片入库,后领用 200 片做生产
① 采购入库(PTP → 库存本体)
- 业务动作:采购订单收货 1000pcs,单价 105 元,标准价 100 元
- 本体变化:
- 新建
OnHandQty(芯片, 深圳仓, 原料区, A1, L20260601) = 1000 - 新建
InventoryTxn(type=接收入库) costedBy挂标准成本层 100 元- 生成
AccountingEntry:借 库存 100,000,借 PPV 5,000,贷 应付暂估 105,000
- 新建
② 生产领用
- 业务动作:车间领 200pcs
- 本体推理:
changesQty扣减 OnHandQty → 800- 生成领用事务,关联成本层
- 自动生成:借 生产成本 20,000,贷 原材料 20,000
- 可用量重算:available = 800 − 0
③ 销售出库(OTC 反向取数)
- 销售订单锁 300pcs → 生成
ReservedQty=300 - 发货后:OnHandQty 变 500,预留释放
- 成本按本体成本层结转 COGS,不再回查采购单
④ 反向追溯(本体优势)
财务问“这 200 片成本怎么来的”
→ 从生产成本凭证反查领用事务→ 反查OnHandQty实例→ 反查入库事务→ 反查采购订单+发票
全链路靠本体关系回溯,不用拼 SQL。
六、本体建模 vs 传统表建模对照
维度 | 传统 INV 表模型 | MetaERP 本体建模 |
|---|---|---|
物料+库位 |
|
|
出入库 | 插事务表 |
|
可用量 | 视图算出来 | 公理推导 |
跨域打通 | ETL 跑批 | 本体关系直接挂 Cost/GL |
AI 使用 | 大模型易幻觉 | 盘古基于本体约束推理 |
七、给你一个可抄的建模模板(库存模块)
# 类 Class: OnHandQty dataProperty: quantity, uom, updateTime objectProperty: belongsToItem, locatedIn, hasLot, costedBy # 规则(DSL伪代码) rule AvailableQty: onHandQty.available = onHandQty.qty - sum(reservedQty) - sum(frozenQty) where onHandQty.hasStatus != "报废" rule TxnMustHaveSource: InventoryTxn ⊑ ∃ generatedBy.BusinessDoc rule InvToCostSync: InventoryTxn(type=入库) → createOrUpdate CostLayer八、实操建议(落地时别踩坑)
- 先建“库存本体”再写微服务,Inventory 服务只消费本体实例
- 实物量归 Inventory 域,别把单价塞进 OnHandQty 表里
- 批次/序列号做成独立类,方便溯源(芯片、设备类必做)
- 状态机(合格/冻结/待检/报废)用枚举类+公理约束,别用字符串字段
- 所有扣减必须走
InventoryTxn,禁止直接 UPDATE 数量