# 正航批號管理功能 Plus（加增儲位版）

> 版本定位：在原本「依批號查庫存」基礎上，**加上「儲位管理」與「異動總帳」**。  
> 資料源：**正航 ERP（MSSQL）** + **本地儲位資料庫（SQLite）**。

---

## 一、系統目標

- 以 **SKU（ProdID）＋批號（BatchID）** 為主軸查詢庫存。
- 僅顯示 **庫存數量 &gt; 0** 且 **排除倉庫 B（WareID &lt;&gt; 'B'）** 的批號。
- 透過 **SQLite** 擴充「儲位（Location）」管理，並提供：
    
    
    - 儲位新增 / 編輯 / 刪除
    - 儲位庫存異動單（暫存 → 執行）
    - 異動總帳（Inventory Ledger）追蹤每筆更動

---

## 二、系統架構

### 1) 後端

- **Flask**（port：`5202`）
- **MSSQL（正航 ERP）**：查 SKU/批號/數量/日期
    
    
    - 主要表：`comProduct`、`comBatchAmount`
    - 查詢條件：`BCQty > 0` 且 `WareID <> 'B'`
- **SQLite（本地儲位資料庫）**：儲位與異動紀錄
    
    
    - `batch_locations`：儲位主表（以 `prod_id + batch_id + location` 唯一）
    - `inventory_ledger`：儲位庫存異動總帳

### 2) 前端頁面（Jinja2 模板）

- `/`：依商品關鍵字查批號庫存（含各批號的儲位清單）
- `/locations`：儲位管理（可切換以「商品」或「儲位」關鍵字查）
- `/transfer_slip`：異動單檢視（暫存清單）
- `/history`：異動總帳查詢
- `/edit_location/<id>`：儲位編輯頁

---

## 三、資料表（SQLite）

### 1) `batch_locations`

<div class="_tableContainer_sk2ct_1" id="bkmrk-%E6%AC%84%E4%BD%8D-%E5%9E%8B%E5%88%A5-%E8%AA%AA%E6%98%8E-id-integer-"><div class="_tableWrapper_sk2ct_13 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1237" data-start="964"><thead data-end="980" data-start="964"><tr data-end="980" data-start="964"><th data-col-size="sm" data-end="969" data-start="964">欄位</th><th data-col-size="sm" data-end="974" data-start="969">型別</th><th data-col-size="sm" data-end="980" data-start="974">說明</th></tr></thead><tbody data-end="1237" data-start="995"><tr data-end="1023" data-start="995"><td data-col-size="sm" data-end="1000" data-start="995">id</td><td data-col-size="sm" data-end="1013" data-start="1000">INTEGER PK</td><td data-col-size="sm" data-end="1023" data-start="1013">儲位記錄主鍵</td></tr><tr data-end="1062" data-start="1024"><td data-col-size="sm" data-end="1034" data-start="1024">prod\_id</td><td data-col-size="sm" data-end="1041" data-start="1034">TEXT</td><td data-col-size="sm" data-end="1062" data-start="1041">SKU（對應正航 `ProdID`）</td></tr><tr data-end="1102" data-start="1063"><td data-col-size="sm" data-end="1074" data-start="1063">batch\_id</td><td data-col-size="sm" data-end="1081" data-start="1074">TEXT</td><td data-col-size="sm" data-end="1102" data-start="1081">批號（對應正航 `BatchID`）</td></tr><tr data-end="1137" data-start="1103"><td data-col-size="sm" data-end="1114" data-start="1103">location</td><td data-col-size="sm" data-end="1121" data-start="1114">TEXT</td><td data-col-size="sm" data-end="1137" data-start="1121">儲位（例：A20-1-1）</td></tr><tr data-end="1173" data-start="1138"><td data-col-size="sm" data-end="1149" data-start="1138">quantity</td><td data-col-size="sm" data-end="1159" data-start="1149">INTEGER</td><td data-col-size="sm" data-end="1173" data-start="1159">此儲位現有量（可為空）</td></tr><tr data-end="1196" data-start="1174"><td data-col-size="sm" data-end="1183" data-start="1174">remark</td><td data-col-size="sm" data-end="1190" data-start="1183">TEXT</td><td data-col-size="sm" data-end="1196" data-start="1190">備註</td></tr><tr data-end="1237" data-start="1197"><td data-col-size="sm" data-end="1210" data-start="1197">created\_at</td><td data-col-size="sm" data-end="1222" data-start="1210">TIMESTAMP</td><td data-col-size="sm" data-end="1237" data-start="1222">建立時間（預設 NOW）</td></tr></tbody></table>

</div></div>> **外鍵**：`FOREIGN KEY(location_id) REFERENCES batch_locations(id) ON DELETE CASCADE`

---

## 四、主要業務規則

1. **ERP 查詢條件**
    
    
    - 只抓 **庫存 &gt; 0（`BCQty > 0`）** 的批號
    - 排除倉庫 **B**（`WareID <> 'B'`）
    - 只顯示欄位：SKU(ProdID)、品名規格(ProdName)、批號(BatchID)、倉庫(WareID)、數量(BCQty)、製造日期(ProduceDate)、有效期限(ValidDate)
2. **儲位管理**
    
    
    - 新增儲位：若同 SKU+批號+儲位 不存在，建立記錄；若有初始量會同時寫入總帳（`INITIAL_STOCK`）。
    - 編輯儲位：若**數量變動**，寫入總帳（`MANUAL_EDIT`）。
    - 刪除儲位：僅允許**庫存=0** 時刪除，否則阻擋。
3. **異動單（Transfer Slip）**
    
    
    - 可從搜尋結果將儲位加入「待處理異動」。
    - 執行異動時，每筆會：
        
        
        - 驗證目前量是否足夠扣減
        - 更新儲位量、寫入總帳（`TRANSFER_DEDUCTION`）
        - 產生參考單號：`MV-YYYYMMDDHHMMSS`
4. **總帳（Ledger）**
    
    
    - 任何造成儲位量變化的操作都寫入此表。
    - 可於 `/history` 依時間序檢視。