シフト自動作成 設計メモ
NSP
二勤交替(D/N/O)を題材にしたNSPです。
シフト表の閲覧・手修正・希望申請・連絡・スタッフ管理はWebアプリ単体で使えます。自動作成はWindows向けのシフト自動作成ツールが担当します。
このページは、完成品の紹介というより、何を狙ってどこで詰まったかの記録です。
Portfolio & Development Workspace
シフト自動作成 設計メモ
二勤交替(D/N/O)を題材にしたNSPです。
シフト表の閲覧・手修正・希望申請・連絡・スタッフ管理はWebアプリ単体で使えます。自動作成はWindows向けのシフト自動作成ツールが担当します。
このページは、完成品の紹介というより、何を狙ってどこで詰まったかの記録です。
NSPは「Need Shift Planner」の略で、二勤交替(D/N/O)を題材にしたシフト作成Webアプリです。 Webアプリ単体でシフト管理が完結し、必要なときにシフト自動作成ツールで下書きを作る構成です。
シフト自動作成ツールは、Webアプリ上のスタッフ・希望・必要人数・既存シフトを読み込んで動くため、ツール単体では使えません。
きれいな完成品を目指したというより、まず動くものを出して、試しながら足りない機能を足していく進め方をしています。
シフト表は、人数・勤務可否・連勤・休みの希望・工程ごとの必要人数など、考えることが多くあります。 手で組むと時間がかかるうえ、条件を1つ変えるだけで全体を組み直すことになりがちです。
看護師の勤務編成で知られるナーススケジューリング問題(NSP)と同じ系統の、制約の多い割り当て問題です。 名前もそこから取っていますが、看護向けの作りをそのまま持ってきたわけではなく、二勤交替のシフト作成に合う形にしています。
市販のシフト作成ツールは多機能なものが多い一方で、細かいルールをそのまま表せないこともあります。 必要な機能を自分で選べる実用ツールを考えて実装した、というのが正直なところです。
目指しているのは、完全な自動化ではありません。 下書きを作るところまでの時間を短くして、人が確認・調整する余裕を残すことです。
自動作成を使わなくても、Webアプリだけで日々のシフト管理を行えます。 自動作成そのものはシフト自動作成ツールに任せ、Webアプリ側は閲覧・手修正・申請・連絡・管理に役割を分けています。
| 項目 | 内容 |
|---|---|
| シフト表 | カレンダー表示、日別の編集、一括入力、担当の入れ替え |
| 希望申請 | 本人/代理入力、締切の管理、未提出者への通知 |
| スタッフ管理 | 配慮業務、勤務可否、月間上限、出勤パターン、社員番号 |
| 応援 | 班をまたぐ貸出の候補表示・申請・承認 |
| CSV入出力 | プレビュー確認後に反映。反映前のバックアップも取得 |
| 連絡 | 全員/グループ/個人宛のスレッド、任意のメール通知 |
| 運用 | 監査ログ、月次バックアップ/復元、テーマと画面状態の保存 |
「シフト表の下書きを、条件を守って自動で作ってくれる道具」です。 人が手で組むより速いですが、「完璧に公平で、いちばん良い組み方」を保証するものではありません。
シフト表の下書き作りには十分使えると感じています。 最低人数・工程の人数・法律や社内ルール寄りの条件・希望・休職/入職を、同時にそこそこ満たした案を出せます。
一方で、公平さまで自動で完璧というわけではありません。 夜勤の偏りや工程の割り振りは、人が仕上げる前提です。
WebアプリはPHP 8とMySQL / MariaDBで構成しています。 ログイン、権限、カレンダー、手修正、希望申請、連絡、スタッフ管理、CSV、監査ログまでを実装しており、単体でも動作します。
自動作成はPython 3.12とOR-ToolsのCP-SATソルバーで行います。 Webアプリからシフト自動作成ツール(EXE)をダウンロードして実行し、ログイン後にスタッフ・希望・必要人数・制約・既存シフトを取得。 制限時間内で解を探し、結果を採点・診断してから、問題なければWebアプリのシフト表へ書き戻します。
このツールはWebアプリへのログインとデータ取得が前提で、単体では使えません。
当初はWebアプリ側で自動作成する構成でしたが、サーバーへの負担が大きかったため、廃止し、求解はPC上で実行できるシフト自動作成ツールに一本化しました。 Webアプリは入力と運用、シフト自動作成ツールは計算という役割分担にしたことで、画面側を触らずに条件を見直せるようになりました。
対象月・グループのスタッフ、希望、必要人数、制約、既存シフトをWebアプリから読み込む。
ハード条件を守りながら、ソフト条件をできるだけ満たす案を制限時間内で探す。
人数の不足や条件違反を確認し、通常の案か診断用の仮案かを判定する。
問題のない案だけをWebアプリのシフト表へ反映する。仮案は保存できない。
変更履歴を記録し、反映前の状態をバックアップとして残す。
| 区分 | 例 |
|---|---|
| ハード条件(必ず守る) | 必要人数、連勤上限、勤務間の休息、固定・必須の希望、在籍期間 |
| ソフト条件(できるだけ守る) | 夜勤の上限、週の公休、できれば希望、夜勤2連、週内の日夜混在の抑制 |
スタッフの勤務可否や希望休は個人情報に近い内容なので、ログインした人だけが使えることを前提にしています。 権限は4段階に分け、画面を隠すだけでなく、サーバー側でも操作できる範囲を確認しています。
事前の要件定義や納期設定を行わないまま、思いつくままに開発を進めました。 そのぶん早く形にはなりましたが、機能が増えるほどコードの整理が課題になり、機能ごとにきれいに保つ工夫が必要だと痛感しています。
機能追加を優先した結果、画面・認証・データ取得の結びつきが強くなり、1か所の変更が別の場所に影響しやすくなりました。 シフトの公平性をどう評価するか、自動作成の条件をどう調整するかも、まだ試行錯誤の途中です。
自動作成をWebアプリからPC上のシフト自動作成ツールへ移す判断にも時間がかかり、その間の作り直しが発生しています。
どれも一度に終わるものではないので、試しながら優先順位を決めていくつもりです。
おわりに
NSPは、シフト作成の負担を減らすために作り始めたアプリです。 まだ調整中の部分はありますが、日々のシフト閲覧・希望申請・手修正と、下書き作成の短縮という役割は少しずつ形になってきました。 同じようにシフト作成を楽にしたい人の参考になればと思っています。