討論 #1461
進行中Feature #1422: [功能開發] Backend Admin 營運 Dashboard(全案場適用,A17 首站)
[Dashboard] 30 日充電用量區塊顯示與資料規則
概述
閱讀基準: 主需求 #1422 與 HTML Mock v0.4/附件 #1121。以下沿用主票區塊編號,依畫面由上到下、由左到右說明。Mock 數字皆為假資料;功能適用所有案場,A17 不是固定規則。
07|30 日充電用量:本票要完成什麼¶
讓使用者知道最近 30 天完成了多少充電、每天如何分布,以及每次平均充多少電。 畫面位於底部左側,右邊是 08 結算流程;上方 03-5「今日已完成充電量」重用本票今天的資料桶。
30 日充電用量 kWh/Sessions
┌──────────────────────────┬─────────────────────────┐
│ 每日圖表 │ 1. 有效充電量 │
│ X:30 個案場日期 │ 2. 充電 Sessions │
│ Y:kWh 或有效充電次數 │ 3. 平均每次充電量 │
└──────────────────────────┴─────────────────────────┘
V1 保留 kWh/Sessions 切換,移除時間使用率,第三項改為平均每次充電量;不是新增日期範圍選擇器。
1. 依畫面位置定義資訊¶
| 位置 | 顯示內容 | 意義/格式 |
|---|---|---|
| 標題 | 30 日充電用量 | 固定最近 30 個案場日曆日,含今天。 |
| 右上切換 | kWh/Sessions | 只切換指標,兩者日期軸完全相同。 |
| 圖表 X 軸 | 日期 | Backend 回傳的 30 個日期,依案場 timezone。 |
| kWh 模式 Y 軸 | 有效充電量(kWh) | 歸屬該開始日的已完成、有效最終電量。 |
| Sessions 模式 Y 軸 | 充電次數(次) | 歸屬該開始日的 COMPLETED 正電量交易數。 |
| 右側第 1 項 | 有效充電量 | validEnergyKWh;Mock 2213.6 kWh。 |
| 右側第 2 項 | 充電 Sessions | validSessionCount;Mock 136。 |
| 右側第 3 項 | 平均每次充電量 | averageEnergyPerSessionKWh,兩位小數、kWh/次;Mock 16.28。 |
短說明須讓人看懂:「僅包含已完成交易;進行中交易完成後納入」、「用量依交易開始日歸屬」、「Sessions 僅計算已完成且有充電量的交易」。平均值說明為「有效充電量 ÷ 充電 Sessions」。
今天仍在進行中,不表示今天已完成結算。這張圖是按 Session 開始日整理的使用趨勢,不是逐日電網電表的精確日切報表。(USG-DEC-001~004/006)
2. 日期怎麼算:30 個日曆日,交易歸開始日¶
Backend 依唯一 enabled Building 與其 timezone 決定 rangeStartDate/rangeEndDate;request 不傳 buildingId,FE 不用瀏覽器時區重算。(USG-DEC-001/003)
例如案場今天為 2026-09-03,日期為 8/5~9/3,共 30 日。查詢開始時間使用半開區間:
rangeStartDate 00:00(含) ───── rangeEndDate 次日 00:00(不含)
一筆交易只歸入 start_timestamp 在案場時區對應的日期,整筆最終電量與有效 Session 不因跨日拆分:
9/2 23:30 開始 ──── 跨午夜 ──── 9/3 01:00 完成
↓
整筆電量與 1 次有效 Session
都歸入 9/2(若為正電量)
在範圍內開始但仍 ACTIVE 的交易先不納入;完成後,下一次 REST 刷新補入原開始日,因此過去某日的數字可能增加。若開始日在 30 日範圍外,不能因為今天才結束而歸入今天。
3. Backend 計算規則:電量、次數、平均值¶
3.1 哪些交易要算¶
| Transaction 狀態/最終 energy_consumed | 有效電量 | 有效 Sessions | 資料品質 |
|---|---|---|---|
| COMPLETED,> 0 Wh | 納入 | 計 1 次 | 正常 |
| COMPLETED,= 0 Wh | 可納入集合,貢獻 0 | 不計次 | 不因 0 自動變 ERROR/PARTIAL |
| COMPLETED,null 或負值 | 排除 | 排除 | excludedEnergyTransactionCount 加 1,Usage 標 PARTIAL |
| ACTIVE | 不估算 | 不計次 | 本來就不符合條件,不列入排除異常數 |
| CANCELLED/ERROR | 不納入 | 不計次 | 本來就不符合條件,不列入排除異常數 |
每日與整段摘要必須用同一套條件。不可直接使用 transactions.size() 當有效次數。(USG-DEC-002/004)
3.2 三項公式¶
validEnergyKWh = SUM(符合條件的 energy_consumed,單位 Wh) ÷ 1000
validSessionCount = COUNT(COMPLETED 且 energy_consumed > 0)
averageEnergyPerSessionKWh = validEnergyKWh ÷ validSessionCount
- 平均值由 Backend 在同一 read model 計算,用 decimal 與明確 rounding;FE 不自行相除或重算摘要。
- validSessionCount=0 時平均值回 null,FE 顯示「—」及「尚無有效充電 Session」,不是 0 kWh/次,也不可除以零。
- 電量/次數為 PARTIAL/ERROR 時,平均值不能標完整。
- 異常 Completed 排除筆數要可見,不能把 null 當 0 後靜默忽略。(USG-DEC-006)
3.3 資料來源必須與即時負載分開¶
既有 e_transactions
status/energy_consumed/start_timestamp
│
├─ 本票 30 日用量
└─ #1486 今日已完成充電量(重用今日 bucket)
MeterValue Power.Active.Import
└─ #1462 案場即時負載(不是本票用量公式)
Usage 只讀已保存的交易結果;不查 raw MeterValue 估算、不呼叫 MeterValueTariffCalculationService、不做費率時段/帳務邊界分段,不建立第二套電量寫入公式。Live Load 算法不能回頭改寫 Usage。(USG-DEC-010)
4. 每日 0、未知、整段無使用:畫面不能混為一談¶
正常/部分可用的每日 series 必須升冪包含恰好 30 個日期;每個 bucket 至少有 date、validEnergyKWh、sessionCount、bucketStatus。(USG-DEC-007)
| 情況 | API 結果 | FE 圖表/摘要 |
|---|---|---|
| 查詢成功,該日沒有有效使用 | 該日 0 kWh、0 次、COMPLETE | 保留日期,零高度/Tooltip 0。 |
| 該日資料未知或查詢部分失敗 | 無法確認的 metric 為 null;PARTIAL/ERROR | 保留日期並顯示缺口/不可取得,不畫成 0。 |
| 部分日期未知、其他正常 | 30 日正常部分仍回傳,section 為 PARTIAL | 提示不完整,正常日期可讀,不壓縮日期軸。 |
| response 漏日期/少於 30 個 bucket | 契約/來源問題 | 不自行補成 0,不假裝完整。 |
| 初次整個來源 ERROR | metric/series 為 null 或不提供假有效數字 | Error,不偽造 30 個零桶,見第 5 節。 |
全部 30 日成功但沒有有效使用¶
sourceStatus=COMPLETE、dataState=EMPTY,仍回傳 30 個零值 bucket;摘要為 0 kWh/0 次/null。(USG-DEC-008)
FE 保留容器、使用中性色,顯示:
最近 30 日尚無有效充電紀錄
完成充電後,使用趨勢將顯示於此
三項摘要顯示 0 kWh/0/—。不用紅黃警示、不顯示載入失敗、不建立「需留意事項」,也不建立假交易。
5. 更新失敗與恢復¶
所有 Usage 資料與「今日已完成充電量」共用 Overview 首載/5 分鐘/手動刷新;每輪只有一個 Overview request,不另設 Usage API/timer/WebSocket,不重建 Dashboard socket。(#1424 DEC-032)
| 狀態 | 使用者應看到 | 工程規則 |
|---|---|---|
| 初次失敗,無舊資料 | 「30 日充電用量暫時無法取得/請稍後重新整理」;三項「—」、圖表 Error placeholder | 子來源 ERROR,其他 Dashboard 正常資料仍可回 PARTIAL Overview。 |
| 後續刷新失敗,有同案場舊資料 | 「資料更新失敗,目前顯示上次成功資料」+最後成功時間 | 保留完整舊 snapshot,不清空、不改 0;Header/section 呈現更新失敗。 |
| 舊資料超過 Backend freshness deadline | 舊資料仍可讀,但明示 STALE | FE 依 Backend updatedAt/deadline/effective cutoff metadata,不硬編碼秒數。 |
| 下次定時/手動刷新成功 | 新 snapshot 與正常品質狀態 | 取代舊資料、移除錯誤/過期提示。 |
lastSuccessfulAt 與 error metadata 由 Backend/已成功 snapshot 提供,不用本機時間冒充來源更新。未達過期門檻也仍須標「更新失敗」。Cache key 綁定 Backend-resolved buildingId,不跨案場沿用。
Backend 隔離子查詢、提供可診斷 error code/status/updatedAt,不洩漏敏感 exception;不新增專用 Backend 歷史 cache。刷新只讀 Overview,不重算 Transaction/MeterValue/Billing,不用 production fixture fallback。(USG-DEC-009)
6. FE/Backend 交付範圍¶
| 負責方 | 工作 |
|---|---|
| Backend | 30 日日期生成、交易唯讀聚合、三項摘要、每日 bucket、排除筆數、品質/錯誤/時間 metadata;供 #1486 重用今日桶。 |
| FE | 左圖右摘要、kWh/Sessions 切換、日期/軸單位/Tooltip、今天進行中語意、開始日說明、平均兩位小數與狀態呈現。 |
| QA | 時區與範圍邊界、跨日、各種交易 eligibility、null/0/部分排除、Empty/Error/快取/恢復,查詢不回寫業務資料。 |
明確不做(USG-DEC-005): 時間使用率 label/數值/Tooltip/placeholder,以及 timeUtilizationPercent、availableConnectorHours、歷史啟用區間分母、availability history、利用率 threshold/排名/告警。原有 durationSeconds 及其其他用途不受影響。
另不做 7/90 日/自訂範圍、Usage history export、交易/MeterValue 明細表、Usage WS publisher,或電量/Session 的寫入、修正、重算操作。
7. 驗收清單與 Fixture¶
- 日期為案場時區的最近 30 日且含今天;每日升冪恰好 30 桶,今天標示進行中。
- kWh/Sessions 切換不改日期、不影響 socket;沒有額外日期範圍控制。
- 開始日半開區間、跨日歸屬與完成後補原日期正確,不拆 MeterValue。
- 電量只加 COMPLETED 非 null、非負 Wh 並 ÷1000;Sessions 只計正電量;0 Wh 本身不報錯。
- null/負值 Completed 排除筆數可見且 PARTIAL;ACTIVE/CANCELLED/ERROR 不誤列排除異常。
- 平均由 Backend decimal 計算、顯示兩位;0 次為 null/—,FE 不重算。
- Usage 不查 raw MeterValue、不用 MeterValueTariffCalculationService、不受 Live Load 計算改變。
- 單日 0/null 視覺不同;漏日期不補 0;全段成功零值為 COMPLETE+EMPTY、0/0/—。
- Initial Error 為—與 Error 圖;Refresh Error 保留同案場資料+lastSuccessfulAt,按 Backend deadline 轉 STALE,成功後恢復。
- 單一來源失敗不拖垮其他區塊,無 fixture fallback、無業務 mutation。
- UI/API 均無時間使用率及其分母/threshold。
正常 Mock 保留,另外提供:單日 0+另一日 null 的 PARTIAL、30 日 Empty、Initial Error、Refresh Error、有舊資料的 Stale、Recovery;錯誤文字可被螢幕閱讀器讀取,不只靠顏色。
8. 決策索引與查核背景¶
| 決策 | 本文位置 |
|---|---|
| USG-DEC-001 固定 30 日;003 開始日 | 第 1~2 節 |
| USG-DEC-002 有效電量;004 有效次數;006 平均 | 第 3 節 |
| USG-DEC-005 移除時間使用率 | 第 1、6 節 |
| USG-DEC-007 零/未知;008 Empty | 第 4 節 |
| USG-DEC-009 Error/快取/恢復 | 第 5 節 |
| USG-DEC-010 Usage/Live Load 來源分離 | 第 3.3 節 |
001~009 於 2026-09-03、010 於 2026-09-07 已確認;早期「狀態待確認」已由 007~009 定案。附件 #1110 的時間使用率是舊設計;目前視覺以 v0.4/#1121 的平均每次充電量與 30 個日期桶為準,版本套件依 #1422 管理。
既有程式碼查核(沿用舊票,本次未重新查 DB): e_transactions 有 status、start_timestamp、stop_timestamp、meter_start/stop、energy_consumed、duration_seconds。TransactionService 完成交易時以 meterStop-meterStart 寫 Wh,狀態為 COMPLETED;既有狀態含 ACTIVE/COMPLETED/CANCELLED/ERROR。費率分段 service 保留原帳務用途,不帶入 Usage。
2026-09-03 A17 基線,範圍 8/5~9/3(不是固定驗收值): Building BLD000000014,4 CP/12 Connector;78 COMPLETED(77 正電量、1 零、0 null/負值),另 1 ACTIVE,10 筆跨日;78 筆最終電量均與 meterStop-meterStart 一致。有效電量 2171.915 kWh、77 次、平均 28.21 kWh/次;excludedEnergyTransactionCount=0。
只供追溯、不是 V1 要做的指標: 原基線零 Wh 交易 15 秒/EVDisconnected,正電量最短 69 秒;有效 Sessions duration 合計 1,124,353 秒(312.320h),38 筆與 timestamp 差 -1 秒、為秒級截斷,timestamp 合計 312.331h。當時 12 Connector 皆屬 enabled CP、30 日無新增,以當前 12×30×24 分母曾算 3.6148%,Mock 4.08% 為假資料。這段「時間使用率」探索已撤回,不能據此恢復分母、設備歷史或利用率功能。
需求管理與本次編輯¶
- 本票仍是已確認需求的追蹤票,不代表已完成開發或通過測試;指派、狀態、進度、附件與父子關係均維持原狀。
- v0.4 Draft 文件套件已依 #1422 DOC-DEC-001 發布並保留 v0.2/v0.3;目前閱讀基準為 PDF #1119、Markdown #1120、HTML #1121。此版仍是 review Draft,尚非 v1.0。
- 2026-09-14:僅重整 Description、說明與排版,將已確認決策併入對應畫面/工程工作;決策編號保留供追溯。E2E impact:No catalog change(沒有修改產品行為、公式或 API 契約);功能實作時仍須遵循主票與本票驗收。