Files
star-erp/source-code/ERP(A-a)-商品建檔管理/src/Barcode_Implementation_Guide.md
2025-12-30 15:03:19 +08:00

14 KiB
Raw Blame History

Code128 條碼功能實作文件

📋 功能概述

已成功為甜點店 ERP 系統的商品建檔管理模組實作完整的 Code128 條碼功能,包含自動生成商品編號、條碼生成、預覽、下載與列印功能。


🗂️ 資料結構設計

Product 介面(已更新)

export interface Product {
  id: string;                    // 系統內部 ID
  product_code: string;          // 商品編號系統自動生成格式ICE000001
  name: string;                  // 商品名稱
  type: ProductType;             // 類型(原物料/成品)
  category: string;              // 分類
  unit: ProductUnit;             // 單位
  barcode_value: string;         // 條碼內容(預設等於商品編號)
  stockQuantity: number;         // 庫存數量
  createdAt: string;             // 建立日期
}

商品編號規則

  • 格式ICE + 6位數字例如ICE000001、ICE000245
  • 生成邏輯:自動遞增,系統找出最大序號後 +1
  • 唯一性:每個商品編號保證唯一
  • 用途:作為條碼內容的預設值

🎨 UI 設計與 Wireframe

商品對話框結構

┌─────────────────────────────────────────────────┐
│  編輯商品 / 新增商品                               │
├─────────────────────────────────────────────────┤
│                                                 │
│  ┌─────────────────────────────────────────┐   │
│  │ 商品編號: ICE000001                      │   │ ← 商品編號區(僅編輯時顯示)
│  │ 系統自動生成,不可修改                    │   │
│  └─────────────────────────────────────────┘   │
│                                                 │
│  商品名稱 *        類型 *                        │
│  [__________]     [原物料 ▼]                    │
│                                                 │
│  分類 *            單位 *                        │
│  [__________]     [公斤 ▼]                      │
│                                                 │
│  庫存數量                                        │
│  [__________]                                   │
│                                                 │
│  ┌─────────────────────────────────────────┐   │
│  │ 條碼資訊                                 │   │ ← 條碼區
│  │                                           │   │
│  │ 條碼內容                                  │   │
│  │ [ICE000001_________] [🔄 重新生成]       │   │
│  │ 條碼內容預設等於商品編號...               │   │
│  │                                           │   │
│  │ 條碼預覽 (Code128)                       │   │
│  │ ┌───────────────────────────────────┐   │   │
│  │ │   ║│││││││││││││││││││││││║       │   │   │
│  │ │        ICE000001                   │   │   │
│  │ └───────────────────────────────────┘   │   │
│  │                                           │   │
│  │ [⬇️ 下載條碼圖片] [🖨️ 列印條碼標籤]      │   │
│  └─────────────────────────────────────────┘   │
│                                                 │
│                          [取消] [儲存變更]      │
└─────────────────────────────────────────────────┘

條碼區功能說明

  1. 商品編號顯示(僅編輯模式)

    • 藍色背景區塊
    • 顯示格式化的商品編號
    • 註明「系統自動生成,不可修改」
  2. 條碼內容

    • 顯示當前條碼值
    • 唯讀輸入框,等寬字體顯示
    • 「重新生成」按鈕:將條碼值恢復為商品編號
  3. 條碼預覽

    • 使用 Code128 格式
    • 白色背景,虛線邊框
    • 自動即時更新
    • 新增模式提示「條碼將在儲存後顯示」
  4. 操作按鈕

    • 下載條碼圖片PNG 格式)
    • 列印條碼標籤(包含商品資訊)

🔧 技術實作

使用的套件

import JsBarcode from "jsbarcode";

核心組件

1. BarcodeDisplay 組件

// /components/BarcodeDisplay.tsx
// 功能:使用 JsBarcode 生成 Code128 條碼
// 參數value, width, height, displayValue

2. ProductDialog 組件更新

主要新增功能:

  • 商品編號顯示區域
  • 條碼內容輸入框(唯讀)
  • 條碼預覽區域
  • 重新生成按鈕
  • 下載與列印功能

3. ProductManagement 組件更新

新增函數:

generateProductCode(): string
  • 自動生成下一個商品編號
  • 確保唯一性
  • 格式ICE + 6位數字

🔄 業務邏輯流程

新增商品流程

1. 使用者點擊「新增商品」
   ↓
2. 填寫商品基本資料(名稱、類型、分類等)
   ↓
3. 條碼區顯示「條碼將在儲存後顯示」
   ↓
4. 點擊「新增商品」
   ↓
5. 系統自動生成 product_code (例ICE000007)
   ↓
6. barcode_value 自動設為 product_code
   ↓
7. 商品儲存完成,可再次編輯查看條碼

編輯商品流程

1. 使用者點擊「編輯」按鈕
   ↓
2. 對話框顯示商品編號(藍色區塊)
   ↓
3. 條碼區顯示當前條碼值與 Code128 條碼圖
   ↓
4. 可選操作:
   - 重新生成條碼(恢復為商品編號)
   - 下載條碼圖片
   - 列印條碼標籤
   ↓
5. 修改其他資料後儲存

重新生成條碼

1. 點擊「重新生成條碼」按鈕
   ↓
2. barcode_value 更新為 product_code
   ↓
3. 條碼圖自動重新渲染
   ↓
4. 顯示成功提示訊息

下載條碼圖片

1. 點擊「下載條碼圖片」
   ↓
2. 從 Canvas 取得條碼圖片
   ↓
3. 轉換為 PNG 格式
   ↓
4. 觸發瀏覽器下載
   ↓
5. 檔名barcode-ICE000001.png

列印條碼標籤

1. 點擊「列印條碼標籤」
   ↓
2. 開啟新視窗
   ↓
3. 顯示條碼圖 + 商品資訊
   - 商品名稱
   - 商品編號
   ↓
4. 自動觸發列印對話框
   ↓
5. 列印完成後關閉視窗

🎯 使用情境範例

情境 1新增新商品「芒果刨冰」

  1. 店員點擊「新增商品」
  2. 輸入商品資料:
    • 名稱:芒果刨冰
    • 類型:成品
    • 分類:冰品
    • 單位:個
  3. 點擊「新增商品」儲存
  4. 系統自動生成:
    • product_code: ICE000245
    • barcode_value: ICE000245
  5. 商品建立完成,可在倉庫撿貨與 POS 掃碼使用

情境 2商品編號需要恢復

  1. 某次誤操作後,條碼內容被意外修改
  2. 管理者進入「編輯商品」
  3. 看到條碼值與商品編號不一致
  4. 點擊「重新生成條碼」
  5. 系統將 barcode_value 重置為 product_code
  6. 條碼恢復正常,可重新列印標籤

情境 3列印商品標籤

  1. 倉庫收到新的原物料「法國麵粉」
  2. 管理者編輯該商品資料
  3. 點擊「列印條碼標籤」
  4. 列印對話框顯示條碼與商品資訊
  5. 連接標籤機或一般印表機列印
  6. 將標籤貼在商品包裝上

🔐 權限與錯誤處理

權限控管

  1. 商品編號修改

    • 目前設定:不可修改(唯讀)
    • 未來擴充:可設定管理員權限允許修改
  2. 條碼重新生成

    • 所有可編輯商品的使用者皆可使用
    • 建議:可加入操作記錄追蹤

錯誤處理

1. 條碼生成失敗

// BarcodeDisplay 組件已處理
try {
  JsBarcode(canvasRef.current, value, {...});
} catch (error) {
  console.error("Error generating barcode:", error);
  // 顯示友善錯誤訊息
}

可能原因:

  • 條碼內容包含無效字符
  • Code128 不支援的特殊符號

解決方案:

  • 確保商品編號僅包含英數字
  • 顯示錯誤提示給使用者

2. 條碼重複檢查

目前實作:

  • 商品編號自動遞增,保證唯一性
  • barcode_value 預設等於 product_code

未來建議:

// 儲存前檢查條碼重複
const isDuplicate = products.some(
  p => p.barcode_value === formData.barcode_value && p.id !== product?.id
);

if (isDuplicate) {
  toast.error("條碼內容重複,請重新生成");
  return;
}

3. 下載/列印失敗

處理方式:

  • 檢查 Canvas 元素是否存在
  • 瀏覽器權限檢查
  • 顯示友善錯誤訊息

📊 商品列表更新

新增欄位

商品列表已更新,新增「商品編號」欄位:

| 商品編號   | 商品名稱     | 類型   | 分類     | 條碼      | 單位 | 庫存數量 | 操作 |
|-----------|-------------|--------|---------|-----------|------|----------|------|
| ICE000001 | 法國麵粉    | 原物料 | 烘焙材料 | ICE000001 | 公斤 | 150      | ✏️🗑️ |
| ICE000002 | 草莓蛋糕    | 成品   | 蛋糕    | ICE000002 | 個   | -        | ✏️🗑️ |

搜尋功能更新

搜尋框已支援商品編號搜尋:

  • 商品名稱
  • 商品編號(新增)
  • 條碼內容
  • 分類

🚀 未來擴充建議

1. 批次條碼列印

// 選擇多個商品,一次列印所有條碼標籤
const handleBatchPrint = (selectedProducts: Product[]) => {
  // 生成包含多個條碼的列印頁面
  // 適合一次收貨多種商品的情境
}

2. 自訂條碼規則

// 允許管理員自訂商品編號前綴
interface BarcodeSettings {
  prefix: string;        // 例ICE, CAKE, RAW
  digitLength: number;   // 例6
  startNumber: number;   // 例1
}

3. 條碼掃描驗證

// 使用手機或掃碼槍掃描條碼
// 驗證條碼是否存在於系統中
const handleBarcodeScan = (scannedValue: string) => {
  const product = products.find(p => p.barcode_value === scannedValue);
  if (product) {
    // 顯示商品詳情
  } else {
    // 提示條碼不存在
  }
}

4. 條碼操作記錄

interface BarcodeLog {
  productId: string;
  action: 'generated' | 'regenerated' | 'printed' | 'downloaded';
  oldValue?: string;
  newValue: string;
  timestamp: string;
  userId: string;
}

5. QR Code 支援

// 除了 Code128也支援 QR Code
// QR Code 可包含更多資訊URL、JSON 等)
import QRCode from "qrcode";

📝 測試檢查清單

  • 新增商品時自動生成商品編號
  • barcode_value 預設等於 product_code
  • Code128 條碼正確生成並顯示
  • 重新生成條碼功能正常
  • 下載條碼圖片功能正常
  • 列印條碼標籤功能正常
  • 商品編號在編輯時唯讀顯示
  • 商品列表顯示商品編號
  • 搜尋支援商品編號
  • 條碼生成錯誤處理
  • UI 符合 Guidelines 設計規範
  • 響應式設計(桌面版)

🎨 設計規範遵循

根據 Guidelines.md

  1. 主要動作按鈕

    • 「新增商品」:使用 button-filled-primary
    • 「儲存變更」:使用 button-filled-primary
  2. 次要動作按鈕

    • 「取消」:使用 button-outlined-primary
    • 「重新生成」:使用 button-outlined-primary
    • 「下載條碼圖片」:使用 button-outlined-primary
    • 「列印條碼標籤」:使用 button-outlined-primary
  3. 對比度檢查

    • 所有按鈕的背景色與文字色皆符合對比度要求
    • 使用 CSS 變數確保一致性

📚 相關檔案清單

新增檔案

  • /components/BarcodeDisplay.tsx - 條碼顯示組件

修改檔案

  • /components/ProductManagement.tsx - 新增商品編號生成邏輯
  • /components/ProductDialog.tsx - 新增條碼區域與相關功能
  • /components/ProductTable.tsx - 新增商品編號欄位

參考檔案

  • /styles/globals.css - 按鈕與樣式定義
  • /guidelines/Guidelines.md - 設計規範

💡 使用建議

  1. 定期備份商品資料

    • 商品編號與條碼資訊非常重要
    • 建議定期匯出資料
  2. 標籤管理

    • 建議使用熱感應標籤紙
    • 條碼尺寸適合一般掃碼槍讀取
  3. 倉庫作業流程

    • 收貨時列印標籤並貼在商品上
    • 撿貨時掃描條碼確認商品
    • POS 結帳時掃描條碼計價
  4. 條碼品質

    • 確保列印清晰
    • 避免條碼損壞或污損
    • 定期更換磨損的標籤

🔧 故障排除

問題 1條碼無法顯示

可能原因:

  • JsBarcode 套件未正確載入
  • 條碼內容包含無效字符

解決方式:

  • 檢查控制台錯誤訊息
  • 確認條碼內容僅包含英數字

問題 2列印視窗空白

可能原因:

  • 瀏覽器阻擋彈出視窗
  • Canvas 尚未完成渲染

解決方式:

  • 允許瀏覽器彈出視窗
  • 確認條碼已正確顯示後再列印

問題 3商品編號重複

可能原因:

  • 多個使用者同時新增商品
  • 資料同步問題

解決方式:

  • 使用資料庫自動遞增序號
  • 實作樂觀鎖定機制

📞 技術支援

如有任何問題或建議,請聯繫開發團隊。

最後更新2025-11-28