配置Viewerを自動更新し、日跨ぎシフトの日付解決を修正する - #12
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Viewer 周りの2件(自動更新の追加と、日跨ぎシフトのバグ修正)。
1. Viewerが配置の変更を自動で拾わない
配置Viewer(
/s/$siteId/viewer)はモニター常時表示を想定した画面だが、配置データを TanStack Query で一度取得するだけで、ポーリングも SSE も無かった。そのため assignment 画面で配置を確定(PUT /assignments)しても、Viewer 側は画面をリロードするまで古い配置を表示し続けていた。refetchIntervalInBackground: trueを指定。TanStack Query は既定でウィンドウのフォーカスが外れるとrefetchIntervalを停止するため、これが無いとキオスク端末で更新が止まるqueryKeyがベタ書き(["employees"])だったので既存のemployeeKeys.allに統一スポットのクエリは
queryKeyが確定済み配置のlayoutSpecVersionIdから導出されるため、配置クエリが新バージョンを拾った時点で自動的に再取得される。よってポーリング不要。SSEではなくポーリングにした理由
SSE / WebSocket なら定期リクエストをゼロにでき即時反映もできるが、API に常駐接続の実装が入り、将来の複数インスタンス化で Pub/Sub が必要になる。配置確定はシフト開始前にまとめて行う性質の操作で最大60秒の遅延は許容できるため、今回はサーバ変更ゼロのポーリングを選択した。
必要になった場合、発火点は
apps/api/src/features/assignments/save.tsのsaveAssignment1箇所に集約されているので差し替えは容易。2. 日跨ぎシフト表示中に誤った日付の配置を出す(バグ)
resolveViewerDisplayは、シフト選択については日付境界を跨いで直前のシフトを採用していたのに、日付は常に当日(toDateStr(now))を返していた。夜勤 19:00〜09:00 の未明に Viewer を見ると、走っているのは前日に始まった夜勤なので配置レコードは「前日 × 夜勤」に紐づく。しかし Viewer は「当日 × 夜勤」を取りに行っていたため、別物(あるいは空)が表示されていた。既存テストは
shiftIdしか検証しておらず日付を見ていなかったため、これを取りこぼしていた。修正は、切り替え時刻ではなくシフトの開始日を追う形に一般化した。単純に「日跨ぎなら前日」とすると
leadMinutesで壊れる(00:30開始のシフトを60分前倒しすると切り替えは前日23:30になり、この時点で表示すべきは翌日の配置)ため、各シフトにstartDayOffsetを持たせてラップ分と合算している。テストも夜勤跨ぎ・lead跨ぎの両方を追加し、日付まで検証するようにした。
確認
pnpm test56件パス /pnpm typecheckパス🤖 Generated with Claude Code