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

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

Я не против. Но не обещаю их поддерживать из-за недостатка свободного времени. На правах "as is".OlegROA

Не забывайте читать комментарии внутри скрипта!

Сам скрипт: js-код для получения расписания ДО школы

 

Получение расписания занятий ДО по всей школе на заданную неделю

1. Заходите в старую админку, на любую страницу.
2. Открываете в браузере панель инструментов разработчика.
3. Переходите на закладку Консоль
4. Открываете файл со скриптом и копируете все его содержимое в окно консоли (в ФайрФоксе возможно придется подтвердить вставку кода ручным вводом указанной фразы).
5. Проверяете начальные параметры — код учебного года, номер недели.
6. Жмете Enter. В зависимости от браузера или будет предложено сохранить csv-файл или он автоматически будет сохранен в папку «Загрузки».
Наименование файла — «Расписание ДО школы.csv».
Сортировка по ФИО учителя, дню недели и по времени начала занятия.
Кодировка текста в файле «Windows-1251», так что его сразу можно открывать в Excel.

var year_id = 12; // Идентификатор учебного года (2024-2025)

// Основные параметры
var week_num = 12;   // Номер недели

// Глобальные переменные
var th_dict = new Map();  // th_id:th_name
var sch_dict = new Map(); // "th_id-day-ftime":[th_name,day,ftime,ltime,prg_name,grp_name,th_id]

(async () => {
  // Функция преобразования текста в кодировке UTF-8
  // в кодовый массив Windows-1251
  async function toWin(s){
    let code = [];
    for(let i = 0; i < s.length; i++){
      let c = s.charCodeAt(i);
      if (c == 0x401){
         code.push(0xA8);
      } else if (c == 0x451){
         code.push(0xB8);
      } else if (c < 0x410){
         code.push(c);
      } else {
         code.push(c - 848);
      };
    };
    return (new Uint8Array(code));
  };

  // Функция чтения данных из базы ЭЖД в формате JSON
  async function fetchData(url) {
    const res = await fetch(url);
    const hdr = await res.headers;
    const json = await res.json();
    return([json, hdr]);
  };

  // Формируем словарь учителей
  let page = 0, pages = 0;
  while (true){
    page += 1;
    // Читаем справочник учителей страницами по 100 записей
    let res = await fetchData("core/api/teacher_profiles?page="+ page +"&per_page=100");
    let th = res[0];
    // Добавляем информацию в словарь
    for(let i = 0; i < th.length; i++){
      th_dict.set(th[i].id, th[i].name);
    };

    pages = res[1].get("Pages");
    if (!pages || (page >= pages)){break};
  };
  
  // Получаем ид недельного расписания ДО на заданную неделю
  const wsch = (await fetchData("core/api/ae_schedules?academic_year_id="+ year_id))[0]
               .filter(function(sch){return sch.week_number == week_num});
  if (!wsch || !wsch.length || !wsch[0].id){
     throw new Error("Указан некорректный номер учебной недели!");
  };
  let sch_id = wsch[0].id;

  // Основной цикл - чтение расписания ДО и формирование словара расписания учителей
  page = 0; pages = 0;
  while (true){
    page += 1;
    // Читаем расписание страницами по 1000 записей
    let res = await fetchData("core/api/ae_schedule_items?ae_schedule_id="+ sch_id +
                              "&page="+ page +"&per_page=1000");
    let sch = res[0];
    // Добавляем информацию в словарь
    for(let i = 0; i < sch.length; i++){
      let ls = sch[i];
      let day = (new Date(ls.date)).getDay();
      let key = ls.teacher_id +"-"+ day +"-"+ ls.begin_time;
      let th_name = ls.teacher_name;
      if (!th_name || !th_name.length){
         // В записи урока нет информации о ФИО учителя -
         // поищем его в справочнике по коду
         th_name = th_dict.get(ls.teacher_id);
         if (!th_name || !th_name.length){
            // Учитель в справочнике не найден
            th_name = "Аноним - "+ ls.teacher_id;
         };
      }
      sch_dict.set(key,
                   [th_name, day, ls.begin_time, ls.end_time,
                    ls.ae_program_name, ls.ae_group_name]
                  );
    };

    pages = res[1].get("Pages");
    if (!pages || (page >= pages)){break};
  };

  if (!sch_dict.size){
     throw new Error("Нет расписания ДО на заданную неделю!");
  };

  let wdays = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
  let content = "Учитель;День;Начало;Конец;Программа;Группа\n";
  // Преобразование словаря в список и сортировка его
  // по ФИО учителя, дню недели, времени начала урока
  const th_sch = [...sch_dict.values()].sort();

  // Формируем данные для вывода в файл
  for(let i = 0; i < th_sch.length; i++){
    content += th_sch[i][0] +";"+ wdays[th_sch[i][1]] +";"+ 
               th_sch[i][2] +";"+ th_sch[i][3] +";"+ 
               th_sch[i][4] +";"+ th_sch[i][5] +"\n";
  };

  // Создание файла формата CSV в кодировке Windows-1251
  // и сохранение его браузером
  const link = document.createElement("a");
  const file = new Blob([await toWin(content)], {type:'text/csv'});
  link.href = URL.createObjectURL(file);
  link.download = "Расписание ДО школы на "+ week_num +" неделю.csv";
  link.click();
  URL.revokeObjectURL(link.href);

})()

 


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

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