库存管理机制

来自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(); 
}