From 0cd1b407e76d9db4611086470b32d48b62888cdd Mon Sep 17 00:00:00 2001 From: esoe Date: Wed, 17 Jul 2024 15:53:16 +0300 Subject: [PATCH] qq --- gates/run.ps1 | 23 + .../gates/controller/BuildingController.java | 22 +- .../gates/controller/CourseController.java | 304 ++++++------ .../gates/controller/CretareaController.java | 5 +- .../gates/controller/GatesController.java | 15 +- .../controller/OrganizationController.java | 5 +- .../gates/controller/ProgramController.java | 5 +- .../gates/controller/TeacherController.java | 195 ++++---- .../java/ru/mlokoin/gates/model/Course.java | 197 +++++++- .../ru/mlokoin/gates/model/CourseWraper.java | 29 +- .../java/ru/mlokoin/gates/model/Teacher.java | 125 +++-- .../fs/MpFile.java} | 9 +- .../ru/mlokoin/gates/teh/strings/Arrayer.java | 49 ++ .../ru/mlokoin/gates/teh/strings/Dater.java | 16 + .../ru/mlokoin/gates/teh/strings/Naimer.java | 237 ++++++++++ .../mlokoin/gates/teh/strings/Stringer.java | 54 +++ gates/src/main/resources/application.yaml | 6 + .../resources/templates/courses-check.html | 56 ++- .../resources/templates/teachers-check.html | 44 +- .../templates/view-as-educations.html | 75 +-- .../mlokoin/gates/teh/strings/NaimerTest.java | 434 ++++++++++++++++++ .../strings/StringerCheckForEmptyTest.java | 61 +++ .../resourceserviceapi/entities/Teacher.java | 7 +- 23 files changed, 1588 insertions(+), 385 deletions(-) create mode 100644 gates/run.ps1 rename gates/src/main/java/ru/mlokoin/gates/{util/CustomMultipartFile.java => teh/fs/MpFile.java} (82%) create mode 100644 gates/src/main/java/ru/mlokoin/gates/teh/strings/Arrayer.java create mode 100644 gates/src/main/java/ru/mlokoin/gates/teh/strings/Dater.java create mode 100644 gates/src/main/java/ru/mlokoin/gates/teh/strings/Naimer.java create mode 100644 gates/src/main/java/ru/mlokoin/gates/teh/strings/Stringer.java create mode 100644 gates/src/test/java/ru/mlokoin/gates/teh/strings/NaimerTest.java create mode 100644 gates/src/test/java/ru/mlokoin/gates/teh/strings/StringerCheckForEmptyTest.java diff --git a/gates/run.ps1 b/gates/run.ps1 new file mode 100644 index 0000000..8c6488f --- /dev/null +++ b/gates/run.ps1 @@ -0,0 +1,23 @@ +$container_name = "gates" +$image_name = "gates" +$build_name = "gates" +$code_location = "C:\Users\devuser\Documents\code\tech-services\gates" + +# Остановить и удалить существующий контейнер +docker stop $container_name +docker rm $container_name + +# Удалить существующий образ +docker rmi $image_name + +# Перейти в каталог с проектом +Set-Location $code_location + +# Собрать jar с помощью Maven +mvn clean package + +# Запустить контейнер с помощью docker-compose +docker-compose up + +# Пауза скрипта +Pause \ No newline at end of file diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java b/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java index 9e66ba6..c031f28 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java @@ -25,6 +25,7 @@ import ru.mlokoin.gates.model.Building; import ru.mlokoin.gates.model.BuildingWraper; import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxDocument; +import ru.mlokoin.gates.teh.strings.Stringer; @Controller @RequestMapping(path = "/buildings") @@ -48,19 +49,10 @@ public class BuildingController { ArrayList xlsx_buildings = new ArrayList<>();//19 столбец Map> map = xlsx.getData(); for (Map.Entry> entry : map.entrySet()) { - /** - * Обработка пустых строк - */ - String string = ""; - try { - string = entry. + String string = Stringer.clear(entry. getValue(). get(19). - getContent(); - } catch (Exception e){ - System.out.println("Не указан объект строительства: " + entry.getKey() + " :: " + e.getMessage()); - string = "-"; - } + getContent()); Building building = new Building(); building.setName_short(string); @@ -69,15 +61,7 @@ public class BuildingController { xlsx_buildings.remove(0);//Удалили из списка заголовок Set xlsx_buildingSet = Set.copyOf(xlsx_buildings);//удалили повторения - //объекты строительства вконсоль ... - System.out.println("###############################"); - System.out.println(">> Объекты строительства из файла: " + xlsx_buildingSet.size()); - for (Building building : xlsx_buildingSet) { - System.out.println("Объект строительства (xlsx): " + building.getName_short()); - } - //Ошибки в консоль - System.out.println("###############################"); System.out.println(">> errors: " + errors.size()); for (String msg : errors) { System.out.println("msg: " + msg); diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/CourseController.java b/gates/src/main/java/ru/mlokoin/gates/controller/CourseController.java index f1ded54..8a785c4 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/CourseController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/CourseController.java @@ -3,8 +3,10 @@ package ru.mlokoin.gates.controller; import java.time.Duration; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; @@ -23,11 +25,12 @@ import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; import ru.mlokoin.gates.model.Building; import ru.mlokoin.gates.model.Course; +import ru.mlokoin.gates.model.CourseWraper; import ru.mlokoin.gates.model.Program; -import ru.mlokoin.gates.model.ProgramWraper; import ru.mlokoin.gates.model.Teacher; import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxDocument; +import ru.mlokoin.gates.teh.strings.Stringer; @Controller @RequestMapping(path = "/courses") @@ -38,129 +41,146 @@ public class CourseController { @GetMapping("/check/{id}") public String checkCoursess(Model model, @PathVariable String id) { System.out.println("Проверка курсов, для внесения в базу ..."); + + // создание списка ошибок + List errors = new ArrayList<>(); + + // Получение списка преподавателей из базы json объект сериализуем в java файл + System.out.println("Получение перечня преподавателей из базы ..."); + List teachers; + try { + teachers = client.method(HttpMethod.GET) + .uri("http://resource-service-api:8181/teacher/list") + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + } catch (Exception e) { + errors.add("Ошибка при получении списка преподавателей из базы :: " +e.getMessage()); + System.out.println("Не удалось получить список преподавателей из базы: " + e.getMessage()); + teachers = new ArrayList<>(); + } + + // получение списка программ обучения из базы, json объект сериализуем в java файл + System.out.println("Получение перечня программ обучения из базы ..."); + List programs; + try { + programs = client.method(HttpMethod.GET) + .uri("http://resource-service-api:8181/program/list") + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + } catch (Exception e) { + errors.add("Ошибка при получении списка программ обучения из базы :: " +e.getMessage()); + System.out.println("Не удалось получить список программ обучения из базы: " + e.getMessage()); + programs = new ArrayList<>(); + } + + // получение списка объектов строительства из базы, json объект сериализуем в java файл + System.out.println("Получение перечня объектов строительства из базы ..."); + List buildings; + try { + buildings = client.method(HttpMethod.GET) + .uri("http://resource-service-api:8181/building/list") + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + } catch (Exception e) { + errors.add("Ошибка при получении списка объектов строительства из базы :: " +e.getMessage()); + System.out.println("Не удалось получить список объектов строительства из базы: " + e.getMessage()); + buildings = new ArrayList<>(); + } + + // Получение данных файла в переменную xlsx, json объект сериализуем в java файл System.out.println("Получение перечня курсов из xlsx-файла ..."); - //получение данных файла в переменную xlsx - XlsxDocument xlsx = client.method(HttpMethod.GET) + XlsxDocument xlsx; + try { + xlsx = client.method(HttpMethod.GET) .uri("http://storage-rs:8282/api/document/content/" + id + ".xlsx") .retrieve() .bodyToMono(new ParameterizedTypeReference (){}) .block(); - //список курсов из файла - List xlsx_courses = new ArrayList<>();//7 столбец + } catch (Exception e) { + errors.add("Ошибка при получении списка курсов из xlsx-файла :: " +e.getMessage()); + System.out.println("Не удалось получить список курсов из xlsx-файла: " + e.getMessage()); + xlsx = new XlsxDocument(); + } + + // Полчение курсов из xlsx + List xlsx_courses = new ArrayList<>();// 7 столбец Map> map = xlsx.getData(); for (Map.Entry> entry : map.entrySet()) { - Course course = new Course(); - course.setPlace(entry - .getValue() - .get(5) - .getContent()); - //Обработка даты начала обучения - course.setStart_date( - new Date( - Long.parseLong( - entry - .getValue() - .get(7) - .getContent()))); - //Обработка даты создания протокола - course.setProtocol_date( - new Date( - Long.parseLong( - entry - .getValue() - .get(9) - .getContent()))); - //Номер протокола - course.setProtocol_number(entry - .getValue() - .get(13) - .getContent()); - //отчтный период - course.setReport_period(entry - .getValue() - .get(17) - .getContent()); - //Извлекаем ФИО преподавателя - course.setTeacher(new Teacher(entry - .getValue() - .get(18) - .getContent())); - //извлекаем программу обучения - course.setProgram(new Program(entry - .getValue() - .get(6) - .getContent())); - course.setBuilding(new Building(entry - .getValue() - .get(19) - .getContent())); - - xlsx_courses.add(course); + xlsx_courses.add(new Course((Entry>) entry, teachers, programs, buildings)); } - xlsx_courses.remove(0);//Удалили из списка заголовок - Set xlsx_courseSet = Set.copyOf(xlsx_courses);//удалили повторения - - //список номеров протоколов из файла в консоль - System.out.println("Список протоколов из файла:" + xlsx_courseSet.size()); - // Set xlsx_stringSet = new HashSet<>(); - for (Course c : xlsx_courseSet) { - System.out.println(c.getProtocol_number() + " от " + c.getProtocol_date()); - // xlsx_stringSet.add(c.); + + //Получение перечня курсов из базы + System.out.println("Получение списка курсов из базы ..."); + List base_courses = client.method(HttpMethod.GET) + .uri("http://resource-service-api:8181/course/list") + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + + //Удаляем повторяющиеся курсы + // List set = new ArrayList<>(xlsx_courses); + // Set set = new HashSet<>(xlsx_courses); + // List courses = new ArrayList<>(set); + System.out.println("Удаляем повторяющиеся курсы ..."); + System.out.println("Количество курсов в xlsx_courses (list): " + xlsx_courses.size()); + for (Course courseA : new ArrayList<>(xlsx_courses)) { + Boolean isExists = false; + for (Course courseB : new ArrayList<>(xlsx_courses)) { + if (Course.isSimilar(courseA, courseB) && !isExists) { + isExists = true; + } else { + if (Course.isSimilar(courseA, courseB) && isExists) { + xlsx_courses.remove(courseA); + } + } + } + } + System.out.println("Количество уникальных курсов в xlsx_courses (list): " + xlsx_courses.size()); + + System.out.println("Удаляем курсы уже учтенные в базе ..."); + // System.out.println("Количество уникальных курсов в xlsx (set): " + set.size()); + if (base_courses.size() > 0) { + System.out.println("Количество курсов в базе: " + base_courses.size()); + for (Course b : base_courses) { + for (Course x : new ArrayList<>(xlsx_courses)) { + if (Course.isSimilar(b, x)) { + // System.out.println("Курс " + b.getProtocol_number() + " от " + b.getStart_date() + " повторяется в set"); + xlsx_courses.remove(x); + } + else { + // System.out.println("Курс " + x.getProtocol_number() + " от " + x.getStart_date() + " не повторяется в базе"); + } + } + + } + System.out.println("Количество курсов для добавления в базу (xlsx_courses): " + xlsx_courses.size()); } + // Set set = Set.copyOf(xlsx_courses);// Удалили повторения + + // List courses = new ArrayList<>(set); + if (xlsx_courses.size() > 0) { + //Ограничиваем количество курсов, подлежащих передаче в wraper + System.out.println("Общее количество курсов для добавления в базу: " + xlsx_courses.size()); + if (xlsx_courses.size() > 10) { + xlsx_courses = xlsx_courses.subList(0, 10); + } - // //Получение перечня программ из базы - // System.out.println("Получение списка программ из базы ..."); - // List base_programs = client.method(HttpMethod.GET) - // .uri("http://resource-service-api:8181/program/list") - // .retrieve() - // .bodyToMono(new ParameterizedTypeReference >(){}) - // .block(); - // Set base_programSet = Set.copyOf(base_programs); - - // //Список наименований программ из базы - // System.out.println("Список уникальных наименований программ из базы:"); - // Set base_stringSet = new HashSet<>(); - // for (Program pc : base_programSet) { - // System.out.println(pc.getName()); - // base_stringSet.add(pc.getName()); - // } - - // //Удаление программ присутствующих в базе - // xlsx_stringSet.removeAll(base_stringSet); - - // if (xlsx_stringSet.size() != 0) { - // //Подготовка списка, для передачи в представление - // ArrayList list = new ArrayList<>(); - // for (String string : xlsx_stringSet) { - // Program pc = new Program(); - // pc.setName(string); - // list.add(pc); - // } - - // /** - // * Подготавлеваем обертку формы - // */ - // // передаем список новых программ - // ProgramWraper pwraper = new ProgramWraper(list); - - // //подготавливаем список критериев - // List base_cretareas = client.method(HttpMethod.GET) - // .uri("http://resource-service-api:8181/cretarea/list") - // .retrieve() - // .bodyToMono(new ParameterizedTypeReference >(){}) - // .block(); - // //передаем список критериев в обертку формы, для селекта - // pwraper.setCretareas(base_cretareas); - - // //передаем обертку в модель - // model.addAttribute("wrapPrograms", pwraper); - // model.addAttribute("id", id); - - // return "programs-check"; - // } - return "courses-check"; - // return "redirect:/document/view-as-educations/" + id; + //Создаем wraper для передачи в шаблон + CourseWraper wraper = new CourseWraper(xlsx_courses); + wraper.addPrograms(programs); + wraper.addBuildings(buildings); + wraper.addTeachers(teachers); + + //Передаем wraper в шаблон + model.addAttribute("wrapCourses", wraper); + model.addAttribute("errors", errors); + return "courses-check"; + } + return "redirect:/document/view-as-educations/" + id; } /** @@ -172,41 +192,39 @@ public class CourseController { @PostMapping( path="/save/{id}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, - produces = { - MediaType.APPLICATION_JSON_VALUE - }) - public String savePrograms(@ModelAttribute("wrapPrograms") ProgramWraper wraper, @PathVariable String id){ + produces = MediaType.APPLICATION_JSON_VALUE + ) + public String saveCourses(Model model, @ModelAttribute("wrapCourses") CourseWraper wraper, @PathVariable String id){ /** - * Отправляем запросы на добавление новых программ в базу + * Отправляем запросы на добавление новых курсов в базу */ - System.out.println("Программы для добавления в базу: " - + wraper.getPrograms().toString()); - for (Program program : wraper.getPrograms()) { - //Проверка наличия полного наименования имени программы - if (!program.getName().equals("")) { - //проверка наличия длительности программы - if (program.getLenght() != null) { - //проверка наличия направления обучения - if (!program.getStudy_direction().equals("")){ - //проверка наличия критерия - if (program.getCretarea() != null){ - client.post() - .uri("http://resource-service-api:8181/program/create") - .body(Mono.just(program), Program.class) - .retrieve() - .toBodilessEntity() - .timeout(Duration.ofSeconds(1)) - .block(); - } - } - } + List errors = new ArrayList<>(); + System.out.println("Отправляем запросы на добавление новых курсов в базу ..."); + List courses = wraper.getCourses(); + System.out.println("Количество курсов для добавления в базу: " + courses.size()); + + // TODO: добавить индексацию курсов + // TODO: получить перечень не доставленных на добавление курсов + for (Course course : courses) { + try{ + client.post() + .uri("http://resource-service-api:8181/course/create") + .body(Mono.just(course), Course.class) + .retrieve() + .toBodilessEntity() + .timeout(Duration.ofSeconds(2)) + .block(); + } catch (Exception e) { + errors.add("Не удалось добавить курс: " + course.toString() + " :: " + e.getMessage()); + System.out.println("Не удалось добавить курс: " + course.toString() + " :: " + e.getMessage()); } } + + model.addAttribute("errors", errors); /** - * Возвращаем пользователя на страницу перечня новых критериев + * Возвращаем пользователя на страницу перечня новых курсов * - если он не пустой */ - return "redirect:/programs/check/" + id; + return "redirect:/courses/check/" + id; } - -} +} \ No newline at end of file diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/CretareaController.java b/gates/src/main/java/ru/mlokoin/gates/controller/CretareaController.java index fc8d3f4..fc410f3 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/CretareaController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/CretareaController.java @@ -25,6 +25,7 @@ import ru.mlokoin.gates.model.ProgramCretarea; import ru.mlokoin.gates.model.ProgramCretareaWraper; import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxDocument; +import ru.mlokoin.gates.teh.strings.Stringer; /** * Контроллер, для работы с критериями @@ -70,10 +71,10 @@ public class CretareaController { Map> map = xlsx.getData(); for (Map.Entry> entry : map.entrySet()) { ProgramCretarea pc = new ProgramCretarea(); - pc.setName_short(entry + pc.setName_short(Stringer.clear(entry .getValue() .get(12) - .getContent()); + .getContent())); xlsx_cretareas.add(pc); } xlsx_cretareas.remove(0);//Удалили из списка заголовок "Критериий" diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/GatesController.java b/gates/src/main/java/ru/mlokoin/gates/controller/GatesController.java index dd83b6e..7a8b0b0 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/GatesController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/GatesController.java @@ -21,7 +21,7 @@ import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; import ru.mlokoin.gates.model.Document; import ru.mlokoin.gates.model.XlsxDocument; -import ru.mlokoin.gates.util.CustomMultipartFile; +import ru.mlokoin.gates.teh.fs.MpFile; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @@ -52,10 +52,10 @@ public class GatesController { .bodyToMono(new ParameterizedTypeReference >(){}) .block(); - // Add the list of documents to the model + // Добавление списка документов в модель model.addAttribute("documents", docs); - // Return the view name "documents" + // Возвращение ползователю обновленной страницы "documents" return "documents"; } @@ -109,7 +109,7 @@ public class GatesController { MultipartBodyBuilder builder = new MultipartBodyBuilder(); Boolean ok; - MultipartFile out = new CustomMultipartFile(file, doc.getId()+"." + doc.getExtension()); + MultipartFile out = new MpFile(file, doc.getId()+"." + doc.getExtension()); builder.part("file", out.getResource()); ok = client.method(HttpMethod.POST) @@ -187,10 +187,11 @@ public class GatesController { // Delete the file from the storage String filename = id + "." + doc.getExtension(); String prefix = "http://storage-rs:8282/api/document/"; - String postfix = "/delete"; + String postfix = "delete/"; URI uri; try { - uri = new URI(prefix + filename + postfix); + // uri = new URI(prefix + filename + postfix); + uri = new URI(prefix + postfix + filename); client.method(HttpMethod.DELETE) .uri(uri) .retrieve() @@ -246,7 +247,7 @@ public class GatesController { // Добавление файла в файловое хранилище MultipartBodyBuilder builder = new MultipartBodyBuilder(); Boolean ok; - MultipartFile out = new CustomMultipartFile(file, doc.getId()+"." + doc.getExtension()); + MultipartFile out = new MpFile(file, doc.getId()+"." + doc.getExtension()); builder.part("file", out.getResource()); ok = client.method(HttpMethod.POST) diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java b/gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java index fe3aea1..ee7002a 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java @@ -27,6 +27,7 @@ import ru.mlokoin.gates.model.Organization; import ru.mlokoin.gates.model.OrganizationWraper; import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxDocument; +import ru.mlokoin.gates.teh.strings.Stringer; @Controller @RequestMapping(path = "/organizations") @@ -57,10 +58,10 @@ public class OrganizationController { */ String string = ""; try { - string = entry. + string = Stringer.clear(entry. getValue(). get(1). - getContent(); + getContent()); } catch (Exception e){ System.out.println("Не указан объект строительства: " + entry.getKey() + " :: " + e.getMessage()); string = "-"; diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/ProgramController.java b/gates/src/main/java/ru/mlokoin/gates/controller/ProgramController.java index 86f60ff..6e5064f 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/ProgramController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/ProgramController.java @@ -26,6 +26,7 @@ import ru.mlokoin.gates.model.ProgramCretarea; import ru.mlokoin.gates.model.ProgramWraper; import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxDocument; +import ru.mlokoin.gates.teh.strings.Stringer; @Controller @RequestMapping(path = "/programs") @@ -55,10 +56,10 @@ public class ProgramController { Map> map = xlsx.getData(); for (Map.Entry> entry : map.entrySet()) { Program programm = new Program(); - programm.setName(entry + programm.setName(Stringer.clear(entry .getValue() .get(6) - .getContent()); + .getContent())); xlsx_programs.add(programm); } xlsx_programs.remove(0);//Удалили из списка заголовок diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java b/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java index bca6457..9665769 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java @@ -6,7 +6,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; @@ -22,8 +21,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; -import ru.mlokoin.gates.model.ProgramCretarea; -import ru.mlokoin.gates.model.ProgramCretareaWraper; import ru.mlokoin.gates.model.Teacher; import ru.mlokoin.gates.model.TeacherWraper; import ru.mlokoin.gates.model.XlsxCell; @@ -35,10 +32,20 @@ public class TeacherController { @Autowired private WebClient client; + /** + * Проверка преподавателей + * @param model + * @param id + * @return + */ @GetMapping("/check/{id}") public String checkTeachers(Model model, @PathVariable String id) { - List errors = new ArrayList<>();//список ошибок System.out.println("Проверка преподавателей, для внесения в базу ..."); + + //список ошибок + List errors = new ArrayList<>(); + + //Запрашиваем данные файла из хранилища System.out.println("Получение перечня преподавателей из xlsx-файла ..."); XlsxDocument xlsx = client.method(HttpMethod.GET) .uri("http://storage-rs:8282/api/document/content/" @@ -46,42 +53,29 @@ public class TeacherController { .retrieve() .bodyToMono(new ParameterizedTypeReference (){}) .block(); - //список преподавателей из файла - // ArrayList xlsx_teachers = new ArrayList<>();//18 столбец + + // получаем данные в виде мапы строк Map> map = xlsx.getData(); - /** - * удалили строку заголовков - */ + // удаляем строку заголовков map.remove(0); System.out.println("Количество записей: " + map.size()); - /** - * что делать с пустыми строками??? - * - "- - -" - * - Указано два преподавателя (оставляем только первого) - * - Указан формат обучения "дистанционно" (удаляем) - * - Теоретически могут быть окончания "-угли, -оглы и т.д. ..." (писать через пробел чтобы отсутствовал сохранить исходное состояние) - */ Set xlsx_strings = new HashSet<>();//строки для браузера Set xlsx_teachers = new HashSet<>();//объекты для обработки + + //перебираем мапу for (Map.Entry> entry : map.entrySet()) { - - - /** - * получаем значение поля "Преподаватель" - * заменяем пустые поля на "- - -" - * добавляем запись в список уникальных значений - */ + // получаем значение поля "Преподаватель", заменяем пустые поля на слово "Нет" + // пустые сроки не выводятся браузром, нет смысла туда передавать пустые объекты String string = ""; try { string = entry - .getValue() - .get(18) - .getContent(); + .getValue() + .get(18) + .getContent(); } catch (Exception e) { - System.out.println("Не указан преподаватель: " + entry.getKey() + " :: " + e.getMessage()); - string = "- - -"; + string = "Нет"; } /** @@ -90,58 +84,79 @@ public class TeacherController { * - разбор строк происходит в основном переборе, чтобы можно было извлечь номер строки с ошибками для пользователя */ Teacher t = new Teacher(); - String[] arr = string.split(" "); - for (int i = 0; i < arr.length; i++){ - switch (i) { - case 0: { - if (arr.length > 1){ + // проверка на пустую строку + if (string.equals("") | + (string == null) | + (string.isEmpty()) | + (string.length() == 0) | + (string.isBlank()) | + (string.equals("Нет")) | + (string.equals("Нет Нет Нет"))) { + //если строка пустая, то добавляем ошибку + errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: Преподаватель не указан"); + string = "Нет"; + t.setSecond_name("Нет");//Фамилия + t.setFirst_name("");//Имя + t.setLast_name("");//Отчество + } else { + //если строка не пустая, то разбираем ее на слова + String[] arr = string.split(" ", 4); + + for (int i = 0; i < arr.length; i++){ + switch (i) { + //проверяем первое слово (фамилия) + case 0: { + //если строка состоит из одного слова, то возможна ошибка + if (arr.length == 1){ + t.setSecond_name(arr[i]);//Фамилия + t.setFirst_name("");//Имя + t.setLast_name("");//Отчество + errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано одно слово ... " + string); + break; + } t.setSecond_name(arr[i]);//Фамилия break; } - t.setSecond_name("-");//Фамилия - t.setFirst_name("-");//Имя - t.setLast_name("-");//Отчество - errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано одно слово ... " + string); - break; - } - case 1: { - t.setFirst_name(arr[i]);//Имя - break; - } - case 2: { - t.setLast_name(arr[i]);//Отчество - break; - } - /** - * Обработка четвертого слова в строке - * Преподавателей, имеющих окончания в фамилии у нас нет. - * можно все что после 3-го слова откинуть .. - * - */ - case 3: { - // t.setLast_name(arr[(i-1)] + " " + arr[i]);//Окончание отчества - оглы, угли итд. - errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано больше трех слов ... " + string); - break; + case 1: { + //если строка состоит из двух слов, то возможна ошибка + if (arr.length == 2){ + t.setFirst_name(arr[i]);//второе слово - имя + t.setLast_name("");//третье слово - Отчество + errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано два слова ... " + string); + break; + } + t.setFirst_name(arr[i]);//Имя + break; + } + case 2: { + //если строка состоит из трех слов, то ошибка не добавляется + if (arr.length == 3){ + t.setLast_name(arr[i]);//третье слово - Отчество + break; + } + t.setLast_name(arr[i]);//Отчество + break; + } + case 3: { + //если строка содержит четыре и больше слов + t.setLast_name(t.getLast_name() + " " + arr[i]);//допишем в поле Отчество все последующие слова + errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано больше трех слов ... " + string); + // System.out.println("Отчество из xlsx-файла (4 больше слов): " + t.getLast_name()); + break; + } + default: + break; } - default: - break; } } xlsx_strings.add(string); xlsx_teachers.add(t); } - /** - * Промежуточные результаты в консоль - */ + + // Промежуточные результаты разбора данных xlsx в консоль System.out.println("Всего преподавателей(obj): " + xlsx_teachers.size()); System.out.println("Всего преподавателей(str): " + xlsx_strings.size()); - for (Teacher teacher : xlsx_teachers) { - System.out.println("Преподаватель (obj): " + teacher.toString()); - } System.out.println(">> errors: " + errors.size()); - for (String msg : errors) { - System.out.println("msg: " + msg); - } /** * Получение перечня преподавателей из базы @@ -161,25 +176,32 @@ public class TeacherController { * - перевожу ФИО в строку и сравниваю строки!!! */ // xlsx_teachers.removeAll(base_teachers); - Set xlsx_teachers_str = new HashSet<>(); + Set xlsx_teachers_str = xlsx_strings; Set base_teachers_str = new HashSet<>(); - for (Teacher t : xlsx_teachers) { - String s = t.getSecond_name() + " " - + t.getFirst_name() + " " - + t.getLast_name(); - xlsx_teachers_str.add(s); - } + // for (Teacher t : xlsx_teachers) { + // String s = t.getSecond_name() + " " + // + t.getFirst_name() + " " + // + t.getLast_name(); + // xlsx_teachers_str.add(s); + // } for (Teacher t : base_teachers) { - String s = t.getSecond_name() + " " - + t.getFirst_name() + " " - + t.getLast_name(); - base_teachers_str.add(s); + StringBuilder sb = new StringBuilder(); + + sb.append(t.getSecond_name()); + if (t.getFirst_name() != "") { + sb.append(" ") + .append(t.getFirst_name()); + } + if (t.getLast_name() != "") { + sb.append(" ") + .append(t.getLast_name()); + } + base_teachers_str.add(sb.toString()); } xlsx_teachers_str.removeAll(base_teachers_str); - /** * Если какието преподаватели отсутствуют в базе, * вернуть страницу проверки преподавателей @@ -192,7 +214,7 @@ public class TeacherController { ArrayList list = new ArrayList<>(); for (String string : xlsx_teachers_str) { Teacher t = new Teacher(); - String[] arr = string.split(" "); + String[] arr = string.split(" ", 4); for (int i = 0; i < arr.length; i++){ switch (i) { case 0: { @@ -207,12 +229,15 @@ public class TeacherController { t.setLast_name(arr[i]);//Отчество break; } + case 3: { + t.setLast_name(t.getLast_name() + " " + arr[i]);//Отчество c остальными дописками + break; + } default: break; } } list.add(t); - } //кладем список в обертку для формы @@ -249,15 +274,15 @@ public class TeacherController { for (Teacher teacher : wraper.getList()) { //Проверка наличия флага для добавления в базу //по полю табельного номера - if (teacher.getEmployee_id() != ""){ + // if (teacher.getEmployee_id() != ""){ client.post() .uri("http://resource-service-api:8181/teacher/create") .body(Mono.just(teacher), Teacher.class) .retrieve() .toBodilessEntity() - .timeout(Duration.ofSeconds(1)) + .timeout(Duration.ofSeconds(2)) .block(); - } + // } } /** * Возвращаем пользователя на страницу перечня новых критериев diff --git a/gates/src/main/java/ru/mlokoin/gates/model/Course.java b/gates/src/main/java/ru/mlokoin/gates/model/Course.java index 4f9233b..fe8cc3f 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/Course.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/Course.java @@ -1,14 +1,23 @@ package ru.mlokoin.gates.model; +import java.util.ArrayList; import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import ru.mlokoin.gates.teh.strings.Stringer; +/** + * Сущность курса + * TODO: предусмотреть метод сравнения курсов, без учета id + */ +@Data @NoArgsConstructor @AllArgsConstructor -@Data public class Course { private long id;//уникальный идентификатор курса private String place;//место проведения занятий @@ -18,7 +27,7 @@ public class Course { private String report_period;//отчетный период (наименование месяца) private Teacher teacher;//сведения о преподаватле private Program program;//сведения о программе обучения - private Building building;//сведения об объекте строительства + private Building building;//сведения об объекте строиbernate /** * Конструктор без id @@ -42,4 +51,188 @@ public class Course { this.program = program; this.building = building; } + + /** + * Консруктор курса из строки xlsx документа + * @param entry + */ + public Course (Map.Entry> entry, List base_teachers, List base_programs, List base_buildings) { + // исключаем строку заголовка + if (entry.getKey() != 0) { + try { + // Извлекаем место проведения занятий из xlsx, очищаем данные + String place = Stringer.clear(entry + .getValue() + .get(5) + .getContent()); + // очищенные данные ячейки пишем в модель + this.setPlace(place); + } catch (Exception e) { + // Не корректно место проведения занятий + System.out.println("Не корректно указано место проведения занятий: " + entry.getKey() + " :: " + e.getMessage()); + } + try{ + // Обработка даты начала обучения + // Преобразуем данные ячейки в дату, для передачи в модель + // Возможна ошибка при преобразовании, которая прервет итерацию цикла и остальные ячейки не будут обработаны + Date startDate = new Date( + Long.parseLong( entry + .getValue() + .get(7) + .getContent())); + this.setStart_date(startDate); + // System.out.println("startDate: " + startDate); + + } catch (Exception e) { + System.out.println("Не корректно указана дата начала обучения: " + entry.getKey() + " :: " + e.getMessage()); + // course.setStart_date(new Date()); + } + + try { + // Обработка даты создания протокола + // Пробразуем данные ячейки в дату, для передачи в модель + // Возможна ошибка при преобразовании, которая прервет итерацию цикла и остальные ячейки не будут обработаны + Date protocolDate = new Date( + Long.parseLong( + entry + .getValue() + .get(9) + .getContent())); + this.setProtocol_date(protocolDate); + } catch (Exception e) { + System.out.println("Не корректна дата создания протокола: " + entry.getKey() + " :: " + e.getMessage()); + } + + try { + //номер протокола + String protocolNumber = Stringer.clear(entry + .getValue() + .get(13) + .getContent()); + this.setProtocol_number(protocolNumber); + } catch (Exception e) { + System.out.println("Не корректен номер протокола: " + entry.getKey() + " :: " + e.getMessage()); + } + + try { + //отчетный период + this.setReport_period(Stringer.clear(entry + .getValue() + .get(17) + .getContent())); + } catch (Exception e) { + System.out.println("Не корректно указан отчетный период: " + entry.getKey() + " :: " + e.getMessage()); + } + + // Извлекаем ФИО преподавателя + // создаем не нового преподавателя, а передаем данные из базы + // Получаем ФИО преподавателя из xlsx + String fio = Stringer.clear(entry + .getValue() + .get(18) + .getContent()); + // Создаем нового преподавателя по данным из xlsx + Teacher cut = new Teacher(fio); + + // Ищем преподавателя в списке из базы, передаем объект в курс + try { + for (Teacher t : base_teachers) { + t.clear(); + // сравниваем преподавателя из xlsx с преподавателем из базы по ФИО + if (t.getSecond_name().equals(cut.getSecond_name()) + && t.getFirst_name().equals(cut.getFirst_name()) + && t.getLast_name().equals(cut.getLast_name())) { + this.setTeacher(t); + break; + } + } + } catch (Exception e) { + System.out.println("Не корректно указан преподаватель: " + entry.getKey() + " :: " + e.getMessage()); + } + + // Извлекаем программу обучения + String program = Stringer.clear(entry.getValue() + .get(6) + .getContent()); + try{ + for (Program p : base_programs) { + String bp = Stringer.clear(p.getName()); + if (bp.equals(program)) { + // System.out.println("Найдена программа обучения: " + program); + this.setProgram(p); + break; + } + else { + //course.setProgram(new Program(program)); + } + } + } catch (Exception e) { + System.out.println("Не корректно указана программа обучения: " + entry.getKey() + " :: " + e.getMessage()); + } + + // Извлекаем объект строительства + String building = Stringer.clear(entry + .getValue() + .get(19) + .getContent()); + try { + for (Building b : base_buildings) { + if (b.getName_short().equals(building)) { + this.setBuilding(b); + break; + } + } + } catch (Exception e) { + } + } + } + + /** + * Проверка тождественности курсов + * сравнение происходит по полям + * - place + * - start_date + * - protocol_date + * - protocol_number + * - report_period + * - teacher + * - program + * - building + * + * @param course1 + * @param course2 + * @return true - если курсы эквивалентны + * false - если курсы различаются + */ + public static boolean isSimilar(Course course1, Course course2) { + if (course1 == null || course2 == null) { + System.out.println("Course is null"); + return false; + } + // if (course1.getPlace() != course2.getPlace()) { + // return false; + // } + // if (course1.getStart_date() != course2.getStart_date()) { + // return false; + // } + // if (course1.getProtocol_date() != course2.getProtocol_date()) { + // return false; + // } + if (course1.getProtocol_number() != course2.getProtocol_number()) { + return false; + } + // if (course1.getReport_period() != course2.getReport_period()) { + // return false; + // } + // if (course1.getTeacher() != course2.getTeacher()) { + // return false; + // } + // if (course1.getProgram() != course2.getProgram()) { + // return false; + // } + // if (course1.getBuilding() != course2.getBuilding()) { + // return false; + // } + return true; + } } diff --git a/gates/src/main/java/ru/mlokoin/gates/model/CourseWraper.java b/gates/src/main/java/ru/mlokoin/gates/model/CourseWraper.java index a459a02..1b2b983 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/CourseWraper.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/CourseWraper.java @@ -7,20 +7,24 @@ import lombok.Data; @Data public class CourseWraper { - List courses; - List programs; - List buildings; - List teachers; + public List courses; + public List programs; + public List buildings; + public List teachers; public CourseWraper(){ init(); } public CourseWraper(List list) { + this.init(); this.courses = list; } public void init(){ this.courses = new ArrayList<>(); + this.programs = new ArrayList<>(); + this.buildings = new ArrayList<>(); + this.teachers = new ArrayList<>(); } public void addCourse(Course course){ @@ -31,13 +35,30 @@ public class CourseWraper { this.programs.add(program); } + public void addPrograms(List programs){ + for (Program program : programs) { + this.addProgram(program); + } + } + public void addBuilding(Building building){ this.buildings.add(building); } + public void addBuildings(List buildings){ + for (Building building : buildings) { + this.addBuilding(building); + } + } + public void addTeacher(Teacher teacher){ this.teachers.add(teacher); } + public void addTeachers(List teachers){ + for (Teacher teacher : teachers) { + this.addTeacher(teacher); + } + } public String toString(){ return this.courses.toString(); diff --git a/gates/src/main/java/ru/mlokoin/gates/model/Teacher.java b/gates/src/main/java/ru/mlokoin/gates/model/Teacher.java index ae0bf1f..7ce7efd 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/Teacher.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/Teacher.java @@ -5,6 +5,8 @@ import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import ru.mlokoin.gates.teh.strings.Naimer; +import ru.mlokoin.gates.teh.strings.Stringer; /** * Сущьность преподавателя @@ -26,59 +28,94 @@ public class Teacher implements Serializable{ private String employee_id; private String snils; - // подготовить конструкторы на все варианты внесения информации о преподавателях + /** + * Создание объекта преподаватель из строк ФИО + * - + * + * @param first_name + * @param second_name + * @param last_name + */ public Teacher(String first_name, String second_name, String last_name){ - this.first_name = first_name; - this.second_name = second_name; - this.last_name = last_name; - } - - //конструктор - все аргуметы кроме id - public Teacher(String first_name, String second_name, String last_name, String employee_id, String snils){ - this.first_name = first_name; - this.second_name = second_name; - this.last_name = last_name; - this.employee_id = employee_id; - this.snils = snils; + this.second_name = Naimer.getNameOf(second_name); + this.first_name = Naimer.getNameOf(first_name); + this.last_name = Naimer.getNameOf(last_name); } /** * Создание объекта преподаватель из строки ФИО - * - отсутствует обработка четвертого слова (оглы, угли итд ... ) - * - если только одно слово, заменяется на "- - -" - * - если пустая строка, заменяется на "- - -" - * * @param full_name */ - public Teacher(String full_name){ - String[] arr = full_name.split(" "); - for (int i = 0; i < arr.length; i++){ - switch (i) { - case 0: { - if (arr.length > 1){ - setSecond_name(arr[i]);//Фамилия - break; - } - setSecond_name("-");//Фамилия - setFirst_name("-");//Имя - setLast_name("-");//Отчество - break; - } - case 1: { - setFirst_name(arr[i]);//Имя - break; - } - case 2: { - setLast_name(arr[i]);//Отчество - break; - } - } - } + public Teacher(String fio){ + this.second_name = Naimer.getSecondNameOf(fio); + this.first_name = Naimer.getFirstNameOf(fio); + this.last_name = Naimer.getLastNameOf(fio); } + /** + * получение ФИО преподавателя одной строкой, собранной из полей класса + * + * @return String fio + */ public String getFullName(){ - return getSecond_name() + " " + - getFirst_name() + " " + - getLast_name(); + StringBuilder sb = new StringBuilder(); + + // Добавление фамилии + if (!Stringer.checkForEmpty(getSecond_name())) { + sb.append(getSecond_name() + " "); + } else { + sb.append("Нет "); + } + + // Добавление имени + if (!Stringer.checkForEmpty(getFirst_name())) { + sb.append(getFirst_name() + " "); + } else { + sb.append("Нет "); + } + + // Добавление отчестваы + if (Stringer.checkForEmpty(getLast_name())) { + sb.append(getLast_name()); + } else { + sb.append("Нет"); + } + + // Удалить лишние пробелы в результате + String fio = Stringer.clear(sb.toString()); + return fio; + } + + /** + * очистка текстовых данных хранящихся в объекте + * от излишних пробельных символов + * от NULL значений + */ + public void clear(){ + if (Stringer.checkForEmpty(second_name)) { + second_name = "Нет"; + } else { + second_name = Stringer.clear(second_name); + } + if (Stringer.checkForEmpty(first_name)) { + first_name = "Нет"; + } else { + first_name = Stringer.clear(first_name); + } + if (Stringer.checkForEmpty(last_name)) { + last_name = "Нет"; + } else { + last_name = Stringer.clear(last_name); + } + if (Stringer.checkForEmpty(snils)) { + snils = "Нет"; + } else { + snils = Stringer.clear(snils); + } + if (Stringer.checkForEmpty(employee_id)) { + employee_id = "Нет"; + } else { + employee_id = Stringer.clear(employee_id); + } } } \ No newline at end of file diff --git a/gates/src/main/java/ru/mlokoin/gates/util/CustomMultipartFile.java b/gates/src/main/java/ru/mlokoin/gates/teh/fs/MpFile.java similarity index 82% rename from gates/src/main/java/ru/mlokoin/gates/util/CustomMultipartFile.java rename to gates/src/main/java/ru/mlokoin/gates/teh/fs/MpFile.java index 358d0d0..755e7d4 100644 --- a/gates/src/main/java/ru/mlokoin/gates/util/CustomMultipartFile.java +++ b/gates/src/main/java/ru/mlokoin/gates/teh/fs/MpFile.java @@ -1,4 +1,4 @@ -package ru.mlokoin.gates.util; +package ru.mlokoin.gates.teh.fs; import java.io.File; import java.io.IOException; @@ -8,7 +8,10 @@ import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.web.multipart.MultipartFile; -public class CustomMultipartFile implements MultipartFile{ +/** + * Переопределены методы MultipartFile + */ +public class MpFile implements MultipartFile{ private MultipartFile file; private String name; @@ -16,7 +19,7 @@ public class CustomMultipartFile implements MultipartFile{ * @param file * @param name */ - public CustomMultipartFile(MultipartFile file, String name) { + public MpFile(MultipartFile file, String name) { this.file = file; this.name = name; } diff --git a/gates/src/main/java/ru/mlokoin/gates/teh/strings/Arrayer.java b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Arrayer.java new file mode 100644 index 0000000..9bae49a --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Arrayer.java @@ -0,0 +1,49 @@ +package ru.mlokoin.gates.teh.strings; + +import java.util.List; + +public class Arrayer { + + /** + * Удаляет все пустые строки из массива строк и возвращает новый массив с оставшимися строками. + * + * @param strings Массив строк из которогу удаляются пустые строки. + * @return Новый массив с оставшимися строками. + */ + public static String[] removeEmptyStrings(String[] strings) { + + // Подсчет количества непустых строк в входном массиве + int count = 0; + for (String string : strings) { + if (!string.equals("")) { + count++; + } + } + + // Новый массив для хранения непустых строк + String[] result = new String[count]; + + // Копирование непустых строк из входного массива в новый массив + int index = 0; + for (String string : strings) { + if (!string.equals("")) { + result[index] = string; + index++; + } + } + + // Возвращение нового массива с непустыми строками + return result; + } + + /** + * Удаление повторяющихся элементов списка строк + * Получение списка уникальных строк + * + */ + public static List uniqueList(List list) { + // Удаление повторяющихся элементов списка + List result = list.stream().distinct().toList(); + return result; + } +} diff --git a/gates/src/main/java/ru/mlokoin/gates/teh/strings/Dater.java b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Dater.java new file mode 100644 index 0000000..3c0c15d --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Dater.java @@ -0,0 +1,16 @@ +package ru.mlokoin.gates.teh.strings; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * Обработка строк с датами + */ +public class Dater { + private Long longDate; + private String stringDate; + private Date date; + private LocalDate localDate; + private LocalDateTime localDateTime; +} diff --git a/gates/src/main/java/ru/mlokoin/gates/teh/strings/Naimer.java b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Naimer.java new file mode 100644 index 0000000..b20638f --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Naimer.java @@ -0,0 +1,237 @@ +package ru.mlokoin.gates.teh.strings; + +import ru.mlokoin.gates.model.Teacher; + +/** + * Обработка строк, содержащих сведения о ФИО + * - Teacher + * - Student + * - Person + */ +public class Naimer { + private static String not = "Нет"; + /** + * Объединяет фамилию, имя и отчество в одну строку. + * Возможые ситуации: + * - фамилия, имя или отчество могут содержать нулевые значения + * - отчество может содержать приписки + * + * @param second_name - фамилия + * @param first_name - имя + * @param last_name - отчество + * @return объединенную строку или пустую строку, + * если все входящие параметры являются нулевыми значениями + */ + public static String getFioOf(String second_name, String first_name, String last_name) { + // Инициализируем StringBuilder для хранения результата. + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли фамилия нулевым значением. + if (!Stringer.checkForEmpty(second_name)) { + // Если фамилия не является нулевым значением, то добавляем ее в строку. + result.append(second_name); + } else { + // Если фамилия является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } + + // Проверяем, является ли имя нулевым значением. + if (!Stringer.checkForEmpty(first_name)) { + // Если имя не является нулевым значением, то добавляем пробел и имя в строку. + result.append(" " + first_name); + } else { + // Если имя является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Проверяем, является ли отчество нулевым значением. + if (!Stringer.checkForEmpty(last_name)) { + // Если отчество не является нулевым значением, то добавляем пробел и отчество в строку. + result.append(" " + last_name); + } else { + // Если отчество является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Возвращаем объединенную строку или строку "Нет Нет Нет", + //если все входящие параметры являются нулевыми значениями. + return result.toString().trim(); + } + + + /** + * Объединяет фамилию, имя и отчество из объекта преподавателя в одну строку. + * Возможные ситуации: + * - фамилия, имя или отчество могут содержать нулевые значения + * - отчество может содержать приписки + * + * @param teacher - объект преподавателя + * @return объединенная строка или строка "Нет Нет Нет", + * если все входящие параметры являются нулевыми значениями + */ + public static String getFioOf(Teacher teacher) { + // Инициализируем StringBuilder для хранения результата. + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли фамилия нулевым значением. + if (!Stringer.checkForEmpty(teacher.getSecond_name())) { + // Если фамилия не является нулевым значением, то добавляем ее в строку. + result.append(teacher.getSecond_name()); + } else { + // Если фамилия является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } + + // Проверяем, является ли имя нулевым значением. + if (!Stringer.checkForEmpty(teacher.getFirst_name())) { + // Если имя не является нулевым значением, то добавляем пробел и имя в строку. + result.append(" " + teacher.getFirst_name()); + } else { + // Если имя является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Проверяем, является ли отчество нулевым значением. + if (!Stringer.checkForEmpty(teacher.getLast_name())) { + // Если отчество не является нулевым значением, то добавляем пробел и отчество в строку. + result.append(" " + teacher.getLast_name()); + } else { + // Если отчество является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Возвращаем объединенную строку или строку "Нет Нет Нет", если все входящие параметры + // являются нулевыми значениями. + return result.toString().trim(); + } + + /** + * Извлекает фамилию из строки, содержащей полное имя (ФИО). + * Строка ФИО может содержать: + * - пустую строку (null, empty, "") + * - одно слово (фамилия, "Нет", односложный комментарий) + * - два слова (фамилия, имя, "Нет") + * - три слова (фамилия, имя, отчество, "Нет") + * - четыре слова (фамилия, имя, отчество, постфикс отчества, комментарии) + * - и более. + * + * Все слова начиная с пятого однозначно являются бесполезным наполнением, однако + * такие слова должны включены в строку отчества, если они есть. + * + * Строка может быть извлечена из xlsx файла + * или сгенерирована из данныых содержащихся в базе данных + * + * @param fio строка, содержащая ФИО + * @return строка, содержащая первое слово из fio которое является фамилией или содержит слово "Нет" + */ + public static String getSecondNameOf(String fio) { + // Инициализируем StringBuilder для хранения результата. + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(fio)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } else { + //убираем пробелы в начале и в конце строки + fio = fio.trim(); + + // Разделяем строку на пробелы и возвращаем первую часть, которая как ожидается является фамилией + result.append(fio.split(" ")[0]); + } + + // Возвращаем первое слово в строке или строку "Нет" + return result.toString().trim(); + } + + /** + * Извлекает имя (фамилия, имя или отчество) из строки, предположительно содержащей только одно слово. + * - проверяет не пустая ли строка, если нет, то добавляет "Нет" + * - очищает строку от лишних пробельных символов + * - возвращает имя или "Нет" + * + * @param name + * @return name + */ + public static String getNameOf(String name) { + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(name)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + return not; + } else { + //очищаем строку + name = Stringer.clear(name); + // возвращаем имя + return name; + } + } + + /** + * Извлекает имя из строки, содержащей полное имя (ФИО). + * + * @param fio строка, содержащая ФИО + * @return строка, содержащая второе слово из fio которое является именем или содержит слово "Нет" + */ + public static String getFirstNameOf(String fio) { + // Создаем StringBuilder для хранения результата + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(fio)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } else { + //убираем излишние пробельные символы + fio = Stringer.clear(fio); + + // Разбиваем строку по пробелам и пишем слова в массив + String[] strings = fio.split(" "); + + // Если массив содержит два или более слов, то второе слово является именем. + if (strings.length > 1) { + // Пишем второе слово в результат + result.append(strings[1].trim()); + }else { + // Если массив содержит только одно слово, то добавляем "Нет" в строку. + result.append(not); + } + } + // Возвращаем второе слово в строке или строку "Нет" + return result.toString().trim(); + } + + /** + * Извлекает отчество из строки, содержащей полное имя (ФИО). + * @param fio строка, содержащая ФИО + * @return строка, содержащая третье слово из fio которое является отчеством\ + * или содержит слово "Нет" + * или содержит все слова, содержащиеся в ФИО, за исключением первых двух + */ + public static String getLastNameOf(String fio) { + // Создаем StringBuilder для хранения результата + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(fio)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } else { + //убираем пробелы в начале и в конце строки + fio = fio.trim(); + fio = Stringer.clear(fio); + + String[] strings = fio.split(" "); + if (strings.length > 2) { + // Пишем третье и последующие слова в результат + for (int i = 2; i < strings.length; i++) { + result.append(strings[i]).append(" "); + } + } else { + // Если массив содержит только два или менее слов, то добавляем "Нет" в строку. + result.append(not); + } + } + // Возвращаем строку ФИО без первых двух слов с удаленными лишними пробелами + return result.toString().trim(); + } +} diff --git a/gates/src/main/java/ru/mlokoin/gates/teh/strings/Stringer.java b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Stringer.java new file mode 100644 index 0000000..602e70e --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/teh/strings/Stringer.java @@ -0,0 +1,54 @@ +package ru.mlokoin.gates.teh.strings; + +/** + * Класс для работы со строками + */ +public class Stringer { + + /** + * Проверяет, является ли переданная строка null, пустой строкой или состоит только из пробелов. + * + * @param str Строка для проверки + * @return True если строка является null, пустой строкой или состоит только из пробелов + * False в противном случае + */ + public static Boolean checkForEmpty(String str) { + // Check if the string is null + if (str == null) { + return true; + } + // Check if the string is empty or consists only of whitespace characters + if (str.isEmpty() || str.trim().isEmpty()) { + return true; + } + // The string is not null, not empty and does not consist only of whitespace characters + return false; + } + + /** + * Удаляет регулярным выражением лишние пробельные символы из строки. + * + * Заменяет знаки переноса строки на пробелы с помощью использования регулярного выражения + * \s+ - пробелы (и все ниже приведенные пробельные символы) + * \t - табуляция + * \v - вертикальная табуляция + * \r - перенос в начало строки + * \n - перенос строки + * \f - форматированный перенос строки + * + * Осавляет по одному пробелу между словами, если слов больше одного + * Возвращает пустую строку, если получена строка null + * + * @param string строка для обработки + * @return строку без лишних пробелов или пустую строку + */ + public static String clear(String string) { + // Проверяем, не является ли строка null. Если строка null, возвращаем пустую строку. + if (string == null) { + return ""; + } + + // Удаляем лишние пробелы из строки. + return string.replaceAll("\\s+", " ").trim(); + } +} diff --git a/gates/src/main/resources/application.yaml b/gates/src/main/resources/application.yaml index 6ca9081..8bf3036 100644 --- a/gates/src/main/resources/application.yaml +++ b/gates/src/main/resources/application.yaml @@ -23,5 +23,11 @@ spring: time: HH:mm:ss server: port: 8383 + max-http-request-header-size: 50MB + tomcat: + max-swallow-size: 50MB + max-http-form-post-size: 50MB + maxParameterCount: 10000 + diff --git a/gates/src/main/resources/templates/courses-check.html b/gates/src/main/resources/templates/courses-check.html index 7e45062..8807377 100644 --- a/gates/src/main/resources/templates/courses-check.html +++ b/gates/src/main/resources/templates/courses-check.html @@ -13,13 +13,32 @@

check-courses

    -
  • +
  • Запуск контейнера скриптом ps1
- +
\ No newline at end of file diff --git a/gates/src/main/resources/templates/teachers-check.html b/gates/src/main/resources/templates/teachers-check.html index b52d09d..5e4a2e0 100644 --- a/gates/src/main/resources/templates/teachers-check.html +++ b/gates/src/main/resources/templates/teachers-check.html @@ -13,7 +13,6 @@

check-teachers

    -
  • Преподаватели добавляются в базу если указан табельный номер.
  • @@ -21,13 +20,32 @@
+
+

Возможные ошибки при заполнении поля "Преподаватель":

+
    +
  1. Не указан преподаватель (пустя ячейка)
  2. +
  3. В поле "Преподаватель" указано одно слово (Дистанционно или только фамилия)
  4. +
  5. В поле "Преподаватель" указано два слова (Фамилия и имя или что-то иное)
  6. +
  7. В поле "Преподаватель" указано четыре слова (Фамилия, имя, отчество, окончание отчества)
  8. +
  9. В поле "Преподаватель" указано пять и более слов (В ячейке размещены какие-то комментарии)
  10. +
+

База допускает все варианты заполнения, но пользователь должен проверить их вручную в исходном xlsx

+

Исправлять все ошибки в исходном xlsx прежде, чем добавлять записи в базу

+ +

Стоит обратить внимание (errors): + +

+
    +
  • +
+
+ th:method="post" + th:object="${wrapTeachers}"> - + @@ -35,33 +53,25 @@
Имя (first_name) Фамилия (second_name)Имя (first_name) Отчество (last_name) Табельный номер (employee_id) СНИЛС (snils)
- + - + - + - + - +
-
-

errors (потенциальные ошибки в исходном документе): - -

-
    -
  • -
-
\ No newline at end of file diff --git a/gates/src/main/resources/templates/view-as-educations.html b/gates/src/main/resources/templates/view-as-educations.html index 3bce84b..8d95802 100644 --- a/gates/src/main/resources/templates/view-as-educations.html +++ b/gates/src/main/resources/templates/view-as-educations.html @@ -11,44 +11,55 @@ xmlns:th="http://www.thymeleaf.org">

view-as-educations (предусмотреть):

-
    +
    1. Добавиь на страницу обработки ошибок и результатов отработки проверок
    2. -
    3. Удалить перед загрузкой xlsx-файла все знаки переноса строки (при отправке в базу автоматически меняются на пробелы)
    4. +
    5. Перед загрузкой xlsx-файла удалить все знаки переноса строки (при отправке в базу автоматически меняются на пробелы)
    6. +
    7. Перед загрузкой xlsx-файла все формулы сохранить как значения
    8. Предусмотреть автоматический погон проверок
    9. Разделить контроллеры по характеру взаимодействия с базой
    10. +
    11. Добавить столбцы: +
        +
      • вид выдаваемого документа
      • +
      • вид программы обучения
      • +
      • номер по реестру ФРДО ДПО
      • +
      • номер ФРДО ПО
      • +
      • номер ЕИСОТ
      • +
      • +
      • try
      • +
      +
    12. Предусмотреть возможность импорта данных из выгрузки в портала ФРДО
    13. -
    14. -
    15. -
-

- -

CONTROLS:

-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
+ +
+
+

CONTROLS:

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
diff --git a/gates/src/test/java/ru/mlokoin/gates/teh/strings/NaimerTest.java b/gates/src/test/java/ru/mlokoin/gates/teh/strings/NaimerTest.java new file mode 100644 index 0000000..984c7e6 --- /dev/null +++ b/gates/src/test/java/ru/mlokoin/gates/teh/strings/NaimerTest.java @@ -0,0 +1,434 @@ +package ru.mlokoin.gates.teh.strings; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class NaimerTest { + + /** + * Тест метода getFioOf() + */ + + /** + * Тест метода getFioOf() для пустых строк + */ + @Test + public void testGetFioOf_EmptyStrings() { + // Проеряем, что метод getFioOf вернет "Нет Нет Нет" строку, когда входные параметры являются пустыми строками. + assertEquals("Нет Нет Нет", + Naimer.getFioOf("", "", ""), + "Метод merge возвращает неожиданное значение для пустых входных параметров"); + } + + /** + * Тест метода getFioOf() для null + */ + @Test + public void testGetFioOf_Null() { + // Проеряем, что метод getFioOf вернет "Нет Нет Нет" строку, когда входные параметры являются null. + assertEquals("Нет Нет Нет", + Naimer.getFioOf(null, null, null), + "Метод merge возвращает неожиданное значение для null входных параметров"); + } + + /** + * Тест метода getFioOf() когда предоставлена только фамилии + */ + @Test + public void testGetFioOf_OnlySecondName() { + // Проверяем, что метод getFioOf вернет строку с фамилией и без пробелов, если остальные входные параметры являются пустыми строками. + assertEquals("Иванов Нет Нет", + Naimer.getFioOf("Иванов", "", ""), + "Метод merge возвращает неожиданное значение для входных параметров только с фамилией"); + } + + /** + * Тест метода getFioOf() когда предоставлено только имя + */ + @Test + public void testGetFioOf_OnlyFirstName() { + // Проверяем, что метод getFioOf вернет строку с именем и без пробелов, если остальные входные параметры являются пустыми строками. + assertEquals("Нет Иван Нет", + Naimer.getFioOf("", "Иван", ""), + "Метод merge возвращает неожиданное значение для входных параметров только с именем"); + } + + /** + * Тест метода getFioOf(), когда предоставлено только отчество + */ + @Test + public void testGetFioOf_OnlyLastName() { + // Проверяем, что метод getFioOf вернет строку с отчеством и без пробелов, если остальные входные параметры являются пустыми строками. + assertEquals("Нет Нет Иванович", + Naimer.getFioOf("", "", "Иванович"), + "Метод merge возвращает неожиданное значение для входных параметров только с отчеством"); + } + + /** + * Тест метода getFioOf() для всех входных параметров + */ + @Test + public void testGetFioOf_AllNames() { + // Проеряем, что метод getFioOf вернет "Иванов Иван Иванович" строку, когда входные параметры являются непустыми строками. + assertEquals("Иванов Иван Иванович", + Naimer.getFioOf("Иванов", "Иван", "Иванович"), + "Метод merge возвращает неожиданное значение для входных параметров с фамилией, именем и отчеством"); + } + + /** + * Тест метода getSecondNameOf() + */ + + /** + * Тест метода getSecondNameOf() для пустых строк + * "" + */ + @Test + public void testGetSecondNameOf_EmptyStrings() { + // Проеряем, что метод getSecondNameOf вернет "Нет" строку, когда входные параметры являются пустыми строками. + assertEquals("Нет", + Naimer.getSecondNameOf(""), + "Метод getSecondNameOf возвращает неожиданное значение для пустых входных параметров"); + } + + /** + * Тест метода getSecondNameOf() для null + * null + */ + @Test + public void testGetSecondNameOf_Null() { + // Проеряем, что метод getSecondNameOf вернет "Нет" строку, когда входные параметры являются null. + assertEquals("Нет", + Naimer.getSecondNameOf(null), + "Метод getSecondNameOf возвращает неожиданное значение для null входных параметров"); + } + + /** + * Тест метода getSecondNameOf() ФИО, содержащего одно слово + * "Иванов" + */ + @Test + public void testGetSecondNameOf_OneWord() { + // Проеряем, что метод getSecondNameOf вернет слово, когда входные параметры содержат одно слово. + assertEquals("Иванов", + Naimer.getSecondNameOf("Иванов"), + "Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих одно слово"); + } + + /** + * Тест метода getSecondNameOf() ФИО, содержащего два слова + * "Иванов Иван" + */ + @Test + public void testGetSecondNameOf_TwoWords() { + // Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат два слова. + assertEquals("Иванов", + Naimer.getSecondNameOf("Иванов Иван"), + "Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих два слова"); + } + + /** + * Тест метода getSecondNameOf() ФИО, содержащего два слова и пробелы перед первым словом и после второго + * " Иванов Иван " + */ + @Test + public void testGetSecondNameOf_TwoWordsWithSpaces() { + // Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат два слова. + assertEquals("Иванов", + Naimer.getSecondNameOf(" Иванов Иван "), + "Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих два слова и излишние пробелы"); + } + + /** + * Тест метода getSecondNameOf() ФИО, содержащего три слова, без лишних пробелов + * "Иванов Иван Иванович" + */ + @Test + public void testGetSecondNameOf_ThreeWords() { + // Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат три слова. + assertEquals("Иванов", + Naimer.getSecondNameOf("Иванов Иван Иванович"), + "Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих три слова"); + } + + /** + * Тест метода getSecondNameOf() ФИО, содержащего три слова и лишние пробелы + * " Иванов Иван Иванович " + */ + @Test + public void testGetSecondNameOf_ThreeWordsWithSpaces() { + // Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат три слова. + assertEquals("Иванов", + Naimer.getSecondNameOf(" Иванов Иван Иванович "), + "Метод merge возвращает неожиданное значение для входных параметров содержащих три слова и излишние пробелы"); + } + + /** + * Тест метода getSecondNameOf() ФИО, содержащего четыре слова + * "Иванов Иван Иванович заочно" + */ + @Test + public void testGetSecondNameOf_FourWords() { + // Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат четыре слова. + assertEquals("Иванов", + Naimer.getSecondNameOf("Иванов Иван Иванович заочно"), + "Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих четыре слова"); + } + + /** + * Тест метода getSecondNameOf() ФИО, содержащего четыре слова и лишние пробелы + * " Иванов Иван Иванович заочно " + */ + @Test + public void testGetSecondNameOf_FourWordsWithSpaces() { + // Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат четыре слова. + assertEquals("Иванов", + Naimer.getSecondNameOf(" Иванов Иван Иванович заочно "), + "Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих четыре слова и излишние пробелы"); + } + + /** + * Тест метода getFirstNameOf() + */ + + /** + * Тест метода getFirstNameOf() ФИО, содержащего + * null + */ + @Test + public void testGetFirstNameOf_Null() { + // Проеряем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры являются null. + assertEquals("Нет", + Naimer.getFirstNameOf(null), + "Метод getFirstNameOf возвращает неожиданное значение для null входных параметров"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего пустую строку + * "" + */ + @Test + public void testGetFirstNameOf_Empty() { + // Проеряем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры являются пустой строкой. + assertEquals("Нет", + Naimer.getFirstNameOf(""), + "Метод getFirstNameOf возвращает неожиданное значение для пустой строки входных параметров"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего одно слово + * "Иванов" + */ + @Test + public void testGetFirstNameOf_OneWord() { + // Проеряем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры содержат одно слово. + assertEquals("Нет", + Naimer.getFirstNameOf("Иванов"), + "Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих одно слово"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего одно слово и лишние пробелы + * " Иванов " + */ + @Test + public void testGetFirstNameOf_OneWordWithSpaces() { + // Проверяем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры содержат одно слово с лишними пробелами. + assertEquals("Нет", + Naimer.getFirstNameOf(" Иванов "), + "Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих одно слово и излишние пробелы"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего два слова + * "Иванов Иван" + */ + @Test + public void testGetFirstNameOf_TwoWords() { + // Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат два слова. + assertEquals("Иван", + Naimer.getFirstNameOf("Иванов Иван"), + "Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих два слова"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего два слова и лишние пробелы + * " Иванов Иван " + */ + @Test + public void testGetFirstNameOf_TwoWordsWithSpaces() { + // Задаем ожидаемой значение + String expected = "Иван"; + // Задаем входные параметры + String fio = " Иванов Иван "; + + // Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат два слова и лишние пробелы. + assertEquals(expected, + Naimer.getFirstNameOf(fio), + "Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих два слова и излишние пробелы"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего три слова + * "Иванов Иван Иванович" + */ + @Test + public void testGetFirstNameOf_ThreeWords() { + // Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат три слова. + assertEquals("Иван", + Naimer.getFirstNameOf("Иванов Иван Иванович"), + "Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих три слова"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего три слова и лишние пробелы + * " Иванов Иван Иванович " + */ + @Test + public void testGetFirstNameOf_ThreeWordsWithSpaces() { + // Задаем ожидаемое значение + String expected = "Иван"; + // Задаем входные параметры + String fio = " Иванов Иван Иванович "; + + // Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат три слова. + assertEquals(expected, + Naimer.getFirstNameOf(fio), + "Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих три слова и излишние пробелы"); + } + + /** + * Тест метода getFirstNameOf() ФИО, содержащего четыре слова и лишние пробелы + * " Иванов Иван Иванович очнов " + */ + @Test + public void testGetFirstNameOf_FourWordsWithSpaces() { + // Задаем ожидаемое значение + String expected = "Иван"; + // Задаем входные параметры + String fio = " Иванов Иван Иванович очнов "; + + // Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат четыре слова и лишние пробелы. + assertEquals(expected, + Naimer.getFirstNameOf(fio), + "Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих четыре слова и излишние пробелы"); + } + + /** + * Тесты метода getLastNameOf() + */ + + /** + * Тест метода getLastNameOf() ФИО, содержащего null + */ + @Test + public void testGetLastNameOf_Null() { + // Проеряем, что метод getLastNameOf вернет "Нет" для null + assertEquals("Нет", + Naimer.getLastNameOf(null), + "Метод getLastNameOf возвращает неожиданное значение для null"); + } + + /** + * Тест метода getLastNameOf() ФИО, содержащего пустую строку + */ + @Test + public void testGetLastNameOf_Empty() { + // Задаем входные параметры + String fio = ""; + // Задаем ожидаемое значение + String expected = "Нет"; + + // Проеряем, что метод getLastNameOf вернет "Нет" для пустой строки + assertEquals(expected, + Naimer.getLastNameOf(fio), + "Метод getLastNameOf возвращает неожиданное значение для пустой строки"); + } + + /** + * Тест метода getLastNameOf() ФИО, содержащего только пробелы + */ + @Test + public void testGetLastNameOf_Spaces() { + // Задаем ожидаемое значение + String expected = "Нет"; + // Задаем входные параметры + String fio = " "; + + // Проеряем, что метод getLastNameOf вернет "Нет" для строки заполненной только пробелами + assertEquals(expected, + Naimer.getLastNameOf(fio), + "Метод getLastNameOf возвращает неожиданное значение для строки заполненной только пробелами"); + } + + /** + * Тест метода getLastNameOf() ФИО, содержащего одно слово + */ + @Test + public void testGetLastNameOf_OneWord() { + // Задаем ожидаемое значение + String expected = "Нет"; + // Задаем входные параметры + String fio = "Иванов"; + + // Проеряем, что метод getLastNameOf вернет "Нет" для одного слова + assertEquals(expected, + Naimer.getLastNameOf(fio), + "Метод getLastNameOf возвращает неожиданное значение для одного слова"); + } + + /** + * Тест метода getLastNameOf() ФИО, содержащего два слова + */ + @Test + public void testGetLastNameOf_TwoWords() { + // Задаем ожидаемое значение + String expected = "Нет"; + // Задаем входные параметры + String fio = "Иванов Иван"; + + // Проеряем, что метод getLastNameOf вернет "Нет" для двух слов + assertEquals(expected, + Naimer.getLastNameOf(fio), + "Метод getLastNameOf возвращает неожиданное значение для двух слов"); + } + + /** + * Тест метода getLastNameOf() ФИО, содержащего три слова с излишними пробелами + * + */ + @Test + public void testGetLastNameOf_ThreeWordsWithSpaces() { + // Задаем ожидаемое значение + String expected = "Иванович"; + // Задаем входные параметры + String fio = " Иванов Иван Иванович "; + + // Проверяем, что метод getLastNameOf вернет "Иванович" для трех слов с излишними пробелами + assertEquals(expected, + Naimer.getLastNameOf(fio), + "Метод getLastNameOf возвращает неожиданное значение для трех слов с излишними пробелами"); + } + + /** + * Тест метода getLastNameOf() ФИО, содержащего четыре слова и излишние пробелы + */ + @Test + public void testGetLastNameOf_FourWordsWithSpaces() { + // Задаем ожидаемое значение + String expected = "Иванович очно"; + // Задаем входные параметры + String fio = " Иванов Иван Иванович очно "; + + // Проверяем, что метод getLastNameOf вернет "Иванович" для четырех слов с излишними пробелами + assertEquals(expected, + Naimer.getLastNameOf(fio), + "Метод getLastNameOf возвращает неожиданное значение для четырех слов с излишними пробелами"); + } + + + + + + +} \ No newline at end of file diff --git a/gates/src/test/java/ru/mlokoin/gates/teh/strings/StringerCheckForEmptyTest.java b/gates/src/test/java/ru/mlokoin/gates/teh/strings/StringerCheckForEmptyTest.java new file mode 100644 index 0000000..09d43fe --- /dev/null +++ b/gates/src/test/java/ru/mlokoin/gates/teh/strings/StringerCheckForEmptyTest.java @@ -0,0 +1,61 @@ +package ru.mlokoin.gates.teh.strings; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; + +/** + * Класс для тестирования метода checkForEmpty(String) + */ +public class StringerCheckForEmptyTest { + /** + * Проверяем поведение метода checkForEmpty(String) когда на вход метода передана строка null. + * + * @see Stringer#checkForEmpty(String) + */ + @Test + public void testCheckForEmpty_NullString() { + // Ожидаем, что метод вернет true, когда входная строка является null + assertTrue(Stringer.checkForEmpty(null), + "Метод checkForEmpty возвращает неожиданное значение для null строки"); + } + + + /** + * Проверяем поведение метода checkForEmpty(String) для пустой строки. + * + * @see Stringer#checkForEmpty(String) + */ + @Test + public void testCheckForEmpty_EmptyString() { + // Проверяем, что метод вернет true, когда входная строка является пустой + assertTrue(Stringer.checkForEmpty(""), + "Метод checkForEmpty возвращает неожиданное значение для пустой строки"); + } + + /** + * Проверяем поведение метода checkForEmpty(String) для строки, состоящей только из пробелов. + * + * @see Stringer#checkForEmpty(String) + */ + @Test + public void testCheckForEmpty_WhitespaceString() { + // Проверяем, что метод вернет true, когда входная строка состоит только из пробелов + // и не содержит других символов + assertTrue(Stringer.checkForEmpty(" "), + "Метод checkForEmpty возвращает неожиданное значение для строки с пробелами"); + } + + /** + * Проверяем поведение метода checkForEmpty(String) для непустой строки. + * + * @see Stringer#checkForEmpty(String) + */ + @Test + public void testCheckForEmpty_NonEmptyString() { + // Проверяем, что метод вернет false, когда входная строка не является пустой, + // содержит другие символы кроме пробелов и не является null + assertFalse(Stringer.checkForEmpty("hello world"), + "Метод checkForEmpty возвращает неожиданное значение для непустой строки"); + } +} \ No newline at end of file diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/entities/Teacher.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/entities/Teacher.java index b5360dd..25fc467 100644 --- a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/entities/Teacher.java +++ b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/entities/Teacher.java @@ -26,17 +26,16 @@ public class Teacher{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id; - @Column(length=50) - private String first_name;//Имя private String second_name;//Фамилия + private String first_name;//Имя private String last_name;//Отчество private String employee_id; private String snils; // подготовить конструкторы на все варианты внесения информации о преподавателях - public Teacher(String first_name, String second_name, String last_name){ - this.first_name = first_name; + public Teacher(String second_name, String first_name, String last_name){ this.second_name = second_name; + this.first_name = first_name; this.last_name = last_name; } }