Перед разработкой приложения Smart Timetable мы изучили очень много расписаний из разных стран и постарались сделать приложение удобным, гибким, легко настраиваемым. У нас большая аудитория: школьники, студенты, преподаватели, родители. Давайте посмотрим, что нам удалось выяснить и как мы это реализовали.

Одна неделя или еженедельное расписание

Классический распорядок занятий в школе, когда предметы повторяются каждую неделю. Необходимо выбрать день недели (понедельник, вторник, ...), указать время начала и конца занятия, и ваш предмет будет повторяться от недели к неделе.

Расписание на одну неделю
Расписание на одну неделю

Реализация такого расписания очень простая. Мы знаем индекс дня недели, на который назначен урок, и сверяем его с датой, которую просматривает пользователь. Например, понедельник имеет индекс "1", вторник "2" и так далее.

Выбор дня недели для занятия
Выбор дня недели для занятия

Предположим, что пользователь хочет узнать расписание на 5 сентября 2022 года. Любой современный язык программирования позволяет складывать и вычитать даты, получать месяц, год, день недели из даты и много другое.

Индекс дня недели для 5 сентября 2022 года равен "1". Значит все занятия, которые хранятся в базе данных с индексом дня "1" будут отображаться в эту дату.

Расписание на две и более недели

Такое расписание часто можно встретить в ВУЗах, когда предметы повторяются не каждую неделю, а чередуются с интервалом N недель. Недели могут называются по-разному: А/В, четная/нечетная, верхняя/нижняя, числитель/знаменатель, встречались и красная/синяя =))

В приложении Smart Timetable можно указать от 2-х до 4-х недель. Если понадобится большее количество, то мы изменим интерфейс для настройки недель через +/-, но об этом нас никто из пользователей не просил. Можем предположить, что этого функционала вполне достаточно.

Расписание на две недели
Расписание на две недели

Начало недели и текущая неделя нужны для того, чтобы корректно считать смену недель. В момент выбора текущей недели мы сохраняем дату, когда текущая неделя была выбрана, и от неё отталкиваемся при подсчёте недель.

Также важно давать пользователям возможность называть недели так, как им хочется. В приложении есть такая возможность. По умолчанию недели называются "Неделя 1", "Неделя 2" и т. д.

Названия недель
Названия недель

Для понимания, какие уроки показывать, теперь нам нужно хранить не только индекс дня, но и индекс недели. При добавлении занятия пользователь выбирает день недели и неделю. Названия недель берутся из настроек выше.

Выбор недели и дня
Выбор недели и дня

Другая или кастомная неделя

В странах СНГ такое расписание нам не встречалось, но вот в США и Канаде достаточно частое явление. Оно называется "shift schedule" или "скользящий график". Внутри нашей команды мы называем такой график "кастомная неделя". Как работает такое расписание?

Например, у нас 6-дневная учебная неделя со скользящим графиком. Это значит, что расписание повторяется каждые 6 дней, но выходные и праздничные дни не участвуют в подсчёте дней. Покажем это в виде таблицы.

Понедельник, 5 сентября

День 1

Вторник, 6 сентября

День 2

Среда, 7 сентября

Нерабочий день

Четверг, 8 сентября

День 3

Пятница, 9 сентября

День 4

Суббота, 10 сентября

Выходной

Воскресенье, 11 сентября

Выходной

Понедельник, 12 сентября

День 5

Вторник, 13 сентября

День 6

Среда, 14 сентября

День 1

Для того, чтобы корректно отображать расписание, нам нужно знать индекс дня недели для занятий, аналогично тому, как если бы у нас было 1-недельное расписание. Но в случае 1-недельного расписания индекс дня мог быть от 0 (воскресенье) до 6 (суббота), а в случае кастомной недели мы имеем переменное количество дней, от 2 до 99.

Гибкая настройка расписания
Гибкая настройка расписания

Также нам нужно знать дату первого дня такой недели. От этой даты мы будем считать индекс дня выбранной пользователем даты, пропуская выходные и праздничные дни.

Нерабочие дни кастомной недели
Нерабочие дни кастомной недели

Иногда пользователи не понимают смысл кастомной недели. Выбирают цикл расписания 7 дней и называют их именами реальных дней недели: понедельник, вторник, среда и т.д. Так тоже можно, но стоит добавить хотя бы один нерабочий день, как сразу все последующие дни недели не будут соответствовать действительности.

И когда нам пишут в поддержку с вопросами по такому расписанию, мы помогаем пользователям перейти на обычный 1-недельный график, если это то, что им в действительности было нужно.

Повторение занятия, но не расписания

Что делать, если расписание у вас 1-недельное, но какие-то занятия повторяются с другим интервалом? Есть решение!

Интервальное повторение занятий
Интервальное повторение занятий

Можно указать любой интервал от 1 до 99 дней, с которым ваше занятие будет повторяться. Здесь стоит обратить внимание на то, что такие занятия выпадают из обычного цикла расписания. Будь то 1, 2, 3, 4-х недельное или кастомное расписание, ваше занятие имеет свои настройки и повторяется так, как вы указали.

Занятие без повторений

Когда вам нужно добавить событие без повторений, например, встреча выпускников, занятие с репетитором, вы можете выбрать режим повторения "Нет". И тогда ваше занятие отобразится только в выбранную дату.

Занятие без повторений
Занятие без повторений

Такое занятие, так же как и интервальное, выпадает из общего цикла расписания, поскольку имеет свои собственные настройки.

Учитель отменил занятие?

Такое бывает, но не удалять же нам занятие полностью из расписания. Для таких случаев есть функция однократного удаления.

Опции удаления занятия
Опции удаления занятия

Когда занятие удаляется однократно, в нём хранится список дат, в которые занятие должно быть пропущено. Этот список вы можете увидеть при просмотре занятия в другой день. И даже можете вернуть обратно отменённое занятие.

Список дат с отменой занятия
Список дат с отменой занятия

Массовое добавление или копирование занятий

Пользователь может выбрать только один день для добавления занятия. Но ведь хочется добавить занятия везде и сразу. На эту тему мы долго дискутировали и продолжаем дискутировать с командой. Если дать выбор нескольких дней, то возникает вопрос выбора времени урока на каждый выбранный день.

Наша основная аудитория - это школьники и студенты. А у них почти никогда не бывает одинаковых предметов в одно и то же время. Например, редко бывает так, что Математика происходит первым уроком несколько дней в неделю. А если дать выбор времени на каждый день, то интерфейс окажется перегруженным.

Копирование занятий является более гибким инструментом. Позволяет решить вопрос массового добавления уроков на несколько дней в разное время. Для каждой копии вы можете указать тип повторения: по дням недели, с интервалом, или вообще без повторения, и выбрать время урока.

Как сделать замену урока?

Это часто задаваемый вопрос. Реализовать замену урока через одно действие, без того, чтобы усложнить жизнь пользователю, у нас пока не получается. Мы всегда выбираем путь наименьшего сопротивления в вопросах дизайна и пользовательского интерфейса. Поэтому самым простым решением будет совершить два действия:

  1. Однократно удалить занятие в нужный день

  2. Добавить или скопировать занятие в этот же день, но без повторения

Итог

Расписание хоть и выглядит простым, но не всегда таким является. Мы, в приложении Smart Timetable, стараемся развивать простые инструменты для управления вашими занятиями и, в будущем, заданиями.

На данный момент задания реализованы по образу и подобию занятий, но это не всегда удобно, особенно если хочется видеть все задания списком. Мы работаем над этим.

Будем рады обратной связи ????

Комментарии (13)


  1. Vasyutka
    19.08.2022 22:45
    +3

    Помню в лицее директор: "ну вы же программисты олимпиадники, помогите программу для расписания сделайте!". Мы такие: "ну наверное это np-полная задача (модное слово было - типа динамика или поиск по графу не решает)! Очень интересно, а какая метрика что расписание хорошее?". Директор: "ооой.. ну мы сидим и пишем, но каждый учитель ещё попросит что-то подвинуть, и так месяц пишем, всем не нравится, но как убедим".


    1. Shersh
      19.08.2022 23:12
      +2

      У меня дипломная работа была - генерация расписаний на основе генетических алгоритмов =)
      Там в общем то учитывалось, что кому то неудобно в какое то время и алгоритм через сотни тысяч итераций генерировал приемлемое расписание.


      1. Akr0n
        21.08.2022 03:18
        +1

        Забавно, тоже когда-то писал точно такой же проект на Delphi для себя и в рамках лабы\конференции. Узнал, что в теории есть куча критериев, по которым в реальности должно составляться расписание для школы. Естественно, при ручном составлении завучу было нереально их все соблюсти. Планировалось внедрение в родную школу, но как-то не дошло до этого, уж очень трудоёмкой оказалась задача для ее реального внедрения.


  1. radioxoma
    19.08.2022 23:15

    Ещё бывают т.н. "циклы". Одно и то же занятие повторяется по будням, например, с 8:00 до 14:00, цикл длится от нескольких дней до нескольких недель. Параллельно с циклами вечером могут быть занятия/лекции.

    В конечном счёте, для удобства пользователей, пришлось делать view где был сортированный список циклов (студенты хотели видеть в какой части города с какими группами будут учиться вместе) и view с обычными занятиями/парами/лекциями для которых было случайное неповторяющееся расписание по датам.


    1. dendude Автор
      19.08.2022 23:24

      где можно посмотреть?


      1. radioxoma
        20.08.2022 00:31

        Сайт с расписанием был выключен в 2015, так что уже нигде.


  1. diakin
    20.08.2022 07:50

    Неинтуитивно (


  1. serg_borisovich
    20.08.2022 11:12

    cвязать с moodle и другими платформами LMS для синхронизации расписаний не планируете?


    1. dendude Автор
      20.08.2022 11:14

      Изучим платформу, возможно импорт получится сделать. Как-то даже не смотрели в их сторону. Спасибо!


  1. pavel_raskin
    20.08.2022 12:05
    +1

    Чем ваше приложение принципиально отличается от календарей/планировщиков? Вроде бы там уже всё необходимое есть: настраиваемая периодичность событий (недели над/под и т.п.), автоматические интервалы (уроки/пары), места и участники (корпус/кабинет, препод/группа), кроме того есть синхронизация с другими пользователями и возможность вести и видеть несколько календарей (расписаний), в том числе и от других пользователей.


    1. dendude Автор
      20.08.2022 14:48

      Да, вы правы. Расписание занятий - это подмножество календаря с более узкоспециализированным функционалом. Чего-то из календаря у нас нет, а что-то сделано прицельно под учёбу.


  1. 4lex
    21.08.2022 14:35

    В статье про это ничего не сказано, но возможно такой функционал есть - выдача заданий студентам с привязкой к уроку когда его нужно сдать? Или например учет пропуска занятий?


    1. dendude Автор
      21.08.2022 16:52

      Можно выбрать предмет, к которому задание относится и назначить дату/время выполнения. Учет пропуска занятий отсутствует, так же как и оценки.