專案

一般

配置概況

動作

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。

是由 陳國瑋 於 30 天 前更新

  • 狀態 從 New 變更為 In Progress
  • 被分派者 設定為 陳國瑋

已完成收案與根因確認,建立 feature/redmine-1458-active-duration 分支;依 Redmine SOP 進入需求確認階段。

是由 陳國瑋 於 30 天 前更新

需求確認完成

  1. 進行中交易的 duration 保留查詢區間裁切:min(now, queryEnd) - max(startTimestamp, queryStart)。
  2. 充電時長維持 API 查詢當下的快照;前端不新增自動累加。
  3. 不修改 MeterValue/Tariff 計算規則;平均功率因正確 duration 自然重算。

下一步進入實作規劃與 E2E Impact Review gate。

是由 陳國瑋 於 30 天 前更新

實作與測試準備

  • 已修正 ACTIVE transaction duration,終點改為單次查詢固定的 now,並保留 [queryStart, queryEnd) 裁切。
  • 已新增 4 個 duration 邊界 Unit Test;Maven testCompile 成功,尚未執行。
  • mvn -DskipTests package:BUILD SUCCESS。
  • E2E Impact:新增 CHG-046(P1、Active)。
  • Catalog validator:PASS(177 cases;P0=56、P1=70、P2=46、P3=5)。

依 SOP,下一步等待 Ken 啟動測試計畫。

是由 陳國瑋 於 30 天 前更新

Unit Test 結果

執行:

mvn -Dtest=TransactionServiceChargingRecordDurationTest,MeterValueTariffCalculationServiceTest test

結果:16 tests、0 failures、0 errors、0 skipped,BUILD SUCCESS。

  • 新增 duration regression:4/4 PASS。
  • #1416 MeterValue/Tariff regression:12/12 PASS。
  • Catalog validator:PASS(177 cases)。
  • 正式報告:test_report/20260901_001_redmine-1458-active-duration.md。
  • 尚未部署,API/UI E2E 尚未執行,不列為 PASS。

目前等待測試報告確認 gate。

是由 陳國瑋 於 30 天 前更新

測試報告確認與 HQ 影響

Ken 已接受 Unit Test 結果並指示 commit。

補充影響確認:ems_hq POST /api/resident/connector/records 與 Branch POST /cp/hq/connector/records 的 DTO 沒有 duration;react/web 也不顯示時長。因此 #1458 不修改 ems_hq/HQ DTO/react/web。HQ 路徑的隔日 00:00 只作 MeterValue 半開查詢邊界,屬正確行為。

目前進入文件/E2E Catalog 確認 gate。

是由 陳國瑋 於 30 天 前更新

Commit 與 push

  • Commit:a4aac29 — fix(#1458): 修正進行中交易充電時長
  • Branch:feature/redmine-1458-active-duration
  • 已 push 至 origin
  • Unit Test:16/16 PASS
  • Build:mvn -DskipTests package PASS
  • Catalog validator:PASS(177 cases)
  • E2E Impact:新增 CHG-046(P1、Active)
  • 未建立或合併 MR

尚待事項:測試環境部署後,需另依 SOP 啟動 Standard Release pack/CHG-046 API 與 UI E2E;目前不得記為 E2E PASS。

動作

匯出至 Atom PDF