库存管理机制
来自iDempiere zh
库存管理是ERP的核心功能之一。在这里我们一起探寻 iDempiere 库存管理的机制。
库存管理核心表
库存管理核心的表有两个类别,一类是记录库存事务的 ( Inventory Transaction ),一类是记录库存数量的 ( Storage )。
- M_Transaction:库存事务
- M_StorageOnHand:在手库存
- M_StorageReservation:预留库存
库存管理非核心表
其他表可看成是非核心的,例如 M_InOut, M_Inventory,这些表(以及表背后的窗口、进程)不会直接改变库存事务和库存数量。
- M_InOut:与销售或采购相关的出入库。
- 相关窗口: Shipment ( Customer ) / 发货给客户, Material Receipt / 物料收货, Customer Return / 客户退货, Return to Vender / 退货给供应商
- M_Inventory:内部领用或库存盘点:
- 相关窗口: Internal Use Inventory / 内部领用 , Physical Inventory / 库存实盘
- M_Movement:库存调拨
- 相关窗口:Inventory Move / 库存调拨
需要注意的几点
- ADempiere 记录库存数量只有一张表 m_storage, iDempiere 则拆分成了两张表 M_StorageOnHand, M_StorageReservation,而 m_storage 变成了视图。原因是会导致数据库锁死和预留库存为负。
- 库存事务、库存数量两者非常独立,在数据表、窗口及后台处理上都是分开的,并不是通过库存事务来改变库存数量。换句话说,你在 MTransaction 类里找不到对 MStorageOnHand 类 或 M_StorageReservation 类的调用 。
典型代码示例
package org.compiere.model; /** * Shipment Model */ public class MInOut extends X_M_InOut implements DocAction { MStorageReservation.add(); // 更新预留库存 MStorageOnHand.add(); // 更新在手库存 // 更新库存事务 mtrx = new MTransaction (); mtrx.save(); }