diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/BuildingController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/BuildingController.java index 6f601f5..ae4ebaa 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/BuildingController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/BuildingController.java @@ -112,7 +112,7 @@ public class BuildingController { model.addAttribute("id", id); return "buildings-check"; } - return "redirect:/document/view-as-educations/" + id; + return "redirect:/document/educations/view/" + id; } @PostMapping( diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java index 04e6121..df4c638 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java @@ -172,7 +172,7 @@ public class CourseController { model.addAttribute("errors", errors); return "courses-check"; } - return "redirect:/document/view-as-educations/" + id; + return "redirect:/document/educations/view/" + id; } /** diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java index 296b762..61f3339 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java @@ -126,7 +126,7 @@ public class CretareaController { return "cretareas-check"; } - return "redirect:/document/view-as-educations/" + id; + return "redirect:/document/educations/view/" + id; } /** diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java index 61978d1..8d951c1 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java @@ -1,22 +1,29 @@ package ru.mlokoin.gates.controller.v1; +import java.time.Duration; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; 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.building.Building; import ru.mlokoin.gates.model.course.Course; +import ru.mlokoin.gates.model.course.CourseWraper; import ru.mlokoin.gates.model.education.EducationEntryWraper; import ru.mlokoin.gates.model.education.EducatonEntry; import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument; import ru.mlokoin.gates.model.fs.xlsx.XlsxDocumentReestr; +import ru.mlokoin.gates.model.monitoring.EducationsReview; import ru.mlokoin.gates.model.organization.Organization; import ru.mlokoin.gates.model.program.Program; import ru.mlokoin.gates.model.student.Student; @@ -24,7 +31,7 @@ import ru.mlokoin.gates.model.teacher.Teacher; import ru.mlokoin.gates.repository.Storage; @Controller -@RequestMapping(path = "/") +@RequestMapping(path = "/document/educations") public class EducationsController { @Autowired private WebClient client; @@ -42,7 +49,7 @@ public class EducationsController { * @param xlsxEducations TODO * @return */ - @GetMapping("/document/view-as-educations/{id}") + @GetMapping("/view/{id}") public String viewAsEducations(Model model, @PathVariable String id) { // создание списка ошибок @@ -151,8 +158,35 @@ public class EducationsController { } //фильтрация записей уже присутствующих в базе - List filtered = new ArrayList<>(xlsx_educations); + List filtered = new ArrayList<>(); + for (EducatonEntry xlsx_entry : xlsx_educations) { + if (xlsx_entry != null) { + if (xlsx_entry.getStudent() != null + || xlsx_entry.getCourse() != null) { + if (!filtered.contains(xlsx_entry)) { + boolean exists = false; + for (EducatonEntry base_entry : base_educations) { + if (base_entry.getSertificate_number().equals(xlsx_entry.getSertificate_number()) + && base_entry.getCourse().getProtocol_number().equals(xlsx_entry.getCourse().getProtocol_number()) + && base_entry.getCourse().getPlace().equals(xlsx_entry.getCourse().getPlace()) + && base_entry.getCourse().getStart_date().equals(xlsx_entry.getCourse().getStart_date()) + && base_entry.getCourse().getTeacher().getFullName().equals(xlsx_entry.getCourse().getTeacher().getFullName()) + && base_entry.getCourse().getBuilding().getName_short().equals(xlsx_entry.getCourse().getBuilding().getName_short()) + && base_entry.getCourse().getProgram().getName().equals(xlsx_entry.getCourse().getProgram().getName())) { + + exists = true; + break; + } + } + if (!exists) { + filtered.add(xlsx_entry); + } + } + } + } + } + //ограничение количества выводимых пользователю записей if (filtered.size() > 0) { if (filtered.size() > 200) { filtered = filtered.subList(0, 200); @@ -163,6 +197,7 @@ public class EducationsController { wraper.setStudents(base_students); //передача данных в модель + model.addAttribute("review", new EducationsReview()); model.addAttribute("wrapEducations", wraper); model.addAttribute("errors", errors); model.addAttribute("filename", xlsxEducations.getDocument().getName()); @@ -171,4 +206,31 @@ public class EducationsController { // model.addAttribute("headers", xlsx.getHeaders()); return "view-as-educations"; } + + @PostMapping( + path="/save/{id}", + consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public String saveEducations(Model model, @ModelAttribute("wrapEducations") EducationEntryWraper wraper, @PathVariable String id) { + List educations = wraper.getEducations(); + if (educations.size() > 0) { + for (EducatonEntry education : educations) { + try { + client.post() + .uri("http://resource-service-api:8181/education/create") + .body(Mono.just(education), EducatonEntry.class) + .retrieve() + .toBodilessEntity() + .timeout(Duration.ofSeconds(2)) + .block(); + } catch (Exception e) { + System.out.println("Не удалось добавить запись об обучении в базу: " + e.getMessage()); + } + } + } + return "redirect:/document/educations/view/" + id; + } + + } diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java index 849dde3..a39b17a 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java @@ -125,7 +125,7 @@ public class OrganizationController { model.addAttribute("id", id); return "organization-check"; } - return "redirect:/document/view-as-educations/" + id; + return "redirect:/document/educations/view/" + id; } @PostMapping( diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java index 4df54bc..39035e2 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java @@ -8,8 +8,6 @@ import java.util.Map; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -114,7 +112,7 @@ public class ProgramController { return "programs-check"; } - return "redirect:/document/view-as-educations/" + id; + return "redirect:/document/educations/view/" + id; } /** diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/StudentController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/StudentController.java index 576fba4..c5754bb 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/StudentController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/StudentController.java @@ -110,7 +110,7 @@ public class StudentController { model.addAttribute("errors", errors); return "students-check"; } - return "redirect:/document/view-as-educations/" + id; + return "redirect:/document/educations/view/" + id; } /** diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/TeacherController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/TeacherController.java index 412b7d3..6a11efb 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/TeacherController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/TeacherController.java @@ -67,7 +67,7 @@ public class TeacherController { return "teachers-check"; } - return "redirect:/document/view-as-educations/" + id; + return "redirect:/document/educations/view/" + id; } /** diff --git a/gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java b/gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java index 7179b62..d161576 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java @@ -68,13 +68,50 @@ public class EducatonEntry { /** * Извлекаем данные из ячеек */ - this.course = new Course(entry, base_teachers, base_programs, base_buildings); - this.student = new Student(entry, base_organizations); - this.ones = cells.get(16).getContent(); + Course xlsx_course = new Course(entry, base_teachers, base_programs, base_buildings); + if (xlsx_course.getProtocol_number() != null + && !xlsx_course.getProtocol_number().isEmpty() + && xlsx_course.getProtocol_number() != "") { + for (Course base_course : base_courses) { + if (base_course.getProtocol_number().equals(xlsx_course.getProtocol_number())) { + this.course = base_course; + break; + } + } - this.sertificate_number = cells.get(14).getContent(); + } + /** + * номер протокола пустой, сравниваем курсы по остальным полям + * - + */ + else{ + for (Course base_course : base_courses) { + if (base_course.getPlace().equals(xlsx_course.getPlace()) + && base_course.getStart_date().equals(xlsx_course.getStart_date()) + && base_course.getTeacher().getFullName().equals(xlsx_course.getTeacher().getFullName()) + && base_course.getBuilding().getName_short().equals(xlsx_course.getBuilding().getName_short()) + && base_course.getProgram().getName().equals(xlsx_course.getProgram().getName())) { + this.course = base_course; + break; + } + } + } - + Student xlsx_student = new Student(entry, base_organizations); + for (Student base_student : base_students) { + if (base_student.getFirst_name().equals(xlsx_student.getFirst_name()) + && base_student.getSecond_name().equals(xlsx_student.getSecond_name()) + && base_student.getLast_name().equals(xlsx_student.getLast_name()) + && base_student.getProfession().equals(xlsx_student.getProfession()) + && base_student.getDirection().equals(xlsx_student.getDirection()) + && base_student.getOrganization().getName_full().equals(xlsx_student.getOrganization().getName_full())) { + this.student = base_student; + break; + } + } + + this.ones = cells.get(16).getContent(); + this.sertificate_number = cells.get(14).getContent(); } } } \ No newline at end of file diff --git a/gates/src/main/java/ru/mlokoin/gates/model/monitoring/EducationsReview.java b/gates/src/main/java/ru/mlokoin/gates/model/monitoring/EducationsReview.java new file mode 100644 index 0000000..7386dcf --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/model/monitoring/EducationsReview.java @@ -0,0 +1,39 @@ +package ru.mlokoin.gates.model.monitoring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import ru.mlokoin.gates.repository.Storage; + +/** + * Класс, предоставляющй обзор содержимого + * - реестра обученных в xlsx-файле + * - реестра обученных в базе данных + * - и сравнение этих данных + */ +@Service +public class EducationsReview { + @Autowired + private WebClient client; + + @Autowired + private Storage storage; + + public int getBaseEducationsCount(){ + return storage.getBaseEducationEntries().size(); + } + + public int getFileEducationsCount(String id){ + //вернули размер документа минус строка заголовков + return storage.getXlsxDocument(id).getData().size() - 1; + } + + + + + + + + +} diff --git a/gates/src/main/resources/templates/view-as-educations.html b/gates/src/main/resources/templates/view-as-educations.html index 3741945..2af48ea 100644 --- a/gates/src/main/resources/templates/view-as-educations.html +++ b/gates/src/main/resources/templates/view-as-educations.html @@ -19,30 +19,25 @@ xmlns:th="http://www.thymeleaf.org">
-

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

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

Общие сведения по документу:

+
    +
  • Наименование файла: + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+

CONTROLS:

@@ -75,7 +70,7 @@ xmlns:th="http://www.thymeleaf.org">

EDUCATIONS:

- + @@ -101,7 +96,7 @@ xmlns:th="http://www.thymeleaf.org">
- + @@ -132,6 +127,28 @@ xmlns:th="http://www.thymeleaf.org">
--> +
+

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

+
    +
  1. Добавиь на страницу обработки ошибок и результатов отработки проверок
  2. +
  3. Перед загрузкой xlsx-файла удалить все знаки переноса строки (при отправке в базу автоматически меняются на пробелы)
  4. +
  5. Перед загрузкой xlsx-файла все формулы сохранить как значения
  6. +
  7. Предусмотреть автоматический погон проверок
  8. +
  9. Разделить контроллеры по характеру взаимодействия с базой
  10. +
  11. Добавить столбцы: +
      +
    • вид выдаваемого документа
    • +
    • вид программы обучения
    • +
    • номер по реестру ФРДО ДПО
    • +
    • номер ФРДО ПО
    • +
    • номер ЕИСОТ
    • +
    • +
    • try
    • +
    +
  12. Предусмотреть возможность импорта данных из выгрузки в портала ФРДО
  13. +
  14. +
+
\ No newline at end of file diff --git a/gates/src/main/resources/templates/view-xlsx.html b/gates/src/main/resources/templates/view-xlsx.html index a1f4bd6..85fae4d 100644 --- a/gates/src/main/resources/templates/view-xlsx.html +++ b/gates/src/main/resources/templates/view-xlsx.html @@ -18,7 +18,7 @@ xmlns:th="http://www.thymeleaf.org">

ЭКСПОРТИРОВАТЬ ФАЙЛ КАК:

  • - +