Автор скрипта @OlegROA

Дисклеймер публикации

Я не против. Но не обещаю их поддерживать из-за недостатка свободного времени. На правах "as is".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;
                };
              });
          });
        });
    });
  })

 


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *