# 📋 ИИ Промпт - Графики смен ## 🎯 Описание проекта Проект для автоматического составления графиков смен сотрудников с использованием **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 смена Если возможности подобрать такой график работ нет - то так и ответь