Автор скрипта @OlegROA
Дисклеймер публикации
Не забывайте читать комментарии внутри скрипта!
Сам скрипт: js-код для копирования кабинетов
Копирование кабинетов из уроков эталонной недели на заданные недели
!!! Данный скрипт НЕ ИЗМЕНЯЕТ уроки, в которых кабинет совпадает с кабинетом этого же урока на эталонной неделе.
!!! Данный скрипт меняет в уроках ТОЛЬКО кабинет и, если необходимо, здание, в котором находится этот кабинет.
!!! Так как скрипт не изменяет ид/дату урока, то все связи урока с другими объектами ЭЖД (КТП, журнал, оценки, дз и пр.) НЕ НАРУШАЮТСЯ.
Шаг 1:
1. ОБЯЗАТЕЛЬНО заходите в старую админку, на любую страницу.
2. Открываете в браузере панель инструментов разработчика. (Google Chrome — F12)
3. Переходите на закладку Консоль.
4. Открываете файл со скриптом и копируете блок «Подключение jQuery» в окно консоли (в ФайрФоксе возможно придется подтвердить вставку кода ручным вводом указанной фразы).
5. Жмете Enter.
// ==================================================================
// Подключение jQuery - НАЧАЛО.
// Выполняется ОДИН РАЗ после каждого обновления страницы.
//
// !!!
// Не запускайте этот скрипт подключения jQuery вместе с запуском
// основного скрипта - для выполнения подключения нужно некоторое
// время (порядка одной секунды), но движек JavaScript не ждет
// завершения операции и продолжает выполнение скрипта - на первом же
// вызове jQuery будет выдана ошибка, потому что jQuery еще не успел
// подключиться.
// !!!
// ==================================================================
var jq = document.createElement('script');
jq.src = "https://code.jquery.com/jquery-3.7.1.min.js";
document.head.appendChild(jq);
// Подключение jQuery - КОНЕЦ.
Шаг 2:
6. Копируете основной код скрипта в окно консоли (в ФайрФоксе возможно придется подтвердить вставку кода ручным вводом указанной фразы).
7. Проверяете начальные параметры — код учебного года, номер эталонной недели, список номеров целевых недель.
8. Жмете Enter.
var year_id = 13; // Идентификатор учебного года (2024-2025)
// Основные параметры
var tpl_week = 8; // Номер эталонной недели.
var chk_week = [9,10,11,12,13,14,15,16,17,18]; // Список (через запятую) целевых недель.
// Наименование класса (как в ЭЖД), например "9-А".
// Обратите внимание на язык букв в наименовании класса!
// Вместо наименования класса можно указать номер параллели -
// будут обработаны только классы указанной параллели.
// Если задать пустое наименование класса или "0", то будут
// обработаны все классы школы с 1 по 12 параллель.
var cls_name = "0";
// Ключи проверки
var chk_days = [1,2,3,4,5]; // Номера обрабатываемых дней недели
var chk_type = ["NORMAL","REMOTE","ELECTRONIC"]; // Типы обрабатываемых уроков
var chk_replaced = false; // Обрабатывать замененные уроки?
// !!! Ключ ТЕСТОВОГО РЕЖИМА !!!
// Если он равен "true", то НИКАКИХ ИЗМЕНЕНИЙ в расписание не будет внесено,
// но будет выведена информация о возможных изменениях.
// Для внесения реальных изменений в расписание следует присвоить
// данному параметру значение "false" (без кавычек).
var chk_only = false;
// Глобальные переменные
var cls_level = parseInt(cls_name || 0);
// Общее кол-во ошибок.
// После завершения проверки просто впишите в консоль имя этой переменной.
var err_count = 0;
chk_week = chk_week.filter(function(w){return (w > 0) && (w < 41)});
if ((tpl_week < 1) || (tpl_week > 40) || (!chk_week.length)){
throw new Error("Некорректные номера недель!");
};
if (!chk_days.length){
throw new Error("Не заданы обрабатываемые дни недели!");
};
if (!chk_type.length){
throw new Error("Не заданы обрабатываемые типы уроков!");
};
cls_name = cls_name.trim().toUpperCase();
if ((cls_level < 0) || (cls_level > 12)){
throw new Error("Некорректный номер параллели!");
} else if (!cls_level){
if (!confirm("Обработка всего расписания школы может быть достаточно длительной!\n"+
"Вы действительно хотите выполнить такую обработку?")){
throw new Error("Отказ от выполнения!");
};
};
if (!cls_level){cls_level = "1,2,3,4,5,6,7,8,9,10,11,12"};
jQuery.getJSON("core/api/class_units?academic_year_id="+ year_id +
"&with_home_based=true&class_level_ids="+ cls_level)
.done(function(data){
let cls_data = data;
if (isNaN(cls_name)){
cls_data = cls_data.filter(function(cls){
return cls.name.trim().toUpperCase() == cls_name;
});
if (!cls_data || !cls_data.length){
throw new Error("Заданный класс \""+ cls_name +"\" не найден!");
};
};
// Обходим обрабатываемые классы
cls_data.forEach(function(cls){
// Запрос расписания класса на эталонную неделю
jQuery.getJSON("jersey/api/schedules/items?academic_year_id="+ year_id +
"&week_number="+ tpl_week +"&class_unit_id="+ cls.id)
.done(function(data){
// Формируем словарь уроков
let orig_tpl_sch = new Map;
data.forEach(function(ls){
let ls_key = ls.day_number +"-"+ ls.study_ordinal +"-"+ ls.group_id;
orig_tpl_sch.set(ls_key,
{"class_unit_id":(ls.class_unit_id || 0),
"group_name" :(ls.group_name || ""),
"building_id" :(ls.building_id || 0),
"building_name":(ls.building_name || "???"),
"room_id" :(ls.room_id || 0),
"room_name" :(ls.room_name || "???"),
"subject_id" :(ls.subject_id || 0),
"teacher_id" :(ls.teacher_id || 0),
"replaced" :(ls.replaced || false),
"lesson_type" :(ls.lesson_type || "NORMAL"),
"cancelled" :(ls.cancelled || false)
}
);
});
if (!orig_tpl_sch.size){
console.log("У класса \""+ cls.name +"\" нет эталонного расписания!");
err_count += 1;
return false;
};
// Обходим расписания на целевых неделях текущего класса
chk_week.forEach(function(week_num){
// Запрос расписания класса на целевую неделю
jQuery.getJSON("jersey/api/schedules/items?academic_year_id="+ year_id +
"&week_number="+ week_num +"&class_unit_id="+ cls.id)
.done(function(data){
let tpl_sch = new Map(orig_tpl_sch);
if (tpl_sch.size != data.length){
console.log("Класс \""+ cls.name +"\", неделя "+ week_num +" - разное количество уроков!");
err_count += 1;
return false;
};
// Обходим уроки целевой недели
let ls_err = 0;
data.forEach(function(ls){
if (!chk_days.includes(ls.day_number)){return true};
if (!chk_type.includes(ls.lesson_type)){return true};
if ((ls.replaced || false) && !chk_replaced){return true};
if (ls.cancelled || false){return true};
let ls_msg = cls.name +";Неделя-"+ week_num +";День-"+ ls.day_number +
";Урок-"+ ls.study_ordinal +";"+ ls.group_name;
let ls_key = ls.day_number +"-"+ ls.study_ordinal +"-"+ ls.group_id;
if (!tpl_sch.has(ls_key)){
console.log(ls_msg +
";Урок целевого расписания не найден в эталонном расписании!\n");
ls_err += 1;
return true;
};
ls_tpl = tpl_sch.get(ls_key);
tpl_sch.delete(ls_key);
if ((ls_tpl.building_id != (ls.building_id || 0)) ||
(ls_tpl.room_id != (ls.room_id || 0))){
if (chk_only){
console.log(ls_msg +";"+ ls_tpl.building_name +";"+ ls_tpl.room_name);
} else {
let url = 'jersey/api/schedules/'+ ls.schedule_id +'/items/'+ ls.id;
let data = {"bell_id":ls.bell_id,
"date":ls.date,
"teacher_id":ls.teacher_id,
"city_building_id":ls_tpl.city_building_id,
"group_id":ls.group_id,
"lesson_type":ls.lesson_type,
"room_id":ls_tpl.room_id
};
jQuery.ajax(url, {method: "PUT",
contentType: "application/json;charset=UTF-8",
data: JSON.stringify(data)
})
.done(function(data){
console.log(ls_msg +";"+ data.building_name +";"+ data.room_name);
})
.fail(function(){
console.log(ls_msg +";Ошибка");
ls_err += 1;
});
};
};
});
if (ls_err){
err_count += ls_err;
};
});
});
});
});
})
