================================================================================ 2026-08-06 report/ 運転日報 区間運転時間の休憩控除バグ修正 ================================================================================ 【背景】 運転日報画面(report/)で、拠点間の運転時間が実際より短く表示される事象。 ユーザー報告: - 04/17 Z9 群馬夜便② … HGPC→①上武 が 0:37。休憩38分が余分に引かれている - 04/15 Z5 群馬夜便① … HGPC→①新狭山 が -1:11。休憩47分が余分に引かれている いずれも「拠点に停車中(到着〜出発の間)に取った休憩」が、その後の 走行区間の運転時間から二重に差し引かれていた。 【原因】(report.js recalc() 内「時間の再計算」ループ) 1. 拠点間の休憩を rest に合算する一方、判定用の restStart には 「最後の1件」の開始時刻しか保持していなかった。 2. 除外判定が if(rs > ca) rest = 0; の全か無かで、合算値をまとめて 生かすか殺すかの二択になっていた。 3. 下限判定(休憩開始が前拠点の出発より前=停車中の休憩か)が無く、 日付跨ぎ補正 if(rs < cd) rs += 24*60; が停車中の休憩を「翌日」と 誤認していた。 → 休憩が1件だけなら 3. の副作用で偶然除外されていたため表面化せず、 「1区間に複数休憩あり+最後が走行中+区間外の休憩が混在」の場合のみ発火。 併せて負数の時刻表示バグも判明。 Math.floor(-11/60)=-1、("0"+(-11%60)).substr(-2)="11" のため -0:11 が -1:11 と表示されていた。 【影響】 運転時間が過少になった分がそのまま待機時間(拘束−運転−作業−休憩)に 化けていた。上記2件はいずれも待機時間が誤控除分と完全に一致していた。 集計値は writeTotals 経由で truckCourse にも保存されるため DB にも波及。 【対応】(report/report.js) - rest(合算値)+restStart(最後の1件)を restList[] に置き換え、 休憩を1件ずつ保持するよう変更。 - 控除判定を「前拠点の出発 <= 休憩開始 < 当拠点の到着」の区間内判定に変更。 日付跨ぎ補正は cd 基準の ±12時間に寄せる方式へ(夜間便の日跨ぎ休憩にも対応)。 - 負数対応の signedTime() を新規追加し、区間・累計の表示に使用。 【検証】 node --check OK。report.js の該当ブロックを実ファイルから抽出して実行する 検証ハーネスを作成し、以下を確認。 - 報告2件: 全区間が期待値と一致。 04/17 運転 02:43→03:21 / 待機 00:38→00:00 04/15 運転 03:31→04:18 / 待機 00:47→00:00 いずれも 拘束−(運転+作業+休憩)=0分 となり過不足なく分解される。 - 境界ケース6種(日跨ぎ区間内の休憩/日跨ぎ停車中の休憩/休憩なし/ 走行中1件/未着行あり/負数フォーマット)全PASS。 - 4/1〜8/6 の全756件を旧新ロジックで再計算し比較 → 差異は上記2件のみ。 他754件は区間・合計とも変化なし(副作用なし)。 旧ロジック再計算とDB保存値の一致 745件で、行順・作業時間再現の妥当性も確認。 【デプロイ】 report/report.js を本番 /home/singroup/public_html/report/ へ scp で反映(2026-08-06)。 md5 でローカル一致を確認済み。 ※ 集計値は画面を開き直した時点で writeTotals により DB も更新される。 【備考(今回の修正とは無関係の要調査事項)】 旧ロジック再計算とDB保存値が食い違う日報が2件あった。新旧ロジックで結果は 同じため今回の修正とは無関係で、日報作成後の時刻編集で writeTotals が 走らないまま保存値が古くなっている可能性。運用判断待ち。 - 2026-04-02 A7 東京2便 DB=02:11 / 再計算=05:47 - 2026-06-25 U3 東京1便 DB=04:22 / 再計算=04:52