VIP Day Snapshot Wed–Fri onlyi
Daily GMV Trend Per-store · VIP days marked with amber ring
Daily Orders & ATV Orders (blue = normal, amber = VIP) + ATV line
Weekly GMV Week starting Monday
Weekly Orders & ATV Per-week combined
GMV Share by Store Share of GMV
Top 10 Brands by GMV
Top 10 Delivery Districts by Orders
Promo Performance Snapshot Mix & Match + Add-on promotions · Current filter
Top 10 Promos by GMV · dynamic to filter
Top 10 Subcategories by GMV · dynamic to filter
Promo Detail Rank / Name / Store split / Orders / GMV / Disc%
Subcategory Detail Rank / Subcategory / Store split / Qty / GMV
Top 10 SKUs by GMV
Store × Date Breakdown Daily per store
Daily Combined Both stores
Weekly Summary Per-store + combined + VIP-only slice
| Week Starting (Mon) | Range | Days | Store |
Orders | GMV | ATV | Qty | Sub-orders |
▶ 系統更新 · 最後更新 2026-04-27 15:10
2026-04-27 15:10 優化
- `/api/data` cache 時間大幅縮短:`s-maxage` 300s→60s、`stale-while-revalidate` 600s→120s
- Rebuild 後最長等待由 ~15 分鐘縮短至 ~3 分鐘即可見到新數據
2026-04-27 00:56 修復
- 折扣深度 vs ROI 散點圖按 ⛶ 放大後空白:根因 `JSON.parse(JSON.stringify(chart.config))` 無法序列化 Chart.js Config 實例
- 改用 `buildDiscountScatterCfg()` 從 `_lastScatterData` 重建 config(與 index.html 的 `buildOverlayConfig()` 模式一致)
2026-04-27 00:30 優化
- Dashboard 首頁刪除 Order Status Mix card(已有 Operation 頁替代),grid-3→grid-2
- Insights 頁標題由「Operator Insights」改為「Insights」
- Operation 頁 5 個 section 全加「🚧 Coming Soon」overlay(等待新數據重新上傳)
▶ 更多歷史記錄 (47 條)
2026-04-26 23:50 新功能
- Monthly Report 新增 **MoM 趨勢對比 + Category Breakdown**
- KPI Grid 加 `↑ +X.X%` / `↓ -X.X%` MoM badge,Daily Rhythm 加上月同期灰色虛線
- Store Compare 加 GMV/Orders/ATV 上月值 + MoM badge
- 新增 Section 13 Category Breakdown:品類 card grid + 橫向 bar chart + GMV↔Qty toggle
2026-04-26 23:16 新功能
- Monthly Report 7 條 Action Plan 全面改為 **data-driven**:Top SKU / 品牌獨家分析 / MoM 品牌環比全部用真實數據生成
- 新增 Action 08(退貨率最高品牌),從 `cancel.by_brand` 抽取異常品牌
2026-04-26 23:49 新功能
- 全新 **🚚 Operation 頁面**(`/operation.html`),5 個 section:
- ① Fulfillment Speed Panel — Order-to-Door / Pickup / Delivery 時效 + SLA breach
- ② Delivery Mode 分析 — Express vs Pickup 佔比 & ATV
- ③ Warehouse 容量 & 錯配 — 主倉佔比 + Cross-warehouse %
- ④ Status Lifecycle Donut — 全狀態 donut + per-store stacked bar
- ⑤ Warehouse Heatmap — 每日 × 倉庫 stacked area chart
- 後端新增 `aggregate-operation.ts`,upload.html 加 9 個新欄位 mapping
- 所有 5 頁導航加 🚚 Operation 連結
2026-04-24 20:20 新功能
- Index 新增 **Hero KPI Strip**:大字 GMV + 3 個 mini KPI(Orders/ATV/Items)+ delta badge
- **Controls Bar**:store chips + date bar 合成一行 compact pill
- KPI grid 由 6 卡精簡為 4 卡(Sub-orders / Avg Items / Avg Sub / Best Day GMV)
- Hero strip 歷經 3 輪用戶 feedback 迭代:移除 sparkline→compact single-row→padding 微調
2026-04-24 20:00 新功能
- Compare 頁新增 **Quick Compare preset**:Last 7D vs Prev / Last 30D vs Prev / This Week vs Last / MTD vs Last Month
- URL param 支援:`?preset=last7&store=H0958013`(shareable link)
2026-04-26 18:12 新功能
- Insights 頁新增 **Section 7:Discount Depth + ROI**(100% 前端計算,無需 rebuild)
- 折扣深度分佈直方圖:6 個區間(0–5% / 5–10% / 10–20% / 20–30% / 30–40% / 40%+),雙軸(訂單數 + GMV)
- Discount Depth vs ROI Bubble 圖:每個 promo 一粒泡,橫=折扣率、縱=ROI、泡大=訂單量,3色分 ROI 區間
- Promo Cannibalization Panel:VIP Day vs 非 VIP Day 平均日 GMV / 訂單 / Uplift %,估算蠶食率
- 4 個 KPI cards:平均折扣率、有折扣訂單佔比、最高 ROI 促銷、最高 ATV 折扣區間
2026-04-26 16:42 新功能
- Insights 頁新增 **Section 6:Basket Combo Matrix**,自動識別最常共購 SKU 組合
- 演算法:Approach B Lift Score(市場籃分析標準);指標:Lift / Confidence / Co-count
- 噪音過濾:MIN_SUPPORT=3 / MIN_LIFT=1.2;輸出 Top 50 pairs(lift 降序)
- 前端:cross-brand toggle + min support selector,Lift pill 顏色分級(≥5 紅 / ≥2 黃 / ≥1.5 綠)
- 自動建議:🔥 強 Bundle / ⭐ Mix & Match / 💡 觀察,附 top 3 actionable insight 文案
- 後端 `aggregate-insights.ts` 新增 `buildComboMatrix()`,`aggregate.ts` 輸出 `insights.basket_combo`
2026-04-24 16:42 新功能
- Insights 頁新增 3 個 section:AI 智能洞察(自動 derive top 3-5 insight)、Promo ROI Leaderboard(識別賺錢 vs 蝕本促銷)、Day-of-Week Performance(VIP Day uplift 量化)
- Promo ROI 完全跟時段 + 店舖篩選,含整體 ROI / 客單提升 / Top 15 promo 排名
- DOW 顯示每個 weekday 平均 GMV/單量/ATV,VIP Day 標記 + 最強/最弱日 insight
2026-04-24 14:25 新功能
- 全新 **💡 Insights 頁面**(`/insights.html`):獨立分析頁,營運效率 + 收入提升盲點
- **Cancel Rate Leaderboard**:SKU / Brand / District 三維度,最少 10 單觸發,揾出取消率異常高嘅 SKU 即時跟進
- **Order Timing Heatmap**:星期 × 小時 7×24 grid,識別 peak slot 排 promo launch、避開 dead hour
- **Basket Size Distribution**:單 SKU vs 多 SKU 訂單拆分,顯示 cross-sell gap + AOV 機會(單 vs 多嘅 AOV 差距)
- 後端 `aggregate.ts` 新增 `insights` 區塊,rebuild 後即可用
2026-04-24 14:15 新功能
- Admin 頁新增 **User Activity** 面板,睇到邊位用戶而家喺線、睇緊邊個頁面、揀咗邊個 time period
- 每行可點擊展開 drill-down,顯示最近幾次 filter 變動(preset、日期範圍、附加 extra)
- 24h / 7d / 30d 時段切換 · 每 60 秒自動刷新 online 狀態
- 前端每頁加 heartbeat(只喺 tab 可見 + 近 5 分鐘有活動時發送,減低 R2 write)
2026-04-24 12:29 新功能
- Top SKUs card 加 GMV / Qty 切換,可以改變排名基準(之前只支援 GMV)
- 切 Qty 模式時,表格按銷量由高至低排序,subtitle 顯示 "by Qty"
2026-04-24 11:55 新功能
- Admin 頁新增 Role Reference 卡,清楚列出 Viewer / Editor / Super Admin 嘅能力範圍,方便指派角色
2026-04-24 10:26 新功能
- 頁腳新增可摺疊嘅系統更新日誌,用戶可隨時查閱改動歷史
2026-04-24 10:06 新功能
- 日期跨度超過 30 日嘅圖表,自動切換做週度匯總,更易睇出趨勢
- 所有趨勢圖加 ⛶ 放大按鈕,全螢幕細看都得
- Top Brands 加 **GMV / 銷量** 切換
- Top SKUs 加 **10 / 20 / 50 / 100** 數量篩選,表格可 scroll
- Promo 同 Sub-category 圖表改成並排 grouped bar,更緊湊
2026-04-24 02:02 新功能
- 預設時段由 All time 改成 **本月至今**(新增 MTD 快捷按鈕)
2026-04-24 01:40 新功能
- 新增 **促銷表現** 模組:Top 促銷、加購附加率、平均折扣率
- 新增 **子類別** 分析,支援逐日 drilldown
2026-04-24 09:57 新功能
- 新增 **🔄 Compare periods** 頁面(MoM / 自訂區間 / Movers & Shakers)
2026-04-26 23:20 優化
- Monthly Report Executive Summary 改為 **Signal Detection** 架構:7 張 card 自動判斷 signal-alert(紅)/ signal-warn(橙)/ signal-ok,取代原本 flat number cards
- Lead paragraph + Footer 改為自動抽出最重要 signal 文案
2026-04-26 23:20 優化
- Insights TOC badge 標注日期篩選覆蓋範圍(Cancel Rate→部分 YTD / Basket Size→YTD only / Combo→YTD only)
- Insights 非 period-aware section 加 `⚠️ 此 section 不跟隨日期篩選` warning
2026-04-24 21:54 優化
- Index Hero GMV 字體加大 clamp(32-42px) fw800,KPI/VIP cards 縮細 padding/value
- VIP 卡片獨立 override(比 KPI 細一級)
- VIP banner 改為 ⓘ icon tooltip(移除整條橙色提示欄)
2026-04-24 19:30 優化
- **UX Audit Batch A**(5 quick wins):
- Index chart legend bar(🔵 Follows filter / 🟡 YTD)
- Insights Promo empty state 改為黃底 banner + fix 建議
- Insights period-kpi-bar 加 label + blue stripe
- Insights 5-section TOC pills(①~⑤)
- Compare skeleton shimmer animation
2026-04-24 18:35 優化
- Session TTL 由 24h 縮短至 **12h**,閒置超過 12 小時自動登出
- Sliding refresh threshold 同步調整:12h→6h
2026-04-26 20:42 優化
- P2/P3 收尾 Jira:輸出 3 張工程債票:Top Brands Qty period-aware(P2)、deprecated saveAllowedEmails 路徑清理(P2)、CSP nonce rollout 替換 unsafe-inline(P3)
2026-04-26 19:08 優化
- 全面 re-audit:typecheck + vitest 全綠(6 files / 118 tests),上輪 P1 核心項基本收斂
- 交付 `AUDIT_RECHECK_2026-04-26.md`,記錄現存 P2/P3 風險清單
2026-04-26 16:28 優化
- **H-13 記憶體佔用優化**:`aggregate-insights.ts` 中 `CancelBucketAcc.byStoreEff` / `byStoreCancel` 從 `Set<string>` 改為 `number` 計數器
- 180k rows / 500 brands / 2 stores 場景估計釋放 ~10–20 MB heap(~1,000 Set objects freed)
- `buildBasketStats()` finalization 後加 `b.skus = new Set()` 釋放 GC 引用
- 新增 `aggregate-memory.test.ts`(18 tests)覆蓋 counter arithmetic / end-to-end cancel rate / 500-brand 壓測
- **H-14 Single-pass 確認**:`aggregate.ts` 係唯一 for-loop orchestrator,Ticket 直接 close(無需改動)
2026-04-26 16:17 優化
- **H-19 Sliding-window rate limit**:`track/view.ts` 新增 count-based 滑動窗口(1 min / 6 req per user)
- Throttle 時 response 含 `throttled_reason: "sliding_window_exceeded"` + CF tail log 可見
- Feature flag:`TRACK_VIEW_RATE_LIMIT_ENABLED != "0"` 才啟用,支援 rollback 無需 redeploy
- 新增 7 條滑動窗口測試覆蓋(6req pass / 7th throttled / 窗外恢復 / per-user 獨立)
2026-04-26 14:51 優化
- **B 線:Aggregate 拆模組完成**,`aggregate.ts` 從 1084 行縮減至 401 行(純 orchestrator)
- 新增 4 個子模組:`aggregate-kpi.ts`(144 行)/ `aggregate-insights.ts`(268 行)/ `aggregate-promo.ts`(307 行)/ `aggregate-output.ts`(212 行)
- 新增 `aggregate-snapshot.test.ts`(18 tests)鎖定 data.json 24 個 top-level key + schema contract
- 全套 100 tests / 5 files / 0 typecheck errors ✅
2026-04-26 14:41 優化
- C 線補充:新增 `upload-rebuild.smoke.test.ts`(18 tests)驗證 sanitizeFileName / UploadRecord schema / aggregate→data.json 24 key contract
- 新增 `auth-me.smoke.test.ts`(28 tests)驗證 Session HMAC round-trip / session refresh threshold / roleMeets 三層 hierarchy / parseCookies
2026-04-26 14:28 優化
- **C 線:測試 + CI 基線**:新增 `tsconfig.json`(strict mode)、`vitest.config.ts`、`package.json` test/typecheck/predeploy scripts
- 新增 `aggregate.test.ts`(23 tests)覆蓋 cancel taxonomy / KPI math / brand normalize / dailyCancelAcc / basket
- 新增 `track-view.smoke.test.ts`(13 tests)覆蓋 sanitize / ALLOWED_PATHS / rate-limit logic
- 新增 `.github/workflows/ci.yml`:Node 22 + typecheck + vitest run on push/PR
2026-04-26 14:14 優化
- **A 線:Activity Shard 模式**:`activity-store.ts` 全面重寫,採用 per-user-per-day shard schema(`activity/<YYYY-MM-DD>/<emailKey>.json`)
- CAS 只鎖單一 shard,消除跨用戶 hot-blob contention;legacy path 保留,rollback 只需 `ACTIVITY_SHARD_MODE=0`
- `track/view.ts` response 新增 `write_ok` / `mode` / `cas_conflict` 觀測欄位
- `auth.ts` Env interface 加 `ACTIVITY_SHARD_MODE?: string`,移除 `(env as any)` cast
- 新增 `activity-store.test.ts`(12 tests)覆蓋 emailKey / dateKey / shardKey / compaction / dedup
2026-04-26 16:19 優化
- 系統更新 Log 顯示重構:預設只顯示最近 3 條,其餘打包入「更多歷史記錄」摺疊按鈕
- `build_changelog.py` 更新:常數 `RECENT_COUNT=3`,自動分組 RECENT / HISTORY 兩段輸出
- Order Status Mix、Top 10 Brands、Top 10 Delivery Districts 三個 card 現已跟隨日期篩選(之前係全期 YTD 靜態數據)
- Backend 新增 `daily_status` / `brand_daily` / `district_daily` 三個 per-date breakdown(需 Rebuild data.json 生效)
- 三個 card 標頭新增 scope note:已 rebuild 顯示「跟隨日期篩選 · N 日」(綠色),未 rebuild 顯示「全期 YTD · 請 Rebuild」(橙色)
- Top 10 Brands GMV metric 用 `brand_daily` 精確計算;Qty metric 仍用全期 top_brands(per-date qty breakdown 留 Phase 2)
2026-04-24 12:03 優化
- Reset All Data 按鈕加強防呆:彈出 modal 解釋後果,必須輸入「RESET」先可以確認
- 舊嘅 `confirm()` 對話框換走,改用設計清晰嘅紅色警告 modal
2026-04-24 12:00 優化
- Admin 頁嘅角色權限說明改用中文顯示,方便本地團隊理解
- 明確標註 Editor 唔能 Reset 全部數據(呢個只有 Super Admin 有權)
2026-04-24 10:56 優化
- 後台數據重建:Top SKUs 擴大至 100 條、品牌銷量數據齊全,WAGAYA 單店篩選唔會再空白
- 加入 `/api/rebuild` 內部觸發機制(需 REBUILD_KEY)畀 CI / 腳本喺部署後自動重建
2026-04-24 10:30 優化
- 更新日誌改用半自動模式,由 CHANGELOG.md 統一管理,deploy 時自動同步
- 日誌支援顯示日期 + 具體時間
2026-04-23 優化
- 上傳架構重構成 sharded,支援約 2 年數據而唔會 rebuild timeout
- 新增上傳歷史,Admin 頁可查看同刪除過往上傳
2026-04-26 21:01 修復
- Insights + Monthly Report **Mobile/iPad Responsive** 修復
- Insights 孤兒 `@media` block 修復 + 加入 480px iPhone breakpoint
- Monthly Report 加入 600px + 480px breakpoints,修復 heatmap grid 手機擠壓
2026-04-26 20:44 修復
- **P2:Top Brands Qty period-aware**:新增 `brand_daily_qty` accumulator,Qty metric 不再 fallback 全期 YTD
- `buildBrandsPool(metric)` 統一函數,GMV/Qty 都走 period-aware 路徑
- aggregate-snapshot.test.ts required keys 24→25
2026-04-24 22:00 修復
- `daily_status` TDZ Bug:`drIso` 變數於宣告前使用導致永遠 undefined,rebuild 無法寫入 daily_status 數據
- 移除頂部 legend bar(Follows date filter / All-time YTD)+ 3 個 scope note span,改由 card 內顯示
2026-04-24 18:28 修復
- **C-01 XSS**:monthly-report.html `esc()` 覆蓋率 90%→100%,6 個 innerHTML sink 全部修復
- **H-03 R2 Race**:allowed-emails.ts 改用 `updateAllowedEmails()` CAS retry(熱點④修復,5 熱點全清)
- **H-10 Activity Tracker**:確認已在 v3 完成(heartbeat 120s + in-memory rate limit)
2026-04-24 17:10 修復
- **v3 Medium 12 條全修**:timezone / YTD fallback / brand dedupe / inline handler / html2canvas scale / filterKey / session sliding / migrate log / brand normalize / file_name sanitize / basket assumption / upload ordering / popover leak
- H-15 cancelReasonStats 改用 `.trim().toUpperCase()` normalize
2026-04-26 14:22 修復
- Resend API Key 失效:更新 `RESEND_API_KEY` + 設定 `OTP_SENDER=HKTV Dashboard <noreply@nylimited.com>`
- `SESSION_SECRET` 空字串導致 HMAC key length=0 錯誤,已換用 64-char hex secret
- `SUPER_ADMIN` secret 重設(移除多餘空格),`sales@nylimited.com` 登入恢復正常
2026-04-24 10:45 修復
- GMV Share 百分比 label 改用動態量度:slice 弧長唔夠容納字就自動用外部 callout(解決仲係貼邊嘅 case)
- Top Brands 加返 Qty 資料(backend 原本只計 GMV,今次補返銷量);切 Qty 時 x 軸顯示數量而唔係金額
- Promo / Subcategory Detail card:Store Split 欄擴闊 + 支援換行,兩間店金額永遠顯示齊
- Promo / Subcategory Detail card:Store Split 嘅 HK$ 簡化為 $(騰空間畀完整數字)
- Top SKUs 10/20/50/100 真正生效(backend 之前只返 10 條,今次提升到 100)
2026-04-24 10:41 修復
- Daily GMV / Daily Orders 圖表唔再會喺 > 30 日時自動變週度 bar(避免同 Weekly GMV card 重複)
- Daily 圖表永遠維持 daily line,保留每日 rhythm 資訊;要睇週度匯總請用下方 Weekly GMV card
2026-04-24 02:05 修復
- 批量 upload 自動跳過冇訂單嘅空 xlsx 檔,唔再當 error
2026-04-24 00:20 修復
- GMV Share 百分比 label 位置調整,唔再貼近環邊緣
- 細 slice(< 6%)改用外部 callout,避免重疊
- Daily GMV Trend legend 顏色修正(唔再兩個都啡色)
- Daily Orders & ATV 加返 legend,Orders / VIP / ATV 三個 dataset 清晰分開
2026-04-24 00:04 修復
- 同一日重複 upload 時新檔覆蓋舊檔,唔會重複 count