esoe
3 months ago
9 changed files with 392 additions and 51 deletions
@ -0,0 +1,158 @@ |
|||||||
|
package ru.mlokoin.gates.controller.v1; |
||||||
|
|
||||||
|
import java.time.Duration; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
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.fs.xlsx.XlsxCell; |
||||||
|
import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument; |
||||||
|
import ru.mlokoin.gates.model.organization.Organization; |
||||||
|
import ru.mlokoin.gates.model.student.Student; |
||||||
|
import ru.mlokoin.gates.model.student.StudentWraper; |
||||||
|
import ru.mlokoin.gates.repository.Storage; |
||||||
|
|
||||||
|
@Controller |
||||||
|
@RequestMapping(path = "/students") |
||||||
|
public class StudentController { |
||||||
|
@Autowired |
||||||
|
private WebClient client; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private Storage storage; |
||||||
|
|
||||||
|
@GetMapping("/check/{id}") |
||||||
|
public String checkStudents(Model model, @PathVariable String id) { |
||||||
|
System.out.println("Проверка студентов из xlsx, для внесения в базу ..."); |
||||||
|
List<String> errors = new ArrayList<>();//список ошибок
|
||||||
|
|
||||||
|
//Получение списка организаций, для передачи в врапер
|
||||||
|
List<Organization> base_organizations; |
||||||
|
try { |
||||||
|
base_organizations = storage.getBaseOrganizations(); |
||||||
|
} catch (Exception e) { |
||||||
|
errors.add("Ошибка при получении списка организаций из базы :: " +e.getMessage()); |
||||||
|
System.out.println("Не удалось получить список организаций из базы: " + e.getMessage()); |
||||||
|
base_organizations = new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
//получение данных файла в переменную xlsx
|
||||||
|
XlsxDocument xlsx = storage.getXlsxDocument(id); |
||||||
|
|
||||||
|
//получение перечня студентов из xlsx
|
||||||
|
ArrayList<Student> xlsx_students = new ArrayList<>(); |
||||||
|
Map<Integer, List<XlsxCell>> map = xlsx.getData(); |
||||||
|
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { |
||||||
|
xlsx_students.add(new Student(entry, base_organizations)); |
||||||
|
} |
||||||
|
System.out.println("Всего студентов в xlsx: " + xlsx_students.size()); |
||||||
|
|
||||||
|
//получение перечня студентов из базы
|
||||||
|
List<Student> base_students = storage.getBaseStudents(); |
||||||
|
System.out.println("Всего студентов в базе: " + base_students.size()); |
||||||
|
|
||||||
|
/** |
||||||
|
* Удаляем повторяющихся студентов из списка |
||||||
|
* Исключаем из списка студентов, данные о которых уже присутствуют в базе |
||||||
|
*/ |
||||||
|
List<Student> filtered = new ArrayList<>(); |
||||||
|
for (Student xlsx_student : xlsx_students) { |
||||||
|
if (xlsx_student != null) { |
||||||
|
// если имя не отсутствует, считаем, что студент существует
|
||||||
|
if (xlsx_student.getFirst_name() != null){ |
||||||
|
if (!filtered.contains(xlsx_student)) { |
||||||
|
boolean exists = false; |
||||||
|
if (base_students.size() > 0) { |
||||||
|
for (Student base_student : base_students) { |
||||||
|
exists = xlsx_student.getFirst_name().equals(base_student.getFirst_name()) |
||||||
|
&& xlsx_student.getLast_name().equals(base_student.getLast_name()) |
||||||
|
&& xlsx_student.getSecond_name().equals(base_student.getSecond_name()) |
||||||
|
&& xlsx_student.getProfession().equals(base_student.getProfession()) |
||||||
|
&& xlsx_student.getOrganization().equals(base_student.getOrganization()) |
||||||
|
&& xlsx_student.getDirection().equals(base_student.getDirection()); |
||||||
|
|
||||||
|
if (exists) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (!exists) { |
||||||
|
filtered.add(xlsx_student); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
System.out.println("Уникальных студентов в xlsx: " + filtered.size()); |
||||||
|
|
||||||
|
//передает список студентов в шаблон
|
||||||
|
if (filtered.size() > 0) { |
||||||
|
if (filtered.size() > 200) { |
||||||
|
filtered = filtered.subList(0, 200); |
||||||
|
} |
||||||
|
//создаем врапер для списка студентов
|
||||||
|
StudentWraper wraper = new StudentWraper(filtered); |
||||||
|
|
||||||
|
//передаем врапер в шаблон
|
||||||
|
model.addAttribute("studentWraper", wraper); |
||||||
|
model.addAttribute("errors", errors); |
||||||
|
return "students-check"; |
||||||
|
} |
||||||
|
return "redirect:/document/view-as-educations/" + id; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Добавление новых студентов в базу |
||||||
|
* @param wraper |
||||||
|
* @param id |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@PostMapping( |
||||||
|
path="/save/{id}", |
||||||
|
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, |
||||||
|
produces = MediaType.APPLICATION_JSON_VALUE |
||||||
|
) |
||||||
|
public String saveCourses(Model model, @ModelAttribute("studentWraper") StudentWraper wraper, @PathVariable String id){ |
||||||
|
/** |
||||||
|
* Отправляем запросы на добавление новых студентов в базу |
||||||
|
*/ |
||||||
|
List<String> errors = new ArrayList<>(); |
||||||
|
System.out.println("Отправляем запросы на добавление новых студентов в базу ..."); |
||||||
|
List<Student> students = wraper.getStudents(); |
||||||
|
System.out.println("Количество студентов для добавления в базу: " + students.size()); |
||||||
|
|
||||||
|
for (Student student : students) { |
||||||
|
try{ |
||||||
|
client.post() |
||||||
|
.uri("http://resource-service-api:8181/student/create") |
||||||
|
.body(Mono.just(student), Student.class) |
||||||
|
.retrieve() |
||||||
|
.toBodilessEntity() |
||||||
|
.timeout(Duration.ofSeconds(2)) |
||||||
|
.block(); |
||||||
|
} catch (Exception e) { |
||||||
|
errors.add("Не удалось добавить студента: " + student.toString() + " :: " + e.getMessage()); |
||||||
|
System.out.println("Не удалось добавить студента: " + student.toString() + " :: " + e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
model.addAttribute("errors", errors); |
||||||
|
/** |
||||||
|
* Возвращаем пользователя на страницу перечня новых студентов |
||||||
|
* - если он не пустой |
||||||
|
*/ |
||||||
|
return "redirect:/students/check/" + id; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
package ru.mlokoin.gates.model.education; |
||||||
|
|
||||||
|
public class EducationEntryWraper { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package ru.mlokoin.gates.model.student; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import ru.mlokoin.gates.model.organization.Organization; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class StudentWraper { |
||||||
|
List<Student> students; |
||||||
|
List<Organization> organizations; |
||||||
|
|
||||||
|
public StudentWraper(){ |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
public StudentWraper(List<Student> list) { |
||||||
|
this.students = list; |
||||||
|
} |
||||||
|
|
||||||
|
public void init(){ |
||||||
|
this.students = new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
public void addStudent(Student student){ |
||||||
|
this.students.add(student); |
||||||
|
} |
||||||
|
|
||||||
|
public void addOrganization(Organization organization){ |
||||||
|
this.organizations.add(organization); |
||||||
|
} |
||||||
|
|
||||||
|
public String toString(){ |
||||||
|
return this.students.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,82 @@ |
|||||||
|
<!DOCTYPE HTML> |
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" |
||||||
|
xmlns:th="http://www.thymeleaf.org"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<title>check-students</title> |
||||||
|
<!-- Скрипт обработки thymeleaf компонентов --> |
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2/webcomponents-loader.min.js"></script> |
||||||
|
<!-- скрипт просмотра *.MD документов --> |
||||||
|
<!-- <script type="module" src="https://cdn.jsdelivr.net/gh/zerodevx/zero-md@1/src/zero-md.min.js"></script> --> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<header> |
||||||
|
<h2>check-students</h2> |
||||||
|
</header> |
||||||
|
<main> |
||||||
|
<div> |
||||||
|
<h2>Стоит обратить внимание (errors): |
||||||
|
<span th:text="${#lists.size(errors)}"></span> |
||||||
|
</h2> |
||||||
|
<ul th:each="e: ${errors}"> |
||||||
|
<li th:text="${e}"></li> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
<form th:action="@{/students/save/{id}(id=${id})}" |
||||||
|
th:method="post" |
||||||
|
th:object="${studentWraper}"> |
||||||
|
<input type="submit" value="POST-ALL"/> |
||||||
|
<table rules="all"> |
||||||
|
<thead> |
||||||
|
<th><span>Фамилия (last_name)</span></th> |
||||||
|
<th><span>Имя (first_name)</span></th> |
||||||
|
<th><span>Отчество (second_name)</span></th> |
||||||
|
<th><span>Профессия (profession)</span></th> |
||||||
|
<th><span>Категория ИТР/рабочий (category)</span></th> |
||||||
|
<th><span>Структурное подразделение (direction)</span></th> |
||||||
|
<th><span>Организация (organization)</span></th> |
||||||
|
<th><span>СНИЛС (snils)</span></th> |
||||||
|
<th><span>Дата рождения (berth)</span></th> |
||||||
|
<th><span>Гражданство (sitizenship)</span></th> |
||||||
|
<th><span>Пол Муж/Жен (sex)</span></th> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
<tr th:each="student, studentStat : *{students}" > |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].second_name}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].first_name}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].last_name}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].profession}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].category}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].direction}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].organization.id}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].berth}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].sitizenship}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{students[__${studentStat.index}__].sex}"> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<input type="submit" value="POST-ALL"/> |
||||||
|
</form> |
||||||
|
</main> |
||||||
|
</body> |
||||||
|
</html> |
Loading…
Reference in new issue