統一全站暖色視覺與市場情報骨架
All checks were successful
CD Pipeline / deploy (push) Successful in 58s

This commit is contained in:
OoO
2026-05-06 20:24:46 +08:00
parent 153e4c9734
commit 30a173cf69
32 changed files with 4463 additions and 93 deletions

View File

@@ -0,0 +1,181 @@
# ADR-035: 跨平台市場活動情報系統
- **狀態**: Accepted
- **日期**: 2026-05-06
- **觸發**: 使用者提出定期掌握 MOMO / 蝦皮 / 酷澎 / PChome 等電商活動檔期、活動商品、競品價格與資料庫保存需求
- **相關 ADR**: ADR-011跨專案資源隔離、ADR-017模組化收尾路線圖、ADR-025市場情報週報
- **相關 Memory**: `docs/memory/code_modularization_inventory_20260430.md`
## Context
EwoooC 目前已有 MOMO EDM / 節慶活動資料、`promo_products`、PChome 競品價格 feeder、PPT 市場情報週報與多個分析頁,但跨平台活動情報尚未形成獨立資料模型與可維護爬蟲框架。
若直接把蝦皮、酷澎、PChome 等平台資料塞進既有 `promo_products``routes/sales_routes.py``scheduler.py` 或分析頁大型 template會造成下列風險
1. 不同平台欄位語意不同,舊表無法承載活動檔期、平台商品 ID、折扣券、銷售訊號與價格歷史。
2. 既有 `scheduler.py``routes/sales_routes.py``routes/dashboard_routes.py`、多個 crawler service 已達大檔治理門檻,新增功能會加劇技術債。
3. 新爬蟲若直接上正式排程,可能造成 DB 寫入量、外部平台 rate limit、排程阻塞與告警噪音。
4. 新市場情報頁若複製既有巨型 Jinja template 模式,會延續 UI token、字體、色彩與點陣風格不一致問題。
## Decision
建立新的 **跨平台市場活動情報系統**,採分階段落地、預設關閉、可獨立回退的方式推進。
### 1. 模組邊界
新功能必須使用獨立模組,不得塞回既有巨檔:
- `services/market_intel/`:活動探索、商品爬取、正規化、商品比對、告警摘要。
- `services/market_intel/adapters/`:各平台 adapter例如 MOMO / PChome / Coupang / Shopee。
- `database/market_intel_models.py``market_*` ORM models。
- `routes/market_intel_routes.py`:市場情報頁面與 API route glue。
- `templates/market_intel/`:市場情報 UI template。
- `services/scheduler/` 或獨立 job module市場情報排程掛載點。
### 2. 資料模型
新增 `market_*` schema 作為唯一主資料層:
- `market_platforms`
- `market_campaigns`
- `market_campaign_snapshots`
- `market_campaign_products`
- `market_product_price_history`
- `market_product_matches`
- `market_crawler_runs`
`promo_products` 只作為既有 MOMO 活動資料的相容來源或雙寫過渡,不再承接跨平台唯一真相。
### 3. Feature Flag 與啟用策略
市場情報第一階段必須預設關閉:
- `MARKET_INTEL_ENABLED=false`
- `MARKET_INTEL_CRAWLER_ENABLED=false`
- `MARKET_INTEL_WRITE_ENABLED=false`
初期允許 dry-run建立 run log、解析活動與商品但不大量寫入正式商品資料。正式入庫與排程啟用需另行通過 smoke test、rate limit 驗證與 rollback drill。
### 4. 爬蟲安全邊界
市場情報爬蟲只允許抓公開頁面或公開結構化資料,不做登入、不碰會員資料、不破解反爬、不使用帳號池、不繞付費牆。
每平台 adapter 必須具備:
- rate limit
- timeout
- retry ceiling
- user-agent 與來源識別
- run log
- error classification
- dry-run mode
- 可單平台停用開關
### 5. UI / UX 邊界
市場情報 UI 不複製巨型分析頁模式,必須先抽共用元件與設計 token
- 活動檔期看板
- 活動商品池
- 商品比對審核
- 市場機會與威脅
所有新頁必須符合 V2 暖紙、暖墨、焦糖 accent、等寬數字、點陣紋理與真實資料規範。未串接資料時只能顯示可診斷空狀態不得使用假商品或假 KPI。
### 6. 上線與回退
部署遵守 ADR-011
- 禁止 `docker compose ... --remove-orphans`
- 禁止影響 `momo-db` 容器生命週期
- 只用 `docker compose up -d --no-deps --force-recreate <service>` 精準重建
- health check 只打 `/health`
異常回退順序:
1. 關閉 `MARKET_INTEL_*` feature flags。
2. 停用市場情報 scheduler job。
3. 保留 `market_*` 表與 run log不刪資料。
4. 回復上一版 route / service 程式碼。
5. 僅重啟受影響應用容器,不動 DB。
## Phased Rollout
### Phase 0Readiness Audit
- 更新模組化 inventory。
- 確認 `scheduler.py` 無 conflict marker 且可 py_compile。
- 標記市場情報不可寫入的既有大檔。
- 完成 ADR-035。
### Phase 1Skeleton Only
- 新增 feature flags。
- 新增 `market_intel` package skeleton。
- 新增空 route / disabled page / dry-run service。
- 不啟用正式排程,不大量入庫。
### Phase 2DB Schema
- 新增 `market_*` ORM models。
- 補 metadata import 與 schema smoke。
- 寫入 crawler run log 與少量 dry-run snapshot。
### Phase 3MOMO / PChome Adapter
- 先接成本最低且已有脈絡的平台。
- 只抓公開活動入口與活動商品。
- 建立活動與商品正規化規則。
### Phase 4Coupang / Shopee Adapter
- Coupang 先做保守 adapter。
- Shopee 因動態資料與反爬風險較高,最後做,並維持更嚴格節流。
### Phase 5Product Matching + HITL
- 用品牌、規格、容量、關鍵字與現有商品資料計算 match score。
- 低信心進人工審核,不自動合併。
### Phase 6AI Insight / Telegram
- 只基於 DB 實證資料產生摘要與告警。
- 不做空泛 LLM 建議。
- 高風險告警需包含平台、活動、商品、價差、資料時間與可追溯 run id。
## Alternatives Considered
### 方案 A直接擴充 `promo_products`
不採用。`promo_products` 偏 MOMO 活動商品語境,無法乾淨承載跨平台活動、商品快照、價格歷史、比對審核與 crawler run log。
### 方案 B直接塞進 `scheduler.py` 與既有 crawler service
不採用。`scheduler.py` 與多個 crawler service 已達大檔治理門檻,新增跨平台 adapter 會讓排程與錯誤隔離更脆弱。
### 方案 C先做完整 UI 再補資料
不採用。違反真實資料與真實頁面規範,容易產生假 KPI、假商品與不可診斷狀態。
## Consequences
**正面**
- 市場情報可以獨立演進不污染業績分析、dashboard、scheduler 既有技術債。
- 每平台 adapter 可單獨停用、測試與回退。
- `market_*` schema 可保留歷史、做趨勢與商品比對。
- AI 告警能基於可追溯 DB run log降低空泛推論。
**負面**
- 初期開發量比「直接塞舊表」更高。
- 需要新增 schema、service、route、UI 與 scheduler registry。
- Shopee 等平台可能因公開資料穩定性與 rate limit 需要較長探索期。
## Acceptance Criteria
- Phase 0 完成後,不改 runtime 行為。
- Phase 1 完成後,`MARKET_INTEL_ENABLED=false` 時所有新功能完全不影響既有頁面與排程。
- 任一 crawler adapter 失敗不得阻塞既有 MOMO 排程。
- 新市場情報 route 不新增到 `app.py`
- 任一新 Python 檔若超過 600 行需提出拆分理由,超過 800 行需更新模組化 inventory。

View File

@@ -56,6 +56,7 @@
| [032](ADR-032-rag-autonomous-learning-loop.md) | RAG 自主學習迴圈 — Distiller + PromotionGate + 反饋環Phase 11 | Accepted | 2026-05-03 |
| [033](ADR-033-rag-three-guardrails.md) | RAG 治理三護欄 — Promotion Gate / Firecrawl 資源 / BGE-M3 一致性Owen v5.0 鐵律) | Accepted | 2026-05-03 |
| [034](ADR-034-dynamic-model-router.md) | Caller × Context 動態 Model Router短文 gemma3 / 複雜 SKU qwen3:14b / 重構 coder:32b | Accepted | 2026-05-04 |
| [035](ADR-035-cross-platform-market-campaign-intelligence.md) | 跨平台市場活動情報系統 | Accepted | 2026-05-06 |
## 規範