專案

一般

配置概況

討論 #1463

是由 陳國瑋 於 27 天 前更新

> **REST 更新週期確認(#1424 DEC-032)**:「需留意事項」由共用 Overview 在頁面首載、每 5 分鐘及手動刷新更新,不建立獨立 timer/request。它仍為 REST-only;不新增 WebSocket event,也不因兩個 live blocks 的 socket 斷線而啟用另一套 fallback。 

 > **傳輸規則更新(#1424 DEC-031)**:「需留意事項」不再訂閱 Dashboard WebSocket,V1 由 Overview REST 提供完整 aggregate。下方舊決策中提及 `ALERTS_UPDATED`、WebSocket replacement、fallback 或重連的傳輸條款由本規則取代;category allowlist、count、Empty/Partial/Error、deep link 與唯讀邊界不變。 

 ## 背景 

 主需求:#1422。 

 原始 mockup 在 Dashboard 頂部使用英文 NEEDS ATTENTION,並顯示「目前有 5 個項目需要處理」。其中「Queue 狀態不同步」只是展示假資料,若要正式成立,必須新增狀態比對/scheduler-health 判斷,與已確認的 Dashboard V1 唯讀、簡化範圍不符。 

 本票定義這個摘要區塊的用途與資料邊界。它不是待辦、派工或自動修復系統。 

 ## ATT-DEC-001:改名為「需留意事項」,只顯示明確既有狀態 

 **狀態:已確認(2026-09-03,Ken)** 

 ### 區塊目的 

 「需留意事項」回答: 

 > 目前有哪些已由 Backend 明確確認的異常或未完成狀態,值得管理者優先查看? 

 使用者不必逐一掃描所有 Dashboard 區塊。摘要項目提供類型、數量與簡短原因,並可導向既有管理頁面或 Dashboard 對應區塊。 

 ### 中文命名 

 - 英文 eyebrow「NEEDS ATTENTION」改為「需留意事項」。 
 - 主標題使用「目前有 N 類項目需要留意」。 
 - 不使用「需要處理」,避免暗示每個項目都必須立即人工操作。 
 - N 由 Backend 正式資料彙整;mockup 的 5 只是展示假資料。 

 ### V1 可納入的明確狀態 

 - Charge Point:既有 OCPP connection status 明確為 OFFLINE。 
 - Connector:既有 runtime status 明確為 FAULTED。 
 - Queue:既有 queue status 明確為 BLOCKED。 
 - Dashboard 資料來源:Backend freshness policy 明確判定為 STALE,或目前資料來源 ERROR/PARTIAL。 
 - 結算流程:#1460 四步驟資料中的既有未完成/異常狀態。 

 上述項目只引用既有 authoritative state 或已確認的 Dashboard dataStatus,不建立新的營運門檻。 

 ### V1 不納入 

 - 「Queue 狀態不同步」等需要額外比對推導的新規則。 
 - WAITING 太久、Queue timeout 或 Queue SLA。 
 - Rotation scheduler-health。 
 - 案場契約容量、利用率或容量餘裕告警。 
 - 預測性維護、異常模型或跨案場排名。 
 - 自動建立工單、指派人員、通知升級或逾期追蹤。 
 - Remote Start/Stop、Reset、重算帳務或其他 mutation。 

 若未來需要上述能力,必須另案定義資料來源、判斷公式與責任人,不能直接加入本摘要。 

 ### Backend 要開發的內容 

 - 依 buildingId 彙整符合確認規則的 category count 與 bounded summary items。 
 - 每個項目使用 stable code、count、display parameters、source updatedAt/freshness 與可供 FE 導覽的 target type/identifier。 
 - 不以自由文字作為 FE 判斷條件;中文文字由 FE 或明確 i18n contract 呈現。 
 - 只讀取既有狀態,不寫回 Charge Point、Connector、Queue、Billing/Invoice 或任何業務資料。 
 - 任一來源失敗時依 overview PARTIAL 規則標示,不捏造 0 筆異常。 
 - 去重、排序、顯示上限與各項 deep link 細節仍待後續逐項確認。 

 ### Frontend 要開發的內容 

 - 顯示「需留意事項」與「目前有 N 類項目需要留意」。 
 - 每個摘要項目顯示數量、清楚的中文名稱及一行原因。 
 - 項目只能導覽/定位至既有頁面或 Dashboard 區塊,不在摘要中放置作業按鈕。 
 - 狀態不能只靠紅/黃色;必須有文字、數字與可存取名稱。 
 - Production API 失敗時不得顯示 mock 假數字。 
 - 正常、Empty、Partial、Error 與大量項目 fixture 在後續規則確認後補齊。 

 ### Mockup 同步 

 - NEEDS ATTENTION 改為「需留意事項」。 
 - 「目前有 5 個項目需要處理」改為「目前有 5 個項目需要留意」。 
 - 「Queue 狀態不同步/標示充電,設備已待機」改為既有明確狀態「Queue 阻塞/2 個項目目前為 BLOCKED」。 
 - 其他數字仍是假資料,不代表 A17 production 現況。 

 ## Acceptance Criteria 

 - [ ] 畫面使用「需留意事項」及「需要留意」,不把摘要描述成派工或待辦。 
 - [ ] 每一種正式項目都可追溯到既有 Backend state 或已確認 dataStatus。 
 - [ ] Queue 只使用既有 BLOCKED;不新增 mismatch、waiting timeout 或 SLA 判斷。 
 - [ ] 不顯示案場契約容量/餘裕告警。 
 - [ ] 摘要與 deep link 均為唯讀,不觸發業務 mutation。 
 - [ ] 未取得來源資料時不回傳 0 冒充「沒有異常」。 
 - [ ] mock 數字與 A17 正式驗收資料明確分開。 
 - [ ] Dashboard 在其餘區塊可用時,不因單一摘要來源失敗而整頁失敗。 

 ## ATT-DEC-002:只有目前負載不可信才進入需留意事項 

 **狀態:已確認(2026-09-03,Ken)** 

 ### 納入摘要的條件 

 「需留意事項」只在目前 Live Load read model 出現下列任一明確狀態時,建立一個「即時負載資料不完整」category: 

 - current Live Load freshness = STALE。 
 - current Live Load dataStatus = PARTIAL。 
 - current Live Load dataStatus = ERROR。 

 此 category 直接引用 Backend 已判定的 current source state,不新增時間門檻或前端推測。點擊後定位至 Dashboard 的 Live Load 區塊,不執行修復操作。 

 ### 不納入摘要的情況 

 - currentPowerKw = 0 且 dataStatus = COMPLETE:代表目前已確認沒有充電負載,是正常狀態。 
 - 過去 finalized bucket 為 PARTIAL/ERROR 或 averagePowerKw = null:只在折線圖保留缺口、tooltip 與區塊內說明。 
 - 不因每一個歷史缺口分別建立摘要項目,也不把缺口數量加到頁首總數。 
 - OPEN bucket 只因時間尚未結束,不構成需留意事項;必須同時有 STALE/PARTIAL/ERROR 才納入。 
 - 不因 currentPowerKw 高或接近任何推算容量而建立告警。 

 ### Backend/事件 

 - category stable code 建議為 LIVE_LOAD_DATA_UNRELIABLE;最終 enum 名稱可在實作 plan 固定,但語意不得擴張。 
 - REST overview 依 current Live Load source state 產生相同 category。 
 - WebSocket 在 current freshness/dataStatus 進入或離開上述狀態時,透過既有「需留意事項」replacement event 更新摘要。 
 - 歷史 series 的單一 bucket status 不觸發摘要 event。 
 - source 恢復 COMPLETE/FRESH 後移除此 category。 

 ### Frontend 

 - 顯示名稱:「即時負載資料不完整」。 
 - 說明依 stable reason code 顯示「資料已過期」、「部分充電功率無法取得」或「負載資料計算失敗」。 
 - 點擊後捲動/定位到 Live Load;不新增獨立頁面。 
 - Live Load 區塊本身仍顯示對應的 stale/partial/error 狀態與重新整理操作。 
 - 歷史缺口維持圖表內呈現,不在「需留意事項」重複列出。 

 ### Mock/Fixture 

 - 正常主 mock 維持 current Live Load FRESH/COMPLETE,不加入故障項目。 
 - 最終 Partial fixture 增加 current Live Load PARTIAL 及一筆「即時負載資料不完整」摘要。 
 - 最終歷史缺口 fixture 只顯示圖表 gap,不出現這個摘要,用來驗證兩者差異。 

 ### Acceptance Criteria 

 - [ ] current STALE/PARTIAL/ERROR 只產生一個 Live Load category,不按 bucket 重複建立。 
 - [ ] current 0 + COMPLETE 不產生需留意事項。 
 - [ ] OPEN + COMPLETE 不產生需留意事項。 
 - [ ] finalized 歷史 gap 不進入摘要,也不增加頁首數量。 
 - [ ] category 可導向 Live Load,但不執行 mutation。 
 - [ ] source 恢復 FRESH/COMPLETE 後摘要同步移除。 
 - [ ] REST bootstrap 與 WebSocket replacement 使用相同判定。 

 ## ATT-DEC-003:頁首計算非零類別,各類顯示受影響數量 

 **狀態:已確認(2026-09-03,Ken)** 

 ### 頁首數字 

 - 頁首文案固定為「目前有 N 類項目需要留意」。 
 - N = categoryCount,代表 affectedCount > 0 的 category 數量。 
 - categoryCount 不是所有 affectedCount 的總和,也不宣稱是設備數、事件數或根因數。 
 - 同一個 category 不論 affectedCount 為 1 或 100,都只對 categoryCount 貢獻 1。 
 - affectedCount = 0 的 category 不顯示,也不計入 categoryCount。 

 ### 各類別計數 

 每個 category 分別回傳 affectedCount,並在同一 category 內依穩定識別碼去重: 

 - CP OFFLINE:依 Charge Point ID distinct count。 
 - Connector FAULTED:依 Connector ID distinct count。 
 - Queue BLOCKED:依 Queue entry ID distinct count。 
 - 結算流程:依 Backend 明確回傳的未完成/異常 step code distinct count。 
 - 即時負載資料不完整:屬 section-level category,存在時 affectedCount = 1。 

 同一實體若重複出現在同類別來源資料中,只計一次。 

 ### 跨類別規則 

 - 不跨 category 去重。 
 - 不推導 CP OFFLINE 是否為 Connector FAULTED/STALE 的共同根因。 
 - 同一設備可在不同 category 中各自出現,因為各 category 表達不同、已確認的狀態。 
 - 頁首只顯示 categoryCount,因此不會把跨類別的 affectedCount 相加後誤稱為不同設備總數。 
 - V1 不建立 root-cause graph、parent-child suppression 或事件關聯引擎。 

 ### Backend Contract 

 需留意事項 read model/replacement event 至少包含: 

 - categoryCount。 
 - categories 陣列。 
 - 每個 category:code、affectedCount、display parameters、target type/identifier、updatedAt/dataStatus。 
 - Backend 驗證 categoryCount 等於 affectedCount > 0 的 categories 數量。 
 - categories 不包含 affectedCount = 0 的空項目。 
 - 當摘要來源為 PARTIAL/ERROR 時,不得以 categoryCount = 0 冒充沒有異常;Partial/Error 整體呈現另依後續狀態規則確認。 

 ### Frontend 

 - 頁首依 categoryCount 顯示「目前有 N 類項目需要留意」。 
 - 每張 category card 顯示自己的 affectedCount 及正確單位,例如「1 個 Connector」、「2 個 Queue 項目」。 
 - FE 不加總 affectedCount 產生另一個總數,也不自行跨類別去重。 
 - categoryCount 與 categories 不一致時視為 contract error,不靜默修正。 

 ### Mockup 

 目前三個非零 category: 

 1. 設備故障:affectedCount = 1。 
 2. Queue 阻塞:affectedCount = 2。 
 3. 結算待確認:affectedCount = 2。 

 因此頁首由「目前有 5 個項目需要留意」改為「目前有 3 類項目需要留意」。1/2/2 仍是展示假資料,不代表 A17 現況。 

 ### Acceptance Criteria 

 - [ ] categoryCount 只計算 affectedCount > 0 的 categories。 
 - [ ] 頁首使用「N 類」,不顯示 affectedCount 總和為設備總數。 
 - [ ] 每類 affectedCount 依該類穩定識別碼 distinct。 
 - [ ] 同類重複資料不重複計數;不同類別不做 root-cause 去重。 
 - [ ] Live Load current quality category 存在時 affectedCount 固定為 1。 
 - [ ] FE 不重新計算 categoryCount 或 affectedCount。 
 - [ ] 來源失敗時不以 0 類冒充沒有需留意事項。 
 - [ ] Mock 正確顯示 3 類與各卡 1/2/2。 

 ## ATT-DEC-004:顯示全部非零類別,固定順序並 Responsive 換行 

 **狀態:已確認(2026-09-03,Ken)** 

 ### 顯示範圍 

 - categories array 顯示全部 affectedCount > 0 的已確認 V1 categories。 
 - affectedCount = 0 的 category 不建立空卡片。 
 - 不做 Top N、隱藏項目、「查看全部」、展開區、Drawer、分頁或使用者自訂排序。 
 - V1 allowlist 目前最多五類,因此直接顯示全部比新增第二層互動更簡單。 
 - 頁首 categoryCount 仍代表全部非零 categories,不受 viewport 或換行影響。 

 ### 固定順序 

 Backend/Frontend contract 的 category 順序固定如下: 

 1. CHARGE_POINT_OFFLINE:Charge Point 離線。 
 2. CONNECTOR_FAULTED:Connector 故障。 
 3. LIVE_LOAD_DATA_UNRELIABLE:即時負載資料不完整。 
 4. QUEUE_BLOCKED:Queue 阻塞。 
 5. SETTLEMENT_INCOMPLETE_OR_ERROR:結算流程未完成/異常。 

 - 不依 affectedCount 大小、最近發生時間或顏色動態重排。 
 - affectedCount = 0 的 category 被省略後,其餘 category 保持上述相對順序。 
 - Backend response/replacement event 應依此順序輸出;FE 保留順序並對未知 code 採安全 fallback,不將未知 code 認成既有類別。 
 - 若未來新增 category,必須更新 allowlist、固定順序、顯示名稱、資料來源與測試,不得只靠自由文字插入。 

 ### Responsive Layout 

 - Desktop/寬畫面:CSS Grid 依可用寬度 auto-fit;intro 與所有非零 category cards 可自動換到下一列。 
 - 約 768/1024 px:兩欄,intro 佔滿第一列。 
 - 390 px/小螢幕:單欄,intro 與 cards 垂直排列。 
 - 卡片不得縮到文字難以閱讀,不產生頁面級或區塊水平捲軸。 
 - 換行只改變版面,不改變 category 順序、categoryCount 或 affectedCount。 
 - keyboard focus/螢幕閱讀順序必須與固定 category 順序一致,不用 CSS visual order 製造 DOM 順序差異。 

 ### Mockup 

 - 正常 mock 目前只有 CONNECTOR_FAULTED、QUEUE_BLOCKED、SETTLEMENT_INCOMPLETE_OR_ERROR 三個非零類別,因此只顯示三張 card。 
 - CHARGE_POINT_OFFLINE 與 LIVE_LOAD_DATA_UNRELIABLE 在正常 mock 為零,不建立假異常卡片。 
 - CSS 改為 auto-fit/wrap,Tablet 兩欄、Mobile 單欄,用同一份 DOM 驗證 1~5 類。 
 - 所有 card 數字仍為展示假資料,不代表 A17 現況。 

 ### Acceptance Criteria 

 - [ ] 1~5 個非零 categories 都完整顯示且依固定順序。 
 - [ ] affectedCount = 0 的 category 不顯示,其他類別相對順序不變。 
 - [ ] 不存在 Top N、Drawer、展開或分頁。 
 - [ ] 390/768/1024/1440 px 不出現水平捲軸或不可讀卡片。 
 - [ ] 換行不改變 categoryCount/affectedCount。 
 - [ ] DOM、keyboard 與視覺順序一致。 
 - [ ] Unknown category code 不冒充任一既有狀態。 
 - [ ] 正常 mock 不為了展示版面而捏造 CP Offline 或 Live Load 異常。 


 ## ATT-DEC-005:成功且沒有非零類別時,保留精簡 Empty State 

 **狀態:已確認(2026-09-04,Ken)** 

 ### 適用條件 

 只有下列條件同時成立時,Frontend 才可顯示「目前沒有需留意事項」: 

 - attention aggregate 的 dataStatus = COMPLETE。 
 - categoryCount = 0。 
 - categories = []。 
 - Backend 已完成本次允許清單內資料來源的彙整,而不是因為 request 尚未完成、部分失敗或回傳內容缺漏而得到空陣列。 

 HTTP 200、畫面沒有卡片或 categories 欄位缺漏,本身都不足以推論為 Empty State。 

 ### 顯示方式 

 - 保留「需留意事項」區塊,不將整個區塊隱藏,讓使用者知道系統已完成檢查。 
 - 區塊縮成單一精簡狀態列,不顯示五張 affectedCount = 0 的空卡片。 
 - 主文案固定為「目前沒有需留意事項」。 
 - 輔助文案為「所有已檢查的狀態目前皆正常」,並顯示 Backend 提供的 updatedAt/頁面 generatedAt 所對應更新時間。 
 - 使用中性偏綠的成功樣式與勾選圖示;不可沿用紅色警示邊框、底色或 pulse。 
 - 狀態意義不能只靠顏色,螢幕閱讀器必須能讀到主文案。 
 - Empty State 不建立通知、事件、待辦或任何作業 mutation。 

 ### Backend Contract 

 attention aggregate 至少明確回傳: 

 - dataStatus。 
 - categoryCount。 
 - categories。 
 - updatedAt;若沿用 overview generatedAt,API contract 必須明確定義,不由 FE 使用本機時間假造。 

 COMPLETE + 0 是經 Backend 確認的正常結果;Frontend 不自行掃描其他 Dashboard 區塊推算是否正常。 

 ### 狀態轉換 

 - WebSocket replacement 使最後一個非零 category 消失,且 aggregate 維持 COMPLETE 時,FE 轉成 Empty State。 
 - 後續出現任何非零 category 時,FE 由 Empty State 回到 category cards。 
 - dataStatus = PARTIAL/ERROR 時不得顯示 Empty State,也不得以 categoryCount = 0 宣稱正常;其呈現方式另由下一項決策確認。 
 - 本規則只改變 read-only Dashboard 顯示,不改變 OCPP、Queue、結算或其他作業邏輯。 

 ### Mockup 

 - 預設網址仍顯示三個非零 category 的假資料。 
 - 在 mock 網址後加上 ?attention=empty,可預覽本 Empty State。 
 - query parameter 僅供 FE review,不是正式產品 UI,也不需要在正式 Dashboard 實作狀態切換控制。 
 - Mock 數字及狀態都不代表 A17 現況。 

 ### Acceptance Criteria 

 - [ ] COMPLETE + categoryCount = 0 + categories = [] 時,保留區塊並顯示精簡 Empty State。 
 - [ ] Empty State 不顯示零值 category cards,也不使用紅色警示樣式。 
 - [ ] 使用者可從文字辨識「已檢查且目前沒有需留意事項」,不只靠顏色。 
 - [ ] PARTIAL、ERROR、request loading 或 contract 缺漏不得顯示正常 Empty State。 
 - [ ] 最後一類消失/第一類出現時,UI 可在 Empty State 與 category cards 間正確切換。 
 - [ ] FE 不以 HTTP 200、空白畫面或本機時間自行推論 COMPLETE。 
 - [ ] Empty State 不觸發任何 mutation、通知或作業流程。 

 ## ATT-DEC-006:Partial 顯示已確認結果,Error 不得顯示為零 

 **狀態:已確認(2026-09-04,Ken)** 

 ### PARTIAL:部分來源成功 

 attention aggregate 的 dataStatus = PARTIAL 代表部分來源有可用結果,但整體無法宣稱完整。 

 - 已成功確認的非零 categories 繼續顯示,不因另一個來源失敗而清空。 
 - categoryCount 仍等於目前 categories 陣列中已確認的非零 category 數量;它不是完整案場總數。 
 - categoryCount > 0 時,頁首改為「已確認 N 類項目需要留意」。 
 - 額外顯示黃色狀態提示:「部分狀態暫時無法確認」及「以下為已確認項目,顯示數量可能不完整」。 
 - categoryCount = 0 時,不顯示「0 類」或綠色 Empty State;只顯示「部分狀態暫時無法確認」。 
 - aggregate 的 PARTIAL 提示是資料完整度狀態,不新增第六個 category,也不計入 categoryCount。 
 - 若 current Live Load 本身 STALE/PARTIAL/ERROR,仍依既有 ATT-DEC-002 顯示 allowlist 內的 LIVE_LOAD_DATA_UNRELIABLE;不得把兩者混成自由文字 category。 

 ### ERROR:整體彙整不可用 

 dataStatus = ERROR 代表本次 attention aggregate 沒有足夠可用結果: 

 - categoryCount = null,不得以 0 代替。 
 - categories = [];空陣列必須搭配 ERROR 解讀,不可套用 COMPLETE Empty State。 
 - 保留區塊並顯示「需留意事項暫時無法取得」。 
 - 不顯示綠色勾選、不宣稱案場正常,也不顯示過期 cards 冒充本次結果。 
 - 顯示 Backend 提供的 errorAt;若存在 lastSuccessfulAt,可一併顯示最後成功更新時間。 
 - 不新增區塊專用 Retry;使用者沿用 Dashboard 頁面既有的重新整理功能。 

 ### Backend Contract 

 attention aggregate 的回傳規則: 

 - COMPLETE:categoryCount 為整數,categories 與數量一致;0 時依 ATT-DEC-005 顯示 Empty State。 
 - PARTIAL:categoryCount 為目前已確認 categories 數量,可為 0;Frontend 必須以「已確認」及部分資料提示呈現。 
 - ERROR:categoryCount = null、categories = []。 
 - dataStatus、categoryCount、categories、updatedAt/errorAt/lastSuccessfulAt 均由 Backend 定義;Frontend 不依 HTTP status、空陣列、本機時間或其他 Dashboard 區塊自行猜測。 
 - categories 與 dataStatus 可由 REST bootstrap 或既有 attention replacement 更新;狀態恢復後以最新 Backend 結果取代畫面。 
 - contract 不一致時視為資料錯誤,不靜默改成 COMPLETE 或 Empty State。 

 ### 顯示與作業邊界 

 - Partial/Error 只描述 Dashboard 讀取結果,不建立告警事件、通知、派工或待辦。 
 - 不修改 OCPP、Queue、結算、排程、freshness cutoff 或任何作業邏輯。 
 - 不新增 retry policy;網路重連與 REST fallback 仍沿用 #1424 已確認規則。 

 ### Mockup 

 - 預設網址:顯示三個非零 category。 
 - ?attention=empty:COMPLETE 且無非零 category。 
 - ?attention=partial:保留三個已確認 category,並顯示黃色「數量可能不完整」提示。 
 - ?attention=error:只顯示「需留意事項暫時無法取得」及失敗時間。 
 - query parameter 只供 FE review,不屬於正式產品 UI。 
 - 所有 mock 數字、狀態與時間均為展示假資料,不代表 A17 現況。 

 ### Acceptance Criteria 

 - [ ] PARTIAL 且 categoryCount > 0 時,已確認 cards 保留,標題使用「已確認 N 類」並顯示數量可能不完整。 
 - [ ] PARTIAL 且 categoryCount = 0 時,不顯示 0 類或正常 Empty State。 
 - [ ] PARTIAL 提示不成為 category,也不增加 categoryCount。 
 - [ ] ERROR 時 categoryCount = null、categories = [],顯示不可取得狀態。 
 - [ ] ERROR/PARTIAL 都不得使用綠色正常文案或由 FE 推論 COMPLETE。 
 - [ ] Error State 沿用頁面既有重新整理功能,不新增區塊專用 Retry。 
 - [ ] 狀態恢復後可用 Backend 最新 replacement/snapshot 回到 COMPLETE、Empty 或非零 categories。 
 - [ ] Partial/Error 顯示不觸發任何業務 mutation。 

 ## ATT-DEC-007:Category Deep Link 採固定 allowlist 對應 

 **狀態:已確認(2026-09-04,Ken)** 

 ### 固定目的地 

 V1 每個 category code 的目的地固定如下: 

 | Category Code | 使用者可見類別 | 目的地 | 
 |---|---|---| 
 | CHARGE_POINT_OFFLINE | Charge Point 離線 | /cp/list | 
 | CONNECTOR_FAULTED | Connector 故障 | /connector/list | 
 | LIVE_LOAD_DATA_UNRELIABLE | 即時負載資料不完整 | Dashboard #load | 
 | QUEUE_BLOCKED | Queue 阻塞 | Dashboard #connectors | 
 | SETTLEMENT_INCOMPLETE_OR_ERROR | 結算未完成/異常 | Dashboard #billing | 

 - /cp/list 與 /connector/list 均為現有 Admin route。 
 - #load、#connectors、#billing 為同一 Dashboard 的固定 section anchor。 
 - Queue V1 不建立專用頁面;Connector 區塊已分層顯示 runtime、OCPP connection 與 Queue state。 
 - 結算類別先定位到四步驟結算區塊;使用者再由該區塊既有入口前往帳單或發票列表。 

 ### Routing Contract 

 - Backend 回 stable category code 與必要 display/target identifiers,不回傳任意 URL。 
 - Frontend 以固定 allowlist 將 category code 映射至 route 或 section anchor。 
 - affectedCount 為 1 或多筆都使用同一目的地,不建立 count-based routing。 
 - V1 不新增 status filter query parameter、不自動套用列表篩選,也不新增 category detail API。 
 - Unknown category code 使用安全 fallback:保留可讀文字但不建立未知目的地 link,並記錄診斷。 
 - Deep link 沿用目的頁既有權限,不繞過 route guard,也不增加使用者權限。 

 ### Interaction 與 Accessibility 

 - 整張 category card 為單一 link,不在卡片內巢狀另一個 button/link。 
 - 卡片顯示「查看 →」類型的可見操作提示,不能只靠游標變化表示可點擊。 
 - 卡片支援 Tab、Enter 與清楚的 focus-visible。 
 - 同頁 anchor 完成後,焦點移至目標 section 標題/容器,並設定 scroll margin,避免只捲動畫面卻沒有輔助科技脈絡。 
 - 跨頁使用既有前端 router;Browser Back 可回到 Dashboard。 
 - 點擊只導覽,不執行修復、重新排程、結算、通知或任何 mutation。 

 ### Mockup 

 - 目前三張假資料 cards 都可用滑鼠與鍵盤操作。 
 - Connector 故障在正式產品目的地為 /connector/list;本機單檔 mock 以 #connectors 模擬,並以 data-production-href 保留正式 route。 
 - Queue 阻塞定位 #connectors;結算待確認定位 #billing。 
 - Live Load 區塊已補上 #load anchor,供正式 mapping 與 FE review 使用。 
 - CP Offline 與 Live Load 異常在預設 mock 為零,因此不為展示 deep link 捏造卡片。 
 - 所有數字與狀態仍為展示假資料,不代表 A17 現況。 

 ### Acceptance Criteria 

 - [ ] 五個 allowlisted category codes 均依固定表格導向既有 route/section。 
 - [ ] Backend response 不含可任意導覽的 URL;FE 不以 display text 判斷目的地。 
 - [ ] affectedCount 不影響 route,V1 不新增自動 filter 或 category detail API。 
 - [ ] 整張 card 可用滑鼠、Tab 與 Enter 導覽,並有可見文字與 focus-visible。 
 - [ ] 同頁導覽後焦點位於目標 section,Browser Back 行為合理。 
 - [ ] Unknown code 不導向錯誤的既有類別或任意 URL。 
 - [ ] Deep link 不繞過既有權限,也不執行任何 mutation。 
 - [ ] 本機 mock 的跨頁模擬方式與正式產品 route 有清楚區隔。 
 ## 待確認事項 

 - [x] 頁首計算非零 category;各類 affectedCount 於類別內 distinct,跨類別不做 root-cause 去重(ATT-DEC-003)。 
 - [x] 使用固定 allowlist 順序,不依 severity、count 或時間動態重排(ATT-DEC-004)。 
 - [x] 顯示全部非零 V1 categories;不設 Top N/上限、Drawer、展開或分頁,版面 responsive 換行(ATT-DEC-004)。 
 - [x] 五個 allowlisted category 使用固定 route/anchor;FE mapping、不接受 Backend 任意 URL(ATT-DEC-007)。 
 - [x] COMPLETE + categoryCount = 0 + categories = [] 時保留精簡 Empty State(ATT-DEC-005)。 
 - [x] 只有目前 Live Load STALE/PARTIAL/ERROR 進入本區塊;歷史 bucket 缺口只在圖表呈現(ATT-DEC-002)。 

 ## 需求管理狀態 

 - Parent:#1422 
 - Related:#1424(REST/WebSocket 資料分工)、#1460(結算流程)、#1462(Live Load) 
 - Requirement status:**ATT-DEC-001~007 已確認;本區塊需求可在全 Dashboard 鎖版時整併,議題暫維持 New/0%** 
 - Final specification:全部 Dashboard 區塊確認後整併至 #1422 v1.0 文件 
 - Implementation tickets:需求鎖定後才建立 FE/BE/QA child issues 

返回