Перед разработкой приложения 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-х недельное или кастомное расписание, ваше занятие имеет свои настройки и повторяется так, как вы указали.
Занятие без повторений
Когда вам нужно добавить событие без повторений, например, встреча выпускников, занятие с репетитором, вы можете выбрать режим повторения "Нет". И тогда ваше занятие отобразится только в выбранную дату.
Такое занятие, так же как и интервальное, выпадает из общего цикла расписания, поскольку имеет свои собственные настройки.
Учитель отменил занятие?
Такое бывает, но не удалять же нам занятие полностью из расписания. Для таких случаев есть функция однократного удаления.
Когда занятие удаляется однократно, в нём хранится список дат, в которые занятие должно быть пропущено. Этот список вы можете увидеть при просмотре занятия в другой день. И даже можете вернуть обратно отменённое занятие.
Массовое добавление или копирование занятий
Пользователь может выбрать только один день для добавления занятия. Но ведь хочется добавить занятия везде и сразу. На эту тему мы долго дискутировали и продолжаем дискутировать с командой. Если дать выбор нескольких дней, то возникает вопрос выбора времени урока на каждый выбранный день.
Наша основная аудитория - это школьники и студенты. А у них почти никогда не бывает одинаковых предметов в одно и то же время. Например, редко бывает так, что Математика происходит первым уроком несколько дней в неделю. А если дать выбор времени на каждый день, то интерфейс окажется перегруженным.
Копирование занятий является более гибким инструментом. Позволяет решить вопрос массового добавления уроков на несколько дней в разное время. Для каждой копии вы можете указать тип повторения: по дням недели, с интервалом, или вообще без повторения, и выбрать время урока.
Как сделать замену урока?
Это часто задаваемый вопрос. Реализовать замену урока через одно действие, без того, чтобы усложнить жизнь пользователю, у нас пока не получается. Мы всегда выбираем путь наименьшего сопротивления в вопросах дизайна и пользовательского интерфейса. Поэтому самым простым решением будет совершить два действия:
Однократно удалить занятие в нужный день
Добавить или скопировать занятие в этот же день, но без повторения
Итог
Расписание хоть и выглядит простым, но не всегда таким является. Мы, в приложении Smart Timetable, стараемся развивать простые инструменты для управления вашими занятиями и, в будущем, заданиями.
На данный момент задания реализованы по образу и подобию занятий, но это не всегда удобно, особенно если хочется видеть все задания списком. Мы работаем над этим.
Будем рады обратной связи ????
Комментарии (13)
radioxoma
19.08.2022 23:15Ещё бывают т.н. "циклы". Одно и то же занятие повторяется по будням, например, с 8:00 до 14:00, цикл длится от нескольких дней до нескольких недель. Параллельно с циклами вечером могут быть занятия/лекции.
В конечном счёте, для удобства пользователей, пришлось делать view где был сортированный список циклов (студенты хотели видеть в какой части города с какими группами будут учиться вместе) и view с обычными занятиями/парами/лекциями для которых было случайное неповторяющееся расписание по датам.
serg_borisovich
20.08.2022 11:12cвязать с moodle и другими платформами LMS для синхронизации расписаний не планируете?
dendude Автор
20.08.2022 11:14Изучим платформу, возможно импорт получится сделать. Как-то даже не смотрели в их сторону. Спасибо!
pavel_raskin
20.08.2022 12:05+1Чем ваше приложение принципиально отличается от календарей/планировщиков? Вроде бы там уже всё необходимое есть: настраиваемая периодичность событий (недели над/под и т.п.), автоматические интервалы (уроки/пары), места и участники (корпус/кабинет, препод/группа), кроме того есть синхронизация с другими пользователями и возможность вести и видеть несколько календарей (расписаний), в том числе и от других пользователей.
dendude Автор
20.08.2022 14:48Да, вы правы. Расписание занятий - это подмножество календаря с более узкоспециализированным функционалом. Чего-то из календаря у нас нет, а что-то сделано прицельно под учёбу.
4lex
21.08.2022 14:35В статье про это ничего не сказано, но возможно такой функционал есть - выдача заданий студентам с привязкой к уроку когда его нужно сдать? Или например учет пропуска занятий?
dendude Автор
21.08.2022 16:52Можно выбрать предмет, к которому задание относится и назначить дату/время выполнения. Учет пропуска занятий отсутствует, так же как и оценки.
Vasyutka
Помню в лицее директор: "ну вы же
программистыолимпиадники, помогите программу для расписания сделайте!". Мы такие: "ну наверное это np-полная задача (модное слово было - типа динамика или поиск по графу не решает)! Очень интересно, а какая метрика что расписание хорошее?". Директор: "ооой.. ну мы сидим и пишем, но каждый учитель ещё попросит что-то подвинуть, и так месяц пишем, всем не нравится, но как убедим".Shersh
У меня дипломная работа была - генерация расписаний на основе генетических алгоритмов =)
Там в общем то учитывалось, что кому то неудобно в какое то время и алгоритм через сотни тысяч итераций генерировал приемлемое расписание.
Akr0n
Забавно, тоже когда-то писал точно такой же проект на Delphi для себя и в рамках лабы\конференции. Узнал, что в теории есть куча критериев, по которым в реальности должно составляться расписание для школы. Естественно, при ручном составлении завучу было нереально их все соблюсти. Планировалось внедрение в родную школу, но как-то не дошло до этого, уж очень трудоёмкой оказалась задача для ее реального внедрения.