📋 ИИ Промпт - Графики смен

🎯 Описание проекта

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

Description
No description provided
Readme 84 KiB
Languages
Python 100%