Skip to content

Latest commit

 

History

History
288 lines (230 loc) · 12.9 KB

README.md

File metadata and controls

288 lines (230 loc) · 12.9 KB

Scheduler

Scheduler.js - Библиотека (singleton) для работы с расписанием лекций. Рядом с ней вы найдете реализацию библиотеки работы со справочниками лекций, лекторов, школ и аудиторий. Реализация может быть любой, главное чтобы структура данных была "понятной" для Scheduler'а (YaSchool).

В YaSchool, к сожалению, еще не реализованы методы: remove/update только add

Структура данных:

Смотреть

Быстрый старт

Иннициализация библиотеки

Scheduler.init({
	data: scheduleData,
	directories: directoriesData
})
.on("afterScheduleAdded", function(data) {
	// Будет выполнено после добавления пункта в расписании
	// Структура объекта data:
	// {
	// 	success: true,
	//	data: newSchedule (см. _models.schedule_)
	// }
})
.on("afterScheduleDeleted", function() {
	// ПОсле удаления пункта в расписании
})
.on("afterScheduleUpdated", function() {
	// После обновления данных
});

Сруктура объекта scheduleData (одномерный массив объектов):

// Это массив объектов
var scheduleData = [  
  { _models.schedule_ },
  { _models.schedule_ }
  ...
  { _models.schedule_ }
]

Структура объекта models.schedule. Каждый такой обект содержит информацию о запланированной лекции:

{
	"_id": null, // string unique hash
	"plannedDateTime": null, // int дата и время начала лекции в секундах
	"plannedDateTimeEnd": null, // int дата и время окончания лекции в секундах (TODO: переделать на duration)
	"lessonId": null, // string ключ в справочнике лекций
	"lecturerId": null, // string ключ в справочнике лекторов
	"roomId": null, // string ключ в справочнике аудиторий
	"schools": [], // array ["schoolId", "schoolId", ...] ключи в справочнике аудиторий
	"isDraft": false, // boolean true - не отображать запланированную лукцию в расписании
	"hasCookies": false // boolean false - нет печенек, true - есть печеньки
}

Структуру можно дополнять своими мета-данными, при добавлении расписания, новые поля будут присущи только добавляемому объекту.

Структура объекта directoriesData. Объект содержит:

{
  "schools"	: { _YaSchool.models.school_ }, // Справочник школ
  "rooms"	: { _YaSchool.models.room_ }, // Справочник аудиторий
  "lessons"	: { _YaSchool.models.lesson_ }, // Справочник лекций
  "lecturers"	: { _YaSchool.models.lecturer_ }, // Справочник лекторов
}

В исходном коде YaSchool вы найдете описание моделей

YaSchool.models.school . Это объект, который описывает школу:

{
	"_id"		: null, // string unique hash
	"title"		: "", // string - Полное название школы
	"studentsCount"	: 0, // int - количество студентов
	"shortTitle" 	: "" // string - сокращенное название школы
}

YaSchool.models.room . Это объект, который описывает аудиторию:

{
	"_id"		: null, // string unique hash
	"title"		: "", // string - название аудитории
	"capacity"	: 0,  // int - количество мест в аудитории
	"location"	: "" // string - как пройти в аудиторию
}

YaSchool.models.lesson . Это объект, который описывает лекцию:

{
	"_id"	: null, // string unique hash
	"title"	: "" // Название лекции
}

YaSchool.models.lecturer . Это объект, который описывает лектора:

{
	"_id"	: null, // string unique hash
	"name"	: "", // 
	"ava"	: "",
	"bio"	: "",

}

Возможности

Библиотека оперирует секундами (например в аргументах, при планировании лекций), поэтому удобно использовать метод перевода человекопонятной даты в секунды:

Scheduler.toSeconds('22-04-2017-19:00'); // ДД-ММ-ГГГГ-ЧЧ:ММ - вернут секунды (unixtime)

Узнать название ошибки по коду:

string Scheduler.ERRORS.getErrorName(int errorCode); 

Вернет названия ошибки: Служебные ошибки

  • DATA_REQUIRED - 900 - объект data не подключен, см. Scheduler.init({ ... })
  • YASCHOOL_DIRECTORIES_NOT_BINDED - 901 - объект со справочниками (directories) не подключен см. Scheduler.init({ ... })

Ошибки целостности данных, при доабвлении или изменении пункта в расписании

  • LESSON_ALREADY_PLANNED_IN_THIS_ROOM_AT_THIS_TIME - 1000 - Лекция уже запланирована в этой Аудитории на эту ДатуВремя
  • LESSON_ALREADY_PLANNED_FOR_THIS_SCHOOL_AT_THIS_TIME - 1001 - Лекция уже запланирована для этой школы в эту ДатуВремя
  • TOO_MANY_STUDENTS_FOR_ROOM - 1002 - Недостаточно мест в аудитории для проведения лекции
  • LECTURER_CANNOT_BE_IN_SEVERAL_ROOMS_AT_THE_SAME_TIME - 1003 - Лектор не может быть одновременно в нескольких аудиториях одновременно (в ук. ДатаВремя)
  • UNKNOWN_SCHOOL - 1004 - школа не найдена (должна быть в справочнике)
  • UNKNOWN_LESSON - 1005 - лекция не найдена
  • UNKNOWN_ROOM - 1006 - аудитория не найдена
  • UNKNOWN_LECTURER - 1007 - лектор не найден
  • ITEM_NOT_FOUND - 1008 - элемент не найден (например, при обновлении)

Коды/Названия ошибок можно получить отсюда: Scheduler.ERRORS ({errname:code}

Запланировать лекцию

addSchedule(secondsLessonBegin, secondsLessonDuration, scheduleData[, callback])
  • int secondsLessonBegin - Дата и время начала лекци в секундах
  • int secondsLessonDuration - Продолжительность лекции в секундах
  • object scheduleData - Параметры нового пункта в расписании (см. models.schedule)
  • function callback - в аргумент передается object: {success:true, data:newSchedule}, либо {success:false, errorCode:999}

Метод возвращает: boolean: true - успешно создано, false не создано

Пример:
Scheduler.addSchedule(
	Scheduler.toSeconds('22-04-2017-19:00'), // 22 апреля 2017 в 19:00
	3600, // Продолжительность лекции - 1 час
	{ 
		lessonId:"lesson2", // лекция 
		lecturerId:"lecturer1", // лектор
		roomId:"room1", // аудитория
		schools:[ "school1", "school3" ] // школы 
	}, 
	function(result) { 
		if (false === result.success) {
			console.log(Scheduler.ERRORS.getErrorName(result.errorCode) ); 
		} 
		else { 
			console.log(result.data._id);
		}
	}
);

Удалить лекцию

removeScheduleById((id [, callback])
  • string id - ключ пункта в расписании
  • function callback - будет выполнен в случае успешного удаления

return boolean: true - удалено, false - не удалено

Пример:
Scheduler.removeScheduleById("5f7fa37e-e578-f2bd-edaf-8abeece7d604", myCallbackFunction);

Обновление пункта в расписании

updateSchedule: function(id, scheduleData [, callback])
  • string id - id пункта в расписании
  • objecet scheduleData - см. models.schedule

Вернет тоже что и addSchedule

Пример:
Scheduler.updateSchedule(
	"5f7fa37e-e578-f2bd-edaf-8abeece7d604", // id пункта в расписании
	{
		// см. _models.schedule_
		// Здесь может быть любое поле из модели, а также новое поле (кроме _id, оно ни на что не повлияет). 
		"lecturerId":"lecturer3" // новый лектор
        }, 
	function(result) { 
		if (!result.success) {
			console.log(Scheduler.ERRORS.getErrorName(result.errorCode) ); 
		}
		else { 
			console.log(result.data._id);
		}
	}
);

Получить расписание для школы (сгруппированное по месяцу и дню )

Scheduler.getTreeScheduleBySchool("schoolId") //получить все расписание для указанной школы
Scheduler.getTreeScheduleBySchool("schoolId", <secondsFrom>) //получить расписание для указанной школы начиная с ДатаВремя (секунды)
Scheduler.getTreeScheduleBySchool("schoolId", <secondsFrom>, <secondsTo>) //получить расписание для указанной школы начиная с ДатаВремя (секунды) по ДатаВремя (секунды)
Пример использования
// Получить, сгруппированное по месяцу и дню расписание, для школы school1 c 1 апреля по 16 апреля
Scheduler.getTreeScheduleBySchool("school1", Scheduler.toSeconds('01-04-2017-19:00'), Scheduler.toSeconds('16-04-2017-19:00'));

// Получить, сгруппированное по месяцу и дню все расписание, для школы school1 c 1 апреля
Scheduler.getTreeScheduleBySchool("school1", Scheduler.toSeconds('01-04-2017-19:00') );

// Получить, сгруппированное по месяцу и дню все расписание, для школы school1
Scheduler.getTreeScheduleBySchool("school1");
Получить расписание для школы (линейное расписание без группировки, массив объектов)
array Scheduler.getPlainScheduleBySchool(string schoolId, int secondsFrom, int secondsTo); // Параметры такие же как у getTreeScheduleBySchool, но вернет одноверный масив объектов _schedule_
Получить расписание для аудитории в заданном диапазоне дат, сгруппированное по месяцу и дате
object Scheduler.getTreeScheduleByRoom(string roomId, int secondsFrom, int secondsTo);
Получить линейное расписание для аудитории в заданном диапазоне дат
array Scheduler.getPlainScheduleByRoom(string roomId, int secondsFrom, int secondsTo);
Получить данные пункта в расписании по ID
// Scheduler.findScheduleById("scheduleId"); // Вернет объект расписания (_schedule_), -1 - если не найдено
var foundScheduleItem = Scheduler.findScheduleById("5f7fa37e-e578-f2bd-edaf-8abeece7d604");

TODO:

  • Обработка исключительных ситуауий
  • Тесты
  • YaSchool - update/remove items
  • Полноценный пример использования с терминалом

Приложения написанные с Sheduler + YaSchool:

Расписание занятий Яндекс школ (сохранение в localStorage, рендеринг на Vuejs).