Files
OperatorSchedule/README.md
2026-04-04 21:56:57 +05:00

251 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📋 ИИ Промпт - Графики смен
## 🎯 Описание проекта
Проект для автоматического составления графиков смен сотрудников с использованием **Constraint Programming (CP-SAT)**. Решает задачи оптимального распределения персонала с учетом множества ограничений и предпочтений.
## 📁 Структура проекта
```
├── main.py # Основная логика с генерацией графика
├── shift_schedule.csv # Результат (заполненный график)
├── README.md # Документация
└── .continue/ # Система контроля версий
```
---
## 🚀 Планы по улучшению проекта
### 📌 Общее описание плана
Данный план содержит улучшения для:
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.12.2.4)
- [ ] Переписывание `main.py`
- [ ] Тестирование модульных функций
### Этап 3: Экспорт (Неделя 3)
- [ ] Разработка базового класса экспортера (2.3.12.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:3020:00, но может работать в любую, если иначе график не составить.
5. Оператор Трудяшкина: Хочет отдыхать 4 апреля
6. Оператор Петрова: Хочет отдыхать 29 и 14 апреля
Задача:
Составь конкретный ежедневный график (таблицей: день недели → смена → оператор), соблюдая:
- условия задачи
- на каждую смену должен быть назначен оператор
- выходные - это дни когда оператор вообще не работает
- пожелания обязательны к исполнению, если это не делает график невозможным
- дни отдыха входят в 10 выходных
Перед отправкой мне решения - проверь что все условия отрабатывают.
Если у тебя есть какой-то вопрос или что-то непонятно - задай, я отвечу
Ответ выдай в csv, в котором столбцы - день;1 смена;2 смена;3 смена;4 смена
Если возможности подобрать такой график работ нет - то так и ответь