350 lines
18 KiB
Markdown
350 lines
18 KiB
Markdown
# 📋 ИИ Промпт - Графики смен
|
||
|
||
## 🎯 Описание проекта
|
||
|
||
Проект для автоматического составления графиков смен сотрудников с использованием **Constraint Programming (CP-SAT)**. Решает задачи оптимального распределения персонала с учетом множества ограничений и предпочтений.
|
||
|
||
## 📁 Структура проекта
|
||
|
||
```
|
||
OperatorSchedule/
|
||
├── src/ # Основной исходный код
|
||
│ ├── __init__.py # Корневой пакет
|
||
│ ├── app.py # Точка входа (FastAPI, если веб-интерфейс)
|
||
│ ├── config.py # Конфигурация системы
|
||
│ ├── exceptions.py # Исключения и ошибки
|
||
│ ├── logging_config.py # Настройка логирования
|
||
│ │
|
||
│ ├── core/ # Ядро системы
|
||
│ │ ├── __init__.py
|
||
│ │ ├── engine.py # Основной класс планировщика (SchedulerEngine)
|
||
│ │ ├── solver.py # Орто-модель CP-SAT
|
||
│ │ ├── validator.py # Валидатор результатов
|
||
│ │ └── events.py # События системы (логи, уведомления)
|
||
│ │
|
||
│ ├── domains/ # Доменные сущности
|
||
│ │ ├── __init__.py
|
||
│ │ ├── models/ # Модели данных
|
||
│ │ │ ├── __init__.py
|
||
│ │ │ ├── operator.py # Класс Operator (оператор)
|
||
│ │ │ ├── shift.py # класс Shift (смена)
|
||
│ │ │ ├── schedule.py # класс Schedule (график)
|
||
│ │ │ └── preference.py # класс Preference (предпочтение)
|
||
│ │ ├── repositories/ # Интерфейсы доступа к данным
|
||
│ │ │ ├── __init__.py
|
||
│ │ │ ├── operator_repo.py
|
||
│ │ │ ├── shift_repo.py
|
||
│ │ │ └── schedule_repo.py
|
||
│ │ └── services/ # Бизнес-логика
|
||
│ │ ├── __init__.py
|
||
│ │ ├── generator.py # Генератор графиков
|
||
│ │ ├── optimizer.py # Оптимизатор
|
||
│ │ └── conflict_resolver.py # Ресольвер конфликтов
|
||
│ │
|
||
│ ├── constraints/ # Управление ограничениями
|
||
│ │ ├── __init__.py
|
||
│ │ ├── base_constraint.py # Базовый класс ограничения
|
||
│ │ ├── hard_constraints.py # Жёсткие ограничения
|
||
│ │ ├── soft_constraints.py # Мягкие ограничения (предпочтения)
|
||
│ │ └── global_constraints.py # Глобальные ограничения
|
||
│ │
|
||
│ ├── exporters/ # Экспорт данных
|
||
│ │ ├── __init__.py
|
||
│ │ ├── base_exporter.py # Базовый класс экспортера
|
||
│ │ ├── csv_exporter.py
|
||
│ │ ├── excel_exporter.py
|
||
│ │ ├── html_exporter.py
|
||
│ │ └── json_exporter.py
|
||
│ │
|
||
│ ├── ui/ # Веб-интерфейс (опционально)
|
||
│ │ ├── __init__.py
|
||
│ │ ├── routes/ # Маршруты API
|
||
│ │ │ ├── __init__.py
|
||
│ │ │ ├── index.py # Главная страница
|
||
│ │ │ ├── config.py # Конфигурация API
|
||
│ │ │ └── export.py # Экспорт графики
|
||
│ │ ├── templates/ # Jinja2 шаблоны
|
||
│ │ └── static/ # CSS, JS
|
||
│ │
|
||
│ └── utils/ # Вспомогательные модули
|
||
│ ├── __init__.py
|
||
│ ├── calendar.py # Работа с календарями
|
||
│ ├── validators.py # Валидаторы данных
|
||
│ └── formatters.py # Форматтеры вывода
|
||
│
|
||
├── tests/ # Тесты
|
||
│ ├── __init__.py
|
||
│ ├── conftest.py # Фикстуры pytest
|
||
│ ├── unit/ # Unit-тесты
|
||
│ │ ├── __init__.py
|
||
│ │ ├── test_domains.py
|
||
│ │ ├── test_constraints.py
|
||
│ │ └── test_exporters.py
|
||
│ ├── integration/ # Интеграционные тесты
|
||
│ │ ├── __init__.py
|
||
│ │ └── test_scheduler.py
|
||
│ └── fixtures/ # Фикстуры данных
|
||
│ ├── __init__.py
|
||
│ ├── operators.json # JSON с операторами
|
||
│ └── shifts.json # JSON со сменами
|
||
│
|
||
├── docs/ # Документация
|
||
│ ├── README.md
|
||
│ ├── CHANGELOG.md # История изменений
|
||
│ ├── API.md # Документация API
|
||
│ └── architecture.md # Архитектурный обзор
|
||
│
|
||
├── config/ # Конфигурационные файлы
|
||
│ ├── __init__.py
|
||
│ ├── default.yaml # Стандартная конфигурация
|
||
│ └── development.yaml # Разработка
|
||
│
|
||
├── examples/ # Примеры использования
|
||
│ ├── basic.py # Базовый пример
|
||
│ ├── custom_constraints.py# Пример с кастомными ограничениями
|
||
│ └── multi_department.py # Многоотраслевой пример
|
||
│
|
||
├── requirements.txt # Зависимости Python
|
||
├── requirements-dev.txt # Зависимости для разработки
|
||
├── setup.py # Установка пакета
|
||
├── pytest.ini # Настройки pytest
|
||
└── .gitignore
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 Планы по улучшению проекта
|
||
|
||
### 📌 Общее описание плана
|
||
|
||
Данный план содержит улучшения для:
|
||
1. **Удобства использования** — понятная документация
|
||
2. **Модульности** — выделение логических блоков в функции
|
||
3. **Гибкости** — поддержка разных форматов экспорта
|
||
4. **Тестируемости** — возможность проверки результатов
|
||
|
||
---
|
||
|
||
## 📝 Задачи и планы по улучшению
|
||
|
||
### ✅ Улучшение 1: Более понятный README.md
|
||
|
||
#### 🎯 Цель
|
||
Сделать документацию дружелюбной для новых разработчиков и пользователей
|
||
|
||
#### 📋 Подзадачи
|
||
|
||
- [ ] **2.1.1 — Добавить описание проекта**
|
||
- [ ] Краткий абзац о назначении
|
||
- [ ] Пример использования
|
||
|
||
- [ ] **2.1.2 — Структурировать условия задачи**
|
||
- [ ] Сделать списки с маркерами
|
||
- [ ] Выделить типы ограничений (жёсткие/мягкие)
|
||
|
||
- [ ] **2.1.3 — Обновить секцию "Смены"**
|
||
- [ ] Оформить таблицей с временем работы
|
||
- [ ] Добавить комментарии для каждого значения
|
||
|
||
- [ ] **2.1.4 — Структурировать предпочтения**
|
||
- [ ] Сформировать таблицу с операторами и пожеланиями
|
||
- [ ] Объяснить типы предпочтений (обязательные/желательные)
|
||
|
||
- [ ] **2.1.5 — Добавить секцию "Как это работает"**
|
||
- [ ] Краткое описание алгоритма
|
||
- [ ] Пример потока выполнения
|
||
|
||
- [ ] **2.1.6 — Добавить примеры конфигурации**
|
||
- [ ] Пример добавления нового оператора
|
||
- [ ] Пример добавления новой смены
|
||
|
||
- [ ] **2.1.7 — Добавить секцию "Формат CSV"**
|
||
- [ ] Объяснить структуру файла
|
||
- [ ] Пример содержимого
|
||
|
||
- [ ] **2.1.8 — Добавить секцию "Как запустить"**
|
||
- [ ] Команды для запуска скрипта
|
||
- [ ] Требования (Python версии и библиотеки)
|
||
|
||
- [ ] **2.1.9 — Добавить секцию "Возможные расширения"**
|
||
- [ ] Учёт усталости сотрудников
|
||
- [ ] Интеграция с календарными данными
|
||
- [ ] Поддержка разных форматов экспорта
|
||
|
||
- [ ] **2.1.10 — Добавить секцию "FAQ"**
|
||
- [ ] Ответы на частые вопросы
|
||
- [ ] Что делать, если график не составляется
|
||
- [ ] Как обработать конфликт предпочтений
|
||
|
||
---
|
||
|
||
### ✅ Улучшение 2: Модульность ограничений
|
||
|
||
#### 🎯 Цель
|
||
Упростить добавление новых операторов и ограничений
|
||
|
||
#### 📋 Подзадачи
|
||
|
||
- [ ] **2.2.1 — Создать функцию `add_hard_constraints(operator_name)`**
|
||
- [ ] Обрабатывать обязательные дни отдыха
|
||
- [ ] Обрабатывать обязательные дни работы
|
||
- [ ] Обрабатывать ограничения на непрерывную работу
|
||
|
||
- [ ] **2.2.2 — Создать функцию `add_soft_preferences(operator_name)`**
|
||
- [ ] Обрабатывать предпочтения по сменам
|
||
- [ ] Обрабатывать предпочтения по дням
|
||
- [ ] Использовать `AddHint()` для мягких условий
|
||
|
||
- [ ] **2.2.3 — Создать функцию `add_global_constraints(model)`**
|
||
- [ ] Проверка покрытия всех смен
|
||
- [ ] Проверка количества выходных
|
||
- [ ] Проверка лимита дней подряд
|
||
|
||
- [ ] **2.2.4 — Создать функцию `create_operator_variables(model)`**
|
||
- [ ] Генерация переменных для одного оператора
|
||
- [ ] Создание булевых переменных для всех смен
|
||
|
||
- [ ] **2.2.5 — Переписать `main.py` с использованием новых функций**
|
||
- [ ] Вынести цикл по операторам
|
||
- [ ] Вынести создание переменных
|
||
- [ ] Добавить тестовые операторы в конце
|
||
|
||
- [ ] **2.2.6 — Добавить докстринги**
|
||
- [ ] Документирование всех функций
|
||
- [ ] Описание аргументов
|
||
- [ ] Возвращаемых значений
|
||
|
||
- [ ] **2.2.7 — Добавить проверки типов**
|
||
- [ ] Проверка входных данных
|
||
- [ ] Валидация дат и смен
|
||
|
||
---
|
||
|
||
### ✅ Улучшение 3: Экспорт результатов
|
||
|
||
#### 🎯 Цель
|
||
Поддержка различных форматов вывода
|
||
|
||
#### 📋 Подзадачи
|
||
|
||
- [ ] **2.3.1 — Создать базовый класс `ScheduleExporter`**
|
||
- [ ] Интерфейс для методов экспорта
|
||
- [ ] Конструктор с параметрами модели
|
||
|
||
- [ ] **2.3.2 — Реализовать экспорт в CSV**
|
||
- [ ] Метод `export_to_csv(self, filename)`
|
||
- [ ] Форматирование заголовков
|
||
- [ ] Обработка пустых значений
|
||
|
||
- [ ] **2.3.3 — Реализовать экспорт в Excel (.xlsx)**
|
||
- [ ] Использование `pandas`
|
||
- [ ] Сохранение стилей (опционально)
|
||
|
||
- [ ] **2.3.4 — Реализовать экспорт в HTML-таблицу**
|
||
- [ ] Создание интерактивной таблицы
|
||
- [ ] Добавление календаря
|
||
- [ ] Подсветка выходных
|
||
|
||
- [ ] **2.3.5 — Добавить вывод в консоль (Pretty Print)**
|
||
- [ ] Отформатированный вывод в терминал
|
||
- [ ] Цветовое кодирование (опционально)
|
||
|
||
- [ ] **2.3.6 — Создать класс `UIExporter` (для будущих веб-интерфейсов)**
|
||
- [ ] Генерация JSON для frontend
|
||
- [ ] REST API endpoints (будущее)
|
||
|
||
- [ ] **2.3.7 — Добавить методы конфигурации**
|
||
- [ ] Выбор формата по умолчанию
|
||
- [ ] Настройки кодировки
|
||
- [ ] Дополнительные столбцы (например, время смены)
|
||
|
||
- [ ] **2.3.8 — Обновить `main.py` с использованием экспортера**
|
||
- [ ] Вынести логику записи в `main.py`
|
||
- [ ] Создать экземпляр `ScheduleExporter`
|
||
- [ ] Вызвать нужный метод экспорта
|
||
|
||
- [ ] **2.3.9 — Добавить тесты для экспортеров**
|
||
- [ ] Проверка правильности CSV
|
||
- [ ] Проверка форматирования Excel
|
||
- [ ] Проверка HTML валидности
|
||
|
||
---
|
||
|
||
## 📅 Дорожная карта (Roadmap)
|
||
|
||
### Этап 1: Фундамент (Неделя 1)
|
||
- [ ] Обновление README.md (подзадачи 2.1.*)
|
||
- [ ] Добавление докстрингов и комментариев в код
|
||
|
||
### Этап 2: Модульность (Неделя 2)
|
||
- [ ] Создание функций ограничений (подзадачи 2.2.1–2.2.4)
|
||
- [ ] Переписывание `main.py`
|
||
- [ ] Тестирование модульных функций
|
||
|
||
### Этап 3: Экспорт (Неделя 3)
|
||
- [ ] Разработка базового класса экспортера (2.3.1–2.3.5)
|
||
- [ ] Реализация Excel и HTML
|
||
- [ ] Интеграция в `main.py`
|
||
|
||
### Этап 4: Документация и тесты (Неделя 4)
|
||
- [ ] Написание примеров в README
|
||
- [ ] Создание секции FAQ
|
||
- [ ] Написание unit-тестов
|
||
- [ ] Проверка всех форматов экспорта
|
||
|
||
---
|
||
|
||
## 🛠️ Технические требования
|
||
|
||
- **Python**: 3.8+
|
||
- **Библиотеки**:
|
||
- `ortools` (CP-SAT)
|
||
- `pandas` (для Excel)
|
||
- `jinja2` (для HTML)
|
||
- `openpyxl` (для стилей Excel)
|
||
|
||
---
|
||
|
||
## 📝 Примечание
|
||
|
||
Этот план можно выполнять итеративно. Можно начать с улучшения README.md, затем перейти к модульности, и в конце добавить новые форматы экспорта.
|
||
|
||
# ИИ Промпт
|
||
Нужно назначить операторов на смены
|
||
|
||
Условия:
|
||
* апрель 2026 года. Месяц начинается со среды
|
||
* график нужен на каждый день этого месяца
|
||
* Операторов всего 6
|
||
* в каждой смене - должен быть один оператор
|
||
* У каждого оператора должно быть 10 выходных
|
||
* оператор не должен работать больше 5 дней подряд
|
||
* в день оператор может работать только одну смену
|
||
|
||
Смены(4 на каждый день):
|
||
с 06:00 до 14:30
|
||
с 08:00 до 16:30
|
||
с 11:30 до 20:00
|
||
с 12:30 до 21:00
|
||
|
||
Список операторов и их пожелания:
|
||
1. Оператор Иванов: Хочет отдыхать 10 апреля и 13 апреля
|
||
2. Оператор Алексеев: Хочет работать по понедельникам в смену с 06:00 до 14:30
|
||
3. Оператор Сидоров: Хочет отдыхать 25 апреля и 26 апреля
|
||
4. Оператор Козобородов: предпочитает смену 11:30–20:00, но может работать в любую, если иначе график не составить.
|
||
5. Оператор Трудяшкина: Хочет отдыхать 4 апреля
|
||
6. Оператор Петрова: Хочет отдыхать 29 и 14 апреля
|
||
|
||
Задача:
|
||
Составь конкретный ежедневный график (таблицей: день недели → смена → оператор), соблюдая:
|
||
- условия задачи
|
||
- на каждую смену должен быть назначен оператор
|
||
- выходные - это дни когда оператор вообще не работает
|
||
- пожелания обязательны к исполнению, если это не делает график невозможным
|
||
- дни отдыха входят в 10 выходных
|
||
|
||
Перед отправкой мне решения - проверь что все условия отрабатывают.
|
||
Если у тебя есть какой-то вопрос или что-то непонятно - задай, я отвечу
|
||
Ответ выдай в csv, в котором столбцы - день;1 смена;2 смена;3 смена;4 смена
|
||
Если возможности подобрать такой график работ нет - то так и ответь
|