專案

一般

配置概況

動作

Bug #1458

進行中

[Backend Bug] 進行中交易的充電時長誤計算至查詢日午夜

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

狀態:
In Progress
優先權:
High
被分派者:
開始日期:
2026-09-01
完成日期:
預估工時:

概述

問題

A17 管理後台的「充電記錄列表」對進行中的交易顯示錯誤充電時長。

2026-09-01 19:51 查詢 Connector CBDAX50A-25L-A6-A072-001 時,交易 788:

  • 開始時間:2026-09-01 17:38:12
  • 結束時間:尚未結束
  • 畫面充電時長:6時21分
  • 當時實際經過時間:約 2時12分

重現方式

  1. 讓 Connector 存在一筆當日開始、尚未結束的 ACTIVE transaction。
  2. 進入 Branch Admin → Connector → 充電記錄列表。
  3. 使用預設日期範圍,結束日期為今天。
  4. 查詢記錄。
  5. 觀察進行中交易的「充電時長」。

根因

ConnectorService.searchConnectorTx 將結束日期正規化為半開區間的隔日 00:00:

end = dto.getEndDate().plusDays(1).atStartOfDay();

此正規化本身正確;錯誤位於 TransactionService.computeConnectorBillDetail:當 stopTimestamp == null 時,直接把查詢區間終點 end 當成交易結束時間。

LocalDateTime transactionEnd = tx.getStopTimestamp() == null ? end : tx.getStopTimestamp();

因此本例計算成:

2026-09-02 00:00:00 - 2026-09-01 17:38:12
= 6時21分48秒

前端截斷秒數後顯示為「6時21分」。

此回歸由 commit 21df2495(#1416 跨月 MeterValue 分段結算)引入。

建議修正

進行中交易的 duration 終點應限制為查詢當下時間與查詢區間終點的較早者:

ACTIVE: min(now, queryEnd)
COMPLETED: min(stopTimestamp, queryEnd)

保留 [start, end) 半開查詢區間,不要將結束日期改回 23:59:59。

驗收條件

  • endDate=今天且交易尚未結束時,duration 不得超過 API 查詢當下時間。
  • 本案例在 19:51 查詢時應約為 2時12分,不得顯示到隔日 00:00 的 6時21分。
  • 已完成交易仍使用實際 stopTimestamp,並正確受查詢區間裁切。
  • 跨日/跨月查詢的半開區間與 #1416 MeterValue 分段結算行為不得退化。
  • 新增單元測試與 E2E regression catalog case。
動作

匯出至 Atom PDF