895 lines
41 KiB
Plaintext
895 lines
41 KiB
Plaintext
|
||
================================================================================
|
||
AI 自動化閉環治理同步 (2026-04-29) [DONE]
|
||
================================================================================
|
||
|
||
【已完成】
|
||
- ADR-018:四 AI Agent 自動化控制面立案。
|
||
- Memory:新增 `docs/memory/ai_automation_closure_20260429.md`。
|
||
- Guide/Skills 替代:新增 `docs/guides/ai_automation_session_sop.md`。
|
||
- SOT:更新 `docs/AI_INTELLIGENCE_MODULE_SOT.md` 至 V10.11 AI Automation Metrics Scrape 架構。
|
||
- Codex 規則:更新 `AGENTS.md`、`CONSTITUTION.md`、ADR/memory 索引。
|
||
- Prometheus 指標化:新增 EventRouter / AutoHeal / safe action / replay in-process metrics,並接入 `/metrics`。
|
||
- 線上 smoke dashboard:新增 `/ai_automation_smoke` 與 `/api/ai-automation/smoke`,覆蓋 EventRouter、AutoHeal、NemoTron fallback、OpenClaw embedding queue、ElephantAlpha HITL。
|
||
- Smoke 趨勢保存:`/api/ai-automation/smoke` 每次快檢追加 JSONL 精簡紀錄,dashboard 顯示最近趨勢。
|
||
- Smoke 趨勢管理:新增 JSONL 匯出、清理與每日摘要。
|
||
- Smoke 每日摘要:新增 Telegram 手動推播 API 與 momo-scheduler 每日 09:10 排程入口。
|
||
- Grafana 視覺化:新增 `MOMO AI Automation Overview` provisioning dashboard,覆蓋 EventRouter、safe action、replay、AutoHeal 指標。
|
||
- Grafana 線上部署:188 active Grafana 已載入 4 個 dashboard,`MOMO AI Automation Overview` provisioning 成功。
|
||
- Prometheus scrape 修復:active monitoring stack 新增 `momo-app` scrape job,目標 `momo-pro-system:80/metrics`。
|
||
- Gunicorn preload 修復:`post_fork` 略過 Flask/Werkzeug request-bound LocalProxy,避免 worker boot fail。
|
||
- CD 健康檢查強化:改為 internal container health + external `mo.wooo.work` 雙檢查,重試窗延長到約 3 分鐘。
|
||
- CD Sync reload 修復:rsync 後明確 `docker compose restart momo-app scheduler telegram-bot`,避免檔案已同步但 process 仍跑舊版。
|
||
- CD Gunicorn 掛載強化:`momo-app` 明確掛載 `./gunicorn.conf.py:/app/gunicorn.conf.py:ro`,避免重啟後吃到 image 內舊版設定。
|
||
- Metrics schema drift 降噪:`realtime_sales_monthly` 總筆數改用 raw `COUNT(*)`,避免 ORM 欄位 drift 造成 Prometheus scrape warning。
|
||
- CD Rebuild 切換強化:rebuild 模式改為先 `docker compose build --no-cache momo-app` 成功,再 stop/rm/recreate 三應用容器,避免長時間 502。
|
||
- ElephantAlpha NIM fallback 強化:預設改用 production 可呼叫的 `nvidia/llama-3.3-nemotron-super-49b-v1.5`,Ultra 253B 權限 404 時自動 fallback。
|
||
- DatabaseManager 連線池收斂:PostgreSQL 每 worker pool 調整為 `pool_size=2/max_overflow=3`,避免多 route 重複 new manager 時吃滿連線。
|
||
- Ollama embedding 強化:改為優先 `/api/embed`,舊節點才 fallback `/api/embeddings`,並新增 `EMBEDDING_TIMEOUT`。
|
||
- Scheduler 例外記錄強化:清除 `scheduler.py` 靜默 `except/pass`,資源清理、EDM 可選欄位、備份 insight/通知失敗全改為可診斷 log。
|
||
- AI metrics baseline 觀測:`/metrics` 在尚無 AI 自動化事件時仍輸出 `momo_ai_*` zero-baseline series,避免重啟後 Grafana/Prometheus 看不到 metric names。
|
||
- ElephantAlpha transient fallback:NVIDIA NIM timeout、connection error、429 與 5xx 會嘗試下一個 fallback model;400 等非暫時性請求錯誤不重試。
|
||
- 模組化治理守門:新增 `docs/guides/modularization_governance.md`、`docs/memory/code_modularization_inventory_20260430.md` 與 `tests/test_modularization_governance.py`,盤點並鎖住 15 個 >800 行 Python 大檔。
|
||
- Legacy 5888 入口清理:刪除 `tests/main_test.py` standalone Flask 死碼,測試與自動匯入文件改用 Port 80 入口。
|
||
- OpenClaw Bot 第一刀拆分:Telegram API send/retry/file upload helper 已移至 `services/openclaw_bot/telegram_api.py`,避免 Blueprint 持續承接 delivery glue。
|
||
|
||
【下次待辦】
|
||
- 繼續依 inventory 拆 `routes/openclaw_bot_routes.py`:下一刀優先拆 menu keyboard 或 report formatting。
|
||
- 觀察 Prometheus scrape 後 `momo_ai_*` baseline 與非 baseline 事件序列是否持續穩定。
|
||
- Superset panel 設定與 Smoke 摘要成效觀察。
|
||
|
||
================================================================================
|
||
品牌資產最終處理與維護 (Phase 7) [DONE]
|
||
================================================================================
|
||
|
||
26. [已完成] 品牌圖檔格式轉換:
|
||
- 使用 `convert_assets.py` 生成多種格式。
|
||
- 產出格式:TIFF, JPG, EPS, AI (PDF), SVG (x3 款 Logo)。
|
||
- 位置:/Users/ogt/momo_pro_system/export_assets
|
||
- 已部署至伺服器並建立品牌資產庫頁面:https://momo.wooo.work/brand_assets
|
||
|
||
27. [已完成] 維護頁面文案更新與部署:
|
||
- 文案已更新為:「正在進行系統升級,為了提供更穩定的網站服務,系統正在進行必要的維護與優化,造成不便,敬請見諒」
|
||
- 已同步至 GCP 生產環境。
|
||
|
||
================================================================================
|
||
WOOO TECH 公司入口網站 (Phase 8) [NEW PROJECT]
|
||
================================================================================
|
||
|
||
28. [待辦] 公司入口網站開發 (wooo.work):
|
||
- 將使用 **Flutter Web** 開發。
|
||
- 需在獨立專案中進行(非 momo_pro_system)。
|
||
- 詳細規劃文件:implementation_plan_wooo_website.md
|
||
|
||
【網站定位】
|
||
- 新創公司 WOOO TECH 的數位門面
|
||
- 整合各子系統產品的導航與介紹
|
||
- 一級域名:wooo.work
|
||
- 子系統:momo.wooo.work, [未來產品].wooo.work
|
||
|
||
【頁面結構】
|
||
- 首頁:Hero Section + 產品卡片
|
||
- 產品介紹頁:各系統功能詳情
|
||
- 公司介紹:願景、使命
|
||
- 聯繫我們:表單或 Email
|
||
|
||
【視覺風格】
|
||
- 延續 WOOO 品牌:漸變紫藍 + 深色科技感 + 玻璃質感
|
||
- 動態流暢的互動效果
|
||
|
||
【待確認】
|
||
- DNS 託管商 (wooo.work)
|
||
- 公司簡介文案
|
||
- 是否需要多語言支援
|
||
|
||
|
||
|
||
|
||
【環境區分】
|
||
|
||
1. 開發/測試環境(本機 VS Code):
|
||
- 位置:macOS 本機 (/Users/ogt/momo_pro_system)
|
||
- 用途:開發新功能、測試、除錯
|
||
- 啟動方式:`python app.py`
|
||
- 訪問:http://localhost:5000 或 http://127.0.0.1:5000
|
||
- 資料庫:data/momo_database.db (本機 SQLite)
|
||
|
||
================================================================================
|
||
完整部署流程 (2026-01-13)
|
||
================================================================================
|
||
|
||
【部署完成狀態】
|
||
✅ 網站:https://momo.wooo.work
|
||
✅ 響應時間:1.7-2 秒
|
||
✅ SSL 有效期:2026-04-13
|
||
✅ Google Drive 自動匯入:每 30 分鐘
|
||
✅ 爬蟲任務:每小時執行
|
||
✅ 自動備份:已配置
|
||
|
||
================================================================================
|
||
日常開發工作流程
|
||
================================================================================
|
||
|
||
【本機開發流程】
|
||
|
||
1. 啟動開發環境:
|
||
cd /Users/ogt/momo_pro_system
|
||
python app.py
|
||
# 訪問:http://localhost:5000
|
||
|
||
2. 開發新功能:
|
||
- 編輯程式碼
|
||
- 本機測試
|
||
- 確認功能正常
|
||
|
||
3. 測試資料庫變更:
|
||
- 修改 database/models.py
|
||
- 執行 python init_db.py
|
||
- 驗證資料庫結構
|
||
|
||
4. 版本控制(如果使用 Git):
|
||
git add .
|
||
git commit -m "描述變更內容"
|
||
|
||
【版本同步檢查】
|
||
|
||
⚠️ 重要:每次更新後確認本機和 GCP 版本一致
|
||
|
||
1. 檢查關鍵文件的修改時間和大小:
|
||
# 本機
|
||
ls -lh /Users/ogt/momo_pro_system/app.py
|
||
ls -lh /Users/ogt/momo_pro_system/dashboard.html
|
||
|
||
# GCP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ls -lh ~/momo_pro_system/app.py ~/momo_pro_system/dashboard.html"
|
||
|
||
2. 比對檔案 MD5 雜湊值(確保內容完全一致):
|
||
# 本機
|
||
md5 /Users/ogt/momo_pro_system/app.py
|
||
|
||
# GCP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="md5sum ~/momo_pro_system/app.py"
|
||
|
||
3. 檢查最近更新的文件:
|
||
# 本機(最近 1 天內修改的 Python 和 HTML 文件)
|
||
find /Users/ogt/momo_pro_system -type f \( -name "*.py" -o -name "*.html" \) -mtime -1 -ls
|
||
|
||
# GCP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="find ~/momo_pro_system -type f \( -name '*.py' -o -name '*.html' \) -mtime -1 -ls"
|
||
|
||
4. 版本追蹤建議:
|
||
✅ 每次更新後記錄更新時間和文件清單
|
||
✅ 使用 Git 進行版本控制(未來可考慮)
|
||
✅ 重大更新前先備份 GCP 當前版本
|
||
✅ 更新後測試關鍵功能確認正常
|
||
|
||
【常用維護命令】
|
||
|
||
# 查看服務狀態
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl status momo"
|
||
|
||
# 查看即時日誌
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo journalctl -u momo -f"
|
||
|
||
# 重啟服務
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl restart momo"
|
||
|
||
# 停止服務
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl stop momo"
|
||
|
||
# 啟動服務
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl start momo"
|
||
|
||
# 查看 Nginx 狀態
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl status nginx"
|
||
|
||
# 重新載入 Nginx 配置
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo nginx -t && sudo systemctl reload nginx"
|
||
|
||
# 檢查 SSL 證書狀態
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo certbot certificates"
|
||
|
||
# 手動更新 DuckDNS IP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="~/duckdns/duck.sh && cat ~/duckdns/duck.log"
|
||
|
||
# 查看資源使用狀況
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="free -h && df -h && top -bn1 | head -n 15"
|
||
|
||
【維護模式管理】
|
||
|
||
# 啟用維護模式(顯示維護頁面,停止應用服務)
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="./enable_maintenance.sh"
|
||
|
||
# 禁用維護模式(恢復正常服務)
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="./disable_maintenance.sh"
|
||
|
||
# 維護模式說明:
|
||
# - 維護模式會將網站切換到靜態維護頁面
|
||
# - 顯示「系統維護中」訊息和即時時鐘
|
||
# - SSL/HTTPS 持續運作
|
||
# - 適用於系統更新、資料庫維護等需要暫停服務的場景
|
||
# - 維護頁面位置:~/momo_pro_system/maintenance.html
|
||
|
||
================================================================================
|
||
系統備份策略
|
||
================================================================================
|
||
|
||
【本機備份】
|
||
- 執行:python backup_system.py
|
||
- 或在系統設定頁面點擊「系統備份」按鈕
|
||
- 位置:backups/ 目錄
|
||
- 最新備份:momo_pro_system_backup_20260113_111011_V9.4.zip (261 MB)
|
||
|
||
【生產環境備份】
|
||
|
||
✅ 已設置每日自動備份(每天凌晨 2:00)
|
||
|
||
1. 自動備份配置:
|
||
- 執行時間:每天 02:00(台北時間 10:00)
|
||
- 備份腳本:~/daily_backup.sh
|
||
- 備份位置:~/momo_backups/
|
||
- 保留期限:最近 7 天
|
||
- 備份內容:
|
||
* 資料庫(momo_database.db)
|
||
* 配置文件(config/)
|
||
* Google Drive 憑證
|
||
* 系統配置(Nginx, systemd)
|
||
* DuckDNS 配置
|
||
* 最近 7 天日誌
|
||
|
||
2. 查看備份狀態:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ls -lh ~/momo_backups/*.tar.gz | tail -5"
|
||
|
||
3. 查看備份日誌:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="tail -50 ~/momo_backups/backup.log"
|
||
|
||
4. 手動執行備份:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="~/daily_backup.sh"
|
||
|
||
5. 下載備份到本機:
|
||
gcloud compute scp momo-server:~/momo_backups/momo_production_backup_*.tar.gz \
|
||
/Users/ogt/momo_pro_system/backups/ --zone=asia-east1-a
|
||
|
||
6. 恢復備份:
|
||
# 解壓備份檔
|
||
tar -xzf momo_production_backup_YYYYMMDD_HHMMSS.tar.gz
|
||
# 恢復資料庫
|
||
cp momo_production_backup_*/momo_database.db ~/momo_pro_system/data/
|
||
# 重啟服務
|
||
sudo systemctl restart momo
|
||
|
||
================================================================================
|
||
故障排除指南
|
||
================================================================================
|
||
|
||
【問題:網站無法訪問】
|
||
1. 檢查服務狀態:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl status momo nginx"
|
||
|
||
2. 檢查防火牆:
|
||
gcloud compute firewall-rules list --filter="name:allow-http*"
|
||
|
||
3. 檢查 DNS 解析:
|
||
nslookup momo.wooo.work
|
||
|
||
【問題:網站速度慢】
|
||
1. 檢查資源使用:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="free -h && df -h && ps aux | grep python"
|
||
|
||
2. 檢查 Gunicorn workers:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ps aux | grep gunicorn"
|
||
|
||
3. 查看應用日誌:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo journalctl -u momo -n 100 --no-pager"
|
||
|
||
【問題:SSL 證書過期】
|
||
1. 檢查證書狀態:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo certbot certificates"
|
||
|
||
2. 手動續期:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo certbot renew"
|
||
|
||
【問題:Google Drive 自動匯入失敗】
|
||
1. 檢查日誌:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo journalctl -u momo | grep -i 'google drive' | tail -n 20"
|
||
|
||
2. 檢查憑證檔案:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ls -lh ~/momo_pro_system/config/google_*.{json,pickle}"
|
||
|
||
3. 手動測試:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a
|
||
cd ~/momo_pro_system
|
||
source venv/bin/activate
|
||
python -c "from services.google_drive_service import GoogleDriveService; g=GoogleDriveService(); print(g.list_files())"
|
||
|
||
【問題:504 Gateway Timeout】
|
||
原因:某些頁面(如 sales_analysis)需要處理大量數據(31 萬+ 筆記錄),
|
||
超過 Nginx 預設的 60 秒 timeout。
|
||
|
||
解決方案(已修復 2026-01-13):
|
||
1. 增加 Nginx proxy timeout 到 300 秒:
|
||
- proxy_read_timeout 300s;
|
||
- proxy_connect_timeout 300s;
|
||
- proxy_send_timeout 300s;
|
||
|
||
2. 如需調整 timeout,編輯 Nginx 配置:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a
|
||
sudo nano /etc/nginx/sites-available/momo
|
||
# 修改 location / { 區塊內的 proxy_*_timeout 值
|
||
sudo nginx -t && sudo systemctl reload nginx
|
||
|
||
3. 如問題持續,考慮:
|
||
- 查詢優化(已添加 11 個索引)
|
||
- 增加 Gunicorn timeout(目前 120 秒)
|
||
- 實作分頁或快取機制
|
||
- 升級 VM 規格(✅ 已升級:e2-standard-2, 8GB RAM)
|
||
|
||
效能優化歷程:
|
||
- 2026-01-13: Nginx timeout 增加到 300 秒
|
||
- 2026-01-13: VM 記憶體從 4GB 升級到 8GB(解決 OOM 問題)
|
||
- 記憶體使用率:從 94% 降至 7.5%,可用記憶體 6.9GB
|
||
|
||
【VM 規格升級方法】
|
||
如需再次升級 VM 規格:
|
||
1. 停止實例:gcloud compute instances stop momo-server --zone=asia-east1-a
|
||
2. 更改類型:gcloud compute instances set-machine-type momo-server --machine-type=e2-standard-4 --zone=asia-east1-a
|
||
3. 啟動實例:gcloud compute instances start momo-server --zone=asia-east1-a
|
||
4. 驗證升級:gcloud compute ssh momo-server --zone=asia-east1-a --command="free -h"
|
||
|
||
可用機器類型:
|
||
- e2-standard-2: 2 vCPU, 8GB RAM (當前)
|
||
- e2-standard-4: 4 vCPU, 16GB RAM
|
||
- e2-standard-8: 8 vCPU, 32GB RAM
|
||
|
||
================================================================================
|
||
重要檔案位置
|
||
================================================================================
|
||
|
||
【本機環境】
|
||
- 專案根目錄:/Users/ogt/momo_pro_system/
|
||
- 資料庫:data/momo_database.db
|
||
- 配置檔:config.py, .env
|
||
- Google Drive:config/google_credentials.json, config/google_token.pickle
|
||
- 備份目錄:backups/
|
||
- 日誌目錄:logs/
|
||
|
||
【生產環境 (VM)】
|
||
- 專案目錄:/home/ogt/momo_pro_system/
|
||
- 虛擬環境:/home/ogt/momo_pro_system/venv/
|
||
- 資料庫:/home/ogt/momo_pro_system/data/momo_database.db
|
||
- 配置檔:/home/ogt/momo_pro_system/.env
|
||
- Systemd 服務:/etc/systemd/system/momo.service
|
||
- Nginx 配置:/etc/nginx/sites-available/momo
|
||
- SSL 證書:/etc/letsencrypt/live/momo.wooo.work/
|
||
- DuckDNS 腳本:/home/ogt/duckdns/duck.sh
|
||
- Gunicorn 日誌:
|
||
- Access: /home/ogt/momo_pro_system/logs/gunicorn-access.log
|
||
- Error: /home/ogt/momo_pro_system/logs/gunicorn-error.log
|
||
- 系統日誌:sudo journalctl -u momo
|
||
|
||
================================================================================
|
||
系統重啟後待辦事項清單
|
||
================================================================================
|
||
|
||
【本機開發環境重啟】
|
||
|
||
1. 啟動系統:
|
||
cd /Users/ogt/momo_pro_system
|
||
python app.py
|
||
|
||
2. 驗證匯入功能 (關鍵):
|
||
- 進入「系統設定」頁面,匯入 Excel 報表。
|
||
- 觀察終端機日誌,確認出現「自動去重」或「已建立新資料表」的訊息。
|
||
- 若重複匯入相同檔案,應顯示「發現 X 筆重複資料,已忽略」。
|
||
|
||
3. 檢查資料顯示:
|
||
- 進入「業績分析」頁面 (/sales_analysis)。
|
||
- 確認 '狀態' 欄位是否正確顯示 'F' (目前系統處於原始匯入模式,未執行強制轉 0)。
|
||
|
||
4. 決定清理策略:
|
||
- 目前 app.py 中的「智慧資料清理」邏輯已被註解掉 (約第 1160 行)。
|
||
- 若確認資料無誤且不需要自動轉型,可維持現狀。
|
||
- 若需要恢復清理功能,請取消註解並重啟 app.py。
|
||
|
||
5. 系統備份:
|
||
- 確認一切正常後,點擊「系統備份」按鈕或執行 `python backup_system.py`。
|
||
|
||
【進階報表與策略分析規劃 (Phase 2)】
|
||
|
||
6. [已完成] 營運成長報表 (Growth Strategy):
|
||
- 建立獨立頁面 `growth_analysis.html`。
|
||
- 實作 MoM (月增率) / YoY (年增率) 雙軸趨勢圖。
|
||
- 實作 YTD (年初至今) 累計達成率。
|
||
- 實作 客單價 (AOV) 趨勢分析。
|
||
|
||
7. [已完成] BCG 矩陣分析 (波士頓矩陣):
|
||
- 已在業績分析頁加入散佈圖,並自動計算中位數劃分四象限。
|
||
- 視覺化顯示:明星(黃)、金牛(綠)、問題(藍)、瘦狗(灰)。
|
||
|
||
8. [已完成] ABC 分析 (帕累托法則):
|
||
- 已實作 A/B/C 類商品佔比計算與視覺化。
|
||
- 已加入 Excel 匯出功能,包含 ABC 分類欄位。
|
||
|
||
9. [已完成] 廠商獲利能力排行:
|
||
- 已在業績分析頁新增廠商排行表格。
|
||
- 顯示總業績、毛利額、毛利率、SKU 數與平均單品產值。
|
||
|
||
10. [已完成] 淡旺季熱力圖:
|
||
- 已實作 Month x Category 熱力圖。
|
||
- 透過氣泡大小與顏色深淺,視覺化呈現各分類在不同月份的業績表現。
|
||
|
||
【系統優化與維護 (Phase 3)】
|
||
|
||
11. [已完成] 業績分析頁面效能優化:
|
||
- 實作 Server-side AJAX 載入列表資料,解決頁面卡頓問題。
|
||
- 優化篩選邏輯與快取機制。
|
||
|
||
12. [已完成] 淡旺季熱力圖匯出:
|
||
- 實作點擊氣泡匯出該月份分類明細的功能。
|
||
|
||
13. [已完成] 廠商排行與詳細列表優化:
|
||
- 廠商排行:新增佔比、銷量、ASP 欄位,並優化版面高度。
|
||
- 詳細列表:改為多維度聚合 (商品+品牌+廠商+分類),新增品牌、均價、退貨率欄位。
|
||
|
||
14. [已完成] ABC 分析列表增加商品ID欄位:
|
||
- 在 ABC 詳細報表頁面與匯出 Excel 中增加「商品ID」欄位。
|
||
|
||
【待辦功能與驗證 (Phase 4)】
|
||
|
||
15. [待辦] 廠商排行互動優化:
|
||
- 實作點擊廠商名稱,自動跳轉並篩選該廠商的所有商品。
|
||
|
||
16. [待辦] 商品看板庫存顯示:
|
||
- 研究是否能從爬蟲抓取一般商品的庫存量 (目前僅 EDM/Festival 有抓取)。
|
||
- 若可行,在商品看板列表加入庫存欄位。
|
||
|
||
17. [已完成] 當日業績看板 (Daily Sales Dashboard):
|
||
【功能目標】
|
||
- ✅ 建立新頁面 `/daily_sales`,用於每日業績快照的分析與追蹤。
|
||
|
||
【資料表設計】
|
||
- ✅ 新建資料表 `daily_sales_snapshot`。
|
||
- ✅ 欄位結構與 `realtime_sales_monthly` 相同,並額外增加 `snapshot_date` (日期) 欄位。
|
||
- ✅ 實作自動去重機制,避免重複匯入相同日期的資料。
|
||
|
||
【Excel 匯入功能】
|
||
- ✅ 提供 Excel 上傳功能,欄位對應 `realtime_sales_monthly` 結構。
|
||
- ✅ 智慧匯入:從 Excel 的「日期」欄位自動拆分 snapshot_date(支援單檔多日)。
|
||
- ✅ 匯入後自動記錄快照日期,保留歷史記錄供比較分析。
|
||
|
||
【KPI 卡片顯示】
|
||
- ✅ 6 個核心指標卡片,每個指標計算 DoD% 和 WoW%:
|
||
1. 總業績 (DoD%, WoW%)
|
||
2. 總成本 (DoD%, WoW%)
|
||
3. 毛利 (DoD%, WoW%)
|
||
4. SKU 數 (DoD%, WoW%)
|
||
5. 客單價 (DoD%, WoW%)
|
||
6. 總銷量 (DoD%, WoW%)
|
||
- ✅ KPI 卡片文字對比度優化(白色文字 + 陰影)
|
||
|
||
【分析圖表】
|
||
- ✅ 每日業績趨勢圖(混合圖表:柱狀 + 折線)
|
||
- ✅ DoD 成長率圖(條件著色)
|
||
- ✅ WoW 成長率圖(前 7 天灰色 + 第 8 天起彩色 + 說明工具提示)
|
||
- ✅ 商品 Top 10 排行(橫向柱狀圖)
|
||
|
||
【業績行事曆視圖】(全新功能)
|
||
- ✅ 完整月份行事曆,顯示每日業績、毛利、SKU、客單價、銷量
|
||
- ✅ 星期標註(週一~週日)
|
||
- ✅ 2026 年台灣國定假日標註(根據人事行政總處公佈)
|
||
- ✅ DoD 顏色系統:紅色 = 正成長,綠色 = 負成長
|
||
- ✅ DoD 百分比標籤顯示(右上角)
|
||
- ✅ 行事曆文字對比度優化(彩色背景上的白色文字 + 陰影)
|
||
- ✅ 點擊日期切換查看詳細業績
|
||
- ✅ 月份切換按鈕(上個月/下個月)
|
||
|
||
【詳細列表】
|
||
- ✅ 顯示當日各分類的業績明細(分類層級聚合)
|
||
- ✅ 支援 DataTables 排序、搜尋、分頁功能
|
||
|
||
【日期選擇功能】
|
||
- ✅ 下拉選單顯示所有可用日期
|
||
- ✅ 切換日期時,KPI、圖表、列表同步更新
|
||
- ✅ 行事曆與日期選擇器連動
|
||
|
||
【UI/UX 優化】(2026-01-12 完成)
|
||
- ✅ 行事曆視覺優化:移除彩色背景,改用白底黑字 + DoD 徽章(上漲紅色、下跌綠色)
|
||
- ✅ 金額格式改為完整顯示(千分位):$123,456 取代 $123K
|
||
- ✅ 移除行事曆日期格中的重複星期顯示(標題列已有星期標註)
|
||
- ✅ 國定假日標籤改為日期右側顯示(inline layout)
|
||
- ✅ 響應式設計優化:
|
||
• 手機版採用橫向滾動(min-width: 700px)
|
||
• KPI 標籤改用 emoji 圖示(💰業績、📊毛利、📦SKU、🛒客單、📈銷量)
|
||
• 平板與手機適配字體大小與間距
|
||
• 新增滾動提示訊息
|
||
|
||
【多維度分析強化】(2026-01-12 完成)
|
||
- ✅ 每日趨勢圖:多 Y 軸顯示(業績/毛利、客單價、銷量)
|
||
- ✅ DoD 圖表:4 條線(業績、毛利、客單價、銷量)
|
||
- ✅ WoW 圖表:4 條線 + 前 7 天灰色顯示 + 工具提示說明
|
||
- ✅ 行事曆每格顯示 5 項指標(業績、毛利、SKU、客單價、銷量)
|
||
- ✅ 毛利計算修正:自動計算 (revenue - cost)
|
||
|
||
【廠商維度增強】(2026-01-12 完成)
|
||
- ✅ Top 10 商品:顯示格式改為「商品名稱 (廠商名稱)」
|
||
- ✅ 分類業績明細:新增廠商欄位,顯示廠商名稱(非 ID)
|
||
- ✅ 欄位優先順序修正:['廠商名稱', '廠商', 'Vendor', 'Supplier']
|
||
|
||
【系統配置更新】(2026-01-12 完成)
|
||
- ✅ 服務端口從 5888 改為 80
|
||
- ✅ 資料庫路徑確認:data/momo_database.db
|
||
|
||
【已完成測試】
|
||
- ✅ 行事曆顯示 5 項指標(完整金額 + 千分位)
|
||
- ✅ 2026 年國定假日正確標註
|
||
- ✅ DoD 徽章顏色系統(紅色上漲、綠色下跌)
|
||
- ✅ WoW 圖表灰色線條邏輯(前 7 天無對比資料)
|
||
- ✅ 行事曆文字清晰可讀(白底黑字 + DoD 徽章)
|
||
- ✅ 月份切換功能
|
||
- ✅ 日期選擇功能
|
||
- ✅ 手機版橫向滾動(行事曆、分類列表、Top 10 圖表)
|
||
- ✅ 廠商名稱顯示(Top 10 + 分類明細)
|
||
- ✅ 手機版 KPI 文字可見性優化(行事曆標籤由灰色改為深色)
|
||
- ✅ 毛利率百分比顯示(顯示於毛利金額右側)
|
||
- ✅ DoD/WoW 徽章對比度優化(改用深色背景白色文字)
|
||
- ✅ 分類業績明細表格手機版滾動(min-width: 800px)
|
||
- ✅ Top 10 商品圖表手機版滾動(min-width: 400-500px)
|
||
|
||
【修正的檔案】
|
||
- app.py (第 3376-3450 行):多維度圖表數據準備(DoD/WoW 計算、毛利計算、廠商維度)
|
||
- app.py (第 3416, 3459 行):廠商欄位優先順序修正
|
||
- app.py (第 3456-3492 行):台灣國定假日資料
|
||
- app.py (第 3548-3628 行):行事曆數據計算(客單價、銷量、毛利)
|
||
- app.py (第 3752-3791 行):行事曆數據準備函式(margin_rate 計算)
|
||
- app.py (多處):服務端口從 5888 改為 80
|
||
- daily_sales.html (第 42-287 行):CSS 樣式重構(白底黑字、DoD 徽章、響應式設計)
|
||
- daily_sales.html (第 106-114 行):Top 10 圖表響應式滾動容器樣式
|
||
- daily_sales.html (第 177-200 行):行事曆 HTML(5 項指標完整顯示)
|
||
- daily_sales.html (第 227-242 行):行事曆 KPI 文字顏色與毛利率樣式
|
||
- daily_sales.html (第 260-262, 277-279 行):手機版 Top 10 圖表最小寬度設定
|
||
- daily_sales.html (第 387 行):毛利率百分比顯示(inline 於毛利右側)
|
||
- daily_sales.html (第 408-521 行):DoD/WoW 徽章改用深色背景
|
||
- daily_sales.html (第 580-588 行):Top 10 圖表容器結構(加入滾動提示與響應式容器)
|
||
- daily_sales.html (第 605-640 行):分類列表表格響應式容器(加入滾動提示)
|
||
- daily_sales.html (第 644-896 行):Chart.js 多維度圖表配置
|
||
|
||
【系統架構優化與重構 (Phase 5)】
|
||
|
||
18. [已完成] 商品看板視覺優化 (V9.2):
|
||
【爬蟲效能優化】(2026-01-12 完成)
|
||
- ✅ 商品圖爬取改用 i_code 直接構造 CDN URL
|
||
- ✅ 格式:https://m.momoshop.com.tw/moscdn/goods/{i_code}_m.webp
|
||
- ✅ 移除複雜 DOM 查詢(8+ CSS 選擇器),速度提升 20-30%
|
||
- ✅ 提高圖片載入準確性與穩定性
|
||
|
||
【UI/UX 全面升級】(2026-01-12 完成)
|
||
- ✅ 統一紫色主題風格(#667eea, #764ba2)與 Daily Sales 一致
|
||
- ✅ 現代化漸變效果(卡片、按鈕、表頭)
|
||
- ✅ 商品卡片懸停動效(陰影、縮放)
|
||
- ✅ 表格樣式優化(漸變表頭、hover 效果)
|
||
- ✅ 商品圖片懸停效果(放大、邊框、陰影)
|
||
- ✅ 分頁按鈕圓角與漸變設計
|
||
|
||
【版面與排版修正】(2026-01-12 完成)
|
||
- ✅ 修正按鈕群組排版(全部、新上架、漲價、跌價、下架)
|
||
- ✅ 修正表格文字可見性(tbody 文字顏色 #2c3e50)
|
||
- ✅ 修正商品列表標題區塊(增加 card-body 包裹)
|
||
- ✅ 商品 ID 字體放大至 0.875rem(原 small class)
|
||
- ✅ 商品 ID 改用紫色主題色(#667eea)
|
||
|
||
【互動體驗增強】(2026-01-12 完成)
|
||
- ✅ 價格顯示 hover 效果(背景漸變、放大、陰影)
|
||
- ✅ 複製品號視覺回饋優化(✅ emoji + 縮放動畫)
|
||
- ✅ 歷史圖表 Modal 視覺升級(漸變標題、圓角、陰影)
|
||
- ✅ 圖表優化:漸變填充、平滑曲線、動態點樣式
|
||
- ✅ Tooltip 優化:emoji 圖示、深色背景、紫色邊框
|
||
- ✅ 圖表動畫:1 秒平滑動畫(easeInOutQuart)
|
||
|
||
【修正的檔案】
|
||
- scheduler.py (第 228-244 行):商品圖 URL 構造邏輯
|
||
- app.py (第 88 行):版本號更新至 V9.2
|
||
- dashboard.html (第 166-331 行):完整 CSS 重構
|
||
- dashboard.html (第 462-500 行):商品列表標題區塊結構調整
|
||
- dashboard.html (第 548-550 行):商品 ID 樣式修正
|
||
- dashboard.html (第 582-587 行):價格顯示互動效果
|
||
- dashboard.html (第 730-813 行):圖表漸變與動畫配置
|
||
- dashboard.html (第 777-789 行):複製回饋動畫
|
||
|
||
19. [已完成] 商品看板 KPI 卡片重構與新增指標 (V9.3):
|
||
【需求整合】(2026-01-12 完成)
|
||
- ✅ 將原有 4 張 KPI 卡片整合為 2 張卡片
|
||
- ✅ 新增 7 個關鍵業務指標
|
||
- ✅ 優化視覺層次與資訊密度
|
||
- ✅ 提升使用者體驗與數據可讀性
|
||
|
||
【卡片 1:商品監控概況】(2026-01-12 完成)
|
||
- ✅ 監控商品總數(千分位格式化)
|
||
- ✅ 今日新增商品數
|
||
- ✅ 週增長(過去 7 天新增商品數)
|
||
- ✅ 價格穩定商品數(7 天內無變價)
|
||
|
||
【卡片 2:今日價格動態】(2026-01-12 完成)
|
||
- ✅ 上排:漲價 / 降價 / 下架(3 個主要變動指標)
|
||
- ✅ 中排:平均漲幅 / 平均跌幅 / 活躍度(價格分析)
|
||
- ✅ 下排:最活躍分類 / 最大變動(關鍵商業指標)
|
||
|
||
【新增 KPI 指標】(2026-01-12 完成)
|
||
- ✅ 平均漲幅:漲價商品平均價格變動
|
||
- ✅ 平均跌幅:降價商品平均價格變動
|
||
- ✅ 今日活躍度:有價格變動的商品百分比
|
||
- ✅ 週增長:過去 7 天新增商品數
|
||
- ✅ 價格穩定商品數:7 天內價格無變化的商品數
|
||
- ✅ 最活躍分類:今日變動商品數最多的分類
|
||
- ✅ 最大變動:單一商品最大價格變動(含商品名稱)
|
||
|
||
【後端數據計算】(2026-01-12 完成)
|
||
- ✅ 平均漲跌幅計算邏輯(sum / count)
|
||
- ✅ 活躍度百分比計算(變動商品 / 總商品 * 100)
|
||
- ✅ 最大變動商品查找(絕對值比較)
|
||
- ✅ 週增長查詢(7 天內 min(timestamp) 的商品數)
|
||
- ✅ 價格穩定商品統計(7 天內 distinct(price) == 1)
|
||
- ✅ 最活躍分類統計(category_activity 字典統計)
|
||
|
||
【前端視覺優化】(2026-01-12 完成)
|
||
- ✅ 新增 .kpi-grid CSS 樣式(3 欄網格佈局)
|
||
- ✅ 新增 .kpi-item 樣式(漸變背景、hover 效果)
|
||
- ✅ 顏色區分:increase (紅色) / decrease (綠色) / neutral (灰色)
|
||
- ✅ 響應式設計:手機版改為單欄佈局
|
||
- ✅ 卡片 1 藍色漸變背景(與 Daily Sales 風格一致)
|
||
- ✅ 卡片 2 白色背景 + 網格佈局(清晰易讀)
|
||
|
||
【修正的檔案】
|
||
- app.py (第 494-554 行):新增 KPI 計算邏輯
|
||
- app.py (第 659-692 行):render_template 傳遞新 KPI 數據
|
||
- app.py (第 88 行):版本號更新至 V9.3
|
||
- dashboard.html (第 369-421 行):新增 KPI 網格樣式
|
||
- dashboard.html (第 440-448 行):響應式設計更新
|
||
- dashboard.html (第 477-585 行):完整 2 張卡片 HTML 結構
|
||
|
||
20. [待辦] 爬蟲邏輯統一與效能優化 (Scheduler):
|
||
- 將 run_momo_task 的優化邏輯 (批次寫入、無例外查找) 套用到 run_edm_task 與 run_festival_task。
|
||
- 提升 EDM 與購物節爬蟲的穩定性與速度。
|
||
|
||
21. [待辦] 首頁 (Dashboard) 效能優化:
|
||
- 對 get_consolidated_data 實作短時間快取 (5-10分鐘),減少資料庫全表掃描。
|
||
- 評估改用 SQL 分頁取代記憶體分頁。
|
||
|
||
22. [待辦] 程式碼重構與模組化:
|
||
- 將 app.py 的路由拆分為 Blueprints (dashboard, analysis, api)。
|
||
- 將資料處理邏輯移至 services 層。
|
||
|
||
23. [待辦] 清理冗餘程式碼:
|
||
- 移除 database/manager.py 中不再使用的 update_data 函式。
|
||
|
||
【系統安全強化 (Phase 6) - URGENT】
|
||
|
||
=== 重大安全風險 (Critical - 須立即修復) ===
|
||
|
||
24. [CRITICAL] 移除硬編碼敏感資訊:
|
||
- 檔案: config.py (第 17, 22, 26, 35, 40, 173 行)
|
||
- 問題: 所有 API 金鑰、密碼、Token 直接寫在程式碼中
|
||
• LOGIN_PASSWORD = "0936223270"
|
||
• TELEGRAM_BOT_TOKEN = "8075645931:AAH-EGKMo8ZC4QJs-Nc1_0s92xHrGdQvdpg"
|
||
• LINE_CHANNEL_ACCESS_TOKEN = "nD6MSXjB2FyB111zpT6Yik5B275mi6olHjjf94VnqN..."
|
||
• EMAIL_HOST_PASSWORD = "jopokbhdpnnborjd"
|
||
• NGROK_AUTH_TOKEN = "36e27NM5V7sUJ8QxJIAAWCp7sUv_3brtcrBarYvcP3SbvFKhF"
|
||
- 風險: 任何有權限看到程式碼的人都能取得所有帳密,可接管系統
|
||
- 修復:
|
||
1. 安裝 python-dotenv: pip install python-dotenv
|
||
2. 建立 .env 檔案存放所有敏感資訊
|
||
3. 將 .env 加入 .gitignore
|
||
4. 更新 config.py 改用 os.getenv() 讀取環境變數
|
||
5. **立即更換所有已外洩的密碼與 Token**
|
||
|
||
25. [CRITICAL] 修復 SQL Injection 漏洞 #1:
|
||
- 檔案: app.py (第 2539, 3469 行)
|
||
- 問題: 使用字串插值直接組合 SQL 查詢
|
||
• df_existing = pd.read_sql(f"SELECT * FROM {table_name}", engine)
|
||
• df = pd.read_sql(f"SELECT {', '.join(req_cols)} FROM {table_name}", db.engine)
|
||
- 風險: 攻擊者可透過惡意表格名稱執行任意 SQL 命令,竊取或刪除資料
|
||
- 修復: 使用參數化查詢,或建立白名單驗證表格/欄位名稱
|
||
|
||
26. [CRITICAL] 修復 SQL Injection 漏洞 #2:
|
||
- 檔案: database/manager.py (第 43, 52, 57 行)
|
||
- 問題: ALTER TABLE 語句使用字串插值組合 SQL
|
||
• session.execute(text(f"ALTER TABLE products ADD COLUMN updated_at TIMESTAMP DEFAULT '{now_str}'"))
|
||
- 風險: 若 now_str 包含單引號可導致 SQL injection
|
||
- 修復: 使用 SQLAlchemy 的 literal() 或驗證輸入格式
|
||
|
||
=== 高風險漏洞 (High - 本週內修復) ===
|
||
|
||
27. [HIGH] 強化登入驗證機制:
|
||
- 檔案: auth.py (第 30-41 行)
|
||
- 問題:
|
||
• 明文密碼比對 (input_password == LOGIN_PASSWORD)
|
||
• 無登入失敗次數限制
|
||
• 無帳號鎖定機制
|
||
• 使用簡單電話號碼作為密碼
|
||
- 風險: 易遭受暴力破解攻擊
|
||
- 修復:
|
||
1. 使用 werkzeug.security 的 generate_password_hash / check_password_hash
|
||
2. 實作登入失敗計數 (IP-based)
|
||
3. 5 次失敗後鎖定 5 分鐘
|
||
4. 要求更換為強密碼 (8+ 字元,含英數符號)
|
||
|
||
28. [HIGH] 加入 CSRF 防護:
|
||
- 檔案: app.py (多處 POST 路由)
|
||
- 問題: 所有 POST/PUT/DELETE 端點皆無 CSRF Token 驗證
|
||
- 風險: 攻擊者可偽造請求執行未授權操作 (如刪除資料、修改設定)
|
||
- 修復:
|
||
1. 安裝 Flask-WTF: pip install Flask-WTF
|
||
2. 在 app.py 設定 app.config['WTF_CSRF_ENABLED'] = True
|
||
3. 在所有表單加入 {{ csrf_token() }}
|
||
4. 為 AJAX 請求設定 X-CSRFToken header
|
||
|
||
29. [HIGH] 修復路徑遍歷漏洞:
|
||
- 檔案: app.py (第 2069-2070 行)
|
||
- 問題: 未驗證檔案路徑是否超出允許目錄
|
||
• potential_path = os.path.join(BASE_DIR, 'web/static/screenshots', filename)
|
||
- 風險: 攻擊者可使用 ../../../etc/passwd 存取系統檔案
|
||
- 修復: 使用 pathlib.Path.resolve() 確保路徑在合法目錄內
|
||
|
||
30. [HIGH] 檔案上傳驗證:
|
||
- 檔案: app.py (第 2406-2422 行)
|
||
- 問題: 上傳 Excel 檔案無驗證
|
||
• 未檢查副檔名
|
||
• 未檢查檔案大小
|
||
• 未驗證 MIME type
|
||
- 風險: 可上傳惡意檔案 (如 webshell, 病毒),或透過大檔案導致 DoS
|
||
- 修復:
|
||
1. 白名單副檔名: ['xlsx', 'xls', 'csv']
|
||
2. 限制檔案大小: 10MB
|
||
3. 使用 werkzeug.utils.secure_filename() 清理檔名
|
||
4. 驗證 MIME type
|
||
|
||
=== 中風險漏洞 (Medium - 本月內修復) ===
|
||
|
||
31. [MEDIUM] 缺少 HTTP 安全標頭:
|
||
- 檔案: app.py (全域)
|
||
- 問題: 未設定安全相關 HTTP headers
|
||
- 風險: 易受 XSS、點擊劫持、MIME type sniffing 攻擊
|
||
- 修復: 在 @app.after_request 加入以下 headers:
|
||
• X-Content-Type-Options: nosniff
|
||
• X-Frame-Options: DENY
|
||
• X-XSS-Protection: 1; mode=block
|
||
• Strict-Transport-Security: max-age=31536000
|
||
• Content-Security-Policy: default-src 'self'
|
||
|
||
32. [MEDIUM] Session 安全性不足:
|
||
- 檔案: auth.py (第 34 行)
|
||
- 問題: Session cookie 設定不安全
|
||
- 風險: Session 易被劫持或遭 CSRF 攻擊
|
||
- 修復: 在 app.py 設定:
|
||
• app.config['SESSION_COOKIE_SECURE'] = True # HTTPS only
|
||
• app.config['SESSION_COOKIE_HTTPONLY'] = True # 防 XSS
|
||
• app.config['SESSION_COOKIE_SAMESITE'] = 'Lax' # 防 CSRF
|
||
• app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
|
||
|
||
33. [MEDIUM] 弱亂數產生器:
|
||
- 檔案: app.py (第 720 行)
|
||
- 問題: 使用時間戳生成 ID
|
||
• new_id = int(time.time() * 1000)
|
||
- 風險: ID 可預測,攻擊者可猜測其他資源 ID
|
||
- 修復: 使用 secrets.randbits(64) 產生密碼學安全的隨機數
|
||
|
||
34. [MEDIUM] 敏感資訊洩漏:
|
||
- 檔案: 多個日誌輸出
|
||
- 問題: 日誌可能記錄敏感資料 (密碼、Token、個資)
|
||
- 風險: 日誌檔若外洩會暴露機密資訊
|
||
- 修復:
|
||
1. 檢視所有 log.info / log.debug 輸出
|
||
2. 實作密碼遮罩函式 (顯示前 2 後 2 碼,中間用 * 遮蔽)
|
||
3. 避免記錄完整 Token 或信用卡資訊
|
||
|
||
35. [MEDIUM] SSRF / Open Redirect 風險:
|
||
- 檔案: app.py (第 756-778 行)
|
||
- 問題: 未驗證外部 URL 就發送請求
|
||
• response = requests.get(url, headers=headers, timeout=10)
|
||
- 風險: 攻擊者可探測內網服務或發動 SSRF 攻擊
|
||
- 修復:
|
||
1. 建立 URL 白名單或黑名單
|
||
2. 禁止存取私有 IP (127.0.0.1, 10.0.0.0/8, 192.168.0.0/16)
|
||
3. 使用 urllib.parse 驗證 URL 格式
|
||
|
||
36. [MEDIUM] 資源耗盡風險:
|
||
- 檔案: app.py (多處查詢)
|
||
- 問題:
|
||
• 查詢結果無分頁限制
|
||
• 無請求速率限制
|
||
• 檔案上傳無大小限制
|
||
- 風險: 攻擊者可發送大量請求或上傳大檔案導致服務中斷
|
||
- 修復:
|
||
1. 安裝 Flask-Limiter: pip install Flask-Limiter
|
||
2. 設定 API 速率限制 (如 100 requests/min)
|
||
3. 設定 app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024 # 10MB
|
||
4. 資料庫查詢加入 LIMIT 與分頁
|
||
|
||
37. [MEDIUM] 缺少授權檢查:
|
||
- 檔案: app.py (多個路由)
|
||
- 問題: 部分路由未加 @login_required 裝飾器
|
||
- 風險: 未登入使用者可存取受保護功能
|
||
- 修復: 檢視所有路由,確保需要登入的端點都有 @login_required
|
||
|
||
=== 後續安全維護建議 ===
|
||
|
||
38. [建議] 定期安全掃描:
|
||
- 使用工具定期檢測漏洞:
|
||
• bandit (Python 程式碼安全掃描): pip install bandit && bandit -r .
|
||
• pip-audit (依賴套件漏洞掃描): pip install pip-audit && pip-audit
|
||
• semgrep (進階程式碼分析): https://semgrep.dev/
|
||
- 建議每月執行一次,或於部署前執行
|
||
|
||
39. [建議] 建立安全開發規範:
|
||
- 制定 secure coding guidelines 文件
|
||
- Code review 時檢查安全性
|
||
- 使用 pre-commit hooks 執行安全掃描
|
||
- 定期更新依賴套件至最新版本
|
||
|
||
40. [建議] 備份與災難復原計畫:
|
||
- 確保資料庫定期備份
|
||
- 建立系統還原 SOP
|
||
- 測試備份還原流程
|
||
- 考慮實作異地備份
|
||
|
||
================================================================================
|
||
【業績分析儀表板邏輯定義 (2026-01-15 修復確認)】
|
||
================================================================================
|
||
所有後續開發與維護,必須嚴格遵守以下邏輯與定義:
|
||
|
||
1. 數據聚合維度 (Aggregation Granularity):
|
||
- Dashboard Top 3 卡片:
|
||
* 聚合鍵: `[商品ID, 商品名稱]` (不可僅用名稱,避免同名不同規商品混淆)。
|
||
* 顯示名稱: 僅顯示 `商品名稱` (前端截斷)。
|
||
* 目的: 確保卡片數值與詳細列表中的單品數值完全一致。
|
||
- 詳細列表 (Modal):
|
||
* 聚合鍵: `[商品ID, 商品名稱, 品牌, 廠商名稱, 商品館(分類)]`。
|
||
* 目的: 提供最完整的商品細節。
|
||
|
||
2. 利潤計算邏輯 (Profit Logic):
|
||
- 通用公式:
|
||
* 若資料源存在「利潤」欄位 (`col_profit`): 優先使用 `SUM(col_profit)`。
|
||
* 若無: 使用 `SUM(總業績) - SUM(總成本)`。
|
||
- 應用範圍:
|
||
* 所有 KPI 卡片 (利潤、毛利率)。
|
||
* 所有圖表 (BCG 矩陣)。
|
||
* 詳細列表 SQL 查詢。
|
||
* Excel 匯出功能。
|
||
|
||
3. 欄位映射與動態性 (Dynamic Column Mapping):
|
||
- 機制: 必須優先從 `_SALES_PROCESSED_CACHE` 讀取 `cols_map`。
|
||
- 禁止行為: 嚴禁在 SQL 查詢中硬編碼中文欄位名稱 (如 "商品館", "品牌", "總業績")。
|
||
- 變數使用: 必須使用變數 (如 `col_category`, `col_amount`) 構建 SQL。
|
||
|
||
4. 篩選連動性 (Filter Consistency):
|
||
- 全域連動: 任何全域篩選條件 (日期、分類、品牌、廠商、價格區間、毛利區間、關鍵字) 必須同時作用於:
|
||
* 主畫面所有圖表 (趨勢圖、圓餅圖、長條圖)。
|
||
* Top 3 商業洞察卡片。
|
||
* 點擊卡片後的詳細列表 (Modal)。
|
||
* 詳細列表的 Excel 匯出。
|