目錄
  1. 一、 進銷存核心業務三部曲
  2. 1. 採購入庫(進)
  3. 2. 庫存管理(存)
  4. 3. 銷售出庫(銷)
  5. 二、 工業級庫存核心資料實體(ER 模型)
  6. 核心資料表職責說明:
  7. 三、 三大核心架構決策
  8. 決策 1:倉庫級管理 vs 貨位級管理
  9. 決策 2:批次管理 vs 批次忽略
  10. 決策 3:零負庫存(Zero Negative Inventory)鐵律
  11. 四、 動態盤點(Cycle Counting)與併發鎖控制
  12. 五、 結語

進銷存與庫存模型從 0 到 1:多組織、批次跟蹤與動態盤點的資料架構設計

在所有 B 端業務系統和企業 ERP 中,進銷存(Purchase-Sales-Inventory) 是當之無愧的動力核心。

無論是紡織製造、服裝成衣、跨國跨境電商,還是通用離散製造,採購、生產與銷售的所有業務流轉,最終都會沉澱為一張張出入庫單據和庫存臺帳的增減變動。

很多初涉 B 端的開發者和產品經理容易將庫存想得過於簡單:認為庫存不過是資料庫裡一個商品表(Item)下的數字欄位 quantity,入庫就 +N,出庫就 -N。

但在真實的工業與商業場景中,這種天真的「單數值模型」會在上線第一天徹底崩潰——面對多倉庫調撥、庫位貨架管理、批次色號追蹤、銷售動態預佔、在途採購以及月中不關停動態盤點,必須構建一套嚴密的、多維度的資料模型與狀態機。

本文基於一線製造業與供應鏈數位化系統的實戰覆盤,系統推導一套工業級進銷存的底層架構。


一、 進銷存核心業務三部曲

業務階段 核心單據與物理狀態流轉
採購入庫(進) 採購合同 ➔ 到貨通知單 ➔ 質檢/驗布 ➔ 入庫單 ➔ 物理庫存增加
庫存營運(存) 庫位對映 ➔ 批次劃分 ➔ 動態調撥 ➔ 盤點凍結 ➔ 呆滯預警
銷售出庫(銷) 銷售訂單 ➔ 鎖庫/預佔 ➔ 揀貨複核 ➔ 出庫單 ➔ 物理與預佔扣減

1. 採購入庫(進)

  • 差異容忍:採購單承諾數量與實際物理到貨數量極少完全一致(如面料米數常因拉伸、磅差出現 ±3% 偏差),系統必須支援「超收比例設定」或「差異生成入庫補單」;
  • 檢驗阻斷:質檢不合格時,貨物進入「待檢暫存區」或「不良品隔離庫」,嚴禁直接進入可用庫存;
  • 批次生成:貨物入庫的瞬間即被打上唯一批次號(Lot/Batch No.),繫結生產日期、供應商批號與物理檢驗報告。

2. 庫存管理(存)

  • 四大核心庫存指標:

    可用庫存 (ATP) = 物理現有庫存 - 鎖定預佔庫存 + 已確認在途庫存

    • 物理庫存 (Physical On-Hand):倉庫地坪上實打實存在的數量;
    • 鎖定預佔 (Allocated/Reserved):已被有效訂單佔用、但尚未打包出庫的數量;
    • 在途庫存 (In-Transit):已向工廠發出採購單/調撥單且已被髮貨、但在路上尚未驗收的數量;
    • 安全庫存 (Safety Stock):根據歷史消耗均值與供貨週期計算的觸發補貨紅線。

可用庫存 ATP 動態狀態機模型

3. 銷售出庫(銷)

  • 併發超賣防禦:下單瞬間必須對物理庫存執行軟鎖定(Soft Allocation),出庫過帳時真正扣減物理庫存並釋放預佔;
  • 核算規則:不同行業適配不同出庫策略——食品與精細化工強制先入先出(FIFO),鋼鐵大件常見後入先出(LIFO),大宗紡織則嚴格按指定批次(Lot-Specific) 出庫。

二、 工業級庫存核心資料實體(ER 模型)

為了支撐複雜的供應鏈流轉,資料庫絕不能只有一張扁平表,通常需要拆解為六張核心表結構:

主實體表 (Parent) 關係基數 關聯實體表 (Child) 核心外部索引鍵與流轉語義
Warehouse(倉庫主表) 1 : N Location(庫區貨位表) 一個物理倉庫劃分多個排架層位
Location(庫區貨位表) 1 : N Stock_OnHand(物理臺帳表) 庫位與物料批次聯合決定物理現存量
Item(物料 SKU 表) 1 : N Item_Batch(批次主表) 同一物料細分不同來料批次與屬性快照
Item_Batch(批次主表) 1 : N Stock_Ledger(進銷存流水) 批次明細單向追加不可篡改流水
Stock_OnHand(即時庫存) 1 : N Stock_Ledger(流水明細帳) 每次物理臺帳變更必然對應一條流水記錄

核心資料表職責說明:

  1. Warehouse(倉庫表):定義物理實體倉(如廣州總倉、紹興坯布倉、越南保稅倉)與虛擬邏輯倉(如在途倉、報廢倉、樣品倉);
  2. Location(庫位表):精細到「排-架-層-位」(如 A-03-02-01),支援路徑最短演算法指引揀貨;
  3. Item_Batch(批次表):記錄該批次物料的屬性快照(缸號、色號、縮水率、檢驗等級、入庫成本價);
  4. Stock_OnHand(即時庫存彙總表):聯合主鍵為 (warehouse_id, location_id, item_id, batch_id),維護當前維度的實物量、預佔量與凍結量;
  5. Stock_Ledger(庫存流水與日記帳):財務審計基石,所有庫存變動必須單向追加寫入(Append-only),禁止對歷史行直接 UPDATE。每一筆變動嚴格記錄關聯業務單號(入庫單、出庫單、調撥單、盤點差異單)。

三、 三大核心架構決策

決策 1:倉庫級管理 vs 貨位級管理

管理模式 適合場景 實施成本 揀貨與發貨效率
倉庫級(Flat) SKU 極少、佔地幾百平米以內的小微倉庫 極低(無需貼條碼與畫線) 嚴重依賴老倉管記憶
貨位級(WMS) SKU 破千、密集立庫、多層貨架 高(需規劃貨位編碼與 PDA 掃碼) 系統計算揀貨路徑,效率提升 60%

實操經驗:在面料與服裝行業,必須精細到貨位。同一款黑色布料,不同染缸出來的色光肉眼極難辨識,一旦放錯位置被錯發,整批成衣將產生嚴重色差災難。

決策 2:批次管理 vs 批次忽略

  • 必須啟用批次:面料印染(缸差)、藥品食品(保質期過期阻斷)、精密電子(元器件來料溯源);
  • 可以忽略批次:標準五金標準件(螺絲、包裝膠帶、通用吊牌紙盒)。
  • 架構底線:批次管理會讓庫存表關聯維度暴增三倍以上,系統應在物料類別層面提供 is_batch_managed 開關,不搞一刀切。

決策 3:零負庫存(Zero Negative Inventory)鐵律

在軟體系統裡,允許庫存扣成負數往往是業務部門「為了圖省事先發貨、後續再補錄入庫」的妥協。

嚴正底線:工業級 ERP 必須在底層強行鎖死「禁止物理負庫存」。

一旦允許負庫存:

  1. 成本核算體系(移動加權平均法)當場失真崩潰;
  2. 排程演算法無法判斷貨物到底在哪個貨位;
  3. 盤點差異將變成一筆無法對帳的無頭公案。

業務上的「緊急借調先發」,系統應當通過建立「應急虛擬倉」或「快速免檢直通入庫單」在 30 秒內補齊單據,而不是在底層放開負數校驗。


四、 動態盤點(Cycle Counting)與併發鎖控制

庫存執行的核心痛點是「帳實不符」。要解決帳實不符,就必須依賴盤點。傳統系統盤點需要「全倉停業封庫三天」,這在現代化快節奏供應鏈中無法被接受。

因此,現代庫存模型必須支援動態分割槽盤點(Dynamic Cycle Counting):

1. 确定盘点范围(指定特定货架或特定物料)
       ↓
2. 发起盘点指令 ➔ 系统记录“盘点基线快照” (Snapshot Quantity)
       ↓
3. 锁定目标货位 ➔ 允许仓库其他区域正常出入库
       ↓
4. PDA 扫码录入实际实物数量
       ↓
5. 计算差异:差异量 = 实盘数量 - (快照数量 + 盘点期间已过账入库 - 盘点期间已过账出库)
       ↓
6. 审核通过 ➔ 自动触发“盘盈入库单”或“盘亏出库单”调账

動態分割槽盤點快照流水對沖機制

通過快照與流水對沖機制,倉庫可以在不關停整體業務的前提下,每天滾動盤點 5% 的高價值貨位,確保年均帳實相符率穩定在 99.5% 以上。


五、 結語

進銷存系統的優雅,從來不在於介面畫得多花哨,而在於底層資料結構面對真實生產現場混亂時的確定性與容錯力。

理清物理庫存、預佔分配與在途承諾的數學邊界,堅持每一筆變更可追溯至不可篡改的日記帳流水,系統才能在日積月累的海量吞吐中,始終充當企業最可信賴的資產底座。