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