esoe
4 months ago
32 changed files with 544 additions and 470 deletions
@ -1,293 +0,0 @@ |
|||||||
package ru.mlokoin.gates.controller; |
|
||||||
|
|
||||||
import java.time.Duration; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashSet; |
|
||||||
import java.util.List; |
|
||||||
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; |
|
||||||
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.Teacher; |
|
||||||
import ru.mlokoin.gates.model.TeacherWraper; |
|
||||||
import ru.mlokoin.gates.model.XlsxCell; |
|
||||||
import ru.mlokoin.gates.model.XlsxDocument; |
|
||||||
|
|
||||||
@Controller |
|
||||||
@RequestMapping(path = "/teachers") |
|
||||||
public class TeacherController { |
|
||||||
@Autowired |
|
||||||
private WebClient client; |
|
||||||
|
|
||||||
/** |
|
||||||
* Проверка преподавателей |
|
||||||
* @param model |
|
||||||
* @param id |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@GetMapping("/check/{id}") |
|
||||||
public String checkTeachers(Model model, @PathVariable String id) { |
|
||||||
System.out.println("Проверка преподавателей, для внесения в базу ..."); |
|
||||||
|
|
||||||
//список ошибок
|
|
||||||
List<String> errors = new ArrayList<>(); |
|
||||||
|
|
||||||
//Запрашиваем данные файла из хранилища
|
|
||||||
System.out.println("Получение перечня преподавателей из xlsx-файла ..."); |
|
||||||
XlsxDocument xlsx = client.method(HttpMethod.GET) |
|
||||||
.uri("http://storage-rs:8282/api/document/content/" |
|
||||||
+ id + ".xlsx") |
|
||||||
.retrieve() |
|
||||||
.bodyToMono(new ParameterizedTypeReference <XlsxDocument>(){}) |
|
||||||
.block(); |
|
||||||
|
|
||||||
// получаем данные в виде мапы строк
|
|
||||||
Map<Integer, List<XlsxCell>> map = xlsx.getData(); |
|
||||||
|
|
||||||
// удаляем строку заголовков
|
|
||||||
map.remove(0); |
|
||||||
System.out.println("Количество записей: " + map.size()); |
|
||||||
|
|
||||||
Set<String> xlsx_strings = new HashSet<>();//строки для браузера
|
|
||||||
Set<Teacher> xlsx_teachers = new HashSet<>();//объекты для обработки
|
|
||||||
|
|
||||||
//перебираем мапу
|
|
||||||
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { |
|
||||||
// получаем значение поля "Преподаватель", заменяем пустые поля на слово "Нет"
|
|
||||||
// пустые сроки не выводятся браузром, нет смысла туда передавать пустые объекты
|
|
||||||
String string = ""; |
|
||||||
try { |
|
||||||
string = entry |
|
||||||
.getValue() |
|
||||||
.get(18) |
|
||||||
.getContent(); |
|
||||||
} catch (Exception e) { |
|
||||||
string = "Нет"; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Преобразование строки в объект Преподавателя |
|
||||||
* - обработка возможных ошибок в файле |
|
||||||
* - разбор строк происходит в основном переборе, чтобы можно было извлечь номер строки с ошибками для пользователя |
|
||||||
*/ |
|
||||||
Teacher t = new Teacher(); |
|
||||||
// проверка на пустую строку
|
|
||||||
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; |
|
||||||
} |
|
||||||
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; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
xlsx_strings.add(string); |
|
||||||
xlsx_teachers.add(t); |
|
||||||
} |
|
||||||
|
|
||||||
// Промежуточные результаты разбора данных xlsx в консоль
|
|
||||||
System.out.println("Всего преподавателей(obj): " + xlsx_teachers.size()); |
|
||||||
System.out.println("Всего преподавателей(str): " + xlsx_strings.size()); |
|
||||||
System.out.println(">> errors: " + errors.size()); |
|
||||||
|
|
||||||
/** |
|
||||||
* Получение перечня преподавателей из базы |
|
||||||
*/ |
|
||||||
System.out.println("Получение списка преподавателей из базы ..."); |
|
||||||
Set<Teacher> base_teachers = client.method(HttpMethod.GET) |
|
||||||
.uri("http://resource-service-api:8181/teacher/list") |
|
||||||
.retrieve() |
|
||||||
.bodyToMono(new ParameterizedTypeReference <Set<Teacher>>(){}) |
|
||||||
.block(); |
|
||||||
|
|
||||||
/** |
|
||||||
* Удаление преподавателей присутствующих в базе |
|
||||||
* сравнение по объектам не проходит: |
|
||||||
* - в объектах xlsx отсутствуют id, которые приходят с объектами из базы |
|
||||||
* - менять Teacher.equals не хочется, он на lombok завязан |
|
||||||
* - перевожу ФИО в строку и сравниваю строки!!! |
|
||||||
*/ |
|
||||||
// xlsx_teachers.removeAll(base_teachers);
|
|
||||||
Set<String> xlsx_teachers_str = xlsx_strings; |
|
||||||
Set<String> 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 : base_teachers) { |
|
||||||
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); |
|
||||||
|
|
||||||
/** |
|
||||||
* Если какието преподаватели отсутствуют в базе, |
|
||||||
* вернуть страницу проверки преподавателей |
|
||||||
*/ |
|
||||||
if (xlsx_teachers_str.size() != 0) { |
|
||||||
/** |
|
||||||
* Подготовка списка, для передачи в представление |
|
||||||
* - опять преобразуем список из строкового в объектный |
|
||||||
*/ |
|
||||||
ArrayList<Teacher> list = new ArrayList<>(); |
|
||||||
for (String string : xlsx_teachers_str) { |
|
||||||
Teacher t = new Teacher(); |
|
||||||
String[] arr = string.split(" ", 4); |
|
||||||
for (int i = 0; i < arr.length; i++){ |
|
||||||
switch (i) { |
|
||||||
case 0: { |
|
||||||
t.setSecond_name(arr[i]);//Фамилия
|
|
||||||
break; |
|
||||||
} |
|
||||||
case 1: { |
|
||||||
t.setFirst_name(arr[i]);//Имя
|
|
||||||
break; |
|
||||||
} |
|
||||||
case 2: { |
|
||||||
t.setLast_name(arr[i]);//Отчество
|
|
||||||
break; |
|
||||||
} |
|
||||||
case 3: { |
|
||||||
t.setLast_name(t.getLast_name() + " " + arr[i]);//Отчество c остальными дописками
|
|
||||||
break; |
|
||||||
} |
|
||||||
default: |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
list.add(t); |
|
||||||
} |
|
||||||
|
|
||||||
//кладем список в обертку для формы
|
|
||||||
TeacherWraper teacherWraper = new TeacherWraper(list); |
|
||||||
|
|
||||||
model.addAttribute("wrapTeachers", teacherWraper); |
|
||||||
model.addAttribute("errors", errors); |
|
||||||
model.addAttribute("id", id); |
|
||||||
|
|
||||||
return "teachers-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 saveTeachers(@ModelAttribute("wrapTeachers") TeacherWraper wraper, @PathVariable String id){ |
|
||||||
/** |
|
||||||
* Отправляем запросы на добавление новых критериев в базу |
|
||||||
*/ |
|
||||||
System.out.println("Преподаватели для добавления в базу: " |
|
||||||
+ wraper.getList().toString()); |
|
||||||
|
|
||||||
for (Teacher teacher : wraper.getList()) { |
|
||||||
//Проверка наличия флага для добавления в базу
|
|
||||||
//по полю табельного номера
|
|
||||||
// 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(2)) |
|
||||||
.block(); |
|
||||||
// }
|
|
||||||
} |
|
||||||
/** |
|
||||||
* Возвращаем пользователя на страницу перечня новых критериев |
|
||||||
* - если он не пустой |
|
||||||
*/ |
|
||||||
return "redirect:/teachers/check/" + id; |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,111 @@ |
|||||||
|
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.fs.xlsx.XlsxDocument; |
||||||
|
import ru.mlokoin.gates.model.teacher.Teacher; |
||||||
|
import ru.mlokoin.gates.model.teacher.TeacherWraper; |
||||||
|
import ru.mlokoin.gates.repository.Storage; |
||||||
|
|
||||||
|
@Controller |
||||||
|
@RequestMapping(path = "/teachers") |
||||||
|
public class TeacherController { |
||||||
|
@Autowired |
||||||
|
private WebClient client; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private Storage storage; |
||||||
|
|
||||||
|
/** |
||||||
|
* Проверка преподавателей |
||||||
|
* @param model |
||||||
|
* @param id |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@GetMapping("/check/{id}") |
||||||
|
public String checkTeachers(Model model, @PathVariable String id) { |
||||||
|
System.out.println("Проверка преподавателей, для внесения в базу ..."); |
||||||
|
|
||||||
|
//список ошибок
|
||||||
|
List<String> errors = new ArrayList<>(); |
||||||
|
|
||||||
|
//Запрашиваем данные файла из хранилища
|
||||||
|
System.out.println("Получение перечня преподавателей из xlsx-файла ..."); |
||||||
|
XlsxDocument xlsx = storage.getXlsxDocument(id); |
||||||
|
// список уникальных преподавателей из xlsx-файла
|
||||||
|
List<Teacher> xlsx_teachers = storage.getXlsxTeachers(xlsx); |
||||||
|
// список преподавателей из базы
|
||||||
|
List<Teacher> base_teachers = storage.getBaseTeachers(); |
||||||
|
// список преподавателей, отсутствующих в базе
|
||||||
|
List<Teacher> absent_teachers = storage.getAbsentTeachers(xlsx_teachers, base_teachers); |
||||||
|
|
||||||
|
/** |
||||||
|
* Если какието преподаватели отсутствуют в базе, |
||||||
|
* вернуть страницу проверки преподавателей |
||||||
|
*/ |
||||||
|
if (absent_teachers.size() != 0) { |
||||||
|
//кладем список в обертку для формы
|
||||||
|
TeacherWraper teacherWraper = new TeacherWraper(storage.sortTeachers(absent_teachers)); |
||||||
|
|
||||||
|
model.addAttribute("wrapTeachers", teacherWraper); |
||||||
|
model.addAttribute("errors", errors); |
||||||
|
model.addAttribute("id", id); |
||||||
|
|
||||||
|
return "teachers-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 saveTeachers(@ModelAttribute("wrapTeachers") TeacherWraper wraper, @PathVariable String id){ |
||||||
|
/** |
||||||
|
* Отправляем запросы на добавление новых критериев в базу |
||||||
|
*/ |
||||||
|
System.out.println("Преподаватели для добавления в базу: " |
||||||
|
+ wraper.getList().toString()); |
||||||
|
|
||||||
|
for (Teacher teacher : wraper.getList()) { |
||||||
|
//Проверка наличия флага для добавления в базу
|
||||||
|
//по полю табельного номера
|
||||||
|
// 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(2)) |
||||||
|
.block(); |
||||||
|
// }
|
||||||
|
} |
||||||
|
/** |
||||||
|
* Возвращаем пользователя на страницу перечня новых критериев |
||||||
|
* - если он не пустой |
||||||
|
*/ |
||||||
|
return "redirect:/teachers/check/" + id; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
package ru.mlokoin.gates.controller.v2; |
||||||
|
|
||||||
|
public class Check { |
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.building; |
||||||
|
|
||||||
import java.io.Serializable; |
import java.io.Serializable; |
||||||
|
|
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.building; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
@ -1,9 +1,12 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.course; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
||||||
|
|
||||||
import lombok.Data; |
import lombok.Data; |
||||||
|
import ru.mlokoin.gates.model.building.Building; |
||||||
|
import ru.mlokoin.gates.model.program.Program; |
||||||
|
import ru.mlokoin.gates.model.teacher.Teacher; |
||||||
|
|
||||||
@Data |
@Data |
||||||
public class CourseWraper { |
public class CourseWraper { |
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.cretarea; |
||||||
|
|
||||||
import java.io.Serializable; |
import java.io.Serializable; |
||||||
|
|
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.cretarea; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
@ -1,8 +1,10 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.education; |
||||||
|
|
||||||
import lombok.AllArgsConstructor; |
import lombok.AllArgsConstructor; |
||||||
import lombok.Data; |
import lombok.Data; |
||||||
import lombok.NoArgsConstructor; |
import lombok.NoArgsConstructor; |
||||||
|
import ru.mlokoin.gates.model.course.Course; |
||||||
|
import ru.mlokoin.gates.model.student.Student; |
||||||
|
|
||||||
@NoArgsConstructor |
@NoArgsConstructor |
||||||
@AllArgsConstructor |
@AllArgsConstructor |
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.fs; |
||||||
|
|
||||||
import java.io.Serializable; |
import java.io.Serializable; |
||||||
|
|
@ -0,0 +1,61 @@ |
|||||||
|
package ru.mlokoin.gates.model.fs; |
||||||
|
|
||||||
|
import java.nio.file.Path; |
||||||
|
import java.nio.file.Paths; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Builder; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
|
||||||
|
/** |
||||||
|
* Метаданные объектов файловой системы (файлов и директорий) |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
@NoArgsConstructor |
||||||
|
@Data |
||||||
|
@Builder |
||||||
|
public class Metadata { |
||||||
|
/** |
||||||
|
* Идентификатор |
||||||
|
*/ |
||||||
|
private Long id; |
||||||
|
/** |
||||||
|
* Путь (полное) к объекту |
||||||
|
*/ |
||||||
|
private Path path; |
||||||
|
/** |
||||||
|
* Имя объекта |
||||||
|
*/ |
||||||
|
private String name; |
||||||
|
/** |
||||||
|
* Расширение объекта |
||||||
|
*/ |
||||||
|
private String extension; |
||||||
|
/** |
||||||
|
* Тип объекта (файл/директория) |
||||||
|
*/ |
||||||
|
private String type; |
||||||
|
/** |
||||||
|
* Размер объекта в байтах |
||||||
|
*/ |
||||||
|
private long size; |
||||||
|
/** |
||||||
|
* Время последнего изменения объекта |
||||||
|
*/ |
||||||
|
private long lastModified; |
||||||
|
|
||||||
|
public Metadata (Path path){ |
||||||
|
this.path = path; |
||||||
|
} |
||||||
|
|
||||||
|
public Metadata (Document doc){ |
||||||
|
this.name = doc.getName(); |
||||||
|
this.extension = doc.getExtension(); |
||||||
|
this.path = Paths.get(doc.getPath()); |
||||||
|
this.size = doc.getSize(); |
||||||
|
|
||||||
|
//this.type = doc.getType();
|
||||||
|
//this.lastModified = doc.getLastModified();
|
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.organization; |
||||||
|
|
||||||
import java.io.Serializable; |
import java.io.Serializable; |
||||||
|
|
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.organization; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
@ -1,8 +1,9 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.program; |
||||||
|
|
||||||
import lombok.AllArgsConstructor; |
import lombok.AllArgsConstructor; |
||||||
import lombok.Data; |
import lombok.Data; |
||||||
import lombok.NoArgsConstructor; |
import lombok.NoArgsConstructor; |
||||||
|
import ru.mlokoin.gates.model.cretarea.ProgramCretarea; |
||||||
|
|
||||||
@NoArgsConstructor |
@NoArgsConstructor |
||||||
@AllArgsConstructor |
@AllArgsConstructor |
@ -1,9 +1,10 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.program; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
||||||
|
|
||||||
import lombok.Data; |
import lombok.Data; |
||||||
|
import ru.mlokoin.gates.model.cretarea.ProgramCretarea; |
||||||
|
|
||||||
/** |
/** |
||||||
* Обертка для списка программ обучения - для thymeleaf |
* Обертка для списка программ обучения - для thymeleaf |
@ -1,4 +1,4 @@ |
|||||||
package ru.mlokoin.gates.model; |
package ru.mlokoin.gates.model.teacher; |
||||||
|
|
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
@ -0,0 +1,238 @@ |
|||||||
|
package ru.mlokoin.gates.repository; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Comparator; |
||||||
|
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; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
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.cretarea.ProgramCretarea; |
||||||
|
import ru.mlokoin.gates.model.fs.Document; |
||||||
|
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.program.Program; |
||||||
|
import ru.mlokoin.gates.model.teacher.Teacher; |
||||||
|
import ru.mlokoin.gates.teh.strings.Stringer; |
||||||
|
|
||||||
|
/** |
||||||
|
* API для работы с данными из хранилища |
||||||
|
* storage servise |
||||||
|
* resource service |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
public class Storage { |
||||||
|
private String storageLink = "http://storage-rs:8282/api/document/content/"; |
||||||
|
private String storageListLink = "http://resource-service-api:8181/storage-entry/list"; |
||||||
|
private String programsLink = "http://resource-service-api:8181/program/list"; |
||||||
|
private String buildingsLink = "http://resource-service-api:8181/building/list"; |
||||||
|
private String coursesLink = "http://resource-service-api:8181/course/list"; |
||||||
|
private String teachersLink = "http://resource-service-api:8181/teacher/list"; |
||||||
|
private String cretareasLink = "http://resource-service-api:8181/cretarea/list"; |
||||||
|
private String organizationsLink = "http://resource-service-api:8181/organization/list"; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private WebClient client; |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение списка документов, размещенных в файловом хранилище |
||||||
|
* @param id |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Document> getDocumentList() { |
||||||
|
System.out.println("Получение списка документов, размещенных в файловом хранилище ..."); |
||||||
|
return client.method(HttpMethod.GET) |
||||||
|
.uri(storageListLink) |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <List<Document>>(){}) |
||||||
|
.block(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение всего содержимого xlsx-файла из файлового хранилища |
||||||
|
* по id документа в хранилище |
||||||
|
* |
||||||
|
* @param id Идентфикатор файла |
||||||
|
* @return XlsxDocument Объект с данными xlsx файла |
||||||
|
*/ |
||||||
|
public XlsxDocument getXlsxDocument(String id) { |
||||||
|
System.out.println("Получение всего содержимого xlsx-файла ..."); |
||||||
|
return client.method(HttpMethod.GET) |
||||||
|
.uri(storageLink |
||||||
|
+ id + ".xlsx") |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <XlsxDocument>(){}) |
||||||
|
.block(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение перечня программ обучения из базы |
||||||
|
* @param id |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Program> getBasePrograms() { |
||||||
|
System.out.println("Получение перечня программ обучения из базы ..."); |
||||||
|
List<Program> list = client.method(HttpMethod.GET) |
||||||
|
.uri(programsLink) |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <List<Program>>(){}) |
||||||
|
.block(); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение перечня объектов строительства из базы |
||||||
|
* @param id |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Building> getBaseBuildings() { |
||||||
|
System.out.println("Получение перечня объектов строительства из базы ..."); |
||||||
|
List<Building> list = client.method(HttpMethod.GET) |
||||||
|
.uri(buildingsLink) |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <List<Building>>(){}) |
||||||
|
.block(); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение списка курсов из базы данных |
||||||
|
*/ |
||||||
|
public List<Course> getBaseCourse() { |
||||||
|
System.out.println("Получение списка курсов из базы данных ..."); |
||||||
|
List<Course> list = client.method(HttpMethod.GET) |
||||||
|
.uri(coursesLink) |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <List<Course>>(){}) |
||||||
|
.block(); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение перечня преподавателей из базы данных |
||||||
|
*/ |
||||||
|
public List<Teacher> getBaseTeachers() { |
||||||
|
System.out.println("Получение перечня преподавателей из базы данных ..."); |
||||||
|
List<Teacher> list = client.method(HttpMethod.GET) |
||||||
|
.uri(teachersLink) |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <List<Teacher>>(){}) |
||||||
|
.block(); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение перечня преподавателей из xlsx-файла |
||||||
|
* |
||||||
|
* @return <List<Teacher>> Перечень преподавателей, полученных из xlsx-файла |
||||||
|
* В объектах перечня незаполнены поля id |
||||||
|
* Объекты сформированы на основании ФИО преподавателя, указанного в xlsx-файле |
||||||
|
* |
||||||
|
*/ |
||||||
|
public List<Teacher> getXlsxTeachers(XlsxDocument xlsx) { |
||||||
|
System.out.println("Получение перечня преподавателей из xlsx-файла ..."); |
||||||
|
List<Teacher> list = new ArrayList<>(); |
||||||
|
// получаем данные в виде мапы строк
|
||||||
|
Map<Integer, List<XlsxCell>> map = xlsx.getData(); |
||||||
|
|
||||||
|
// удаляем строку заголовков
|
||||||
|
map.remove(0); |
||||||
|
|
||||||
|
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { |
||||||
|
String fio = Stringer.clear(entry |
||||||
|
.getValue() |
||||||
|
.get(18) |
||||||
|
.getContent()); |
||||||
|
list.add(new Teacher(fio)); |
||||||
|
} |
||||||
|
|
||||||
|
// удаляем дубликаты
|
||||||
|
Set <Teacher> set = new HashSet<>(list); |
||||||
|
list = new ArrayList<>(set); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение списка преподавателей, отсутствующих в базе данных (новых преподавателей) |
||||||
|
* |
||||||
|
* @param xlsxList список уникальных преподаватетей из файла |
||||||
|
* @param baseList список преподавателей из базы |
||||||
|
* @return List<Teacher> |
||||||
|
*/ |
||||||
|
public List<Teacher> getAbsentTeachers(List<Teacher> xlsxList, List<Teacher> baseList) { |
||||||
|
System.out.println("Получение списка преподавателей, отсутствующих в базе данных ..."); |
||||||
|
if (xlsxList == null || xlsxList.isEmpty()) { |
||||||
|
return new ArrayList<Teacher>(); |
||||||
|
} |
||||||
|
List<Teacher> result = new ArrayList<>(xlsxList); |
||||||
|
if (baseList == null || baseList.isEmpty()) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
for (Teacher xlsxTeacher : xlsxList) { |
||||||
|
for (Teacher baseTeacher : baseList) { |
||||||
|
if (xlsxTeacher.getFullName().equals(baseTeacher.getFullName())) { |
||||||
|
result.remove(xlsxTeacher); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Teacher> sortTeachers(List<Teacher> list) { |
||||||
|
System.out.println("Сортировка списка преподавателей ..."); |
||||||
|
Comparator<Teacher> compareBySecondName = Comparator |
||||||
|
.comparing(Teacher::getSecond_name) |
||||||
|
.thenComparing(Teacher::getFirst_name) |
||||||
|
.thenComparing(Teacher::getLast_name); |
||||||
|
return list.stream() |
||||||
|
.sorted(compareBySecondName) |
||||||
|
.collect(Collectors.toCollection(ArrayList::new)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Получение списка критериев из баз данных |
||||||
|
*/ |
||||||
|
public List<ProgramCretarea> getBaseCretareas() { |
||||||
|
System.out.println("Получение списка критериев из баз данных ..."); |
||||||
|
List<ProgramCretarea> list = client.method(HttpMethod.GET) |
||||||
|
.uri(cretareasLink) |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <List<ProgramCretarea>>(){}) |
||||||
|
.block(); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Получение списка организаций из базы данных |
||||||
|
*/ |
||||||
|
public List<Organization> getBaseOrganizations() { |
||||||
|
System.out.println("Получение списка организаций из базы данных ..."); |
||||||
|
List<Organization> list = client.method(HttpMethod.GET) |
||||||
|
.uri(organizationsLink) |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <List<Organization>>(){}) |
||||||
|
.block(); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue