目錄

在所有 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):根據歷史消耗均值與供貨週期計算的觸發補貨紅線。

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(流水明細帳) |
每次物理臺帳變更必然對應一條流水記錄 |
核心資料表職責說明:
Warehouse(倉庫表):定義物理實體倉(如廣州總倉、紹興坯布倉、越南保稅倉)與虛擬邏輯倉(如在途倉、報廢倉、樣品倉);Location(庫位表):精細到「排-架-層-位」(如A-03-02-01),支援路徑最短演算法指引揀貨;Item_Batch(批次表):記錄該批次物料的屬性快照(缸號、色號、縮水率、檢驗等級、入庫成本價);Stock_OnHand(即時庫存彙總表):聯合主鍵為(warehouse_id, location_id, item_id, batch_id),維護當前維度的實物量、預佔量與凍結量;Stock_Ledger(庫存流水與日記帳):財務審計基石,所有庫存變動必須單向追加寫入(Append-only),禁止對歷史行直接 UPDATE。每一筆變動嚴格記錄關聯業務單號(入庫單、出庫單、調撥單、盤點差異單)。
三、 三大核心架構決策
決策 1:倉庫級管理 vs 貨位級管理
| 管理模式 | 適合場景 | 實施成本 | 揀貨與發貨效率 |
|---|---|---|---|
| 倉庫級(Flat) | SKU 極少、佔地幾百平米以內的小微倉庫 | 極低(無需貼條碼與畫線) | 嚴重依賴老倉管記憶 |
| 貨位級(WMS) | SKU 破千、密集立庫、多層貨架 | 高(需規劃貨位編碼與 PDA 掃碼) | 系統計算揀貨路徑,效率提升 60% |
實操經驗:在面料與服裝行業,必須精細到貨位。同一款黑色布料,不同染缸出來的色光肉眼極難辨識,一旦放錯位置被錯發,整批成衣將產生嚴重色差災難。
決策 2:批次管理 vs 批次忽略
- 必須啟用批次:面料印染(缸差)、藥品食品(保質期過期阻斷)、精密電子(元器件來料溯源);
- 可以忽略批次:標準五金標準件(螺絲、包裝膠帶、通用吊牌紙盒)。
- 架構底線:批次管理會讓庫存表關聯維度暴增三倍以上,系統應在物料類別層面提供
is_batch_managed開關,不搞一刀切。
決策 3:零負庫存(Zero Negative Inventory)鐵律
在軟體系統裡,允許庫存扣成負數往往是業務部門「為了圖省事先發貨、後續再補錄入庫」的妥協。
嚴正底線:工業級 ERP 必須在底層強行鎖死「禁止物理負庫存」。
一旦允許負庫存:
- 成本核算體系(移動加權平均法)當場失真崩潰;
- 排程演算法無法判斷貨物到底在哪個貨位;
- 盤點差異將變成一筆無法對帳的無頭公案。
業務上的「緊急借調先發」,系統應當通過建立「應急虛擬倉」或「快速免檢直通入庫單」在 30 秒內補齊單據,而不是在底層放開負數校驗。
四、 動態盤點(Cycle Counting)與併發鎖控制
庫存執行的核心痛點是「帳實不符」。要解決帳實不符,就必須依賴盤點。傳統系統盤點需要「全倉停業封庫三天」,這在現代化快節奏供應鏈中無法被接受。
因此,現代庫存模型必須支援動態分割槽盤點(Dynamic Cycle Counting):
1. 确定盘点范围(指定特定货架或特定物料)
↓
2. 发起盘点指令 ➔ 系统记录“盘点基线快照” (Snapshot Quantity)
↓
3. 锁定目标货位 ➔ 允许仓库其他区域正常出入库
↓
4. PDA 扫码录入实际实物数量
↓
5. 计算差异:差异量 = 实盘数量 - (快照数量 + 盘点期间已过账入库 - 盘点期间已过账出库)
↓
6. 审核通过 ➔ 自动触发“盘盈入库单”或“盘亏出库单”调账

通過快照與流水對沖機制,倉庫可以在不關停整體業務的前提下,每天滾動盤點 5% 的高價值貨位,確保年均帳實相符率穩定在 99.5% 以上。
五、 結語
進銷存系統的優雅,從來不在於介面畫得多花哨,而在於底層資料結構面對真實生產現場混亂時的確定性與容錯力。
理清物理庫存、預佔分配與在途承諾的數學邊界,堅持每一筆變更可追溯至不可篡改的日記帳流水,系統才能在日積月累的海量吞吐中,始終充當企業最可信賴的資產底座。