動作
Bug #1458
進行中[Backend Bug] 進行中交易的充電時長誤計算至查詢日午夜
開始日期:
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分
重現方式¶
- 讓 Connector 存在一筆當日開始、尚未結束的 ACTIVE transaction。
- 進入 Branch Admin → Connector → 充電記錄列表。
- 使用預設日期範圍,結束日期為今天。
- 查詢記錄。
- 觀察進行中交易的「充電時長」。
根因¶
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。
動作