在 RPA 開發初期,為了驗證可行性,我們往往習慣將所有邏輯(讀設定檔、網頁爬蟲、資料處理、報表產出、推播通知)塞在同一支 Main.xaml 中。
這種「巨大工作流(Monolithic Workflow)」在專案規模擴大後會帶來致命問題:
維護災難:一個流程動輒五、六百行,找邏輯如同大海撈針。
缺乏複用性:其他專案若想用相同的推播模組或組態讀取器,無法獨立抽離。
版本控制衝突:團隊協作時只要修改同一個 XAML 檔,Git 合併就會發生無解衝突。
今天我們要將專利情報機器人進行「解耦重構」,拆分成 4 個獨立子模組,並透過 Main.xaml 進行頂層調度。
🏗️ 架構設計:4 大解耦模組
重構後的專案目錄結構如下:
RPA_Workflow/
├── Main.xaml # 頂層調度中心(Orchestrator)
├── config_rules.json # 監控規則組態
├── processed_ids.txt # 歷史水位線
└── Modules/
├── Init_LoadConfig.xaml # 模組 1:組態讀取與水位線初始化
├── Scraping_ExtractPatents.xaml# 模組 2:瀏覽器爬蟲與多維加權打分
├── Reporting_GenerateHtmlCsv.xaml# 模組 3:歸檔目錄建立、CSV/HTML 產出
└── Notifier_SendDiscord.xaml # 模組 4:Discord Webhook 推播
模組職責與實作細節
模組一:組態與水位線初始化 (Init_LoadConfig.xaml)
職責:專職負責檔案 I/O 與前置檢查。
主要輸出引數:
out_vipList (String[]):VIP 競品名單。
out_foreignList (String[]):優先權關鍵詞。
out_techList (String[]):核心技術關鍵詞。
out_historyIds (List):歷史已處理之專利案號清單。
out_isFirstRun (Boolean):是否為首次巡檢模式。
模組二:專利爬蟲與加權打分 (Scraping_ExtractPatents.xaml)
職責:聚焦於 UI 自動化與業務邏輯。
核心機制:
增量比對煞車:遇歷史案號立刻 Break,節省檢索時間。
UI 防抖重試(RetryScope):避免網路微卡頓導致元素找不到崩潰。
加權打分分流:
Tier 1 (≥4分):VIP 競品 + 核心技術等高風險專利。
Tier 2 (2-3分):重點關注專利。
Tier 3 (<2分):常規備查專利。
模組三:報表歸檔與視覺化儀表板 (Reporting_GenerateHtmlCsv.xaml)
職責:數據持久化與報表生成。
主要特點:
自動按年月歸檔:路徑自動組裝為 Reports/yyyy/MM/。
CSV 商業報表:提供原始數據以供 Excel 分析。
Chart.js HTML 儀表板:生成包含甜甜圈圖(分佈佔比)、長條圖與即時搜尋欄位的視覺化報表。
模組四:Discord 推播通知 (Notifier_SendDiscord.xaml)
職責:透過 Webhook 發送結構化 Embed 卡片通知。
雙模式支援:
正常巡檢戰報(in_isErrorAlert = False):推送綠色/橘色儀表板統計摘要。
災難告警模式(in_isErrorAlert = True):捕捉到例外時,推送紅色警報與崩潰案號。