分析模組架構優化開發筆記
概述
任務背景: CustomerAnalytics 模組出現數據顯示問題,需要檢視並優化所有分析模組的架構一致性 優化原則: 遵循 YAGNI (You Aren't Gonna Need It) 原則,避免過度工程化 目標: 統一架構模式,但只修復有問題的部分,保持已工作良好的模組
🔍 問題識別
主要問題:CustomerAnalytics 功能失效
typescript
// ❌ 當前複雜架構導致的問題
CustomerAnalyticsView.vue
├── useCustomerAnalyticsComplete (Edge Function)
├── useCustomerAnalyticsBasic (備援)
└── 複雜的數據優先級邏輯 → 導致數據顯示失敗具體症狀:
- 所有分析標籤頁顯示空內容
- Edge Function 正常返回數據,但被複雜的優先級邏輯忽略
- 備援系統執行成功但返回空數據 (所有計數為 0)
根因分析 (基於 git 9b744341 對比)
工作版本的簡單架構:
typescript
// ✅ 工作正常的版本 (9b744341)
CustomerAnalyticsView → useCustomerAnalyticsBasic → CustomerAnalyticsZeroExpansionService當前版本的複雜架構:
typescript
// ❌ 當前複雜版本
CustomerAnalyticsView → useCustomerAnalyticsComplete + useCustomerAnalyticsBasic (備援)
→ 複雜的數據合併和優先級邏輯分析模組現況評估
✅ 運作良好,保持現狀的模組 (3個)
1. OrderAnalytics
- 架構:
OrderAnalyticsView → useOrderAnalyticsBasic → OrderAnalyticsZeroExpansionService - 評估: ✅ 架構清晰,功能正常,符合理想模式
- 決策: 保持現狀
2. SupportAnalytics
- 架構:
SupportAnalyticsView → useSupportAnalytics → SupportAnalyticsApiService - 評估: ✅ 架構清晰,功能正常,符合理想模式
- 決策: 保持現狀
3. ProductAnalytics
- 架構:
ProductAnalyticsView → useProductAnalytics → 直接查詢 - 評估: ✅ 簡單有效,功能正常
- 決策: 保持現狀
需要優化的模組 (2個)
1. CustomerAnalytics (優先級:🔥 立即)
- 問題: 複雜的 Edge Function + 備援雙重架構導致功能失敗
- 當前檔案:
CustomerAnalyticsView.vue(複雜的雙重架構)useCustomerAnalyticsCompleteQueries.ts(Edge Function 查詢)useCustomerAnalyticsBasic.ts(備援組合函數)
- 解決方案: 恢復到簡單的單一架構模式
2. DashboardExecutiveHealth (優先級:🔸 中期)
- 問題: 多重查詢 + 複雜備援邏輯,過度複雜
- 當前檔案:
DashboardExecutiveHealth.vue - 解決方案: 選擇最有效的單一數據源,移除備援邏輯
統一架構設計原則
理想的標準架構模式
typescript
View Layer (XXXAnalyticsView.vue)
↓ 單一數據流
Composable Layer (useXXXAnalytics.ts)
↓ 標準化業務邏輯
Service Layer (XXXAnalyticsService.ts)
↓ 統一 API 介面
ServiceFactory 註冊和管理避免的複雜模式
typescript
// ❌ 避免這些複雜模式
View → Multiple Queries + Fallback Logic + Priority Handling
View → Edge Function + Backup Service + Complex Data Merging
View → Parallel Queries + Manual Data Consolidation核心設計原則
- YAGNI 導向: 只實現當前需要的功能,避免過度設計
- 單一職責: 每層只負責自己的職責,避免職責混合
- 實用主義: 優先解決實際問題,而非強制統一
- 漸進演進: 架構可隨需求成長,但不預先過度設計
優化執行計劃
Phase 1: CustomerAnalytics 架構簡化 (立即執行)
目標
- 恢復 CustomerAnalytics 的數據顯示功能
- 簡化複雜的雙重架構為單一可靠架構
具體步驟
移除複雜邏輯:
typescript// ❌ 移除 - useCustomerAnalyticsCompleteQueries.ts - CustomerAnalyticsView.vue 中的複雜優先級邏輯 // ✅ 保留並優化 - useCustomerAnalyticsBasic.ts - CustomerAnalyticsZeroExpansionService.ts恢復簡單架構:
typescript// 恢復到工作版本的模式 CustomerAnalyticsView → useCustomerAnalyticsBasic → CustomerAnalyticsZeroExpansionService修正日期範圍: UI 日期預設從 89 天改為 7 天,匹配實際數據範圍
預期成果
- 所有 5 個分析標籤頁正常顯示數據
- 移除複雜的數據合併邏輯
- 統一使用單一可靠的數據源
Phase 2: DashboardExecutiveHealth 簡化 (中期執行)
目標
- 減少 DashboardExecutiveHealth 的維護複雜度
- 統一使用最有效的單一數據源
具體步驟
評估當前查詢:
useCompleteDashboardHealth(主要)useUnifiedDashboardContent(統合內容)- 多個備援查詢 (businessHealthQuery, revenueKPIsQuery 等)
選擇最優方案: 保留最有效的查詢,移除冗余備援
簡化刷新邏輯: 統一使用單一刷新函數
技術實現詳細規格
CustomerAnalytics 修復規格
檔案修改清單
CustomerAnalyticsView.vue:
typescript// ❌ 移除複雜導入 import { useCustomerAnalyticsComplete } from '@/composables/queries/useCustomerAnalyticsCompleteQueries' // ✅ 簡化為單一導入 import { useCustomerAnalyticsBasic } from '@/composables/analytics/useCustomerAnalyticsBasic' // ❌ 移除複雜的數據優先級邏輯 const churnRisks = computed(() => { if (legacyChurnRisks.value && legacyChurnRisks.value.length > 0) { return legacyChurnRisks.value } // ... 複雜邏輯 }) // ✅ 簡化為直接使用 const { churnRisks, ... } = useCustomerAnalyticsBasic()日期範圍修正:
typescript// ❌ 修正前 const dateRange = ref<DateRange>({ start: today(getLocalTimeZone()).subtract({ days: 89 }), end: today(getLocalTimeZone()), }) // ✅ 修正後 const dateRange = ref<DateRange>({ start: today(getLocalTimeZone()).subtract({ days: 7 }), end: today(getLocalTimeZone()), })
備援服務檢查
- CustomerAnalyticsZeroExpansionService.ts: 確保查詢邏輯正確
- 數據篩選邏輯: 確保活躍客戶篩選正確工作
- 分析算法: 檢查為什麼返回空數據,調整參數或閾值
標準化 Composable 模式
typescript
// 統一的 Composable 模式範本
export function useXXXAnalytics() {
const service = defaultServiceFactory.getXXXAnalyticsService()
// 響應式狀態
const state = ref({ isLoading: false, error: null, data: null })
// 主要分析函數
async function performXXXAnalytics(params) {
try {
state.value.isLoading = true
const response = await service.getAnalytics(params)
// 處理響應...
} catch (error) {
state.value.error = error.message
} finally {
state.value.isLoading = false
}
}
return { ...state.value, performXXXAnalytics }
}成果量化指標
技術指標
- 代碼複雜度: 減少 CustomerAnalyticsView.vue 40% 的代碼量
- 檔案數量: 移除 1 個不必要的查詢檔案 (
useCustomerAnalyticsCompleteQueries.ts) - 依賴關係: 簡化從 3 層依賴到 2 層依賴
- 維護負擔: 移除複雜的數據合併邏輯和優先級判斷
功能指標
- 數據顯示: CustomerAnalytics 所有標籤頁恢復正常顯示
- 載入速度: 移除不必要的並行查詢,提升載入效率
- 錯誤處理: 統一錯誤處理邏輯,減少錯誤狀態
可維護性指標
- 架構一致性: 5 個分析模組中,4 個使用統一的簡單架構
- 新人友善性: 新開發者更容易理解單一數據流架構
- 除錯難度: 移除複雜的數據流,除錯更直接
🎓 經驗與教訓
✅ 成功要素
- 問題導向: 基於實際功能問題進行架構優化,而非為統一而統一
- 歷史對比: 通過 git 歷史對比找到工作版本的成功模式
- YAGNI 原則: 只修復有問題的部分,保持已工作良好的代碼
- 漸進演進: 分階段執行,先解決關鍵問題再考慮一致性
避免的陷阱
- 過度工程化: 不要為了架構統一而引入不必要的複雜性
- 破壞性重構: 不要為了統一而破壞已經工作良好的模組
- 預先優化: 不要預設未來需求,專注解決當前實際問題
- 複雜備援: 避免建立複雜的備援和降級邏輯,選擇一個可靠方案
🔮 未來擴展指引
- 按需擴展: 只有當確實需要多種實現時,才考慮工廠模式
- 實證決策: 基於實際使用數據決定是否需要更複雜的架構
- 團隊規模: 隨著團隊擴大,再考慮更多標準化和抽象層
- 業務複雜度: 當業務邏輯真正複雜時,再引入更深的分層
可複製性和標準化
分析模組開發標準流程
- 需求分析: 確定實際的業務需求和數據來源
- 架構選擇: 優先選擇最簡單有效的三層架構
- 實現開發: View → Composable → Service 的標準實現
- 測試驗證: 確保數據流和錯誤處理正確
- 文檔記錄: 記錄設計決策和架構選擇理由
故障排除標準流程
- 問題重現: 確定具體的功能失效症狀
- 歷史對比: 查找最後工作正常的版本進行對比
- 簡化測試: 逐步移除複雜邏輯,找到問題根因
- 漸進修復: 優先恢復功能,再考慮架構優化
- 文檔更新: 記錄問題原因和解決方案
架構決策標準
- 3 個模組以下: 使用直接的 View → Composable → Service
- 複雜業務邏輯: 引入 ServiceFactory 統一管理
- 多種實現需求: 考慮介面抽象和工廠模式
- 運行時切換: 只有確實需要時才引入配置驅動
相關文檔和資源
相關開發筆記
- SERVICE_FACTORY_ARCHITECTURE.md - ServiceFactory 架構設計
- CUSTOMER_ANALYTICS_DEVELOPMENT_GUIDE.md - 客戶分析開發指南
- ORDER_ANALYTICS_DEVELOPMENT_PHASES.md - 訂單分析階段規劃
技術參考
- Vue 3 Composition API 最佳實踐
- TypeScript 類型系統設計
- Supabase Edge Functions vs 前端分析的架構選擇
測試和驗證
- 分析模組功能測試清單
- 架構一致性檢查清單
- 效能和可維護性評估標準
文檔版本: v1.0
建立日期: 2025-08-23
最後更新: 2025-08-23
負責人: 系統架構優化團隊
狀態: 執行中