Some checks failed
CD Pipeline / deploy (push) Failing after 59s
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml) - 部署模式: rsync Python 檔案至 188 → docker restart (volume mount) - Dockerfile/requirements 變動時自動重建 Docker image - 部署通知: Telegram (開始/成功/失敗) - 健康檢查: https://mo.wooo.work/health (最多 5 次重試) - 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 KiB
10 KiB
app.py 重構計畫
文件資訊
- 建立日期: 2026-01-18
- 目標檔案: app.py (7,253 行)
- 目標: 模組化拆分,提高可維護性
一、現況分析
1.1 檔案規模
- 總行數: 7,253 行
- 路由數量: 49 個
- 函數數量: 約 70 個
1.2 最大函數 (需優先拆分)
| 排名 | 函數名稱 | 行數 | 所屬模組建議 |
|---|---|---|---|
| 1 | sales_analysis() |
1,020 行 | sales_routes.py |
| 2 | get_monthly_summary_data() |
388 行 | monthly_routes.py |
| 3 | import_excel() |
288 行 | import_routes.py |
| 4 | get_sales_table_data() |
267 行 | sales_routes.py |
| 5 | export_top_detail() |
256 行 | sales_routes.py |
| 6 | get_top_detail() |
252 行 | sales_routes.py |
| 7 | edm_dashboard() |
244 行 | edm_routes.py |
| 8 | index() |
190 行 | dashboard_routes.py |
1.3 現有路由分類
頁面路由 (12個):
├── / (首頁/商品看板)
├── /settings (設定)
├── /system_settings (系統設定)
├── /brand_assets (品牌資源)
├── /edm (EDM 儀表板)
├── /festival (節慶儀表板)
├── /abc_analysis/detail (ABC 分析詳情)
├── /logs (系統日誌)
├── /monthly_summary_analysis (月結分析)
├── /sales_analysis (業績分析)
├── /growth_analysis (成長分析)
└── /daily_sales (當日業績)
API 路由 (37個):
├── 系統 API (3個): /health, /metrics, /api/logs
├── 分類管理 API (4個): /api/categories/*
├── 匯出 API (11個): /api/export/*
├── 任務觸發 API (6個): /api/run_*, /api/trigger_*
├── 匯入 API (2個): /api/import_excel, /api/import/monthly_summary
├── 備份 API (2個): /api/backup, /api/backup/download/*
├── 業績分析 API (5個): /api/sales_analysis/*
├── 月結分析 API (1個): /api/monthly_summary_data
├── 其他 API (3個): /api/test_url, /api/history/*, /api/price_change_details
└── 當日業績匯出 (2個): /daily_sales/export*
二、重構架構設計
2.1 目標目錄結構
momo_pro_system/
├── app.py # 主應用程式 (精簡後約 500 行)
├── config.py # 配置檔 (保持不變)
├── auth.py # 認證模組 (保持不變)
│
├── routes/ # 🆕 路由模組目錄
│ ├── __init__.py # Blueprint 註冊中心
│ ├── dashboard_routes.py # 商品看板 (首頁)
│ ├── sales_routes.py # 業績分析相關
│ ├── daily_sales_routes.py # 當日業績相關
│ ├── monthly_routes.py # 月結分析相關
│ ├── edm_routes.py # EDM 儀表板
│ ├── export_routes.py # 匯出功能
│ ├── import_routes.py # 匯入功能
│ ├── system_routes.py # 系統管理 (設定、日誌、備份)
│ └── api_routes.py # 通用 API (健康檢查、任務觸發等)
│
├── services/ # 服務層 (現有)
│ ├── __init__.py
│ ├── cache_service.py # 🆕 快取服務 (從 app.py 抽出)
│ ├── sales_service.py # 🆕 業績計算服務
│ ├── dashboard_service.py # 🆕 看板數據服務
│ └── ... (現有服務)
│
├── utils/ # 工具函數 (現有)
│ ├── __init__.py
│ ├── validators.py # 🆕 驗證函數 (從 app.py 抽出)
│ ├── formatters.py # 🆕 格式化函數
│ └── ... (現有工具)
│
├── database/ # 資料庫層 (保持不變)
├── vendor_routes.py # 廠商缺貨路由 (已存在)
└── auto_import_routes.py # 自動匯入路由 (已存在)
2.2 模組劃分詳情
模組 1: routes/dashboard_routes.py (~400 行)
# 包含路由:
- GET / # index() - 商品看板首頁
- GET /brand_assets # brand_assets()
# 包含函數:
- get_consolidated_data() # 153 行
- get_full_dashboard_data() # 148 行
- get_dashboard_stats() # 16 行
模組 2: routes/sales_routes.py (~2,000 行)
# 包含路由:
- GET /sales_analysis # sales_analysis() - 1,020 行
- GET /api/sales_analysis/table_data # get_sales_table_data() - 267 行
- GET /api/sales_analysis/table_data_pandas
- GET /api/sales_analysis/top_detail # get_top_detail() - 252 行
- GET /api/sales_analysis/export_top_detail
- GET /api/sales_analysis/yoy_comparison
# 包含函數:
- _get_filtered_sales_data()
模組 3: routes/daily_sales_routes.py (~800 行)
# 包含路由:
- GET /daily_sales # daily_sales() - 161 行
- GET /daily_sales/export # export_daily_sales_category()
- GET /daily_sales/export_marketing
- GET /growth_analysis # growth_analysis()
# 包含函數:
- preprocess_daily_sales_data()
- calculate_daily_kpis()
- calculate_dod()
- calculate_wow()
- prepare_daily_charts()
- prepare_category_summary()
- prepare_marketing_summary()
- get_taiwan_holiday()
- prepare_calendar_data()
模組 4: routes/monthly_routes.py (~500 行)
# 包含路由:
- GET /monthly_summary_analysis
- GET /api/monthly_summary_data # 388 行
- POST /api/import/monthly_summary
模組 5: routes/edm_routes.py (~400 行)
# 包含路由:
- GET /edm # edm_dashboard() - 244 行
- GET /festival # festival_dashboard() - 148 行
模組 6: routes/export_routes.py (~800 行)
# 包含路由:
- GET /api/export/all_categories
- GET /api/export/excel/all
- GET /api/export/excel/changes
- GET /api/export/excel/delisted
- GET /api/export/price_changes # 156 行
- GET /api/export/low_prices
- GET /api/export/changes
- GET /api/export/excel/abc # 175 行
- GET /api/export/excel/vendor # 135 行
- GET /api/export/excel/seasonality_detail
模組 7: routes/import_routes.py (~350 行)
# 包含路由:
- POST /api/import_excel # import_excel() - 288 行
模組 8: routes/system_routes.py (~400 行)
# 包含路由:
- GET /settings
- GET /system_settings
- GET /logs
- GET /api/logs
- POST /api/backup
- GET /api/backup/download/<path:filename>
- POST /api/categories (CRUD)
- POST /api/test_url
# 包含函數:
- load_categories()
- save_categories()
- load_scheduler_stats()
模組 9: routes/api_routes.py (~300 行)
# 包含路由:
- GET /health
- GET /metrics
- POST /api/run_task
- POST /api/run_edm_task
- POST /api/run_festival_task
- POST /api/trigger_momo_notification
- POST /api/trigger_edm_notification
- POST /api/test_notification
- GET /api/history/<int:product_id>
- GET /api/price_change_details
- GET /abc_analysis/detail
# 包含函數:
- track_query_time()
三、重構執行步驟
階段 1: 準備工作 (風險: 低)
- ✅ 完整備份現有程式碼
- 建立
routes/目錄結構 - 建立
routes/__init__.pyBlueprint 註冊中心
階段 2: 抽取共用模組 (風險: 低)
- 建立
services/cache_service.py- 抽取快取相關變數和函數 - 建立
utils/validators.py- 抽取驗證函數 - 建立
utils/formatters.py- 抽取格式化函數
階段 3: 拆分路由模組 (風險: 中)
執行順序 (由簡單到複雜):
| 順序 | 模組 | 路由數 | 複雜度 | 依賴關係 |
|---|---|---|---|---|
| 1 | system_routes.py | 8 | 低 | 無外部依賴 |
| 2 | api_routes.py | 10 | 低 | scheduler |
| 3 | export_routes.py | 10 | 中 | DatabaseManager, Exporter |
| 4 | import_routes.py | 1 | 中 | DatabaseManager |
| 5 | edm_routes.py | 2 | 中 | DatabaseManager |
| 6 | monthly_routes.py | 3 | 中 | DatabaseManager |
| 7 | dashboard_routes.py | 2 | 高 | cache_service, DatabaseManager |
| 8 | daily_sales_routes.py | 4 | 高 | 多個輔助函數 |
| 9 | sales_routes.py | 6 | 高 | cache_service, 複雜邏輯 |
階段 4: 整合測試 (風險: 低)
- 本機測試所有路由
- UAT 環境部署測試
- 回歸測試所有功能
四、安全措施
4.1 備份策略
# 重構前完整備份
cp -r /Users/ogt/momo_pro_system /Users/ogt/momo_pro_system_backup_$(date +%Y%m%d_%H%M%S)
# 資料庫備份
cp /Users/ogt/momo_pro_system/data/momo_database.db /Users/ogt/momo_pro_system/backups/
4.2 漸進式部署
- 每拆分一個模組後立即測試
- 使用 feature flag 控制新舊路由切換
- 保留原始 app.py 直到所有模組穩定
4.3 回滾方案
# 如發生嚴重問題,立即回滾
cp /Users/ogt/momo_pro_system_backup_YYYYMMDD/app.py /Users/ogt/momo_pro_system/app.py
rm -rf /Users/ogt/momo_pro_system/routes/
# 重新部署
五、預期效益
5.1 程式碼品質
| 指標 | 重構前 | 重構後 |
|---|---|---|
| app.py 行數 | 7,253 | ~500 |
| 最大函數行數 | 1,020 | ~200 |
| 模組數量 | 1 | 10 |
| 可測試性 | 低 | 高 |
5.2 維護性改善
- 問題定位: 從搜尋 7000 行 → 搜尋 300-800 行
- 功能擴展: 只需修改相關模組
- 團隊協作: 可並行開發不同模組
- 部署風險: 可單獨部署/回滾特定模組
六、時程規劃
| 階段 | 工作項目 | 預估工作量 |
|---|---|---|
| 1 | 準備工作 + 共用模組 | 1-2 小時 |
| 2 | system_routes + api_routes | 2-3 小時 |
| 3 | export_routes + import_routes | 2-3 小時 |
| 4 | edm_routes + monthly_routes | 2-3 小時 |
| 5 | dashboard_routes | 2-3 小時 |
| 6 | daily_sales_routes | 3-4 小時 |
| 7 | sales_routes (最複雜) | 4-5 小時 |
| 8 | 整合測試 + 修復 | 2-3 小時 |
| 總計 | 18-26 小時 |
七、注意事項
7.1 已知問題需修復
- datetime 重複導入: 多處函數內有
from datetime import datetime,需統一移除 - 快取變數:
_SALES_DF_CACHE等全域變數需移至 cache_service.py - 循環依賴: 拆分時需注意模組間的 import 順序
7.2 不動的部分
config.py- 配置檔保持不變auth.py- 認證模組保持不變vendor_routes.py- 已是 Blueprint,保持不變auto_import_routes.py- 已是 Blueprint,保持不變database/目錄 - 資料庫層保持不變services/目錄 - 現有服務保持不變
八、執行確認
重構開始前,請確認:
- 已完成完整備份
- 已確認 UAT 環境可正常運作
- 已預留足夠時間進行測試
- 已準備好回滾方案
文件結束