專案

一般

配置概況

動作

討論 #1461

進行中

Feature #1422: [功能開發] Backend Admin 營運 Dashboard(全案場適用,A17 首站)

[Dashboard] 30 日充電用量區塊顯示與資料規則

是由 陳國瑋 於 28 天 前加入. 於 15 天 前更新.

狀態:
New
優先權:
Normal
被分派者:
-

概述

閱讀基準: 主需求 #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 契約);功能實作時仍須遵循主票與本票驗收。

是由 陳國瑋 於 28 天 前更新

  • 追蹤標籤 從 討論 變更為 Feature
  • 狀態 從 Closed 變更為 New
  • 完成百分比 設定為 0

Redmine 討論 tracker 建票時自動套用 Closed;暫切 Feature 以恢復 New/0%,此為 workflow 校正,不代表進入開發。

是由 陳國瑋 於 28 天 前更新

  • 追蹤標籤 從 Feature 變更為 討論

已恢復為討論/New/0%。本票仍在指標定義需求確認階段,不應結案。

是由 陳國瑋 於 28 天 前更新

補充唯讀研究證據:A17 2026-08-05~09-03 有 78 Completed/1 Active;Completed 電量欄位完整且與 meterStop - meterStart 一致,正電量合計 2,171.915 kWh;10 筆跨日。此紀錄僅供後續公式決策,不是全案場規則或驗收數字。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-002:有效充電量只加總 COMPLETED 且 energy_consumed 非 null、非負的最終交易電量;ACTIVE 不以 MeterValue 估算。異常 Completed 排除並回傳筆數,Usage 標示 PARTIAL。跨日交易的每日歸屬仍保留為下一項獨立決策。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-003:整筆有效電量及 Session 依 building timezone 的 startTimestamp 日期歸屬;跨日交易不拆 MeterValue。30 日範圍以開始日半開區間判定,ACTIVE 完成後再補入原開始日 bucket。本決策只影響 Dashboard read model。

是由 陳國瑋 於 28 天 前更新

補充 Sessions 討論證據:A17 唯一 0 Wh COMPLETED 交易持續 15 秒並以 EVDisconnected 結束;正電量 COMPLETED 最短 69 秒。此為匿名化基線,不代表 Sessions eligibility 已確認。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-004:充電 Sessions 只計算 COMPLETED 且 energy_consumed > 0 的交易,並依開始日歸屬。0 Wh Completed 與 ACTIVE 不納入;0 Wh 本身不自動標示錯誤。A17 baseline 為 77 Sessions。本決策只影響 Dashboard read-only 統計。

是由 陳國瑋 於 28 天 前更新

補充時間使用率研究基線(尚非決策):A17 77 個有效 Sessions 合計 312.320 小時;38 筆 durationSeconds 僅與 timestamp 差 -1 秒。12 個 Connector 皆在 enabled CP,30 日 denominator 8,640 小時,baseline 3.6148%。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-005:Dashboard V1 移除時間使用率。FE 移除該摘要與 states;Backend 不回 timeUtilizationPercent/denominator,也不新增設備啟停歷史。第三個摘要替代資訊仍待下一題確認。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-006:以平均每次充電量取代時間使用率,由 Backend 計算 validEnergyKWh ÷ validSessionCount;0 Sessions 回 null,FE 顯示「—」。本機 working mock 已改為 16.28 kWh/次(沿用一致的假資料);最終附件與 PDF 待全部需求鎖定後更新。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-007:Usage 固定回傳 30 個日期 bucket;成功但無有效 Session 為 0,資料未知為 null;部分日期未知時 section = PARTIAL,FE 以圖表缺口與零值區分。最終 mock/fixture 須同時示範 0 與 null。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-008:30 日查詢成功但全為零時,sourceStatus = COMPLETE、dataState = EMPTY;回傳 30 個零 bucket,摘要顯示 0 kWh/0 Sessions/—,使用中性無紀錄文案,不產生告警。最終 mock 增加 Empty fixture。

是由 陳國瑋 於 28 天 前更新

已依 Ken 確認新增 USG-DEC-009:Initial Error 無舊資料時顯示 —/Error placeholder;後續 refresh 失敗保留同 building 最後成功 snapshot、顯示 lastSuccessfulAt,並依 Backend freshness deadline 轉為 STALE。Usage 子查詢失敗不拖垮其他區塊。#1461 區塊需求已全部確認,票仍維持 New/0%。

是由 陳國瑋 於 27 天 前更新

下游重用確認:#1486 KPI-DEC-006「今日已完成充電量」直接使用本票 date = rangeEndDate 的 today daily bucket(validEnergyKWh/sessionCount),完整沿用 USG-DEC-001~009;不新增第二套查詢或 WebSocket。

是由 陳國瑋 於 27 天 前更新

同步 DEC-032:既有 5 分鐘 Usage 更新改由全頁唯一 Overview timer 執行,不建立 Usage 專用 polling;公式與狀態規則不變。

是由 陳國瑋 於 26 天 前更新

【現行需求一致性整理|#1424 DEC-029/032】

  • Usage 與今日已完成充電量維持 REST-only,使用共用 Overview 更新。
  • 明確改為頁面手動刷新不重建 Dashboard WebSocket,也不觸發任何資料重算或 mutation。
  • V1 無 building selector;cache 以 Overview response 的 Backend-resolved buildingId 隔離,不跨 scope 沿用。
  • 30 日、開始日歸屬、Completed-only、0/null/Error 等既有公式不變;Issue 維持 New/0%。

E2E impact:No catalog change;本次未執行產品/整合/E2E 測試。

是由 陳國瑋 於 24 天 前更新

是由 陳國瑋 於 24 天 前更新

【需求確認|USG-DEC-010】

Ken 同意將 Usage 與 Live Load 的資料來源明確分開,並清除舊的「尚未決定」文字。

現行規則:

  • 30 日充電用量與今日已完成充電量只讀取 e_transactions 的 COMPLETED status、既有最終 energy_consumed 與 start_timestamp。
  • 每日資料依 building timezone 的交易開始日歸屬;跨日不拆分。
  • Session eligibility 維持 COMPLETED 且 energy_consumed > 0。
  • Usage 不讀取 raw MeterValue 重新估算、不呼叫 MeterValueTariffCalculationService,也不做費率時段/帳務邊界分段。
  • MeterValue 只由 #1462 Live Load 用於 current power 與 time-weighted series。
  • 不修改 Transaction、MeterValue、Billing 或 charging lifecycle。

已同步修正 USG-DEC-002/003 的舊「另案確認」、A17 baseline 的舊待決文字、Acceptance Criteria、確認清單與需求管理狀態。Issue 維持討論/New/0%。本次未修改程式或 mock;E2E impact:需求階段 No catalog change。

是由 陳國瑋 於 17 天 前更新

是由 陳國瑋 於 15 天 前更新

動作

匯出至 Atom PDF