Это старая версия документа!


Инвентаризация: DEV: Расписания

Для себя схема работы класса расписаний, чтобы была дока и не запутаться

  • Расписания не в курсе про часовой пояс. Т.е. все они живут в одном поясе
  • Расписание только недельное. Нет вариантов «каждый 3й день начиная с даты». Нет варианта «каждый 2й вторник месяца». Такое нужно реализовывать дополнительным движком и пока не нужно
  • Расписание на день может залезать на следующий день: 22:00-06:00
  • Объявленное расписание на день (то что удобно читать) и реальное расписание (то что реально надо проверять) на день отличаются (т.к. часть того что мы объявили может уходить на следующий день и обрезается, а часть сегодняшнего расписания может прилетать с предыдущего дня).
  • В описании функций желательно подписывать:
    • Учитывает ли функция наличие границ действия расписания
    • Учитывает ли функция наличие родителей у расписания
    • Учитывает ли функция наличие перекрытий у расписания (периодов когда всё расписание на неделю меняется)
    • Учитывает ли дни-исключения
    • Учитывает ли периоды-исключения

Класс расписания

  • id - ключ
  • parent_id - родительское расписание
  • override_id - перекрываемое расписание (это расписание является периодом-исключением в другом расписании)
  • name - ну как-то без имени не получается
  • start_date - дата начала действия расписания
  • end_date - дата окончания действия расписания
  • description - короткое пояснение
  • history - неограниченные по размеру заметки

Ну а где собственно время то?. Ниже

Запись в расписание. Может представлять из себя

  • расписание на каждый день
  • расписание на день недели
  • расписание на дату
  • период рабочего/нерабочего времени с даты-времени1 до даты-времени2

для этого у нас есть такие поля

  • id - ключ
  • schedule_id - к какому расписанию запись
  • date - дата на которую делается запись времени работы. может иметь значение
    • def - расписание на каждый день
    • 1-7 - день недели начиная с понедельника
    • YYYY-MM-DD - расписание на конкретную дату
    • YYYY-MM-DD HH:MM:SS - начало периода неработоспособности (или наоборот включения работы), если эта запись не расписание на день, а запись о «периоде» непрерывной работы/отключения (is_period)
  • date_end - окончание периода работы/неработоспособности (если is_period)
  • schedule - текстовое расписание в формате HH:MM-HH:MM,HH:MM-HH:MM.
    Также к каждому периоду работы можно добавлять «метаданные» в JSON формате, например: 08:00-12:30{«user»:«musaev.al»},12:30-17:00{«user»:«bardina.m»}.
    потом можно будет через API запрашивать текущие (из активного в настоящее время интервала) метаданные из расписания Х или метаданные за период который будет активен следующим (если сейчас нерабочее время)
    Отдельным валидным значением является прочерк/минус «-», означающий что в этот день рабочего времени нет.
  • is_period - флаг того что эта запись не расписание на день, а период включения/выключения
  • is_work - переключатель типа периода (рабочий/нерабочий), если выставлен is_period
  • comment - коротенький камент к записи
  • history - неограниченные по размеру заметки

попробуем зарисовать
инвентаризация:расписания:diagram1.png

инвентаризация:расписания:diagram2.png
инвентаризация:расписания:diagram3.png

  • инвентаризация/dev/расписания.1709122926.txt.gz
  • Последнее изменение: 2024/02/28 12:22
  • admin