Browse Source

reestr in process

master
esoe 3 months ago
parent
commit
3c123fbc74
  1. 1
      README.md
  2. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java
  3. 146
      gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java
  4. 62
      gates/src/main/java/ru/mlokoin/gates/model/education/EducationEntryWraper.java
  5. 40
      gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java
  6. 6
      gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocument.java
  7. 38
      gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java
  8. 14
      gates/src/main/java/ru/mlokoin/gates/repository/Storage.java
  9. 55
      gates/src/main/resources/templates/view-as-educations.html

1
README.md

@ -75,4 +75,5 @@ POSTGRES_DB='tech-services'
Микросервисы располагаются в контейнерах docker Микросервисы располагаются в контейнерах docker
Развертывание сервисов в windows осуществляется PowerShell скриптом (run.ps1) Развертывание сервисов в windows осуществляется PowerShell скриптом (run.ps1)
$ipconfig
10.100.113.239 10.100.113.239

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

@ -96,7 +96,7 @@ public class CourseController {
//Получение перечня курсов из базы //Получение перечня курсов из базы
System.out.println("Получение списка курсов из базы ..."); System.out.println("Получение списка курсов из базы ...");
List<Course> base_courses = storage.getBaseCourse(); List<Course> base_courses = storage.getBaseCourses();
System.out.println("Количество курсов в базе: " + base_courses.size()); System.out.println("Количество курсов в базе: " + base_courses.size());
/***************************************************************************************** /*****************************************************************************************

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

@ -1,8 +1,9 @@
package ru.mlokoin.gates.controller.v1; package ru.mlokoin.gates.controller.v1;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -10,12 +11,24 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import ru.mlokoin.gates.model.building.Building;
import ru.mlokoin.gates.model.course.Course;
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.XlsxDocument;
import ru.mlokoin.gates.model.fs.xlsx.XlsxDocumentReestr;
import ru.mlokoin.gates.model.organization.Organization;
import ru.mlokoin.gates.model.program.Program;
import ru.mlokoin.gates.model.student.Student;
import ru.mlokoin.gates.model.teacher.Teacher;
import ru.mlokoin.gates.repository.Storage; import ru.mlokoin.gates.repository.Storage;
@Controller @Controller
@RequestMapping(path = "/") @RequestMapping(path = "/")
public class EducationsController { public class EducationsController {
@Autowired
private WebClient client;
@Autowired @Autowired
private Storage storage; private Storage storage;
@ -26,17 +39,136 @@ public class EducationsController {
* - кнопки запуска механизмов проверок полей формы (критерии, программы, итд ...) * - кнопки запуска механизмов проверок полей формы (критерии, программы, итд ...)
* @param model * @param model
* @param id * @param id
* @param xlsxEducations TODO
* @return * @return
*/ */
@GetMapping("/document/view-as-educations/{id}") @GetMapping("/document/view-as-educations/{id}")
public String viewAsEducations(Model model, @PathVariable String id) { public String viewAsEducations(Model model, @PathVariable String id) {
System.out.println("Просмотр содержимого файла ...");
XlsxDocument xlsx = storage.getXlsxDocument(id);
model.addAttribute("filename", xlsx.getDocument().getName()); // создание списка ошибок
List<String> errors = new ArrayList<>();
// Получение данных файла в переменную xlsx, json объект сериализуем в java файл
System.out.println("Получение данных из xlsx-файла ...");
XlsxDocument xlsx;
try {
xlsx = storage.getXlsxDocument(id);
} catch (Exception e) {
errors.add("Ошибка при получении данных из xlsx-файла :: " +e.getMessage());
System.out.println("Не удалось получить данные из xlsx-файла: " + e.getMessage());
xlsx = new XlsxDocument();
}
//Обращение к xlsx-файлу как к Реестру обученных
XlsxDocumentReestr xlsxEducations = new XlsxDocumentReestr(xlsx);
//получение списка студентов из базы
System.out.println("Получение списка студентов из базы ...");
List<Student> base_students;
try {
base_students = storage.getBaseStudents();
} catch (Exception e) {
errors.add("Ошибка при получении списка студентов из базы :: " +e.getMessage());
System.out.println("Не удалось получить список студентов из базы: " + e.getMessage());
base_students = new ArrayList<>();
}
//получение списка курсов из базы
System.out.println("Получение списка курсов из базы ...");
List<Course> base_courses;
try {
base_courses = storage.getBaseCourses();
} catch (Exception e) {
errors.add("Ошибка при получении списка курсов из базы :: " +e.getMessage());
System.out.println("Не удалось получить список курсов из базы: " + e.getMessage());
base_courses = new ArrayList<>();
}
//получение списка преподавателей из базы
System.out.println("Получение списка преподавателей из базы ...");
List<Teacher> base_teachers;
try {
base_teachers = storage.getBaseTeachers();
} catch (Exception e) {
errors.add("Ошибка при получении списка преподавателей из базы :: " +e.getMessage());
System.out.println("Не удалось получить список преподавателей из базы: " + e.getMessage());
base_teachers = new ArrayList<>();
}
//получение списка программ обучения из базы
System.out.println("Получение списка программ обучения из базы ...");
List<Program> base_programs;
try {
base_programs = storage.getBasePrograms();
} catch (Exception e) {
errors.add("Ошибка при получении списка программ обучения из базы :: " +e.getMessage());
System.out.println("Не удалось получить список программ обучения из базы: " + e.getMessage());
base_programs = new ArrayList<>();
}
//получение списка объектов строительства из базы
System.out.println("Получение списка объектов строительства из базы ...");
List<Building> base_buildings;
try {
base_buildings = storage.getBaseBuildings();
} catch (Exception e) {
errors.add("Ошибка при получении списка объектов строительства из базы :: " +e.getMessage());
System.out.println("Не удалось получить список объектов строительства из базы: " + e.getMessage());
base_buildings = new ArrayList<>();
}
//получение списка организаций из базы
System.out.println("Получение списка организаций из базы ...");
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<>();
}
//получение списка записей об обучениях из базы
System.out.println("Получение списка записей об обучениях из базы ...");
List<EducatonEntry> base_educations;
try {
base_educations = storage.getBaseEducationEntries();
} catch (Exception e) {
errors.add("Ошибка при получении списка записей об обучениях из базы :: " +e.getMessage());
System.out.println("Не удалось получить список записей об обучениях из базы: " + e.getMessage());
base_educations = new ArrayList<>();
}
//получение списка записей об обучениях из xlsx-файла
System.out.println("Получение списка записей об обучениях из xlsx-файла ...");
List<EducatonEntry> xlsx_educations = new ArrayList<>();
try {
xlsx_educations = xlsxEducations.getEducations(base_courses, base_students, base_teachers, base_programs, base_buildings, base_organizations);
} catch (Exception e) {
errors.add("Ошибка при получении списка записей об обучениях из xlsx-файла :: " +e.getMessage());
System.out.println("Не удалось получить список записей об обучениях из xlsx-файла: " + e.getMessage());
xlsx_educations = new ArrayList<>();
}
//фильтрация записей уже присутствующих в базе
List<EducatonEntry> filtered = new ArrayList<>(xlsx_educations);
if (filtered.size() > 0) {
if (filtered.size() > 200) {
filtered = filtered.subList(0, 200);
}
}
EducationEntryWraper wraper = new EducationEntryWraper(filtered);
wraper.setCourses(base_courses);
wraper.setStudents(base_students);
//передача данных в модель
model.addAttribute("wrapEducations", wraper);
model.addAttribute("errors", errors);
model.addAttribute("filename", xlsxEducations.getDocument().getName());
model.addAttribute("id", id); model.addAttribute("id", id);
model.addAttribute("xlsx", xlsx.getData()); // model.addAttribute("xlsx", xlsx.getData());
model.addAttribute("headers", xlsx.getHeaders()); // model.addAttribute("headers", xlsx.getHeaders());
return "view-as-educations"; return "view-as-educations";
} }
} }

62
gates/src/main/java/ru/mlokoin/gates/model/education/EducationEntryWraper.java

@ -1,5 +1,67 @@
package ru.mlokoin.gates.model.education; package ru.mlokoin.gates.model.education;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import ru.mlokoin.gates.model.course.Course;
import ru.mlokoin.gates.model.student.Student;
@Data
public class EducationEntryWraper { public class EducationEntryWraper {
public List<EducatonEntry> educations;
public List<Course> courses;
public List<Student> students;
public EducationEntryWraper(){
init();
}
public EducationEntryWraper(List<EducatonEntry> list) {
this.init();
this.educations = list;
}
public void init(){
this.educations = new ArrayList<>();
this.courses = new ArrayList<>();
this.students = new ArrayList<>();
}
public void addEducation(EducatonEntry education){
this.educations.add(education);
}
public void addEducations(List<EducatonEntry> educations){
for (EducatonEntry education : educations) {
this.addEducation(education);
}
}
public void addCourse(Course course){
this.courses.add(course);
}
public void addCourses(List<Course> courses){
for (Course course : courses) {
this.addCourse(course);
}
}
public void addStudent(Student student){
this.students.add(student);
}
public void addStudents(List<Student> students){
for (Student student : students) {
this.addStudent(student);
}
}
@Override
public String toString() {
return this.educations.toString();
}
} }

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

@ -1,10 +1,18 @@
package ru.mlokoin.gates.model.education; package ru.mlokoin.gates.model.education;
import java.util.List;
import java.util.Map.Entry;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import ru.mlokoin.gates.model.building.Building;
import ru.mlokoin.gates.model.course.Course; import ru.mlokoin.gates.model.course.Course;
import ru.mlokoin.gates.model.fs.xlsx.XlsxCell;
import ru.mlokoin.gates.model.organization.Organization;
import ru.mlokoin.gates.model.program.Program;
import ru.mlokoin.gates.model.student.Student; import ru.mlokoin.gates.model.student.Student;
import ru.mlokoin.gates.model.teacher.Teacher;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ -37,4 +45,36 @@ public class EducatonEntry {
this.student = student; this.student = student;
} }
/**
* Консруктор записи в реестре обученных из строки xlsx документа
* -
*
* @param entry
* @param base_courses
* @param base_students
*/
public EducatonEntry(Entry<Integer, List<XlsxCell>> entry,
List<Course> base_courses,
List<Student> base_students,
List<Teacher> base_teachers,
List<Program> base_programs,
List<Building> base_buildings,
List<Organization> base_organizations) {
// Убираем строку заголовков
if (entry.getKey() != 0) {
//получаем строку из файла
List<XlsxCell> cells = entry.getValue();//строка xlsx
/**
* Извлекаем данные из ячеек
*/
this.course = new Course(entry, base_teachers, base_programs, base_buildings);
this.student = new Student(entry, base_organizations);
this.ones = cells.get(16).getContent();
this.sertificate_number = cells.get(14).getContent();
}
}
} }

6
gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocument.java

@ -16,4 +16,10 @@ public class XlsxDocument implements Serializable{
private Map<Integer, List<XlsxCell>> data; private Map<Integer, List<XlsxCell>> data;
private Document document; private Document document;
private List<XlsxCell> headers; private List<XlsxCell> headers;
public XlsxDocument(XlsxDocument xlsx) {
this.data = xlsx.data;
this.document = xlsx.document;
this.headers = xlsx.headers;
}
} }

38
gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java

@ -0,0 +1,38 @@
package ru.mlokoin.gates.model.fs.xlsx;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import ru.mlokoin.gates.model.building.Building;
import ru.mlokoin.gates.model.course.Course;
import ru.mlokoin.gates.model.education.EducatonEntry;
import ru.mlokoin.gates.model.organization.Organization;
import ru.mlokoin.gates.model.program.Program;
import ru.mlokoin.gates.model.student.Student;
import ru.mlokoin.gates.model.teacher.Teacher;
/**
* Класс для извлечения данных из Реестра обученных (educations)
*/
public class XlsxDocumentReestr extends XlsxDocument {
public XlsxDocumentReestr(XlsxDocument xlsx) {
super(xlsx);
}
public List<EducatonEntry> getEducations(List<Course> base_courses,
List<Student> base_students,
List<Teacher> base_teachers,
List<Program> base_programs,
List<Building> base_buildings,
List<Organization> base_organizations) {
List<EducatonEntry> educations = new ArrayList<>();
Map<Integer, List<XlsxCell>> map = getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
educations.add(new EducatonEntry((Entry<Integer, List<XlsxCell>>) entry, base_courses, base_students, base_teachers, base_programs, base_buildings, base_organizations));
}
return educations;
}
}

14
gates/src/main/java/ru/mlokoin/gates/repository/Storage.java

@ -18,6 +18,7 @@ import org.springframework.web.reactive.function.client.WebClient;
import ru.mlokoin.gates.model.building.Building; import ru.mlokoin.gates.model.building.Building;
import ru.mlokoin.gates.model.course.Course; import ru.mlokoin.gates.model.course.Course;
import ru.mlokoin.gates.model.cretarea.ProgramCretarea; import ru.mlokoin.gates.model.cretarea.ProgramCretarea;
import ru.mlokoin.gates.model.education.EducatonEntry;
import ru.mlokoin.gates.model.fs.Document; import ru.mlokoin.gates.model.fs.Document;
import ru.mlokoin.gates.model.fs.xlsx.XlsxCell; import ru.mlokoin.gates.model.fs.xlsx.XlsxCell;
import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument; import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument;
@ -43,6 +44,7 @@ public class Storage {
private String cretareasLink = "http://resource-service-api:8181/cretarea/list"; private String cretareasLink = "http://resource-service-api:8181/cretarea/list";
private String organizationsLink = "http://resource-service-api:8181/organization/list"; private String organizationsLink = "http://resource-service-api:8181/organization/list";
private String studentsLink = "http://resource-service-api:8181/student/list"; private String studentsLink = "http://resource-service-api:8181/student/list";
private String educationEntriesLink = "http://resource-service-api:8181/education/list";
@Autowired @Autowired
private WebClient client; private WebClient client;
@ -111,7 +113,7 @@ public class Storage {
/** /**
* Получение списка курсов из базы данных * Получение списка курсов из базы данных
*/ */
public List<Course> getBaseCourse() { public List<Course> getBaseCourses() {
System.out.println("Получение списка курсов из базы данных ..."); System.out.println("Получение списка курсов из базы данных ...");
List<Course> list = client.method(HttpMethod.GET) List<Course> list = client.method(HttpMethod.GET)
.uri(coursesLink) .uri(coursesLink)
@ -244,6 +246,16 @@ public class Storage {
return list; return list;
} }
public List<EducatonEntry> getBaseEducationEntries() {
System.out.println("Получение списка записей об обучениях из базы данных ...");
List<EducatonEntry> list = client.method(HttpMethod.GET)
.uri(educationEntriesLink)
.retrieve()
.bodyToMono(new ParameterizedTypeReference <List<EducatonEntry>>(){})
.block();
return list;
}

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

@ -6,6 +6,15 @@ xmlns:th="http://www.thymeleaf.org">
<title>view-as-educations</title> <title>view-as-educations</title>
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2/webcomponents-loader.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2/webcomponents-loader.min.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/gh/zerodevx/zero-md@1/src/zero-md.min.js"></script> <script type="module" src="https://cdn.jsdelivr.net/gh/zerodevx/zero-md@1/src/zero-md.min.js"></script>
<style>
caption {
caption-side: top;
text-align: left;
/* padding-bottom: 10px; */
font-weight: bold;
font-size: x-large;
}
</style>
</head> </head>
<body> <body>
@ -60,6 +69,50 @@ xmlns:th="http://www.thymeleaf.org">
<input type="submit" value="POST-AS-EDUCATIONS"/> <input type="submit" value="POST-AS-EDUCATIONS"/>
</form> </form>
</div> </div>
<div class="errors"></div>
<hr>
<div class="educations">
<h2>EDUCATIONS:</h2>
<form th:action="@{/document/view-as-educations/{id}(id=${id})}" th:method="post" th:object="${wrapEducations}">
<input type="submit" value="POST-ALL"/>
<table rules="all">
<thead>
<th><span>Номер удостоверения (sertificate_number)</span></th>
<th><span>ФРДО (frdo_number)</span></th>
<th><span>ЕИСОТ (eisot_number)</span></th>
<th><span>Единички (ones)</span></th>
<th><span>Курс (course)</span></th>
<th><span>Студент (student)</span></th>
</thead>
<tbody>
<tr th:each="edu, eduStat : *{educations}">
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].sertificate_number}">
</td>
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].frdo_number}">
</td>
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].eisot_number}">
</td>
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].ones}">
</td>
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].course.protocol_number}">
</td>
<td>
<input type="text" th:field="*{educations[__${eduStat.index}__].student.id}">
</td>
</tr>
</tbody>
</table>
</form>
</div>
<!-- <hr>
<div class="main-wraper"> <div class="main-wraper">
<table rules="all"> <table rules="all">
<caption th:text="${filename}"></caption> <caption th:text="${filename}"></caption>
@ -78,7 +131,7 @@ xmlns:th="http://www.thymeleaf.org">
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div> -->
</main> </main>
</body> </body>
</html> </html>
Loading…
Cancel
Save