From b508db693e8458d4dabaca8f67ed2a4422a68798 Mon Sep 17 00:00:00 2001 From: N08I40K Date: Fri, 21 Mar 2025 20:54:52 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=80=D0=B0=D1=81=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=BF=D0=BE=D0=B4=D0=B0=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- Cargo.lock | 4 +- Cargo.toml | 2 +- lib/schedule_parser/Cargo.toml | 2 +- lib/schedule_parser/src/lib/lib.rs | 87 +++++++++++++++++++++++++-- lib/schedule_parser/src/lib/schema.rs | 24 +++++--- src/main.rs | 12 +++- 7 files changed, 114 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 56536bf..3978cb6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target .~*.xls -schedule.json \ No newline at end of file +schedule.json +teachers.json \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 45b0eca..776aa92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -600,7 +600,7 @@ dependencies = [ [[package]] name = "schedule-parser-rusted" -version = "0.1.0" +version = "0.2.0" dependencies = [ "schedule_parser", "serde", @@ -609,7 +609,7 @@ dependencies = [ [[package]] name = "schedule_parser" -version = "0.1.0" +version = "0.2.0" dependencies = [ "calamine", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 310b5c2..228a836 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["lib/schedule_parser"] [package] name = "schedule-parser-rusted" -version = "0.1.0" +version = "0.2.0" edition = "2024" publish = false diff --git a/lib/schedule_parser/Cargo.toml b/lib/schedule_parser/Cargo.toml index 5c129e3..4b1906b 100644 --- a/lib/schedule_parser/Cargo.toml +++ b/lib/schedule_parser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "schedule_parser" -version = "0.1.0" +version = "0.2.0" edition = "2024" [lib] diff --git a/lib/schedule_parser/src/lib/lib.rs b/lib/schedule_parser/src/lib/lib.rs index 7745866..b8960eb 100644 --- a/lib/schedule_parser/src/lib/lib.rs +++ b/lib/schedule_parser/src/lib/lib.rs @@ -1,6 +1,6 @@ use crate::LessonParseResult::{Lessons, Street}; use crate::schema::LessonType::Break; -use crate::schema::{Day, Group, Lesson, LessonSubGroup, LessonTime, LessonType}; +use crate::schema::{Day, Lesson, LessonSubGroup, LessonTime, LessonType, ScheduleEntity}; use calamine::{Reader, Xls, open_workbook}; use chrono::{Duration, NaiveDateTime}; use fuzzy_matcher::FuzzyMatcher; @@ -470,7 +470,80 @@ fn parse_name_and_subgroups(name: &String) -> (String, Vec) { (lesson_name, subgroups) } -pub fn parse_xls(path: &Path) -> HashMap { +fn convert_groups_to_teachers( + groups: &HashMap, +) -> HashMap { + let mut teachers: HashMap = HashMap::new(); + + let empty_days: Vec = groups + .values() + .next() + .unwrap() + .days + .iter() + .map(|day| Day { + name: day.name.clone(), + street: day.street.clone(), + date: day.date.clone(), + lessons: vec![], + }) + .collect(); + + for group in groups.values() { + for (index, day) in group.days.iter().enumerate() { + for group_lesson in &day.lessons { + if group_lesson.lesson_type == Break { + continue; + } + + if group_lesson.subgroups.is_none() { + continue; + } + + let subgroups = group_lesson.subgroups.as_ref().unwrap(); + + for subgroup in subgroups { + if subgroup.teacher == "Ошибка в расписании" { + continue; + } + + if !teachers.contains_key(&subgroup.teacher) { + teachers.insert( + subgroup.teacher.clone(), + ScheduleEntity { + name: subgroup.teacher.clone(), + days: empty_days.to_vec(), + }, + ); + } + + let teacher_day = teachers + .get_mut(&subgroup.teacher) + .unwrap() + .days + .get_mut(index) + .unwrap(); + + teacher_day.lessons.push({ + let mut lesson = group_lesson.clone(); + lesson.group = Some(group.name.clone()); + + lesson + }); + } + } + } + } + + teachers +} + +pub fn parse_xls( + path: &Path, +) -> ( + HashMap, + HashMap, +) { let mut workbook: Xls<_> = open_workbook(path).expect("Can't open workbook"); let worksheet: WorkSheet = workbook @@ -482,13 +555,13 @@ pub fn parse_xls(path: &Path) -> HashMap { let (days_markup, groups_markup) = parse_skeleton(&worksheet); - let mut groups: HashMap = HashMap::new(); + let mut groups: HashMap = HashMap::new(); let mut days_times: Vec> = Vec::new(); let saturday_end_row = worksheet.end().unwrap().0; for group_markup in groups_markup { - let mut group = Group { + let mut group = ScheduleEntity { name: group_markup.name, days: Vec::new(), }; @@ -612,7 +685,7 @@ pub fn parse_xls(path: &Path) -> HashMap { groups.insert(group.name.clone(), group); } - groups + (convert_groups_to_teachers(&groups), groups) } #[cfg(test)] @@ -622,6 +695,8 @@ mod tests { #[test] fn it_works() { let result = parse_xls(Path::new("../../schedule.xls")); - assert_ne!(result.len(), 0); + + assert_ne!(result.0.len(), 0); + assert_ne!(result.1.len(), 0); } } diff --git a/lib/schedule_parser/src/lib/schema.rs b/lib/schedule_parser/src/lib/schema.rs index 8687ad5..412127f 100644 --- a/lib/schedule_parser/src/lib/schema.rs +++ b/lib/schedule_parser/src/lib/schema.rs @@ -1,9 +1,9 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; use serde_repr::{Deserialize_repr, Serialize_repr}; +use std::collections::HashMap; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct LessonTime { pub start: DateTime, pub end: DateTime, @@ -22,7 +22,7 @@ pub enum LessonType { ExamDefault, // Экзамен } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct LessonSubGroup { pub number: u8, @@ -31,7 +31,7 @@ pub struct LessonSubGroup { pub teacher: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct Lesson { /** * Тип занятия @@ -67,7 +67,7 @@ pub struct Lesson { pub group: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct Day { pub name: String, @@ -79,7 +79,7 @@ pub struct Day { } #[derive(Serialize, Deserialize, Debug)] -pub struct Group { +pub struct ScheduleEntity { pub name: String, pub days: Vec, @@ -90,8 +90,18 @@ pub struct Schedule { #[serde(rename = "updatedAt")] pub updated_at: DateTime, - pub groups: HashMap, + pub groups: HashMap, #[serde(rename = "updatedGroups")] pub updated_groups: Vec>, } + +#[derive(Serialize, Deserialize, Debug)] +pub struct TeacherSchedule { + #[serde(rename = "updatedAt")] + pub updated_at: DateTime, + + pub teacher: ScheduleEntity, + + pub updated: Vec, +} diff --git a/src/main.rs b/src/main.rs index 262553f..5e7374b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,13 +3,21 @@ use std::path::Path; use schedule_parser::parse_xls; fn main() { - let groups = parse_xls(Path::new("./schedule.xls")); + let (teachers, groups) = parse_xls(Path::new("./schedule.xls")); fs::write( "./schedule.json", serde_json::to_string_pretty(&groups) - .expect("Failed to serialize schedule!") + .expect("Failed to serialize schedule") .as_bytes(), ) .expect("Failed to write schedule"); + + fs::write( + "./teachers.json", + serde_json::to_string_pretty(&teachers) + .expect("Failed to serialize teachers schedule") + .as_bytes(), + ) + .expect("Failed to write teachers schedule"); }