シフト自動作成 設計メモ

NSP

二勤交替(D/N/O)を題材にしたNSPです。
シフト表の閲覧・手修正・希望申請・連絡・スタッフ管理はWebアプリ単体で使えます。自動作成はWindows向けのシフト自動作成ツールが担当します。
このページは、完成品の紹介というより、何を狙ってどこで詰まったかの記録です。

種別 個人開発 / Webアプリ + シフト自動作成ツール
実装 PHP 8 + MySQL / JavaScript / Python + OR-Tools
更新 2026-10-18
画面イメージは準備中です。用意ができ次第、実際の画面に差し替えます。
01

はじめに

NSPは「Need Shift Planner」の略で、二勤交替(D/N/O)を題材にしたシフト作成Webアプリです。 Webアプリ単体でシフト管理が完結し、必要なときにシフト自動作成ツールで下書きを作る構成です。

シフト自動作成ツールは、Webアプリ上のスタッフ・希望・必要人数・既存シフトを読み込んで動くため、ツール単体では使えません。

きれいな完成品を目指したというより、まず動くものを出して、試しながら足りない機能を足していく進め方をしています。

D/N/O 二勤交替の区分
Web + Windows 2つの構成
4段階 権限のレベル
月次 バックアップ
自動作成は下書きです。 出てくるのは制限時間内に見つけた案で、夜勤回数や工程ごとの担当の公平さまで完璧にそろえるものではありません。 最後の確認と調整は人が行う前提で作っています。
02

作った理由

シフト表は、人数・勤務可否・連勤・休みの希望・工程ごとの必要人数など、考えることが多くあります。 手で組むと時間がかかるうえ、条件を1つ変えるだけで全体を組み直すことになりがちです。

看護師の勤務編成で知られるナーススケジューリング問題(NSP)と同じ系統の、制約の多い割り当て問題です。 名前もそこから取っていますが、看護向けの作りをそのまま持ってきたわけではなく、二勤交替のシフト作成に合う形にしています。

市販のシフト作成ツールは多機能なものが多い一方で、細かいルールをそのまま表せないこともあります。 必要な機能を自分で選べる実用ツールを考えて実装した、というのが正直なところです。

目指しているのは、完全な自動化ではありません。 下書きを作るところまでの時間を短くして、人が確認・調整する余裕を残すことです。

03

できること

自動作成を使わなくても、Webアプリだけで日々のシフト管理を行えます。 自動作成そのものはシフト自動作成ツールに任せ、Webアプリ側は閲覧・手修正・申請・連絡・管理に役割を分けています。

NSP Webアプリの主な機能
項目 内容
シフト表 カレンダー表示、日別の編集、一括入力、担当の入れ替え
希望申請 本人/代理入力、締切の管理、未提出者への通知
スタッフ管理 配慮業務、勤務可否、月間上限、出勤パターン、社員番号
応援 班をまたぐ貸出の候補表示・申請・承認
CSV入出力 プレビュー確認後に反映。反映前のバックアップも取得
連絡 全員/グループ/個人宛のスレッド、任意のメール通知
運用 監査ログ、月次バックアップ/復元、テーマと画面状態の保存
04

シフト自動作成ツール(Windows)

「シフト表の下書きを、条件を守って自動で作ってくれる道具」です。 人が手で組むより速いですが、「完璧に公平で、いちばん良い組み方」を保証するものではありません。

できること

  • 班・日・昼/夜ごとに、必要な人数をそろえる
  • 工程ごとの必要人数を満たす(苦手な人は外して数える)
  • 連続勤務の上限、勤務間の休息、日勤系から夜勤への前休み
  • 夜勤の上限、週の公休、月の公休日数
  • 希望休の「必須」を固定し、「できれば」を優先して寄せる
  • 勤務可否を守り、入社前・退職後・休職中の人は入れない
  • 承認済みの応援を人数に反映する
  • 確定済みの日・過去の日は、勝手に変えない
  • 祝日の日勤人数の加算や、夜勤後の追加休みを設定で有効にする

苦手なこと

  • 夜勤回数・週末・負荷の公平性を自動で調整する
  • 工程ごとに誰が担当するかまで決める
  • 残業や実際の勤務時間を厳密に計算する
  • 決まった順番のローテーションを保証する
  • 資格や熟練度で人を選ぶ
  • 数学的な最適解を保証する
結果の扱い。 出てくるのは「制限時間内で見つけた良い案」であり、最善であることは保証しません。 条件が厳しすぎると診断用の仮案が出ることがありますが、仮案のままではシフト表へ書き戻せません。 必要人数・固定・希望を見直してから、もう一度計算してください。

総合評価

シフト表の下書き作りには十分使えると感じています。 最低人数・工程の人数・法律や社内ルール寄りの条件・希望・休職/入職を、同時にそこそこ満たした案を出せます。

一方で、公平さまで自動で完璧というわけではありません。 夜勤の偏りや工程の割り振りは、人が仕上げる前提です。

05

仕組み

WebアプリはPHP 8とMySQL / MariaDBで構成しています。 ログイン、権限、カレンダー、手修正、希望申請、連絡、スタッフ管理、CSV、監査ログまでを実装しており、単体でも動作します。

自動作成はPython 3.12とOR-ToolsのCP-SATソルバーで行います。 Webアプリからシフト自動作成ツール(EXE)をダウンロードして実行し、ログイン後にスタッフ・希望・必要人数・制約・既存シフトを取得。 制限時間内で解を探し、結果を採点・診断してから、問題なければWebアプリのシフト表へ書き戻します。

このツールはWebアプリへのログインとデータ取得が前提で、単体では使えません。

当初はWebアプリ側で自動作成する構成でしたが、サーバーへの負担が大きかったため、廃止し、求解はPC上で実行できるシフト自動作成ツールに一本化しました。 Webアプリは入力と運用、シフト自動作成ツールは計算という役割分担にしたことで、画面側を触らずに条件を見直せるようになりました。

  1. 1
    取得

    対象月・グループのスタッフ、希望、必要人数、制約、既存シフトをWebアプリから読み込む。

  2. 2
    求解

    ハード条件を守りながら、ソフト条件をできるだけ満たす案を制限時間内で探す。

  3. 3
    採点・診断

    人数の不足や条件違反を確認し、通常の案か診断用の仮案かを判定する。

  4. 4
    書き戻し

    問題のない案だけをWebアプリのシフト表へ反映する。仮案は保存できない。

  5. 5
    監査・バックアップ

    変更履歴を記録し、反映前の状態をバックアップとして残す。

ハード条件とソフト条件

ハード条件とソフト条件の違い
区分 例
ハード条件(必ず守る) 必要人数、連勤上限、勤務間の休息、固定・必須の希望、在籍期間
ソフト条件(できるだけ守る) 夜勤の上限、週の公休、できれば希望、夜勤2連、週内の日夜混在の抑制
06

セキュリティと運用

スタッフの勤務可否や希望休は個人情報に近い内容なので、ログインした人だけが使えることを前提にしています。 権限は4段階に分け、画面を隠すだけでなく、サーバー側でも操作できる範囲を確認しています。

主な対策

  • ログインユーザーのみ利用できる
  • 4段階の権限に応じて、見える範囲と操作できる範囲を分ける
  • パスワードはそのまま保存せず、ハッシュ化して保管する
  • セッション管理とCSRF対策を行う
  • SQLはプリペアドステートメント、HTML出力はエスケープする
  • ログイン・編集・復元・設定変更などの操作を監査ログに残す
  • 月次バックアップに加え、大切な編集の前にもバックアップを取る
  • 通知メールには本文の全文ではなく、抜粋とアプリへのリンクだけを載せる
運用で大事にしていること。 個人情報を扱う以上、便利さより先に「誰が何をできるか」と「何をしたか」を残すことを優先しています。 復元や設定変更は権限を持つ担当者だけが行えるようにしています。
07

うまくいかなかったこと・反省点

事前の要件定義や納期設定を行わないまま、思いつくままに開発を進めました。 そのぶん早く形にはなりましたが、機能が増えるほどコードの整理が課題になり、機能ごとにきれいに保つ工夫が必要だと痛感しています。

機能追加を優先した結果、画面・認証・データ取得の結びつきが強くなり、1か所の変更が別の場所に影響しやすくなりました。 シフトの公平性をどう評価するか、自動作成の条件をどう調整するかも、まだ試行錯誤の途中です。

自動作成をWebアプリからPC上のシフト自動作成ツールへ移す判断にも時間がかかり、その間の作り直しが発生しています。

次にやること

  • テストを増やし、変更の影響を確認しやすくする
  • 画面・認証・データ取得の責務を分ける
  • 夜勤回数や負荷の偏りを、人が確認しやすい形で見えるようにする
  • 自動作成の条件と結果の説明を、もう少し分かりやすくする

どれも一度に終わるものではないので、試しながら優先順位を決めていくつもりです。

08

使っているもの

サーバー

PHP 8 MySQL / MariaDB Nginx Debian

フロントエンド

JavaScript (ES6) CSS

ソルバー

Python 3.12 OR-Tools CP-SAT

認証・メール

Laminas Authentication PHPMailer SMTP

おわりに

おわりに

NSPは、シフト作成の負担を減らすために作り始めたアプリです。 まだ調整中の部分はありますが、日々のシフト閲覧・希望申請・手修正と、下書き作成の短縮という役割は少しずつ形になってきました。 同じようにシフト作成を楽にしたい人の参考になればと思っています。