OoO
3971fd4020
CD Pipeline / deploy (push) Successful in 1m12s
fix(daily_sales): cache 失效改 DB fingerprint + clear_cache 加 @login_required
回應 critic 對 8fefea0 的 4 個 HIGH finding(debugger/web-researcher/migration-engineer 三方共識):
HIGH-3 修復:
- /api/daily_sales/clear_cache 加 @login_required,避免外部 DoS 攻擊清快取
HIGH-4 修復(核心):
- 新增 _get_data_fingerprint(engine):SELECT MAX(snapshot_date), COUNT(*) FROM daily_sales_snapshot
- _is_cache_valid 改雙閘:TTL(保險絲)+ DB fingerprint(強一致)
- 三個 cache 寫入點同步記錄 fingerprint
- 移除 services/import_service.py 的 4-worker N-POST hack(命中率僅 9.4%,
coupon collector 機率:4!/4^4 = 0.094)
- 資料寫入後指紋自動跳號,4 worker 下次 request 各自偵測失效並重載 → 強一致
附帶修:
- 統一 export/export_marketing 兩處 cache 寫入結構(補 timestamp/fingerprint),
解決 db-expert 標記的「export 端點 cache 缺 timestamp 導致主看板每次都重讀」瑕疵
未處理(留待後續):
- HIGH-2: app.py 仍有 43 處 _SALES_PROCESSED_CACHE(sales_analysis 等其他路由的獨立 cache)
待後續 P9 統一抽 services/cache_manager.py
[P7-COMPLETION]
方案: critic + debugger + web-researcher + migration-engineer 四方共識的方案 B
影響: routes/daily_sales_routes.py + services/import_service.py 兩檔
Regression: 每 request 多 1 次 SELECT MAX/COUNT(< 5ms),其餘行為等價
2026-04-29 09:10:23 +08:00
..
2026-04-28 15:26:20 +08:00
2026-04-19 01:21:13 +08:00
2026-04-28 13:57:44 +08:00
2026-04-19 01:21:13 +08:00
2026-04-25 10:12:20 +08:00
2026-04-25 03:30:14 +08:00
2026-04-28 12:11:33 +08:00
2026-04-27 21:11:52 +08:00
2026-04-19 01:21:13 +08:00
2026-04-21 15:17:48 +08:00
2026-04-28 21:01:44 +08:00
2026-04-19 01:21:13 +08:00
2026-04-19 01:21:13 +08:00
2026-04-28 13:57:44 +08:00
2026-04-28 15:37:07 +08:00
2026-04-27 21:28:23 +08:00
2026-04-22 01:12:23 +08:00
2026-04-19 01:21:13 +08:00
2026-04-28 12:15:42 +08:00
2026-04-20 04:28:26 +08:00
2026-04-25 10:31:00 +08:00
2026-04-25 03:30:14 +08:00
2026-04-20 04:28:26 +08:00
2026-04-19 01:21:13 +08:00
2026-04-19 01:21:13 +08:00
2026-04-27 21:11:52 +08:00
2026-04-28 12:15:59 +08:00
2026-04-29 09:10:23 +08:00
2026-04-28 19:42:05 +08:00
2026-04-27 21:28:23 +08:00
2026-04-28 12:26:49 +08:00
2026-04-25 01:42:40 +08:00
2026-04-19 01:21:13 +08:00
2026-04-19 01:21:13 +08:00
2026-04-28 12:15:59 +08:00
2026-04-19 01:21:13 +08:00
2026-04-19 01:21:13 +08:00
2026-04-28 14:40:22 +08:00
2026-04-28 12:29:48 +08:00
2026-04-25 11:03:11 +08:00
2026-04-19 01:21:13 +08:00
2026-04-20 06:09:33 +08:00
2026-04-19 01:21:13 +08:00
2026-04-22 01:12:23 +08:00
2026-04-20 20:26:47 +08:00
2026-04-19 01:21:13 +08:00
2026-04-27 21:28:23 +08:00
2026-04-25 09:41:55 +08:00
2026-04-28 11:33:02 +08:00
2026-04-25 01:42:58 +08:00
2026-04-19 01:21:13 +08:00
2026-04-19 01:21:13 +08:00
2026-04-27 20:34:15 +08:00
2026-04-19 01:21:13 +08:00
2026-04-19 20:43:53 +08:00