esoe 3 months ago
parent
commit
3cd0e45604
  1. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/BuildingController.java
  2. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java
  3. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java
  4. 68
      gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java
  5. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java
  6. 4
      gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java
  7. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/StudentController.java
  8. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/TeacherController.java
  9. 45
      gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java
  10. 39
      gates/src/main/java/ru/mlokoin/gates/model/monitoring/EducationsReview.java
  11. 63
      gates/src/main/resources/templates/view-as-educations.html
  12. 2
      gates/src/main/resources/templates/view-xlsx.html

2
gates/src/main/java/ru/mlokoin/gates/controller/v1/BuildingController.java

@ -112,7 +112,7 @@ public class BuildingController { @@ -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(

2
gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java

@ -172,7 +172,7 @@ public class CourseController { @@ -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;
}
/**

2
gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java

@ -126,7 +126,7 @@ public class CretareaController { @@ -126,7 +126,7 @@ public class CretareaController {
return "cretareas-check";
}
return "redirect:/document/view-as-educations/" + id;
return "redirect:/document/educations/view/" + id;
}
/**

68
gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java

@ -1,22 +1,29 @@ @@ -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; @@ -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 { @@ -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 { @@ -151,8 +158,35 @@ public class EducationsController {
}
//фильтрация записей уже присутствующих в базе
List<EducatonEntry> filtered = new ArrayList<>(xlsx_educations);
List<EducatonEntry> 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 { @@ -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 { @@ -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<EducatonEntry> 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;
}
}

2
gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java

@ -125,7 +125,7 @@ public class OrganizationController { @@ -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(

4
gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java

@ -8,8 +8,6 @@ import java.util.Map; @@ -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 { @@ -114,7 +112,7 @@ public class ProgramController {
return "programs-check";
}
return "redirect:/document/view-as-educations/" + id;
return "redirect:/document/educations/view/" + id;
}
/**

2
gates/src/main/java/ru/mlokoin/gates/controller/v1/StudentController.java

@ -110,7 +110,7 @@ public class StudentController { @@ -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;
}
/**

2
gates/src/main/java/ru/mlokoin/gates/controller/v1/TeacherController.java

@ -67,7 +67,7 @@ public class TeacherController { @@ -67,7 +67,7 @@ public class TeacherController {
return "teachers-check";
}
return "redirect:/document/view-as-educations/" + id;
return "redirect:/document/educations/view/" + id;
}
/**

45
gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java

@ -68,13 +68,50 @@ public class EducatonEntry { @@ -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();
}
}
}

39
gates/src/main/java/ru/mlokoin/gates/model/monitoring/EducationsReview.java

@ -0,0 +1,39 @@ @@ -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;
}
}

63
gates/src/main/resources/templates/view-as-educations.html

@ -19,30 +19,25 @@ xmlns:th="http://www.thymeleaf.org"> @@ -19,30 +19,25 @@ xmlns:th="http://www.thymeleaf.org">
<body>
<header>
<h2>view-as-educations (предусмотреть): </h2>
<ol>
<li>Добавиь на страницу обработки ошибок и результатов отработки проверок</li>
<li>Перед загрузкой xlsx-файла удалить все знаки переноса строки (при отправке в базу автоматически меняются на пробелы)</li>
<li>Перед загрузкой xlsx-файла все формулы сохранить как значения </li>
<li>Предусмотреть автоматический погон проверок</li>
<li>Разделить контроллеры по характеру взаимодействия с базой</li>
<li>Добавить столбцы:
</header>
<main>
<div class="doc-info">
<h2>Общие сведения по документу:</h2>
<ul>
<li>вид выдаваемого документа</li>
<li>вид программы обучения</li>
<li>номер по реестру ФРДО ДПО</li>
<li>номер ФРДО ПО</li>
<li>номер ЕИСОТ</li>
<li>Наименование файла:
<span th:text="${filename}"></span>
</li>
<li></li>
<li>try</li>
</ul>
<li>Предусмотреть возможность импорта данных из выгрузки в портала ФРДО</li>
<li></li>
</ol>
<br>
</header>
<main>
<div class="cntrols">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<div class="controls">
<h2>CONTROLS:</h2>
<form th:action="@{/program-cretareas/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-CRETAREAS"/>
@ -75,7 +70,7 @@ xmlns:th="http://www.thymeleaf.org"> @@ -75,7 +70,7 @@ xmlns:th="http://www.thymeleaf.org">
<hr>
<div class="educations">
<h2>EDUCATIONS:</h2>
<form th:action="@{/document/view-as-educations/{id}(id=${id})}" th:method="post" th:object="${wrapEducations}">
<form th:action="@{/document/educations/save/{id}(id=${id})}" th:method="post" th:object="${wrapEducations}">
<input type="submit" value="POST-ALL"/>
<table rules="all">
<thead>
@ -101,7 +96,7 @@ xmlns:th="http://www.thymeleaf.org"> @@ -101,7 +96,7 @@ xmlns:th="http://www.thymeleaf.org">
<input type="text" th:field="*{educations[__${eduStat.index}__].ones}">
</td>
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].course.protocol_number}">
<input type="text" th:field="*{educations[__${eduStat.index}__].course.id}">
</td>
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].student.id}">
@ -132,6 +127,28 @@ xmlns:th="http://www.thymeleaf.org"> @@ -132,6 +127,28 @@ xmlns:th="http://www.thymeleaf.org">
</tbody>
</table>
</div> -->
<hr>
<h2>view-as-educations (предусмотреть): </h2>
<ol>
<li>Добавиь на страницу обработки ошибок и результатов отработки проверок</li>
<li>Перед загрузкой xlsx-файла удалить все знаки переноса строки (при отправке в базу автоматически меняются на пробелы)</li>
<li>Перед загрузкой xlsx-файла все формулы сохранить как значения </li>
<li>Предусмотреть автоматический погон проверок</li>
<li>Разделить контроллеры по характеру взаимодействия с базой</li>
<li>Добавить столбцы:
<ul>
<li>вид выдаваемого документа</li>
<li>вид программы обучения</li>
<li>номер по реестру ФРДО ДПО</li>
<li>номер ФРДО ПО</li>
<li>номер ЕИСОТ</li>
<li></li>
<li>try</li>
</ul>
<li>Предусмотреть возможность импорта данных из выгрузки в портала ФРДО</li>
<li></li>
</ol>
<br>
</main>
</body>
</html>

2
gates/src/main/resources/templates/view-xlsx.html

@ -18,7 +18,7 @@ xmlns:th="http://www.thymeleaf.org"> @@ -18,7 +18,7 @@ xmlns:th="http://www.thymeleaf.org">
<h2>ЭКСПОРТИРОВАТЬ ФАЙЛ КАК:</h2>
<ul>
<li>
<form th:action="@{/document/view-as-educations/{id}(id=${id})}" th:method="get">
<form th:action="@{/document/educations/view/{id}(id=${id})}" th:method="get">
<input type="submit" value="РЕЕСТР ОБУЧЕННЫХ (educations)"/>
</form>
</li>

Loading…
Cancel
Save