# 廠務

# 🌡️ 溫度監控與警報系統

## 📌 功能簡介

此專案透過 Flask 網站 + SQLite 資料庫，定時從 **210.62.179.209/Data.txt** 抓取冷凍冷藏室的即時溫度，並具備 **超標警報與 Gmail API 通知功能**。  
同時支援歷史查詢、Excel 匯出與排程紀錄。

---

## 🔧 系統架構

- **語言**：Python + Flask
- **資料庫**：SQLite (`temperatures.db`)
- **功能模組**：
    
    
    - `requests`：抓取即時溫度
    - `schedule` + `threading`：背景定時任務
    - `pandas`：Excel 匯出
    - `googleapiclient`：Gmail API 寄送通知
- **服務監控點**：
    
    
    - 1F前室
    - 魚翅保存庫
    - 原物料保存庫
    - 成品保存庫
    - 急速冷凍室
    - 製成品預冷室
    - 2F冷藏室
    - 3F冷藏室

---

## 📑 功能說明

### 1. 定時紀錄與警報

- 每 10 分鐘自動抓取一次溫度數據並存入資料庫。
- 若溫度高於設定值（排除除霜時段），會透過 Gmail API 發送異常警報。
- 記錄冷卻時間 (`alert_cooldown_hours`)，避免重複通知。

### 2. 設定檔 (`config.json`)

```json
{
  "notifications": {
    "enabled": true,
    "sender": "zfuntw@gmail.com",
    "recipients": ["example@mail.com"],
    "alert_cooldown_hours": 3
  },
  "temperature_settings": {
    "1F前室": {"enabled": true, "threshold": 10, "defrost_hours": [3, 15]},
    "魚翅保存庫": {"enabled": true, "threshold": -5, "defrost_hours": []}
  }
}
```

### 3. 前端介面

- `/` 即時監控頁面，顯示當前溫度
- `/history` 歷史紀錄查詢，可篩選日期區間
- `/export_excel` 將指定日期區間匯出 Excel
- `/settings` 設定通知收件人、警報值與除霜時段

### 4. Gmail API 通知

- 使用 `token.json` 儲存授權憑證。
- 異常時寄送 Email 通知指定人員。

### 5. 簡易版資料採集程式

另附加 `get_temperature_data` 腳本：

- 每 10 秒抓取一次溫度資料
- 僅儲存前 4 筆溫度數據至資料庫

---

## 📂 資料表結構

`temperatures`

<div class="_tableContainer_16hzy_1" id="bkmrk-%E6%AC%84%E4%BD%8D-%E8%AA%AA%E6%98%8E-id-%E4%B8%BB%E9%8D%B5-timestam"><div class="_tableWrapper_16hzy_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1705" data-start="1421"><thead data-end="1432" data-start="1421"><tr data-end="1432" data-start="1421"><th data-col-size="sm" data-end="1426" data-start="1421">欄位</th><th data-col-size="sm" data-end="1432" data-start="1426">說明</th></tr></thead><tbody data-end="1705" data-start="1449"><tr data-end="1460" data-start="1449"><td data-col-size="sm" data-end="1454" data-start="1449">id</td><td data-col-size="sm" data-end="1460" data-start="1454">主鍵</td></tr><tr data-end="1481" data-start="1461"><td data-col-size="sm" data-end="1473" data-start="1461">timestamp</td><td data-col-size="sm" data-end="1481" data-start="1473">紀錄時間</td></tr><tr data-end="1508" data-start="1482"><td data-col-size="sm" data-end="1500" data-start="1482">temp\_front\_room</td><td data-col-size="sm" data-end="1508" data-start="1500">1F前室</td></tr><tr data-end="1535" data-start="1509"><td data-col-size="sm" data-end="1526" data-start="1509">temp\_shark\_fin</td><td data-col-size="sm" data-end="1535" data-start="1526">魚翅保存庫</td></tr><tr data-end="1566" data-start="1536"><td data-col-size="sm" data-end="1556" data-start="1536">temp\_raw\_material</td><td data-col-size="sm" data-end="1566" data-start="1556">原物料保存庫</td></tr><tr data-end="1600" data-start="1567"><td data-col-size="sm" data-end="1591" data-start="1567">temp\_finished\_product</td><td data-col-size="sm" data-end="1600" data-start="1591">成品保存庫</td></tr><tr data-end="1631" data-start="1601"><td data-col-size="sm" data-end="1622" data-start="1601">temp\_blast\_freezer</td><td data-col-size="sm" data-end="1631" data-start="1622">急速冷凍室</td></tr><tr data-end="1665" data-start="1632"><td data-col-size="sm" data-end="1655" data-start="1632">temp\_precooling\_room</td><td data-col-size="sm" data-end="1665" data-start="1655">製成品預冷室</td></tr><tr data-end="1685" data-start="1666"><td data-col-size="sm" data-end="1676" data-start="1666">temp\_2f</td><td data-col-size="sm" data-end="1685" data-start="1676">2F冷藏室</td></tr><tr data-end="1705" data-start="1686"><td data-col-size="sm" data-end="1696" data-start="1686">temp\_3f</td><td data-col-size="sm" data-end="1705" data-start="1696">3F冷藏室</td></tr></tbody></table>

</div></div>## ▶️ 啟動方式

```bash
python app.py
```

網站預設服務於  
👉 [https://temp.zfun.com.tw/login](https://temp.zfun.com.tw/login)

---

## ⚠️ 注意事項

- 需先完成 Gmail API OAuth 授權並放置 `token.json`。
- 除霜時間需在設定檔中明確設定，避免誤報。
- 若無法連線 `210.62.179.209`，會回傳空值並略過紀錄。

# 冷凍倉儲管理系統

本系統為一套以 **Flask + SQLite** 為基礎開發的冷凍倉儲管理系統，支援產品管理、庫存進出、位置視覺化與資料匯出入等功能，適合中小型冷鏈倉儲作業使用。

### 系統功能簡述

#### 📦 商品管理

- 新增 / 編輯 / 查詢商品（SKU、品名、分類、備註）
- 匯入/匯出商品資料（CSV）

#### 📍 倉儲位置管理

- 建立儲位資料（名稱、描述）
- 支援位置編碼格式解析（如：冷凍A區-A1-L1-前）

#### 🧊 庫存管理

- 入庫（新增批號或補貨至既有批號）
- 出庫（支援多批次出貨，加入出庫車、建立出庫單）
- 庫存轉移（不同儲位間移動批號）

#### 📑 出庫單管理

- 建立 / 檢視 / 確認 / 取消出庫單
- 出庫時自動更新庫存數量

#### 📊 倉儲視覺化

- 依照區域 → 區段 → 層 → 子區 顯示各儲位庫存狀況
- 支援位置階層資料視覺化呈現

#### 🔍 商品定位查詢

- 透過 SKU 或品名查詢現有庫存與對應儲位

#### 🧪 API 提供

- `/api/location_inventory/<location_id>`：查詢指定儲位之商品庫存清單（JSON 格式）

---

### 使用技術

- **後端**：Flask + SQLAlchemy
- **資料庫**：SQLite
- **前端樣板**：Jinja2 + HTML/CSS
- **Session 控制**：Flask Session（儲存出庫購物車）
- **檔案處理**：CSV 匯入/匯出功能

# 正航依批號查詢庫存及倉儲管理系統 API 介接

## 功能概述

本系統整合 **正航 ERP** 與 **倉儲管理系統 (WMS)**，提供以 **產品 SKU 與批號** 為基準的庫存查詢與儲位管理。

透過 Web 介面與 API，可快速查詢指定商品的批號、庫存數量及所在倉庫，並同步連接倉儲系統取得實際儲位資訊。

---

## 查詢來源

- **資料庫：正航 ERP (MSSQL)**
    
    
    - 表格：`comProduct`、`comBatchAmount`
    - 條件：`BCQty > 0` 且 `WareID <> 'B'`
- **外部 API：倉儲管理系統**
    
    
    - URL: `https://stock.zfun.com.tw/wp-json/batch/v1/get-pallet`
    - 參數：
        
        
        - `sku`: 商品代號 (ProdID)
        - `batch_number`: 批號 (BatchID)

---

## 前台查詢顯示欄位

<div class="_tableContainer_sk2ct_1" id="bkmrk-%E6%AC%84%E4%BD%8D%E5%90%8D%E7%A8%B1-%E8%AA%AA%E6%98%8E-sku-%E5%95%86%E5%93%81%E4%BB%A3%E8%99%9F-%28pr"><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="843" data-start="543"><thead data-end="566" data-start="543"><tr data-end="566" data-start="543"><th data-col-size="sm" data-end="552" data-start="543">欄位名稱</th><th data-col-size="sm" data-end="566" data-start="552">說明</th></tr></thead><tbody data-end="843" data-start="597"><tr data-end="627" data-start="597"><td data-col-size="sm" data-end="610" data-start="597">SKU</td><td data-col-size="sm" data-end="627" data-start="610">商品代號 (ProdID)</td></tr><tr data-end="656" data-start="628"><td data-col-size="sm" data-end="637" data-start="628">品名規格</td><td data-col-size="sm" data-end="656" data-start="637">產品名稱 (ProdName)</td></tr><tr data-end="684" data-start="657"><td data-col-size="sm" data-end="668" data-start="657">批號</td><td data-col-size="sm" data-end="684" data-start="668">批號 (BatchID)</td></tr><tr data-end="713" data-start="685"><td data-col-size="sm" data-end="696" data-start="685">倉庫</td><td data-col-size="sm" data-end="713" data-start="696">倉庫代號 (WareID)</td></tr><tr data-end="741" data-start="714"><td data-col-size="sm" data-end="725" data-start="714">數量</td><td data-col-size="sm" data-end="741" data-start="725">庫存數量 (BCQty)</td></tr><tr data-end="773" data-start="742"><td data-col-size="sm" data-end="751" data-start="742">製造日期</td><td data-col-size="sm" data-end="773" data-start="751">生產日期 (ProduceDate)</td></tr><tr data-end="803" data-start="774"><td data-col-size="sm" data-end="783" data-start="774">有效期限</td><td data-col-size="sm" data-end="803" data-start="783">有效日期 (ValidDate)</td></tr><tr data-end="843" data-start="804"><td data-col-size="sm" data-end="815" data-start="804">儲位</td><td data-col-size="sm" data-end="843" data-start="815">來自倉儲系統 API 的 location 清單</td></tr></tbody></table>

</div></div>## API 介接說明

### 1. ERP 批號查詢 API

- **路由**：`GET /api/sku/<sku>`
- **回傳格式**：

```json
{
  "SKU001": [
    {
      "no": "20250801",
      "inbound_date": "2025-08-01",
      "expiry_date": "2026-08-01",
      "quantity": 100
    }
  ]
}
```

### 2. 倉儲儲位查詢 API

- **外部 API URL**：

```json
{
  "success": true,
  "data": [
    {
      "product_name": "烏骨雞1.1-1.2K(12隻/箱)",
      "sku": "R07-001-00",
      "batch_number": "20250730",
      "pallet_number": "20250730132412",
      "quantity": 600,
      "unit": "隻",
      "location": "B11-1-1"
    }
  ]
}
```

- **整合顯示**：

```
B11-1-1
B11-1-2
B11-1-3
```

---

## 系統流程

1. 使用者輸入 **SKU 或產品名稱**。
2. 系統從 **正航 ERP** 查詢符合條件的批號與庫存。
3. 針對每一個批號，系統再呼叫 **WMS API**，取得儲位資訊。
4. 前端頁面自動列出 **庫存與儲位對應清單**。

---

## 注意事項

- 倉庫代號 `B` 不列入查詢。
- 僅顯示 **庫存數量大於 0** 的批號。
- 儲位資訊完全由 **外部倉儲管理系統 API** 提供。
- 建議設定 API timeout 機制，避免查詢卡死。

---

# 正航批號管理功能 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` 依時間序檢視。