介護施設(デイサービス・訪問介護)向けの 1か月分シフト自動作成 Webアプリケーション。
Google OR-Tools の CP-SAT ソルバーで制約充足最適化を行い、 人手では数時間かかるシフト作成を 約1分 で完了します。
- 制約充足最適化: 連勤制限・休み希望・最低配置人数・資格配置ルールなどを自動で満たすシフトを生成
- 2部門対応: 介護(デイサービス + 訪問介護)と調理の独立ソルバーで部門別に最適化
- 兼務パターン: デイサービスと訪問介護の兼務シフトを自動配置
- 相談員ローテーション: 2時間交代の相談員配置を自動割り当て
- 電話当番ローテーション: 社員のみ・連続禁止などのルールに準拠
- Excel/CSV出力: 印刷対応済みのシフト表を1クリックでダウンロード
- 祝日自動判定: 日本の祝日を自動検出し、祝日NG職員を自動休みに
- ブラウザUI: インストール不要、ローカルで動くWebアプリ
- Python 3.9 以上
git clone https://github.com/yourusername/shift-generator.git
cd shift-generator
./setup.sh
./run.sh
# → http://localhost:50501. ZIPをダウンロードして展開
2. setup_windows.bat をダブルクリック(初回のみ)
3. start_windows.bat をダブルクリック
4. ブラウザで http://localhost:5050 を開く
動作確認用の架空職員データを投入できます。
# macOS / Linux
source venv/bin/activate
python seed_sample.py
# Windows
venv\Scripts\activate
python seed_sample.py- 職員登録 -- 名前・雇用形態・資格・兼務可否などを登録
- 休み希望登録 -- カレンダーで日付をクリック
- 条件設定 -- 最低配置人数・営業曜日などを設定
- シフト生成 -- ボタン1つで自動作成(約1分)
- ダウンロード -- Excel / CSV で出力
詳細は docs/操作マニュアル.md を参照してください。
┌─────────────┐ ┌─────────────┐ ┌──────────────┐
│ Browser UI │◄──►│ Flask API │◄──►│ SQLite DB │
│ (Jinja2) │ │ (app.py) │ │ (shift.db) │
└─────────────┘ └──────┬──────┘ └──────────────┘
│
┌──────▼──────┐
│ CP-SAT │
│ Solver │
│ (solver.py)│
└─────────────┘
二段構成で介護と調理を独立に解決:
- 介護ソルバー
_solve_care()-- デイ・訪問・兼務の配置を決定 - 調理ソルバー
_solve_cooking()-- 早番・日勤・遅番・通しの配置を決定 - マージ
generate_shift()-- 両者の結果を統合
ソルバー解決後のポストプロセスで休憩時間と相談員ローテーションを割り当て。
| カテゴリ | 制約 | 種類 |
|---|---|---|
| 人数 | デイ最低/最大人数(9時・15時) | ハード |
| 人数 | 訪問最低人数(AM/PM) | ハード |
| 労務 | 連勤上限・週勤務日数上限/下限 | ハード |
| 労務 | 休み希望・祝日NG | ハード |
| 配置 | 看護師/PTはデイ4名から除外 | ハード |
| 配置 | 電話当番(社員のみ、連続禁止) | ハード |
| 調理 | 組み合わせルール(①②③ or ③④) | ハード |
| 均等化 | 出勤日数・休憩・相談ローテーション | ソフト |
| レイヤー | 技術 |
|---|---|
| バックエンド | Python 3.9+ / Flask 3.1 |
| 最適化エンジン | Google OR-Tools CP-SAT |
| データベース | SQLite + Flask-SQLAlchemy |
| フロントエンド | Jinja2 + Vanilla JavaScript + Tailwind CSS (CDN) |
| Excel出力 | openpyxl |
| 祝日判定 | jpholiday |
| ファイル | 行数 | 責務 |
|---|---|---|
app.py |
1223 | Flask ルーティング、CRUD API、シフト生成の起動 |
solver.py |
1760 | CP-SAT ソルバー本体(介護/調理を独立解決→マージ) |
export.py |
625 | Excel (.xlsx) / CSV エクスポート |
models.py |
409 | SQLAlchemy モデル定義(11テーブル) |
config.py |
28 | Flask / SQLAlchemy 設定 |
seed_sample.py |
— | サンプル職員データ投入 |