Skip to main content
系統更新 · 最後更新 2026-05-02 08:37
2026-05-02 08:37 修復
  • **S-4:CSP `unsafe-inline` 移除(nonce-based script-src)**:`functions/_middleware.ts` 重寫 CSP 方案
  • 每個請求生成獨立的 16-byte 加密 nonce(base64url 編碼)
  • `HTMLRewriter` 自動為所有 HTML 回應中的每個 `<script>` 和 `<style>` 標籤注入 `nonce=...` 屬性
  • `script-src` 從 `'unsafe-inline'` 改為 `'nonce-{nonce}'`,封堵所有未授權 inline script 注入(XSS 核心防線)
  • `style-src` 保留 `'unsafe-inline'`(因大量 `style="..."` 屬性需要)
  • `script-src` 額外允許 `cdn.jsdelivr.net`(Chart.js CDN fallback 用)
  • `applySecurityHeaders()` 改為接受 nonce 參數,`injectNonce()` 僅對 text/html 回應執行 HTMLRewriter transform
2026-05-02 08:25 修復
  • **v9 Phase 2 安全盲區修復(S-37/S-30/S-31/S-32/S-35/S-20)**:
  • **S-37(P1)** `upload-stock.ts` 新增 `sanitizeStoreKey()`,merchant_id 只允許英數字 + 連字符 + 下劃線(最多 64 字元),徹底封堵 `../` 注入及非預期 R2 key
  • **S-30** catch 錯誤訊息改為通用「Failed to save stock data.」,不再暴露 R2 內部細節
  • **S-31** 新增 `MAX_STOCK_ROWS = 50000` 上限,超出返回 413
  • **S-32** 新增 `MAX_RAW_CSV_BYTES = 10MB` 限制,超出返回 413
  • **S-35** `strip-raw.ts`、`consolidate-shards.ts`、`preagg-months.ts` 三個破壞性維護端點從 `requireRole("editor")` 升級為 `requireRole("admin")`,防止低權限用戶誤觸
  • **S-20/S-27** `storage.ts` `newUploadId()` 改用 `crypto.randomUUID()` 替代 `Math.random()`,upload ID 熵提升至 128-bit
  • **v9 Phase 2 UX 修復(U-46/U-48)**:
  • **U-46** Inventory SKU Detail 新增「⬇ Export CSV」全量匯出按鈕,匯出目前篩選店鋪的所有 SKU(含 Stock / Safety Stock / Daily Sales / Days Cover / OOS Days / Status),檔名自動帶入店鋪名稱與日期
  • **U-48** Inventory SKU Detail 表頭全部改為可點擊排序(SKU ID / SKU Name / Category / Stock / Safety Stock / Daily Sales / Days Cover),點擊切換升序/降序,排序指示符 ▲/▼ 顯示;同時新增 Days Cover 欄位
2026-05-02 07:56 優化
  • **重建進度 Banner 改進**:Stale data banner 新增 GitHub Actions 自動重建說明 + 實時倒計時(~30s 倒數至 0 後顯示 "almost done…");正常重建時隱藏「Rebuild Now」按鈕(僅出錯時顯示);倒計時基於上傳時間計算,即使用戶延遲打開頁面也能顯示準確剩餘時間
  • 部署:https://8bcc8d76.hktv-dashboard.pages.dev
更多歷史記錄 (78 條)
2026-05-02 00:10 新功能
  • **GitHub Actions 自動 Rebuild(終極方案)**:CF Worker Free Plan CPU 10ms 限制無法完成 aggregate,改為上傳成功後 CF Worker 通過 `repository_dispatch` 觸發 GitHub Actions 在雲端運行 rebuild
  • 新增 `.github/workflows/rebuild.yml`:觸發類型 `repository_dispatch`(type: rebuild)+ `workflow_dispatch`(手動);步驟:Checkout → Setup Node 22 → npm ci → `npx tsx rebuild_local_node.mjs`
  • `functions/api/upload.ts` 修改:waitUntil 邏輯改為雙層 —— Primary: 通過 GitHub API `POST /repos/{owner}/{repo}/dispatches` 觸發 Actions;Fallback: CF Worker 同步/異步 rebuild(GitHub dispatch 失敗時)
  • `functions/lib/auth.ts` 新增 Env interface 欄位:`GITHUB_TOKEN`、`GITHUB_OWNER`、`GITHUB_REPO`(需在 CF Pages Dashboard → Settings → Environment variables 設定)
  • 修復過程中解決的錯誤:`refusing to allow PAT...workflow scope`(Token 權限不足,重新生成包含 workflow scope)、`npm ci` 失敗(Mac 生成的 lock 檔案缺 Linux 套件,改用 `npm install` 更新)、`ERR_REQUIRE_CYCLE_MODULE`(Node.js 22 ESM 循環依賴,改用 `npx tsx` 替代 `node --import=tsx/esm`)
  • 部署:https://d035ab61.hktv-dashboard.pages.dev
2026-05-01 14:57 新功能
  • **Stock Level 多文件批量上傳**:`upload.html` Stock Level 上傳區改為支持多文件選擇(`<input multiple>`)。可同時選取兩個或以上店鋪的 CSV 文件,系統會依次串行上傳每個文件,每步顯示進度 `[1/2]` / `[2/2]`,最後彙總成功/失敗數量。拖拽也支持多文件。
  • 部署:https://b91b19d8.hktv-dashboard.pages.dev
2026-05-01 14:39 新功能
  • **多店铺库存数据支持**:修复上传 Pretties 店铺库存报告会覆盖 Wagaya 店铺数据的问题。后端 `upload-stock.ts` 改为将 `stock_level` 存储为按店铺 ID 索引的对象(`stock_level[store_id] = storeData`),支持多店铺数据并存。前端 `inventory.html` 改为遍历所有店铺数据,合并 SKU 列表并显示汇总。控制台日志现在会显示 "Loaded X SKUs from Y stores"
  • 部署:https://81c9ceae.hktv-dashboard.pages.dev
2026-04-29 22:00 新功能
  • **SmartRebuild 上傳即更新**:`storage.ts` 新增 `smartRebuild(env, uploads, affectedMonths)`,只 load 受影響月份嘅 consolidated shards(~8-15K rows/月),同步在 upload Worker 內完成 aggregate
  • upload.html 移除多餘嘅 /api/rebuild batch call,直接讀 upload response 嘅 rebuild status
  • 效果:upload 1-5 天數據後 dashboard 即時更新,無需另按 Rebuild
2026-04-28 01:33 新功能
  • Upload 頁 Upload History 新增**日期篩選**:最近 7 日 / 30 日 / 90 日 / 全部 快捷 pill + 自訂日期範圍(from → to)
  • 右側顯示「N / 總數 筆」計數,切換篩選即時刷新唔使重新 request API
  • 數據一次載入後 client-side filter,零額外網絡延遲
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)