跳到主要內容
yoAkyoku
← Work

多門市 POS/ERP/CRM 整合平台

在既有 POS 上長出多門市、多倉庫、BOM 與製造,並讓 POS 交易與 CRM 同步而不互相拖住。

  • Web
  • Data
  • Automation
Contents

概述

商業專案,工作室負責全端開發。這套 POS 接手時已經有不少功能,任務是在原架構上把它擴充成多門市的 POS/ERP/CRM 整合平台:商品與庫存建模、多層 BOM 與製造、多倉庫調撥,以及 POS 與 CRM 之間的資料同步。

重點不在新增頁面,而在整理舊流程的資料邊界,讓後面的功能有地方站。

問題

需求一路從單店 POS 長到多門市、倉庫調撥、Variant、BOM、製造和 CRM 同步。既有流程對 item、商品、原料和 Variant 的假設不完全一樣,新增功能時如果只在畫面補欄位,採購、製造和銷售很快就會各自用一套規則,庫存和成本對不起來。

解法

先把「資料如何進入庫存、成本與同步流程」整理成一張圖,再依這張圖調整每個流程的寫入邊界。BOM 展開改成樹狀走訪;POS 主交易與 CRM 同步拆開,用 Outbox 加 Queue 處理。

系統架構
POS 門市端 ──┐
ERP 後台 ────┼──▶ Laravel Application ──▶ MySQL
CRM 儀表板 ──┘          │
                        ├──▶ Scheduler / Database Queue / Queue Worker
                        ├──▶ Outbox ──▶ CRM Sync (HMAC, Retry, Idempotency)
                        └──▶ Print Adapter (USB / Wi-Fi)

外部整合:Google Calendar 雙向預約、電商訂單匯入、條碼收貨、LINE OA 出勤、電子發票

主要功能

  • 商品、原料、分類與 Variant 的資料關係整理
  • 多層 BOM 展開,接到工單材料、投料與入庫
  • 採購、進貨、銷售、退貨、出貨、調撥與多倉庫庫存異動
  • 成本歷史、庫存變更紀錄、條碼收貨與主檔匯入
  • 員工、報表、會計與多門市管理介面
  • POS 與 CRM 的商品、分類、原料與交易資料同步
  • 部署腳本、Queue、排程與測試驗證

架構

POS 與 CRM 同步
POS ──▶ POS Database ──▶ Outbox(記錄同步事件)
                            │
                            ▼
                      Queue Worker ──▶ 簽章請求 ──▶ CRM
                            ▲                        │
                            └──── 成功 / 失敗 ◀───────┘
                                  失敗:Retry + Backoff → Dead Letter
                                  重複:Idempotency Key 擋掉
                                  CRM 持續故障:Circuit Breaker 暫停
Item / BOM 領域模型
Category ─┬─ Item ─┬─ Variant ─── Inventory(多倉庫)
          │        ├─ BOM Line ──▶ Component Item(可多層)
          │        └─ Cost History
          └─ Raw Material ─── Inventory

Manufacturing Order ──▶ BOM 展開(樹狀走訪、去重、防循環)──▶ 需求數量 ──▶ 投料 ──▶ 成品入庫

工程決策

商品、原料與庫存不是同一種東西

它們進入庫存、成本與同步的路徑不同。把這三條路徑先畫清楚,再決定每個流程可以寫哪些欄位,比在每個畫面各自補邏輯穩得多。

BOM 展開之後,庫存才真正有意義

BOM 不只是顯示父子樹。展開結果會決定工單材料、需求數量與投料。多層元件和重複品項讓平面查詢順序不夠用,所以改用樹狀走訪加排序,並偵測循環關係避免無限展開。

POS 交易不能被 CRM 綁住

如果每筆異動都同步等待 CRM,CRM 暫時失敗就會直接卡住門市結帳。主交易先落地,Outbox 記下事件,Queue Worker 負責重送、退避、冪等與斷路。重送時不會把同一筆商品或交易重複建立。

畫面

以下畫面只展示功能邊界,品牌、租戶、內部編號與識別資訊已移除。

POS 銷售作業畫面
POS 銷售作業
ERP 商品與庫存
ERP 商品與庫存
ERP 庫存異動與成本
庫存異動與成本
CRM 儀表板
CRM 儀表板與客戶分析

技術

PHP、Laravel、JavaScript、Bootstrap-based UI、MySQL。部署環境包含 Apache、Scheduler、Database Queue、Queue Worker 與 Print Adapter。

結果與心得

  • 先畫資料流再動手,比先加欄位再回頭補規則省下更多時間。
  • Outbox 與 Queue 讓 CRM 的可用性問題不再變成門市的問題。
  • RFID 讀卡器與付款流程只做到整合邊界,未進入正式硬體與付款 UAT。