Skip to content

配置Viewerを自動更新し、日跨ぎシフトの日付解決を修正する - #12

Merged
uswebk merged 2 commits into
mainfrom
feature/viewer-auto-refresh
Jul 13, 2026
Merged

配置Viewerを自動更新し、日跨ぎシフトの日付解決を修正する#12
uswebk merged 2 commits into
mainfrom
feature/viewer-auto-refresh

Conversation

@uswebk

@uswebk uswebk commented Jul 12, 2026

Copy link
Copy Markdown
Owner

Viewer 周りの2件(自動更新の追加と、日跨ぎシフトのバグ修正)。

1. Viewerが配置の変更を自動で拾わない

配置Viewer(/s/$siteId/viewer)はモニター常時表示を想定した画面だが、配置データを TanStack Query で一度取得するだけで、ポーリングも SSE も無かった。そのため assignment 画面で配置を確定(PUT /assignments)しても、Viewer 側は画面をリロードするまで古い配置を表示し続けていた

  • 配置クエリ(一覧カード・詳細キャンバスの2箇所)に 60秒 ポーリングを追加
  • viewer設定 / 勤務体制 / エリア / 従業員のマスタ系クエリに 5分 ポーリングを追加
  • 両方に refetchIntervalInBackground: true を指定。TanStack Query は既定でウィンドウのフォーカスが外れると refetchInterval を停止するため、これが無いとキオスク端末で更新が止まる
  • 従業員クエリの queryKey がベタ書き(["employees"])だったので既存の employeeKeys.all に統一

スポットのクエリは queryKey が確定済み配置の layoutSpecVersionId から導出されるため、配置クエリが新バージョンを拾った時点で自動的に再取得される。よってポーリング不要。

SSEではなくポーリングにした理由

SSE / WebSocket なら定期リクエストをゼロにでき即時反映もできるが、API に常駐接続の実装が入り、将来の複数インスタンス化で Pub/Sub が必要になる。配置確定はシフト開始前にまとめて行う性質の操作で最大60秒の遅延は許容できるため、今回はサーバ変更ゼロのポーリングを選択した。

必要になった場合、発火点は apps/api/src/features/assignments/save.tssaveAssignment 1箇所に集約されているので差し替えは容易。

2. 日跨ぎシフト表示中に誤った日付の配置を出す(バグ)

resolveViewerDisplay は、シフト選択については日付境界を跨いで直前のシフトを採用していたのに、日付は常に当日(toDateStr(now))を返していた

夜勤 19:00〜09:00 の未明に Viewer を見ると、走っているのは前日に始まった夜勤なので配置レコードは「前日 × 夜勤」に紐づく。しかし Viewer は「当日 × 夜勤」を取りに行っていたため、別物(あるいは空)が表示されていた。既存テストは shiftId しか検証しておらず日付を見ていなかったため、これを取りこぼしていた。

修正は、切り替え時刻ではなくシフトの開始日を追う形に一般化した。単純に「日跨ぎなら前日」とすると leadMinutes で壊れる(00:30開始のシフトを60分前倒しすると切り替えは前日23:30になり、この時点で表示すべきは翌日の配置)ため、各シフトに startDayOffset を持たせてラップ分と合算している。

テストも夜勤跨ぎ・lead跨ぎの両方を追加し、日付まで検証するようにした。

確認

  • pnpm test 56件パス / pnpm typecheck パス
  • ⚠️ 実機での動作確認は未実施(別ウィンドウで確定した配置が操作なしでViewerに反映されること、未明の日跨ぎ夜勤表示)

🤖 Generated with Claude Code

uswebk and others added 2 commits July 13, 2026 00:46
Viewerはモニター常時表示を想定しているが、配置を確定しても画面を
リロードするまで古い配置が表示され続けていた。

配置クエリを60秒、マスタ系クエリを5分でポーリングする。ウィンドウの
フォーカスが外れると refetchInterval が停止するため、キオスク表示でも
更新が止まらないよう refetchIntervalInBackground を有効にする。

あわせて従業員クエリの queryKey をベタ書きから employeeKeys.all に揃える。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
シフト選択は日付境界を跨いで直前のシフトを採用していたが、日付は常に
当日を返していた。夜勤19:00-09:00の未明にViewerを見ると、走っている
のは前日開始の夜勤なのに「当日×夜勤」の配置を取りに行っていた。

シフトの切り替え時刻ではなく開始日を追う形に一般化する。単純に
「日跨ぎなら前日」とすると leadMinutes で壊れるため(00:30開始の
シフトを60分前倒しすると切り替えは前日23:30になり、この時点で表示
すべきは翌日の配置)、各シフトに startDayOffset を持たせて合算する。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@uswebk uswebk changed the title 配置Viewerを自動更新する 配置Viewerを自動更新し、日跨ぎシフトの日付解決を修正する Jul 12, 2026
@uswebk
uswebk merged commit 6fa057e into main Jul 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant