客戶管理平台 — 系統架構圖

Altra Tech  |  數位部 / AI 部  |  2026-05-05  |  v1.1(含待串接模組)

已完成(可用)
待串接(明天討論重點)
資料庫
外部服務
腳本 / Agent
flowchart TB %% ───── UI Layer ───── subgraph UI["🖥️ 前端 UI"] direction LR ui_contacts["contacts_ui.html\n(客戶名單 / 搜尋任務 / 統計)"] end %% ───── API Layer ───── subgraph API["⚙️ FastAPI (port 8000)"] direction TB r_contacts["/contacts\nCRUD + 匯入/匯出 + Bounce 掃描"] r_jobs["/jobs\nJob 建立 + 狀態追蹤 + n8n 觸發"] r_products["/products\n產品知識庫(產品清單 + 目標客群)"] end %% ───── DB Layer ───── subgraph DB["🗄️ MySQL 192.168.0.127(公司內網)"] direction LR subgraph db_marketing["altra_marketing"] t_contacts["contacts\n(聯絡人主檔)"] t_jobs["jobs\n(搜尋任務追蹤)"] end subgraph db_agent["altra_agent"] t_domain["domain_cache\n(公司 → 主網域 快取)"] end end %% ───── Product KB (PENDING) ───── subgraph PKB["⚠️ 產品知識庫 ← 待串接重點"] direction TB pk_list["產品清單\nLow-Dk PI|HDI|凡立水|FIW"] pk_seg["目標客群分類\n各產品對應客群 + 英文搜尋關鍵字"] pk_list --> pk_seg end %% ───── Scripts / Agents ───── subgraph Agents["🤖 腳本 / Agents"] direction TB s_batch["maoxiaoqi_batch_search.py\nPlaywright RPA\n(company / domain / product 三模式)"] s_domain["domain_lookup.py\nDomain Lookup Agent\n(Tavily API + MySQL 快取)"] s_bounce["scan_bounce_contacts.py\nBounce 掃描\n(每週一 07:30 自動執行)"] end %% ───── External Services ───── subgraph Ext["🌐 外部服務"] direction LR ext_mxq["貿小七\napp.maoxiaoqi.com\n(Playwright 模擬操作)"] ext_tavily["Tavily API\n(Domain 查詢)"] ext_n8n["n8n\n(工作流自動化)"] ext_imap["IMAP / Outlook\n(Bounce 郵件掃描)"] end %% ═══════════ CONNECTIONS ═══════════ %% UI ↔ API UI <-->|"HTTP REST"| API %% API ↔ DB r_contacts <-->|"pymysql"| t_contacts r_jobs <-->|"pymysql"| t_jobs r_products -.->|"目前為 mock data\n未來接真實 DB"| pk_list %% Agents ↔ DB s_domain <-->|"快取讀寫"| t_domain s_bounce -->|"更新 status=Bounce"| t_contacts %% Agents ↔ External s_batch -->|"Playwright 自動化"| ext_mxq s_batch --> s_domain s_domain -->|"查詢公司網域"| ext_tavily s_bounce -->|"掃描退信"| ext_imap %% Batch Search flow s_batch -->|"搜尋結果 POST /contacts/import"| r_contacts s_batch -->|"更新 job 狀態 PATCH /jobs/:id"| r_jobs %% n8n trigger r_jobs -->|"POST N8N_SUBMIT_URL\n(觸發批量搜尋)"| ext_n8n ext_n8n -->|"呼叫腳本"| s_batch %% ═══════════ PENDING CONNECTIONS ═══════════ pk_list -.->|"⚠️ 待串接\n① product_tag 選項動態從 API 拉取"| r_jobs pk_seg -.->|"⚠️ 待串接\n② 目標客群關鍵字 → 自動填入搜尋詞"| s_batch pk_seg -.->|"⚠️ 待串接\n③ 依客群抓對應公司名單"| r_contacts %% Styles classDef done fill:#e6fffa,stroke:#2c7a7b,color:#1a202c classDef pending fill:#fffaf0,stroke:#dd6b20,stroke-dasharray:5 4,color:#1a202c classDef db fill:#ebf8ff,stroke:#2b6cb0,color:#1a202c classDef agent fill:#fffff0,stroke:#b7791f,color:#1a202c classDef ext fill:#f7fafc,stroke:#718096,color:#1a202c class ui_contacts,r_contacts,r_jobs,s_batch,s_domain,s_bounce,t_contacts,t_jobs,t_domain done class r_products,pk_list,pk_seg pending class t_contacts,t_jobs,t_domain db class s_batch,s_domain,s_bounce agent class ext_mxq,ext_tavily,ext_n8n,ext_imap ext

⚠️ 明天討論重點:產品知識庫串接(3 個整合點)

① product_tag 動態從 API 拉取

② 目標客群關鍵字 → 自動填入搜尋詞

③ 依客群抓對應公司名單

目前已完成(無需更動)

資料庫 Schema 快速參考

🗃 contacts(聯絡人主檔)

altra_marketing.contacts
id UUID 主鍵
company_name 公司名稱
contact_name 姓名
email 唯一鍵
title 職稱
phone / website / linkedin
industry / country
source_tag 貿小七 / Bitrix24 / CSV手動
segment_tag 潛在客戶 / 現有客戶 / 冷客戶
product_tag JSON 陣列(可多選)
search_tag 逗號分隔字串(搜尋域名)
status 有效 / Bounce / 待確認 / 封鎖
edm_sent_count / edm_last_sent_at
created_at / updated_at / bitrix24_id

📋 jobs(搜尋任務追蹤)

altra_marketing.jobs
id UUID 主鍵
type maoxiaoqi_search
status pending / running / done / error
keywords JSON 陣列(公司/關鍵字清單)
mode company / domain / product
tag 搜尋用 tag(域名)
product_tag 對應產品
total / done_count 進度
current_keyword 目前處理到哪筆
added_count 本次新增幾筆
result / error JSON 結果 / 錯誤訊息
triggered_by script / ui / n8n
created_at / updated_at

🌐 domain_cache(網域快取)

altra_agent.domain_cache
company_name 公司名稱(主鍵)
domain 主網域(例 foxconn.com)
source tavily / manual
created_at

⚠️ products(待真實化)

目前為 mock data in products.py
id low-dk-pi / hdi / varnish / fiw
name / desc / status
segments[] 目標客群陣列
  segment.name 客群名稱
  segment.keywords 搜尋關鍵字(多行)

→ 需決定:持續 hardcode 還是移入 MySQL?

API Endpoints 速查

📞 /contacts

GET /contacts 查詢(可篩選)
POST /contacts 新增單筆
GET /contacts/stats 統計
GET /contacts/export 匯出 CSV
POST /contacts/import 匯入 CSV/XLSX
POST /contacts/scan-bounce 觸發 Bounce 掃描
GET /contacts/:id 單筆查詢
PATCH /contacts/:id 更新
DELETE /contacts/:id 封鎖(軟刪除)

🔧 /jobs

GET /jobs 查詢最近任務
POST /jobs 建立任務(記錄用)
PATCH /jobs/:id 更新任務狀態
GET /jobs/:id 查詢單一任務
POST /jobs/trigger 觸發 n8n 搜尋
  → body: keywords, mode, product_tag

📦 /products(⚠️ 待強化)

GET /products 取得所有產品
GET /products/:id 取得單一產品

每個產品回傳:
id, name, desc, status
segments[].name 目標客群名稱
segments[].keywords 搜尋關鍵字

→ 明天討論:是否需要 POST/PATCH 管理產品?
Altra Tech 數位部 / AI 部  •  系統架構圖 v1.1  •  2026-05-05