first commit

This commit is contained in:
2025-12-30 15:03:19 +08:00
commit c735c36009
902 changed files with 83591 additions and 0 deletions

View File

@@ -0,0 +1,245 @@
# 安全庫存設定頁面 - 功能規格文件
## 頁面概述
單一倉庫為單位管理各商品的安全庫存量。初版使用 mock data 呈現,不涉及實際 API 串接。
## 頁面定位
- 路徑:`/safety-stock`
- 標題:`[倉庫名稱] 安全庫存設定`例如A 倉庫 安全庫存設定)
- 僅顯示該倉庫中「曾有庫存紀錄的商品」
---
## 頁面架構
### 1. 頂部區塊
#### 1.1 標題與說明
- **倉庫名稱**顯眼標題h1
- **說明文字**:「僅顯示本倉庫曾有庫存紀錄的商品。安全庫存用於判斷庫存不足與缺貨提醒。」
#### 1.2 搜尋欄位
- 輸入框:可搜尋商品名稱、商品編號或條碼
- 圖標搜尋圖標Search icon
- Placeholder「搜尋商品名稱、商品編號或條碼」
#### 1.3 篩選條件
下拉選單,包含以下選項:
- **全部商品**:顯示所有商品(預設)
- **已設定安全庫存**:只顯示 `safetyStock !== null` 的商品
- **有異常狀態**:只顯示「低於安全庫存」或「缺貨」狀態的商品
---
### 2. 列表區塊
#### 2.1 表格欄位
| 欄位名稱 | 說明 | 資料型態 | 顯示範例 |
|---------|------|---------|---------|
| 商品名稱 | 商品的名稱 | 文字 | 高筋麵粉 |
| 商品編號 | 商品的編號 | 文字 | P001 |
| 目前庫存 | 此倉庫的庫存數量 + 單位 | 數字 + 單位 | 150 kg |
| 安全庫存量 | 設定的安全庫存數量 | 數字 + 單位 或 "—" | 50 kg / — |
| 狀態 | 依據規則計算的狀態 | Badge | 正常 / 低於安全庫存 / 缺貨 / 未設定 |
| 操作 | 操作按鈕 | 按鈕 | 設定outline button |
#### 2.2 狀態計算規則
```
未設定safetyStock === null
正常safetyStock !== null && currentStock >= safetyStock
低於安全庫存safetyStock !== null && currentStock > 0 && currentStock < safetyStock
缺貨currentStock === 0 && safetyStock !== null
```
#### 2.3 狀態顏色
- **未設定**:灰色 Border Badge
- **正常**:綠色 Border Badge
- **低於安全庫存**:琥珀色 Border Badge
- **缺貨**:紅色 Border Badge
#### 2.4 特性
- 表格中的欄位全部為**唯讀**狀態
- **不提供** inline 編輯功能
- 所有修改必須透過「設定」按鈕開啟彈窗完成
---
### 3. 安全庫存設定彈窗Modal
#### 3.1 觸發方式
使用者點擊表格某一列的「設定」按鈕
#### 3.2 彈窗標題
```
設定安全庫存 [商品名稱][倉庫名稱]
```
範例:`設定安全庫存 高筋麵粉A 倉庫)`
#### 3.3 彈窗欄位
##### 唯讀欄位(顯示用)
- 商品名稱
- 商品編號
- 倉庫名稱
- 目前庫存(含單位)
##### 可編輯欄位
- **安全庫存量**(數字輸入框)
- 類型:正整數
- 驗證:不得為負數或非數字
- 預設值:若已設定過安全庫存,帶入原數值
- 清空代表取消安全庫存設定
#### 3.4 輔助文字
「當本倉庫庫存量低於安全庫存時,系統會顯示庫存不足提醒。」
#### 3.5 按鈕
- **取消**outline button關閉彈窗不儲存變更
- **儲存設定**filled button套用新的安全庫存數值
---
## 驗證與提示
### 4.1 輸入驗證
- 安全庫存量不得為負數
- 安全庫存量不得為非數字
- 必須為整數
- 若不合法,顯示錯誤訊息於輸入框下方
### 4.2 取消設定確認
當使用者清空安全庫存量欄位並按下儲存時:
- 顯示確認提示AlertDialog
- 標題:「確認取消安全庫存設定」
- 內容:「是否確認取消此商品在本倉庫的安全庫存設定?」
- 按鈕:
- 取消outline
- 確認取消設定filled
### 4.3 成功提示
- 儲存成功後關閉彈窗
- 顯示 toast 訊息
- 列表中該商品的「安全庫存量」與「狀態」即時更新
---
## Mock Data 結構
```typescript
interface SafetyStockItem {
productId: string; // 商品 ID
productCode: string; // 商品編號
productName: string; // 商品名稱
productBarcode: string; // 商品條碼
unit: string; // 單位kg, L, 顆, mL 等)
currentStock: number; // 目前庫存
safetyStock: number | null; // 安全庫存量null 表示未設定)
}
interface SafetyStockSetting {
warehouseId: string; // 倉庫 ID
warehouseName: string; // 倉庫名稱
items: SafetyStockItem[]; // 商品列表
}
```
### 範例資料
```typescript
const MOCK_ITEMS: SafetyStockItem[] = [
{
productId: "prod-001",
productCode: "P001",
productName: "高筋麵粉",
productBarcode: "4710001234567",
unit: "kg",
currentStock: 150,
safetyStock: 50, // 狀態:正常
},
{
productId: "prod-002",
productCode: "P002",
productName: "細砂糖",
productBarcode: "4710001234568",
unit: "kg",
currentStock: 30,
safetyStock: 50, // 狀態:低於安全庫存
},
{
productId: "prod-003",
productCode: "P003",
productName: "無鹽奶油",
productBarcode: "4710001234569",
unit: "kg",
currentStock: 0,
safetyStock: 20, // 狀態:缺貨
},
{
productId: "prod-004",
productCode: "P004",
productName: "動物鮮奶油",
productBarcode: "4710001234570",
unit: "L",
currentStock: 45,
safetyStock: null, // 狀態:未設定
},
];
```
---
## 設計規範遵循
### Guidelines 遵循
- ✅ **主要按鈕**(儲存設定、確認取消設定):使用 **filled button class**
- ✅ **次要按鈕**(取消、設定、返回):使用 **outlined button class**
- ✅ **輸入欄位**:使用 **Outlined style** 的 border/outline
- ✅ **對比度**:所有按鈕的背景色與文字色具備足夠對比度
### 使用者體驗原則
1. **安全性**:刪除/取消操作需要二次確認
2. **即時反饋**:操作成功後立即更新 UI 並顯示 toast
3. **錯誤處理**:輸入驗證錯誤即時顯示於輸入框下方
4. **一致性**:與系統其他頁面保持一致的操作邏輯
---
## 技術實作重點
### 元件組成
- `SafetyStockPage.tsx`:主頁面元件
- 使用的 UI 元件:
- `Button`filled / outline variants
- `Input`outlined style
- `Select`(下拉篩選)
- `Dialog`(設定彈窗)
- `AlertDialog`(確認對話框)
- `Badge`(狀態標籤)
- `Label`(表單標籤)
### 狀態管理
- `items`:商品列表資料
- `searchQuery`:搜尋關鍵字
- `filterType`篩選類型all / withSafety / abnormal
- `selectedItem`:當前選中要設定的商品
- `isDialogOpen`:彈窗開啟狀態
- `safetyStockValue`:彈窗中的安全庫存輸入值
- `showClearConfirm`:取消設定確認對話框狀態
- `error`:輸入驗證錯誤訊息
### 核心功能
1. **搜尋**:依商品名稱、編號、條碼進行即時搜尋
2. **篩選**:依狀態類型過濾商品列表
3. **開啟設定彈窗**:點擊設定按鈕,帶入商品資料
4. **輸入驗證**:正整數驗證、錯誤訊息顯示
5. **儲存設定**:更新 mock data 並即時反映於列表
6. **取消設定**:清空輸入框時顯示確認對話框
7. **狀態計算**:依據邏輯計算並顯示對應的狀態 Badge
---
## 未來擴展方向
- [ ] 實際 API 串接
- [ ] 批次設定功能
- [ ] 匯出安全庫存設定報表
- [ ] 歷史變更記錄
- [ ] 多倉庫切換功能