esoe 4 months ago
parent
commit
0cd1b407e7
  1. 23
      gates/run.ps1
  2. 22
      gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java
  3. 302
      gates/src/main/java/ru/mlokoin/gates/controller/CourseController.java
  4. 5
      gates/src/main/java/ru/mlokoin/gates/controller/CretareaController.java
  5. 15
      gates/src/main/java/ru/mlokoin/gates/controller/GatesController.java
  6. 5
      gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java
  7. 5
      gates/src/main/java/ru/mlokoin/gates/controller/ProgramController.java
  8. 195
      gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java
  9. 197
      gates/src/main/java/ru/mlokoin/gates/model/Course.java
  10. 29
      gates/src/main/java/ru/mlokoin/gates/model/CourseWraper.java
  11. 123
      gates/src/main/java/ru/mlokoin/gates/model/Teacher.java
  12. 9
      gates/src/main/java/ru/mlokoin/gates/teh/fs/MpFile.java
  13. 49
      gates/src/main/java/ru/mlokoin/gates/teh/strings/Arrayer.java
  14. 16
      gates/src/main/java/ru/mlokoin/gates/teh/strings/Dater.java
  15. 237
      gates/src/main/java/ru/mlokoin/gates/teh/strings/Naimer.java
  16. 54
      gates/src/main/java/ru/mlokoin/gates/teh/strings/Stringer.java
  17. 6
      gates/src/main/resources/application.yaml
  18. 56
      gates/src/main/resources/templates/courses-check.html
  19. 44
      gates/src/main/resources/templates/teachers-check.html
  20. 75
      gates/src/main/resources/templates/view-as-educations.html
  21. 434
      gates/src/test/java/ru/mlokoin/gates/teh/strings/NaimerTest.java
  22. 61
      gates/src/test/java/ru/mlokoin/gates/teh/strings/StringerCheckForEmptyTest.java
  23. 7
      resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/entities/Teacher.java

23
gates/run.ps1

@ -0,0 +1,23 @@
$container_name = "gates"
$image_name = "gates"
$build_name = "gates"
$code_location = "C:\Users\devuser\Documents\code\tech-services\gates"
# Остановить и удалить существующий контейнер
docker stop $container_name
docker rm $container_name
# Удалить существующий образ
docker rmi $image_name
# Перейти в каталог с проектом
Set-Location $code_location
# Собрать jar с помощью Maven
mvn clean package
# Запустить контейнер с помощью docker-compose
docker-compose up
# Пауза скрипта
Pause

22
gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java

@ -25,6 +25,7 @@ import ru.mlokoin.gates.model.Building;
import ru.mlokoin.gates.model.BuildingWraper; import ru.mlokoin.gates.model.BuildingWraper;
import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxCell;
import ru.mlokoin.gates.model.XlsxDocument; import ru.mlokoin.gates.model.XlsxDocument;
import ru.mlokoin.gates.teh.strings.Stringer;
@Controller @Controller
@RequestMapping(path = "/buildings") @RequestMapping(path = "/buildings")
@ -48,19 +49,10 @@ public class BuildingController {
ArrayList<Building> xlsx_buildings = new ArrayList<>();//19 столбец ArrayList<Building> xlsx_buildings = new ArrayList<>();//19 столбец
Map<Integer, List<XlsxCell>> map = xlsx.getData(); Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
/** String string = Stringer.clear(entry.
* Обработка пустых строк
*/
String string = "";
try {
string = entry.
getValue(). getValue().
get(19). get(19).
getContent(); getContent());
} catch (Exception e){
System.out.println("Не указан объект строительства: " + entry.getKey() + " :: " + e.getMessage());
string = "-";
}
Building building = new Building(); Building building = new Building();
building.setName_short(string); building.setName_short(string);
@ -69,15 +61,7 @@ public class BuildingController {
xlsx_buildings.remove(0);//Удалили из списка заголовок xlsx_buildings.remove(0);//Удалили из списка заголовок
Set<Building> xlsx_buildingSet = Set.copyOf(xlsx_buildings);//удалили повторения Set<Building> xlsx_buildingSet = Set.copyOf(xlsx_buildings);//удалили повторения
//объекты строительства вконсоль ...
System.out.println("###############################");
System.out.println(">> Объекты строительства из файла: " + xlsx_buildingSet.size());
for (Building building : xlsx_buildingSet) {
System.out.println("Объект строительства (xlsx): " + building.getName_short());
}
//Ошибки в консоль //Ошибки в консоль
System.out.println("###############################");
System.out.println(">> errors: " + errors.size()); System.out.println(">> errors: " + errors.size());
for (String msg : errors) { for (String msg : errors) {
System.out.println("msg: " + msg); System.out.println("msg: " + msg);

302
gates/src/main/java/ru/mlokoin/gates/controller/CourseController.java

@ -3,8 +3,10 @@ package ru.mlokoin.gates.controller;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -23,11 +25,12 @@ import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import ru.mlokoin.gates.model.Building; import ru.mlokoin.gates.model.Building;
import ru.mlokoin.gates.model.Course; import ru.mlokoin.gates.model.Course;
import ru.mlokoin.gates.model.CourseWraper;
import ru.mlokoin.gates.model.Program; import ru.mlokoin.gates.model.Program;
import ru.mlokoin.gates.model.ProgramWraper;
import ru.mlokoin.gates.model.Teacher; import ru.mlokoin.gates.model.Teacher;
import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxCell;
import ru.mlokoin.gates.model.XlsxDocument; import ru.mlokoin.gates.model.XlsxDocument;
import ru.mlokoin.gates.teh.strings.Stringer;
@Controller @Controller
@RequestMapping(path = "/courses") @RequestMapping(path = "/courses")
@ -38,129 +41,146 @@ public class CourseController {
@GetMapping("/check/{id}") @GetMapping("/check/{id}")
public String checkCoursess(Model model, @PathVariable String id) { public String checkCoursess(Model model, @PathVariable String id) {
System.out.println("Проверка курсов, для внесения в базу ..."); System.out.println("Проверка курсов, для внесения в базу ...");
// создание списка ошибок
List<String> errors = new ArrayList<>();
// Получение списка преподавателей из базы json объект сериализуем в java файл
System.out.println("Получение перечня преподавателей из базы ...");
List<Teacher> teachers;
try {
teachers = client.method(HttpMethod.GET)
.uri("http://resource-service-api:8181/teacher/list")
.retrieve()
.bodyToMono(new ParameterizedTypeReference <List<Teacher>>(){})
.block();
} catch (Exception e) {
errors.add("Ошибка при получении списка преподавателей из базы :: " +e.getMessage());
System.out.println("Не удалось получить список преподавателей из базы: " + e.getMessage());
teachers = new ArrayList<>();
}
// получение списка программ обучения из базы, json объект сериализуем в java файл
System.out.println("Получение перечня программ обучения из базы ...");
List<Program> programs;
try {
programs = client.method(HttpMethod.GET)
.uri("http://resource-service-api:8181/program/list")
.retrieve()
.bodyToMono(new ParameterizedTypeReference <List<Program>>(){})
.block();
} catch (Exception e) {
errors.add("Ошибка при получении списка программ обучения из базы :: " +e.getMessage());
System.out.println("Не удалось получить список программ обучения из базы: " + e.getMessage());
programs = new ArrayList<>();
}
// получение списка объектов строительства из базы, json объект сериализуем в java файл
System.out.println("Получение перечня объектов строительства из базы ...");
List<Building> buildings;
try {
buildings = client.method(HttpMethod.GET)
.uri("http://resource-service-api:8181/building/list")
.retrieve()
.bodyToMono(new ParameterizedTypeReference <List<Building>>(){})
.block();
} catch (Exception e) {
errors.add("Ошибка при получении списка объектов строительства из базы :: " +e.getMessage());
System.out.println("Не удалось получить список объектов строительства из базы: " + e.getMessage());
buildings = new ArrayList<>();
}
// Получение данных файла в переменную xlsx, json объект сериализуем в java файл
System.out.println("Получение перечня курсов из xlsx-файла ..."); System.out.println("Получение перечня курсов из xlsx-файла ...");
//получение данных файла в переменную xlsx XlsxDocument xlsx;
XlsxDocument xlsx = client.method(HttpMethod.GET) try {
xlsx = client.method(HttpMethod.GET)
.uri("http://storage-rs:8282/api/document/content/" .uri("http://storage-rs:8282/api/document/content/"
+ id + ".xlsx") + id + ".xlsx")
.retrieve() .retrieve()
.bodyToMono(new ParameterizedTypeReference <XlsxDocument>(){}) .bodyToMono(new ParameterizedTypeReference <XlsxDocument>(){})
.block(); .block();
//список курсов из файла } catch (Exception e) {
List<Course> xlsx_courses = new ArrayList<>();//7 столбец errors.add("Ошибка при получении списка курсов из xlsx-файла :: " +e.getMessage());
System.out.println("Не удалось получить список курсов из xlsx-файла: " + e.getMessage());
xlsx = new XlsxDocument();
}
// Полчение курсов из xlsx
List<Course> xlsx_courses = new ArrayList<>();// 7 столбец
Map<Integer, List<XlsxCell>> map = xlsx.getData(); Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
Course course = new Course(); xlsx_courses.add(new Course((Entry<Integer, List<XlsxCell>>) entry, teachers, programs, buildings));
course.setPlace(entry
.getValue()
.get(5)
.getContent());
//Обработка даты начала обучения
course.setStart_date(
new Date(
Long.parseLong(
entry
.getValue()
.get(7)
.getContent())));
//Обработка даты создания протокола
course.setProtocol_date(
new Date(
Long.parseLong(
entry
.getValue()
.get(9)
.getContent())));
//Номер протокола
course.setProtocol_number(entry
.getValue()
.get(13)
.getContent());
//отчтный период
course.setReport_period(entry
.getValue()
.get(17)
.getContent());
//Извлекаем ФИО преподавателя
course.setTeacher(new Teacher(entry
.getValue()
.get(18)
.getContent()));
//извлекаем программу обучения
course.setProgram(new Program(entry
.getValue()
.get(6)
.getContent()));
course.setBuilding(new Building(entry
.getValue()
.get(19)
.getContent()));
xlsx_courses.add(course);
} }
xlsx_courses.remove(0);//Удалили из списка заголовок
Set<Course> xlsx_courseSet = Set.copyOf(xlsx_courses);//удалили повторения //Получение перечня курсов из базы
System.out.println("Получение списка курсов из базы ...");
//список номеров протоколов из файла в консоль List<Course> base_courses = client.method(HttpMethod.GET)
System.out.println("Список протоколов из файла:" + xlsx_courseSet.size()); .uri("http://resource-service-api:8181/course/list")
// Set<String> xlsx_stringSet = new HashSet<>(); .retrieve()
for (Course c : xlsx_courseSet) { .bodyToMono(new ParameterizedTypeReference <List<Course>>(){})
System.out.println(c.getProtocol_number() + " от " + c.getProtocol_date()); .block();
// xlsx_stringSet.add(c.);
//Удаляем повторяющиеся курсы
// List<Course> set = new ArrayList<>(xlsx_courses);
// Set<Course> set = new HashSet<>(xlsx_courses);
// List<Course> courses = new ArrayList<>(set);
System.out.println("Удаляем повторяющиеся курсы ...");
System.out.println("Количество курсов в xlsx_courses (list): " + xlsx_courses.size());
for (Course courseA : new ArrayList<>(xlsx_courses)) {
Boolean isExists = false;
for (Course courseB : new ArrayList<>(xlsx_courses)) {
if (Course.isSimilar(courseA, courseB) && !isExists) {
isExists = true;
} else {
if (Course.isSimilar(courseA, courseB) && isExists) {
xlsx_courses.remove(courseA);
}
}
}
}
System.out.println("Количество уникальных курсов в xlsx_courses (list): " + xlsx_courses.size());
System.out.println("Удаляем курсы уже учтенные в базе ...");
// System.out.println("Количество уникальных курсов в xlsx (set): " + set.size());
if (base_courses.size() > 0) {
System.out.println("Количество курсов в базе: " + base_courses.size());
for (Course b : base_courses) {
for (Course x : new ArrayList<>(xlsx_courses)) {
if (Course.isSimilar(b, x)) {
// System.out.println("Курс " + b.getProtocol_number() + " от " + b.getStart_date() + " повторяется в set");
xlsx_courses.remove(x);
}
else {
// System.out.println("Курс " + x.getProtocol_number() + " от " + x.getStart_date() + " не повторяется в базе");
}
}
}
System.out.println("Количество курсов для добавления в базу (xlsx_courses): " + xlsx_courses.size());
} }
// Set<Course> set = Set.copyOf(xlsx_courses);// Удалили повторения
// List<Course> courses = new ArrayList<>(set);
if (xlsx_courses.size() > 0) {
//Ограничиваем количество курсов, подлежащих передаче в wraper
System.out.println("Общее количество курсов для добавления в базу: " + xlsx_courses.size());
if (xlsx_courses.size() > 10) {
xlsx_courses = xlsx_courses.subList(0, 10);
}
//Создаем wraper для передачи в шаблон
CourseWraper wraper = new CourseWraper(xlsx_courses);
wraper.addPrograms(programs);
wraper.addBuildings(buildings);
wraper.addTeachers(teachers);
// //Получение перечня программ из базы //Передаем wraper в шаблон
// System.out.println("Получение списка программ из базы ..."); model.addAttribute("wrapCourses", wraper);
// List<Program> base_programs = client.method(HttpMethod.GET) model.addAttribute("errors", errors);
// .uri("http://resource-service-api:8181/program/list") return "courses-check";
// .retrieve() }
// .bodyToMono(new ParameterizedTypeReference <List<Program>>(){}) return "redirect:/document/view-as-educations/" + id;
// .block();
// Set<Program> base_programSet = Set.copyOf(base_programs);
// //Список наименований программ из базы
// System.out.println("Список уникальных наименований программ из базы:");
// Set<String> base_stringSet = new HashSet<>();
// for (Program pc : base_programSet) {
// System.out.println(pc.getName());
// base_stringSet.add(pc.getName());
// }
// //Удаление программ присутствующих в базе
// xlsx_stringSet.removeAll(base_stringSet);
// if (xlsx_stringSet.size() != 0) {
// //Подготовка списка, для передачи в представление
// ArrayList<Program> list = new ArrayList<>();
// for (String string : xlsx_stringSet) {
// Program pc = new Program();
// pc.setName(string);
// list.add(pc);
// }
// /**
// * Подготавлеваем обертку формы
// */
// // передаем список новых программ
// ProgramWraper pwraper = new ProgramWraper(list);
// //подготавливаем список критериев
// List<ProgramCretarea> base_cretareas = client.method(HttpMethod.GET)
// .uri("http://resource-service-api:8181/cretarea/list")
// .retrieve()
// .bodyToMono(new ParameterizedTypeReference <List<ProgramCretarea>>(){})
// .block();
// //передаем список критериев в обертку формы, для селекта
// pwraper.setCretareas(base_cretareas);
// //передаем обертку в модель
// model.addAttribute("wrapPrograms", pwraper);
// model.addAttribute("id", id);
// return "programs-check";
// }
return "courses-check";
// return "redirect:/document/view-as-educations/" + id;
} }
/** /**
@ -172,41 +192,39 @@ public class CourseController {
@PostMapping( @PostMapping(
path="/save/{id}", path="/save/{id}",
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = { produces = MediaType.APPLICATION_JSON_VALUE
MediaType.APPLICATION_JSON_VALUE )
}) public String saveCourses(Model model, @ModelAttribute("wrapCourses") CourseWraper wraper, @PathVariable String id){
public String savePrograms(@ModelAttribute("wrapPrograms") ProgramWraper wraper, @PathVariable String id){
/** /**
* Отправляем запросы на добавление новых программ в базу * Отправляем запросы на добавление новых курсов в базу
*/ */
System.out.println("Программы для добавления в базу: " List<String> errors = new ArrayList<>();
+ wraper.getPrograms().toString()); System.out.println("Отправляем запросы на добавление новых курсов в базу ...");
for (Program program : wraper.getPrograms()) { List<Course> courses = wraper.getCourses();
//Проверка наличия полного наименования имени программы System.out.println("Количество курсов для добавления в базу: " + courses.size());
if (!program.getName().equals("")) {
//проверка наличия длительности программы // TODO: добавить индексацию курсов
if (program.getLenght() != null) { // TODO: получить перечень не доставленных на добавление курсов
//проверка наличия направления обучения for (Course course : courses) {
if (!program.getStudy_direction().equals("")){ try{
//проверка наличия критерия client.post()
if (program.getCretarea() != null){ .uri("http://resource-service-api:8181/course/create")
client.post() .body(Mono.just(course), Course.class)
.uri("http://resource-service-api:8181/program/create") .retrieve()
.body(Mono.just(program), Program.class) .toBodilessEntity()
.retrieve() .timeout(Duration.ofSeconds(2))
.toBodilessEntity() .block();
.timeout(Duration.ofSeconds(1)) } catch (Exception e) {
.block(); errors.add("Не удалось добавить курс: " + course.toString() + " :: " + e.getMessage());
} System.out.println("Не удалось добавить курс: " + course.toString() + " :: " + e.getMessage());
}
}
} }
} }
model.addAttribute("errors", errors);
/** /**
* Возвращаем пользователя на страницу перечня новых критериев * Возвращаем пользователя на страницу перечня новых курсов
* - если он не пустой * - если он не пустой
*/ */
return "redirect:/programs/check/" + id; return "redirect:/courses/check/" + id;
} }
} }

5
gates/src/main/java/ru/mlokoin/gates/controller/CretareaController.java

@ -25,6 +25,7 @@ import ru.mlokoin.gates.model.ProgramCretarea;
import ru.mlokoin.gates.model.ProgramCretareaWraper; import ru.mlokoin.gates.model.ProgramCretareaWraper;
import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxCell;
import ru.mlokoin.gates.model.XlsxDocument; import ru.mlokoin.gates.model.XlsxDocument;
import ru.mlokoin.gates.teh.strings.Stringer;
/** /**
* Контроллер, для работы с критериями * Контроллер, для работы с критериями
@ -70,10 +71,10 @@ public class CretareaController {
Map<Integer, List<XlsxCell>> map = xlsx.getData(); Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
ProgramCretarea pc = new ProgramCretarea(); ProgramCretarea pc = new ProgramCretarea();
pc.setName_short(entry pc.setName_short(Stringer.clear(entry
.getValue() .getValue()
.get(12) .get(12)
.getContent()); .getContent()));
xlsx_cretareas.add(pc); xlsx_cretareas.add(pc);
} }
xlsx_cretareas.remove(0);//Удалили из списка заголовок "Критериий" xlsx_cretareas.remove(0);//Удалили из списка заголовок "Критериий"

15
gates/src/main/java/ru/mlokoin/gates/controller/GatesController.java

@ -21,7 +21,7 @@ import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import ru.mlokoin.gates.model.Document; import ru.mlokoin.gates.model.Document;
import ru.mlokoin.gates.model.XlsxDocument; import ru.mlokoin.gates.model.XlsxDocument;
import ru.mlokoin.gates.util.CustomMultipartFile; import ru.mlokoin.gates.teh.fs.MpFile;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -52,10 +52,10 @@ public class GatesController {
.bodyToMono(new ParameterizedTypeReference <List<Document>>(){}) .bodyToMono(new ParameterizedTypeReference <List<Document>>(){})
.block(); .block();
// Add the list of documents to the model // Добавление списка документов в модель
model.addAttribute("documents", docs); model.addAttribute("documents", docs);
// Return the view name "documents" // Возвращение ползователю обновленной страницы "documents"
return "documents"; return "documents";
} }
@ -109,7 +109,7 @@ public class GatesController {
MultipartBodyBuilder builder = new MultipartBodyBuilder(); MultipartBodyBuilder builder = new MultipartBodyBuilder();
Boolean ok; Boolean ok;
MultipartFile out = new CustomMultipartFile(file, doc.getId()+"." + doc.getExtension()); MultipartFile out = new MpFile(file, doc.getId()+"." + doc.getExtension());
builder.part("file", out.getResource()); builder.part("file", out.getResource());
ok = client.method(HttpMethod.POST) ok = client.method(HttpMethod.POST)
@ -187,10 +187,11 @@ public class GatesController {
// Delete the file from the storage // Delete the file from the storage
String filename = id + "." + doc.getExtension(); String filename = id + "." + doc.getExtension();
String prefix = "http://storage-rs:8282/api/document/"; String prefix = "http://storage-rs:8282/api/document/";
String postfix = "/delete"; String postfix = "delete/";
URI uri; URI uri;
try { try {
uri = new URI(prefix + filename + postfix); // uri = new URI(prefix + filename + postfix);
uri = new URI(prefix + postfix + filename);
client.method(HttpMethod.DELETE) client.method(HttpMethod.DELETE)
.uri(uri) .uri(uri)
.retrieve() .retrieve()
@ -246,7 +247,7 @@ public class GatesController {
// Добавление файла в файловое хранилище // Добавление файла в файловое хранилище
MultipartBodyBuilder builder = new MultipartBodyBuilder(); MultipartBodyBuilder builder = new MultipartBodyBuilder();
Boolean ok; Boolean ok;
MultipartFile out = new CustomMultipartFile(file, doc.getId()+"." + doc.getExtension()); MultipartFile out = new MpFile(file, doc.getId()+"." + doc.getExtension());
builder.part("file", out.getResource()); builder.part("file", out.getResource());
ok = client.method(HttpMethod.POST) ok = client.method(HttpMethod.POST)

5
gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java

@ -27,6 +27,7 @@ import ru.mlokoin.gates.model.Organization;
import ru.mlokoin.gates.model.OrganizationWraper; import ru.mlokoin.gates.model.OrganizationWraper;
import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxCell;
import ru.mlokoin.gates.model.XlsxDocument; import ru.mlokoin.gates.model.XlsxDocument;
import ru.mlokoin.gates.teh.strings.Stringer;
@Controller @Controller
@RequestMapping(path = "/organizations") @RequestMapping(path = "/organizations")
@ -57,10 +58,10 @@ public class OrganizationController {
*/ */
String string = ""; String string = "";
try { try {
string = entry. string = Stringer.clear(entry.
getValue(). getValue().
get(1). get(1).
getContent(); getContent());
} catch (Exception e){ } catch (Exception e){
System.out.println("Не указан объект строительства: " + entry.getKey() + " :: " + e.getMessage()); System.out.println("Не указан объект строительства: " + entry.getKey() + " :: " + e.getMessage());
string = "-"; string = "-";

5
gates/src/main/java/ru/mlokoin/gates/controller/ProgramController.java

@ -26,6 +26,7 @@ import ru.mlokoin.gates.model.ProgramCretarea;
import ru.mlokoin.gates.model.ProgramWraper; import ru.mlokoin.gates.model.ProgramWraper;
import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxCell;
import ru.mlokoin.gates.model.XlsxDocument; import ru.mlokoin.gates.model.XlsxDocument;
import ru.mlokoin.gates.teh.strings.Stringer;
@Controller @Controller
@RequestMapping(path = "/programs") @RequestMapping(path = "/programs")
@ -55,10 +56,10 @@ public class ProgramController {
Map<Integer, List<XlsxCell>> map = xlsx.getData(); Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
Program programm = new Program(); Program programm = new Program();
programm.setName(entry programm.setName(Stringer.clear(entry
.getValue() .getValue()
.get(6) .get(6)
.getContent()); .getContent()));
xlsx_programs.add(programm); xlsx_programs.add(programm);
} }
xlsx_programs.remove(0);//Удалили из списка заголовок xlsx_programs.remove(0);//Удалили из списка заголовок

195
gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java

@ -6,7 +6,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
@ -22,8 +21,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import ru.mlokoin.gates.model.ProgramCretarea;
import ru.mlokoin.gates.model.ProgramCretareaWraper;
import ru.mlokoin.gates.model.Teacher; import ru.mlokoin.gates.model.Teacher;
import ru.mlokoin.gates.model.TeacherWraper; import ru.mlokoin.gates.model.TeacherWraper;
import ru.mlokoin.gates.model.XlsxCell; import ru.mlokoin.gates.model.XlsxCell;
@ -35,10 +32,20 @@ public class TeacherController {
@Autowired @Autowired
private WebClient client; private WebClient client;
/**
* Проверка преподавателей
* @param model
* @param id
* @return
*/
@GetMapping("/check/{id}") @GetMapping("/check/{id}")
public String checkTeachers(Model model, @PathVariable String id) { public String checkTeachers(Model model, @PathVariable String id) {
List<String> errors = new ArrayList<>();//список ошибок
System.out.println("Проверка преподавателей, для внесения в базу ..."); System.out.println("Проверка преподавателей, для внесения в базу ...");
//список ошибок
List<String> errors = new ArrayList<>();
//Запрашиваем данные файла из хранилища
System.out.println("Получение перечня преподавателей из xlsx-файла ..."); System.out.println("Получение перечня преподавателей из xlsx-файла ...");
XlsxDocument xlsx = client.method(HttpMethod.GET) XlsxDocument xlsx = client.method(HttpMethod.GET)
.uri("http://storage-rs:8282/api/document/content/" .uri("http://storage-rs:8282/api/document/content/"
@ -46,42 +53,29 @@ public class TeacherController {
.retrieve() .retrieve()
.bodyToMono(new ParameterizedTypeReference <XlsxDocument>(){}) .bodyToMono(new ParameterizedTypeReference <XlsxDocument>(){})
.block(); .block();
//список преподавателей из файла
// ArrayList<Teacher> xlsx_teachers = new ArrayList<>();//18 столбец // получаем данные в виде мапы строк
Map<Integer, List<XlsxCell>> map = xlsx.getData(); Map<Integer, List<XlsxCell>> map = xlsx.getData();
/** // удаляем строку заголовков
* удалили строку заголовков
*/
map.remove(0); map.remove(0);
System.out.println("Количество записей: " + map.size()); System.out.println("Количество записей: " + map.size());
/**
* что делать с пустыми строками???
* - "- - -"
* - Указано два преподавателя (оставляем только первого)
* - Указан формат обучения "дистанционно" (удаляем)
* - Теоретически могут быть окончания "-угли, -оглы и т.д. ..." (писать через пробел чтобы отсутствовал сохранить исходное состояние)
*/
Set<String> xlsx_strings = new HashSet<>();//строки для браузера Set<String> xlsx_strings = new HashSet<>();//строки для браузера
Set<Teacher> xlsx_teachers = new HashSet<>();//объекты для обработки Set<Teacher> xlsx_teachers = new HashSet<>();//объекты для обработки
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
//перебираем мапу
/** for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
* получаем значение поля "Преподаватель" // получаем значение поля "Преподаватель", заменяем пустые поля на слово "Нет"
* заменяем пустые поля на "- - -" // пустые сроки не выводятся браузром, нет смысла туда передавать пустые объекты
* добавляем запись в список уникальных значений
*/
String string = ""; String string = "";
try { try {
string = entry string = entry
.getValue() .getValue()
.get(18) .get(18)
.getContent(); .getContent();
} catch (Exception e) { } catch (Exception e) {
System.out.println("Не указан преподаватель: " + entry.getKey() + " :: " + e.getMessage()); string = "Нет";
string = "- - -";
} }
/** /**
@ -90,58 +84,79 @@ public class TeacherController {
* - разбор строк происходит в основном переборе, чтобы можно было извлечь номер строки с ошибками для пользователя * - разбор строк происходит в основном переборе, чтобы можно было извлечь номер строки с ошибками для пользователя
*/ */
Teacher t = new Teacher(); Teacher t = new Teacher();
String[] arr = string.split(" "); // проверка на пустую строку
for (int i = 0; i < arr.length; i++){ if (string.equals("") |
switch (i) { (string == null) |
case 0: { (string.isEmpty()) |
if (arr.length > 1){ (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]);//Фамилия t.setSecond_name(arr[i]);//Фамилия
break; break;
} }
t.setSecond_name("-");//Фамилия case 1: {
t.setFirst_name("-");//Имя //если строка состоит из двух слов, то возможна ошибка
t.setLast_name("-");//Отчество if (arr.length == 2){
errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано одно слово ... " + string); t.setFirst_name(arr[i]);//второе слово - имя
break; t.setLast_name("");//третье слово - Отчество
} errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано два слова ... " + string);
case 1: { break;
t.setFirst_name(arr[i]);//Имя }
break; t.setFirst_name(arr[i]);//Имя
} break;
case 2: { }
t.setLast_name(arr[i]);//Отчество case 2: {
break; //если строка состоит из трех слов, то ошибка не добавляется
} if (arr.length == 3){
/** t.setLast_name(arr[i]);//третье слово - Отчество
* Обработка четвертого слова в строке break;
* Преподавателей, имеющих окончания в фамилии у нас нет. }
* можно все что после 3-го слова откинуть .. t.setLast_name(arr[i]);//Отчество
* break;
*/ }
case 3: { case 3: {
// t.setLast_name(arr[(i-1)] + " " + arr[i]);//Окончание отчества - оглы, угли итд. //если строка содержит четыре и больше слов
errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано больше трех слов ... " + string); t.setLast_name(t.getLast_name() + " " + arr[i]);//допишем в поле Отчество все последующие слова
break; errors.add("Возможна ошибка в строке документа: " + entry.getKey() + " :: В поле *Преподаватель* указано больше трех слов ... " + string);
// System.out.println("Отчество из xlsx-файла (4 больше слов): " + t.getLast_name());
break;
}
default:
break;
} }
default:
break;
} }
} }
xlsx_strings.add(string); xlsx_strings.add(string);
xlsx_teachers.add(t); xlsx_teachers.add(t);
} }
/**
* Промежуточные результаты в консоль // Промежуточные результаты разбора данных xlsx в консоль
*/
System.out.println("Всего преподавателей(obj): " + xlsx_teachers.size()); System.out.println("Всего преподавателей(obj): " + xlsx_teachers.size());
System.out.println("Всего преподавателей(str): " + xlsx_strings.size()); System.out.println("Всего преподавателей(str): " + xlsx_strings.size());
for (Teacher teacher : xlsx_teachers) {
System.out.println("Преподаватель (obj): " + teacher.toString());
}
System.out.println(">> errors: " + errors.size()); System.out.println(">> errors: " + errors.size());
for (String msg : errors) {
System.out.println("msg: " + msg);
}
/** /**
* Получение перечня преподавателей из базы * Получение перечня преподавателей из базы
@ -161,25 +176,32 @@ public class TeacherController {
* - перевожу ФИО в строку и сравниваю строки!!! * - перевожу ФИО в строку и сравниваю строки!!!
*/ */
// xlsx_teachers.removeAll(base_teachers); // xlsx_teachers.removeAll(base_teachers);
Set<String> xlsx_teachers_str = new HashSet<>(); Set<String> xlsx_teachers_str = xlsx_strings;
Set<String> base_teachers_str = new HashSet<>(); Set<String> base_teachers_str = new HashSet<>();
for (Teacher t : xlsx_teachers) { // for (Teacher t : xlsx_teachers) {
String s = t.getSecond_name() + " " // String s = t.getSecond_name() + " "
+ t.getFirst_name() + " " // + t.getFirst_name() + " "
+ t.getLast_name(); // + t.getLast_name();
xlsx_teachers_str.add(s); // xlsx_teachers_str.add(s);
} // }
for (Teacher t : base_teachers) { for (Teacher t : base_teachers) {
String s = t.getSecond_name() + " " StringBuilder sb = new StringBuilder();
+ t.getFirst_name() + " "
+ t.getLast_name(); sb.append(t.getSecond_name());
base_teachers_str.add(s); 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); xlsx_teachers_str.removeAll(base_teachers_str);
/** /**
* Если какието преподаватели отсутствуют в базе, * Если какието преподаватели отсутствуют в базе,
* вернуть страницу проверки преподавателей * вернуть страницу проверки преподавателей
@ -192,7 +214,7 @@ public class TeacherController {
ArrayList<Teacher> list = new ArrayList<>(); ArrayList<Teacher> list = new ArrayList<>();
for (String string : xlsx_teachers_str) { for (String string : xlsx_teachers_str) {
Teacher t = new Teacher(); Teacher t = new Teacher();
String[] arr = string.split(" "); String[] arr = string.split(" ", 4);
for (int i = 0; i < arr.length; i++){ for (int i = 0; i < arr.length; i++){
switch (i) { switch (i) {
case 0: { case 0: {
@ -207,12 +229,15 @@ public class TeacherController {
t.setLast_name(arr[i]);//Отчество t.setLast_name(arr[i]);//Отчество
break; break;
} }
case 3: {
t.setLast_name(t.getLast_name() + " " + arr[i]);//Отчество c остальными дописками
break;
}
default: default:
break; break;
} }
} }
list.add(t); list.add(t);
} }
//кладем список в обертку для формы //кладем список в обертку для формы
@ -249,15 +274,15 @@ public class TeacherController {
for (Teacher teacher : wraper.getList()) { for (Teacher teacher : wraper.getList()) {
//Проверка наличия флага для добавления в базу //Проверка наличия флага для добавления в базу
//по полю табельного номера //по полю табельного номера
if (teacher.getEmployee_id() != ""){ // if (teacher.getEmployee_id() != ""){
client.post() client.post()
.uri("http://resource-service-api:8181/teacher/create") .uri("http://resource-service-api:8181/teacher/create")
.body(Mono.just(teacher), Teacher.class) .body(Mono.just(teacher), Teacher.class)
.retrieve() .retrieve()
.toBodilessEntity() .toBodilessEntity()
.timeout(Duration.ofSeconds(1)) .timeout(Duration.ofSeconds(2))
.block(); .block();
} // }
} }
/** /**
* Возвращаем пользователя на страницу перечня новых критериев * Возвращаем пользователя на страницу перечня новых критериев

197
gates/src/main/java/ru/mlokoin/gates/model/Course.java

@ -1,14 +1,23 @@
package ru.mlokoin.gates.model; package ru.mlokoin.gates.model;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import ru.mlokoin.gates.teh.strings.Stringer;
/**
* Сущность курса
* TODO: предусмотреть метод сравнения курсов, без учета id
*/
@Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Data
public class Course { public class Course {
private long id;//уникальный идентификатор курса private long id;//уникальный идентификатор курса
private String place;//место проведения занятий private String place;//место проведения занятий
@ -18,7 +27,7 @@ public class Course {
private String report_period;//отчетный период (наименование месяца) private String report_period;//отчетный период (наименование месяца)
private Teacher teacher;//сведения о преподаватле private Teacher teacher;//сведения о преподаватле
private Program program;//сведения о программе обучения private Program program;//сведения о программе обучения
private Building building;//сведения об объекте строительства private Building building;//сведения об объекте строиbernate
/** /**
* Конструктор без id * Конструктор без id
@ -42,4 +51,188 @@ public class Course {
this.program = program; this.program = program;
this.building = building; this.building = building;
} }
/**
* Консруктор курса из строки xlsx документа
* @param entry
*/
public Course (Map.Entry<Integer, List<XlsxCell>> entry, List<Teacher> base_teachers, List<Program> base_programs, List<Building> base_buildings) {
// исключаем строку заголовка
if (entry.getKey() != 0) {
try {
// Извлекаем место проведения занятий из xlsx, очищаем данные
String place = Stringer.clear(entry
.getValue()
.get(5)
.getContent());
// очищенные данные ячейки пишем в модель
this.setPlace(place);
} catch (Exception e) {
// Не корректно место проведения занятий
System.out.println("Не корректно указано место проведения занятий: " + entry.getKey() + " :: " + e.getMessage());
}
try{
// Обработка даты начала обучения
// Преобразуем данные ячейки в дату, для передачи в модель
// Возможна ошибка при преобразовании, которая прервет итерацию цикла и остальные ячейки не будут обработаны
Date startDate = new Date(
Long.parseLong( entry
.getValue()
.get(7)
.getContent()));
this.setStart_date(startDate);
// System.out.println("startDate: " + startDate);
} catch (Exception e) {
System.out.println("Не корректно указана дата начала обучения: " + entry.getKey() + " :: " + e.getMessage());
// course.setStart_date(new Date());
}
try {
// Обработка даты создания протокола
// Пробразуем данные ячейки в дату, для передачи в модель
// Возможна ошибка при преобразовании, которая прервет итерацию цикла и остальные ячейки не будут обработаны
Date protocolDate = new Date(
Long.parseLong(
entry
.getValue()
.get(9)
.getContent()));
this.setProtocol_date(protocolDate);
} catch (Exception e) {
System.out.println("Не корректна дата создания протокола: " + entry.getKey() + " :: " + e.getMessage());
}
try {
//номер протокола
String protocolNumber = Stringer.clear(entry
.getValue()
.get(13)
.getContent());
this.setProtocol_number(protocolNumber);
} catch (Exception e) {
System.out.println("Не корректен номер протокола: " + entry.getKey() + " :: " + e.getMessage());
}
try {
//отчетный период
this.setReport_period(Stringer.clear(entry
.getValue()
.get(17)
.getContent()));
} catch (Exception e) {
System.out.println("Не корректно указан отчетный период: " + entry.getKey() + " :: " + e.getMessage());
}
// Извлекаем ФИО преподавателя
// создаем не нового преподавателя, а передаем данные из базы
// Получаем ФИО преподавателя из xlsx
String fio = Stringer.clear(entry
.getValue()
.get(18)
.getContent());
// Создаем нового преподавателя по данным из xlsx
Teacher cut = new Teacher(fio);
// Ищем преподавателя в списке из базы, передаем объект в курс
try {
for (Teacher t : base_teachers) {
t.clear();
// сравниваем преподавателя из xlsx с преподавателем из базы по ФИО
if (t.getSecond_name().equals(cut.getSecond_name())
&& t.getFirst_name().equals(cut.getFirst_name())
&& t.getLast_name().equals(cut.getLast_name())) {
this.setTeacher(t);
break;
}
}
} catch (Exception e) {
System.out.println("Не корректно указан преподаватель: " + entry.getKey() + " :: " + e.getMessage());
}
// Извлекаем программу обучения
String program = Stringer.clear(entry.getValue()
.get(6)
.getContent());
try{
for (Program p : base_programs) {
String bp = Stringer.clear(p.getName());
if (bp.equals(program)) {
// System.out.println("Найдена программа обучения: " + program);
this.setProgram(p);
break;
}
else {
//course.setProgram(new Program(program));
}
}
} catch (Exception e) {
System.out.println("Не корректно указана программа обучения: " + entry.getKey() + " :: " + e.getMessage());
}
// Извлекаем объект строительства
String building = Stringer.clear(entry
.getValue()
.get(19)
.getContent());
try {
for (Building b : base_buildings) {
if (b.getName_short().equals(building)) {
this.setBuilding(b);
break;
}
}
} catch (Exception e) {
}
}
}
/**
* Проверка тождественности курсов
* сравнение происходит по полям
* - place
* - start_date
* - protocol_date
* - protocol_number
* - report_period
* - teacher
* - program
* - building
*
* @param course1
* @param course2
* @return true - если курсы эквивалентны
* false - если курсы различаются
*/
public static boolean isSimilar(Course course1, Course course2) {
if (course1 == null || course2 == null) {
System.out.println("Course is null");
return false;
}
// if (course1.getPlace() != course2.getPlace()) {
// return false;
// }
// if (course1.getStart_date() != course2.getStart_date()) {
// return false;
// }
// if (course1.getProtocol_date() != course2.getProtocol_date()) {
// return false;
// }
if (course1.getProtocol_number() != course2.getProtocol_number()) {
return false;
}
// if (course1.getReport_period() != course2.getReport_period()) {
// return false;
// }
// if (course1.getTeacher() != course2.getTeacher()) {
// return false;
// }
// if (course1.getProgram() != course2.getProgram()) {
// return false;
// }
// if (course1.getBuilding() != course2.getBuilding()) {
// return false;
// }
return true;
}
} }

29
gates/src/main/java/ru/mlokoin/gates/model/CourseWraper.java

@ -7,20 +7,24 @@ import lombok.Data;
@Data @Data
public class CourseWraper { public class CourseWraper {
List<Course> courses; public List<Course> courses;
List<Program> programs; public List<Program> programs;
List<Building> buildings; public List<Building> buildings;
List<Teacher> teachers; public List<Teacher> teachers;
public CourseWraper(){ public CourseWraper(){
init(); init();
} }
public CourseWraper(List<Course> list) { public CourseWraper(List<Course> list) {
this.init();
this.courses = list; this.courses = list;
} }
public void init(){ public void init(){
this.courses = new ArrayList<>(); this.courses = new ArrayList<>();
this.programs = new ArrayList<>();
this.buildings = new ArrayList<>();
this.teachers = new ArrayList<>();
} }
public void addCourse(Course course){ public void addCourse(Course course){
@ -31,13 +35,30 @@ public class CourseWraper {
this.programs.add(program); this.programs.add(program);
} }
public void addPrograms(List<Program> programs){
for (Program program : programs) {
this.addProgram(program);
}
}
public void addBuilding(Building building){ public void addBuilding(Building building){
this.buildings.add(building); this.buildings.add(building);
} }
public void addBuildings(List<Building> buildings){
for (Building building : buildings) {
this.addBuilding(building);
}
}
public void addTeacher(Teacher teacher){ public void addTeacher(Teacher teacher){
this.teachers.add(teacher); this.teachers.add(teacher);
} }
public void addTeachers(List<Teacher> teachers){
for (Teacher teacher : teachers) {
this.addTeacher(teacher);
}
}
public String toString(){ public String toString(){
return this.courses.toString(); return this.courses.toString();

123
gates/src/main/java/ru/mlokoin/gates/model/Teacher.java

@ -5,6 +5,8 @@ import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import ru.mlokoin.gates.teh.strings.Naimer;
import ru.mlokoin.gates.teh.strings.Stringer;
/** /**
* Сущьность преподавателя * Сущьность преподавателя
@ -26,59 +28,94 @@ public class Teacher implements Serializable{
private String employee_id; private String employee_id;
private String snils; private String snils;
// подготовить конструкторы на все варианты внесения информации о преподавателях /**
* Создание объекта преподаватель из строк ФИО
* -
*
* @param first_name
* @param second_name
* @param last_name
*/
public Teacher(String first_name, String second_name, String last_name){ public Teacher(String first_name, String second_name, String last_name){
this.first_name = first_name; this.second_name = Naimer.getNameOf(second_name);
this.second_name = second_name; this.first_name = Naimer.getNameOf(first_name);
this.last_name = last_name; this.last_name = Naimer.getNameOf(last_name);
} }
//конструктор - все аргуметы кроме id /**
public Teacher(String first_name, String second_name, String last_name, String employee_id, String snils){ * Создание объекта преподаватель из строки ФИО
this.first_name = first_name; * @param full_name
this.second_name = second_name; */
this.last_name = last_name; public Teacher(String fio){
this.employee_id = employee_id; this.second_name = Naimer.getSecondNameOf(fio);
this.snils = snils; this.first_name = Naimer.getFirstNameOf(fio);
this.last_name = Naimer.getLastNameOf(fio);
} }
/** /**
* Создание объекта преподаватель из строки ФИО * получение ФИО преподавателя одной строкой, собранной из полей класса
* - отсутствует обработка четвертого слова (оглы, угли итд ... )
* - если только одно слово, заменяется на "- - -"
* - если пустая строка, заменяется на "- - -"
* *
* @param full_name * @return String fio
*/ */
public Teacher(String full_name){ public String getFullName(){
String[] arr = full_name.split(" "); StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++){
switch (i) { // Добавление фамилии
case 0: { if (!Stringer.checkForEmpty(getSecond_name())) {
if (arr.length > 1){ sb.append(getSecond_name() + " ");
setSecond_name(arr[i]);//Фамилия } else {
break; sb.append("Нет ");
} }
setSecond_name("-");//Фамилия
setFirst_name("-");//Имя // Добавление имени
setLast_name("-");//Отчество if (!Stringer.checkForEmpty(getFirst_name())) {
break; sb.append(getFirst_name() + " ");
} } else {
case 1: { sb.append("Нет ");
setFirst_name(arr[i]);//Имя }
break;
} // Добавление отчестваы
case 2: { if (Stringer.checkForEmpty(getLast_name())) {
setLast_name(arr[i]);//Отчество sb.append(getLast_name());
break; } else {
} sb.append("Нет");
}
} }
// Удалить лишние пробелы в результате
String fio = Stringer.clear(sb.toString());
return fio;
} }
public String getFullName(){ /**
return getSecond_name() + " " + * очистка текстовых данных хранящихся в объекте
getFirst_name() + " " + * от излишних пробельных символов
getLast_name(); * от NULL значений
*/
public void clear(){
if (Stringer.checkForEmpty(second_name)) {
second_name = "Нет";
} else {
second_name = Stringer.clear(second_name);
}
if (Stringer.checkForEmpty(first_name)) {
first_name = "Нет";
} else {
first_name = Stringer.clear(first_name);
}
if (Stringer.checkForEmpty(last_name)) {
last_name = "Нет";
} else {
last_name = Stringer.clear(last_name);
}
if (Stringer.checkForEmpty(snils)) {
snils = "Нет";
} else {
snils = Stringer.clear(snils);
}
if (Stringer.checkForEmpty(employee_id)) {
employee_id = "Нет";
} else {
employee_id = Stringer.clear(employee_id);
}
} }
} }

9
gates/src/main/java/ru/mlokoin/gates/util/CustomMultipartFile.java → gates/src/main/java/ru/mlokoin/gates/teh/fs/MpFile.java

@ -1,4 +1,4 @@
package ru.mlokoin.gates.util; package ru.mlokoin.gates.teh.fs;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -8,7 +8,10 @@ import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
public class CustomMultipartFile implements MultipartFile{ /**
* Переопределены методы MultipartFile
*/
public class MpFile implements MultipartFile{
private MultipartFile file; private MultipartFile file;
private String name; private String name;
@ -16,7 +19,7 @@ public class CustomMultipartFile implements MultipartFile{
* @param file * @param file
* @param name * @param name
*/ */
public CustomMultipartFile(MultipartFile file, String name) { public MpFile(MultipartFile file, String name) {
this.file = file; this.file = file;
this.name = name; this.name = name;
} }

49
gates/src/main/java/ru/mlokoin/gates/teh/strings/Arrayer.java

@ -0,0 +1,49 @@
package ru.mlokoin.gates.teh.strings;
import java.util.List;
public class Arrayer {
/**
* Удаляет все пустые строки из массива строк и возвращает новый массив с оставшимися строками.
*
* @param strings Массив строк из которогу удаляются пустые строки.
* @return Новый массив с оставшимися строками.
*/
public static String[] removeEmptyStrings(String[] strings) {
// Подсчет количества непустых строк в входном массиве
int count = 0;
for (String string : strings) {
if (!string.equals("")) {
count++;
}
}
// Новый массив для хранения непустых строк
String[] result = new String[count];
// Копирование непустых строк из входного массива в новый массив
int index = 0;
for (String string : strings) {
if (!string.equals("")) {
result[index] = string;
index++;
}
}
// Возвращение нового массива с непустыми строками
return result;
}
/**
* Удаление повторяющихся элементов списка строк
* Получение списка уникальных строк
*
*/
public static List<String> uniqueList(List<String> list) {
// Удаление повторяющихся элементов списка
List<String> result = list.stream().distinct().toList();
return result;
}
}

16
gates/src/main/java/ru/mlokoin/gates/teh/strings/Dater.java

@ -0,0 +1,16 @@
package ru.mlokoin.gates.teh.strings;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
/**
* Обработка строк с датами
*/
public class Dater {
private Long longDate;
private String stringDate;
private Date date;
private LocalDate localDate;
private LocalDateTime localDateTime;
}

237
gates/src/main/java/ru/mlokoin/gates/teh/strings/Naimer.java

@ -0,0 +1,237 @@
package ru.mlokoin.gates.teh.strings;
import ru.mlokoin.gates.model.Teacher;
/**
* Обработка строк, содержащих сведения о ФИО
* - Teacher
* - Student
* - Person
*/
public class Naimer {
private static String not = "Нет";
/**
* Объединяет фамилию, имя и отчество в одну строку.
* Возможые ситуации:
* - фамилия, имя или отчество могут содержать нулевые значения
* - отчество может содержать приписки
*
* @param second_name - фамилия
* @param first_name - имя
* @param last_name - отчество
* @return объединенную строку или пустую строку,
* если все входящие параметры являются нулевыми значениями
*/
public static String getFioOf(String second_name, String first_name, String last_name) {
// Инициализируем StringBuilder для хранения результата.
StringBuilder result = new StringBuilder();
// Проверяем, является ли фамилия нулевым значением.
if (!Stringer.checkForEmpty(second_name)) {
// Если фамилия не является нулевым значением, то добавляем ее в строку.
result.append(second_name);
} else {
// Если фамилия является нулевым значением, то добавляем "Нет" в строку.
result.append(not);
}
// Проверяем, является ли имя нулевым значением.
if (!Stringer.checkForEmpty(first_name)) {
// Если имя не является нулевым значением, то добавляем пробел и имя в строку.
result.append(" " + first_name);
} else {
// Если имя является нулевым значением, то добавляем "Нет" в строку.
result.append(" " + not);
}
// Проверяем, является ли отчество нулевым значением.
if (!Stringer.checkForEmpty(last_name)) {
// Если отчество не является нулевым значением, то добавляем пробел и отчество в строку.
result.append(" " + last_name);
} else {
// Если отчество является нулевым значением, то добавляем "Нет" в строку.
result.append(" " + not);
}
// Возвращаем объединенную строку или строку "Нет Нет Нет",
//если все входящие параметры являются нулевыми значениями.
return result.toString().trim();
}
/**
* Объединяет фамилию, имя и отчество из объекта преподавателя в одну строку.
* Возможные ситуации:
* - фамилия, имя или отчество могут содержать нулевые значения
* - отчество может содержать приписки
*
* @param teacher - объект преподавателя
* @return объединенная строка или строка "Нет Нет Нет",
* если все входящие параметры являются нулевыми значениями
*/
public static String getFioOf(Teacher teacher) {
// Инициализируем StringBuilder для хранения результата.
StringBuilder result = new StringBuilder();
// Проверяем, является ли фамилия нулевым значением.
if (!Stringer.checkForEmpty(teacher.getSecond_name())) {
// Если фамилия не является нулевым значением, то добавляем ее в строку.
result.append(teacher.getSecond_name());
} else {
// Если фамилия является нулевым значением, то добавляем "Нет" в строку.
result.append(not);
}
// Проверяем, является ли имя нулевым значением.
if (!Stringer.checkForEmpty(teacher.getFirst_name())) {
// Если имя не является нулевым значением, то добавляем пробел и имя в строку.
result.append(" " + teacher.getFirst_name());
} else {
// Если имя является нулевым значением, то добавляем "Нет" в строку.
result.append(" " + not);
}
// Проверяем, является ли отчество нулевым значением.
if (!Stringer.checkForEmpty(teacher.getLast_name())) {
// Если отчество не является нулевым значением, то добавляем пробел и отчество в строку.
result.append(" " + teacher.getLast_name());
} else {
// Если отчество является нулевым значением, то добавляем "Нет" в строку.
result.append(" " + not);
}
// Возвращаем объединенную строку или строку "Нет Нет Нет", если все входящие параметры
// являются нулевыми значениями.
return result.toString().trim();
}
/**
* Извлекает фамилию из строки, содержащей полное имя (ФИО).
* Строка ФИО может содержать:
* - пустую строку (null, empty, "")
* - одно слово (фамилия, "Нет", односложный комментарий)
* - два слова (фамилия, имя, "Нет")
* - три слова (фамилия, имя, отчество, "Нет")
* - четыре слова (фамилия, имя, отчество, постфикс отчества, комментарии)
* - и более.
*
* Все слова начиная с пятого однозначно являются бесполезным наполнением, однако
* такие слова должны включены в строку отчества, если они есть.
*
* Строка может быть извлечена из xlsx файла
* или сгенерирована из данныых содержащихся в базе данных
*
* @param fio строка, содержащая ФИО
* @return строка, содержащая первое слово из fio которое является фамилией или содержит слово "Нет"
*/
public static String getSecondNameOf(String fio) {
// Инициализируем StringBuilder для хранения результата.
StringBuilder result = new StringBuilder();
// Проверяем, является ли строка null, пустой строкой или состоит только из пробелов.
if (Stringer.checkForEmpty(fio)) {
// Если строка является нулевым значением, то добавляем "Нет" в строку.
result.append(not);
} else {
//убираем пробелы в начале и в конце строки
fio = fio.trim();
// Разделяем строку на пробелы и возвращаем первую часть, которая как ожидается является фамилией
result.append(fio.split(" ")[0]);
}
// Возвращаем первое слово в строке или строку "Нет"
return result.toString().trim();
}
/**
* Извлекает имя (фамилия, имя или отчество) из строки, предположительно содержащей только одно слово.
* - проверяет не пустая ли строка, если нет, то добавляет "Нет"
* - очищает строку от лишних пробельных символов
* - возвращает имя или "Нет"
*
* @param name
* @return name
*/
public static String getNameOf(String name) {
// Проверяем, является ли строка null, пустой строкой или состоит только из пробелов.
if (Stringer.checkForEmpty(name)) {
// Если строка является нулевым значением, то добавляем "Нет" в строку.
return not;
} else {
//очищаем строку
name = Stringer.clear(name);
// возвращаем имя
return name;
}
}
/**
* Извлекает имя из строки, содержащей полное имя (ФИО).
*
* @param fio строка, содержащая ФИО
* @return строка, содержащая второе слово из fio которое является именем или содержит слово "Нет"
*/
public static String getFirstNameOf(String fio) {
// Создаем StringBuilder для хранения результата
StringBuilder result = new StringBuilder();
// Проверяем, является ли строка null, пустой строкой или состоит только из пробелов.
if (Stringer.checkForEmpty(fio)) {
// Если строка является нулевым значением, то добавляем "Нет" в строку.
result.append(not);
} else {
//убираем излишние пробельные символы
fio = Stringer.clear(fio);
// Разбиваем строку по пробелам и пишем слова в массив
String[] strings = fio.split(" ");
// Если массив содержит два или более слов, то второе слово является именем.
if (strings.length > 1) {
// Пишем второе слово в результат
result.append(strings[1].trim());
}else {
// Если массив содержит только одно слово, то добавляем "Нет" в строку.
result.append(not);
}
}
// Возвращаем второе слово в строке или строку "Нет"
return result.toString().trim();
}
/**
* Извлекает отчество из строки, содержащей полное имя (ФИО).
* @param fio строка, содержащая ФИО
* @return строка, содержащая третье слово из fio которое является отчеством\
* или содержит слово "Нет"
* или содержит все слова, содержащиеся в ФИО, за исключением первых двух
*/
public static String getLastNameOf(String fio) {
// Создаем StringBuilder для хранения результата
StringBuilder result = new StringBuilder();
// Проверяем, является ли строка null, пустой строкой или состоит только из пробелов.
if (Stringer.checkForEmpty(fio)) {
// Если строка является нулевым значением, то добавляем "Нет" в строку.
result.append(not);
} else {
//убираем пробелы в начале и в конце строки
fio = fio.trim();
fio = Stringer.clear(fio);
String[] strings = fio.split(" ");
if (strings.length > 2) {
// Пишем третье и последующие слова в результат
for (int i = 2; i < strings.length; i++) {
result.append(strings[i]).append(" ");
}
} else {
// Если массив содержит только два или менее слов, то добавляем "Нет" в строку.
result.append(not);
}
}
// Возвращаем строку ФИО без первых двух слов с удаленными лишними пробелами
return result.toString().trim();
}
}

54
gates/src/main/java/ru/mlokoin/gates/teh/strings/Stringer.java

@ -0,0 +1,54 @@
package ru.mlokoin.gates.teh.strings;
/**
* Класс для работы со строками
*/
public class Stringer {
/**
* Проверяет, является ли переданная строка null, пустой строкой или состоит только из пробелов.
*
* @param str Строка для проверки
* @return True если строка является null, пустой строкой или состоит только из пробелов
* False в противном случае
*/
public static Boolean checkForEmpty(String str) {
// Check if the string is null
if (str == null) {
return true;
}
// Check if the string is empty or consists only of whitespace characters
if (str.isEmpty() || str.trim().isEmpty()) {
return true;
}
// The string is not null, not empty and does not consist only of whitespace characters
return false;
}
/**
* Удаляет регулярным выражением лишние пробельные символы из строки.
*
* Заменяет знаки переноса строки на пробелы с помощью использования регулярного выражения
* \s+ - пробелы (и все ниже приведенные пробельные символы)
* \t - табуляция
* \v - вертикальная табуляция
* \r - перенос в начало строки
* \n - перенос строки
* \f - форматированный перенос строки
*
* Осавляет по одному пробелу между словами, если слов больше одного
* Возвращает пустую строку, если получена строка null
*
* @param string строка для обработки
* @return строку без лишних пробелов или пустую строку
*/
public static String clear(String string) {
// Проверяем, не является ли строка null. Если строка null, возвращаем пустую строку.
if (string == null) {
return "";
}
// Удаляем лишние пробелы из строки.
return string.replaceAll("\\s+", " ").trim();
}
}

6
gates/src/main/resources/application.yaml

@ -23,5 +23,11 @@ spring:
time: HH:mm:ss time: HH:mm:ss
server: server:
port: 8383 port: 8383
max-http-request-header-size: 50MB
tomcat:
max-swallow-size: 50MB
max-http-form-post-size: 50MB
maxParameterCount: 10000

56
gates/src/main/resources/templates/courses-check.html

@ -13,13 +13,32 @@
<header> <header>
<h2>check-courses</h2> <h2>check-courses</h2>
<ul> <ul>
<li></li> <li>Запуск контейнера скриптом ps1</li>
<li></li> <li></li>
</ul> </ul>
</header> </header>
<main> <main>
<!-- <form th:action="@{/courses/save/{id}(id=${id})}" <div>
<h2>Возможные ошибки: ":</h2>
<ol>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ol>
<p>База допускает все варианты заполнения, но пользователь должен проверить их вручную в исходном xlsx</p>
<p>Исправлять все ошибки в исходном xlsx прежде, чем добавлять записи в базу</p>
<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="@{/courses/save/{id}(id=${id})}"
th:method="post" th:method="post"
th:object="${wrapCourses}"> th:object="${wrapCourses}">
<table rules="all"> <table rules="all">
@ -34,37 +53,36 @@
<th><span>Объект строительства (building)</span></th> <th><span>Объект строительства (building)</span></th>
</thead> </thead>
<tbody> <tbody>
<tr th:each="course, courseStat : *{getCourses()}" > <tr th:each="course, courseStat : *{courses}" >
<td>
<input type="text" th:field="*{courses[__${courseStat.index}__].place}">
</td>
<td>
<input type="text" th:field="*{courses[__${courseStat.index}__].start_date}">
</td>
<td>
<input type="text" th:field="*{courses[__${courseStat.index}__].protocol_date}">
</td>
<td> <td>
<input type="text" th:field="*{programs[__${courseStat.index}__].name}"> <input type="text" th:field="*{courses[__${courseStat.index}__].protocol_number}">
</td> </td>
<td> <td>
<input type="text" th:field="*{programs[__${courseStat.index}__].lenght}"/> <input type="text" th:field="*{courses[__${courseStat.index}__].report_period}">
</td> </td>
<td> <td>
<select th:field="*{programs[__${courseStat.index}__].study_direction}"> <input type="text" th:field="*{courses[__${courseStat.index}__].teacher.id}">
<option value="0" disabled >выберите нарпавление обучения</option>
<option value="1" >Обучение вновь внедряемым процедурам</option>
<option value="2" >Обучение водителей</option>
<option value="3" >Обязательное обучение</option>
<option value="4" >Производственное обучение</option>
<option value="4" >Профессиональная переподготовка</option>
</select>
</td> </td>
<td> <td>
<input type="text" th:field="*{programs[__${courseStat.index}__].price}"/> <input type="text" th:field="*{courses[__${courseStat.index}__].program.id}">
</td> </td>
<td> <td>
<select th:field="*{programs[__${pStat.index}__].cretarea.id}"> <input type="text" th:field="*{courses[__${courseStat.index}__].building.id}">
<option value="0" disabled >выберите критерий</option>
<option th:each="option : *{cretareas}" th:value="${option.id}" th:text="${option.name_short}"></option>
</select>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<input type="submit" value="POST-ALL"/> <input type="submit" value="POST-ALL"/>
</form> --> </form>
</main> </main>
</body> </body>
</html> </html>

44
gates/src/main/resources/templates/teachers-check.html

@ -13,7 +13,6 @@
<header> <header>
<h2>check-teachers</h2> <h2>check-teachers</h2>
<ul> <ul>
<li>Преподаватели добавляются в базу если указан табельный номер.</li>
<li></li> <li></li>
<li></li> <li></li>
<li></li> <li></li>
@ -21,13 +20,32 @@
</ul> </ul>
</header> </header>
<main> <main>
<div>
<h2>Возможные ошибки при заполнении поля "Преподаватель":</h2>
<ol>
<li>Не указан преподаватель (пустя ячейка)</li>
<li>В поле "Преподаватель" указано одно слово (Дистанционно или только фамилия)</li>
<li>В поле "Преподаватель" указано два слова (Фамилия и имя или что-то иное)</li>
<li>В поле "Преподаватель" указано четыре слова (Фамилия, имя, отчество, окончание отчества)</li>
<li>В поле "Преподаватель" указано пять и более слов (В ячейке размещены какие-то комментарии)</li>
</ol>
<p>База допускает все варианты заполнения, но пользователь должен проверить их вручную в исходном xlsx</p>
<p>Исправлять все ошибки в исходном xlsx прежде, чем добавлять записи в базу</p>
<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="@{/teachers/save/{id}(id=${id})}" <form th:action="@{/teachers/save/{id}(id=${id})}"
th:method="post" th:method="post"
th:object="${wrapTeachers}"> th:object="${wrapTeachers}">
<table rules="all"> <table rules="all">
<thead> <thead>
<th>Имя (first_name)</th>
<th>Фамилия (second_name)</th> <th>Фамилия (second_name)</th>
<th>Имя (first_name)</th>
<th>Отчество (last_name)</th> <th>Отчество (last_name)</th>
<th>Табельный номер (employee_id)</th> <th>Табельный номер (employee_id)</th>
<th>СНИЛС (snils)</th> <th>СНИЛС (snils)</th>
@ -35,33 +53,25 @@
<tbody> <tbody>
<tr th:each="t, tStat : *{getList()}"> <tr th:each="t, tStat : *{getList()}">
<td> <td>
<input type="text" th:field="*{list[__${tStat.index}__].first_name}"> <input type="text" th:field="*{list[__${tStat.index}__].second_name}" readonly>
</td> </td>
<td> <td>
<input type="text" th:field="*{list[__${tStat.index}__].second_name}"> <input type="text" th:field="*{list[__${tStat.index}__].first_name}" readonly>
</td> </td>
<td> <td>
<input type="text" th:field="*{list[__${tStat.index}__].last_name}"> <input type="text" th:field="*{list[__${tStat.index}__].last_name}" readonly>
</td> </td>
<td> <td>
<input type="text" th:field="*{list[__${tStat.index}__].employee_id}"> <input type="text" th:field="*{list[__${tStat.index}__].employee_id}" >
</td> </td>
<td> <td>
<input type="text" th:field="*{list[__${tStat.index}__].snils}"> <input type="text" th:field="*{list[__${tStat.index}__].snils}" >
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<input type="submit" value="POST-ALL"/> <input type="submit" value="POST-ALL"/>
</form> </form>
<div>
<h2>errors (потенциальные ошибки в исходном документе):
<span th:text="${#lists.size(errors)}"></span>
</h2>
<ul th:each="e: ${errors}">
<li th:text="${e}"></li>
</ul>
</div>
</main> </main>
</body> </body>
</html> </html>

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

@ -11,44 +11,55 @@ xmlns:th="http://www.thymeleaf.org">
<body> <body>
<header> <header>
<h2>view-as-educations (предусмотреть): </h2> <h2>view-as-educations (предусмотреть): </h2>
<ul> <ol>
<li>Добавиь на страницу обработки ошибок и результатов отработки проверок</li> <li>Добавиь на страницу обработки ошибок и результатов отработки проверок</li>
<li>Удалить перед загрузкой xlsx-файла все знаки переноса строки (при отправке в базу автоматически меняются на пробелы)</li> <li>Перед загрузкой xlsx-файла удалить все знаки переноса строки (при отправке в базу автоматически меняются на пробелы)</li>
<li>Перед загрузкой xlsx-файла все формулы сохранить как значения </li>
<li>Предусмотреть автоматический погон проверок</li> <li>Предусмотреть автоматический погон проверок</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> <li></li>
<li></li> </ol>
<li></li> <br>
</ul>
<br><br>
<h2>CONTROLS:</h2>
<form th:action="@{/program-cretareas/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-CRETAREAS"/>
</form>
<form th:action="@{/programs/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-PROGRAMS"/>
</form>
<form th:action="@{/teachers/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-TEACHERS"/>
</form>
<form th:action="@{/buildings/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-BUILDINGS"/>
</form>
<form th:action="@{/organizations/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-ORGANIZATION"/>
</form>
<form th:action="@{/courses/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-COURSES"/>
</form>
<form th:action="@{#}" th:method="get">
<input type="submit" value="CHECK-STUDENTS"/>
</form>
<form th:action="@{#}" th:method="get">
<input type="submit" value="POST-AS-EDUCATIONS"/>
</form>
</header> </header>
<main> <main>
<div class="cntrols">
<h2>CONTROLS:</h2>
<form th:action="@{/program-cretareas/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-CRETAREAS"/>
</form>
<form th:action="@{/programs/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-PROGRAMS"/>
</form>
<form th:action="@{/teachers/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-TEACHERS"/>
</form>
<form th:action="@{/buildings/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-BUILDINGS"/>
</form>
<form th:action="@{/organizations/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-ORGANIZATION"/>
</form>
<form th:action="@{/courses/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-COURSES"/>
</form>
<form th:action="@{#}" th:method="get">
<input type="submit" value="CHECK-STUDENTS"/>
</form>
<form th:action="@{#}" th:method="get">
<input type="submit" value="POST-AS-EDUCATIONS"/>
</form>
</div>
<div class="main-wraper"> <div class="main-wraper">
<table rules="all"> <table rules="all">
<caption th:text="${filename}"></caption> <caption th:text="${filename}"></caption>

434
gates/src/test/java/ru/mlokoin/gates/teh/strings/NaimerTest.java

@ -0,0 +1,434 @@
package ru.mlokoin.gates.teh.strings;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class NaimerTest {
/**
* Тест метода getFioOf()
*/
/**
* Тест метода getFioOf() для пустых строк
*/
@Test
public void testGetFioOf_EmptyStrings() {
// Проеряем, что метод getFioOf вернет "Нет Нет Нет" строку, когда входные параметры являются пустыми строками.
assertEquals("Нет Нет Нет",
Naimer.getFioOf("", "", ""),
"Метод merge возвращает неожиданное значение для пустых входных параметров");
}
/**
* Тест метода getFioOf() для null
*/
@Test
public void testGetFioOf_Null() {
// Проеряем, что метод getFioOf вернет "Нет Нет Нет" строку, когда входные параметры являются null.
assertEquals("Нет Нет Нет",
Naimer.getFioOf(null, null, null),
"Метод merge возвращает неожиданное значение для null входных параметров");
}
/**
* Тест метода getFioOf() когда предоставлена только фамилии
*/
@Test
public void testGetFioOf_OnlySecondName() {
// Проверяем, что метод getFioOf вернет строку с фамилией и без пробелов, если остальные входные параметры являются пустыми строками.
assertEquals("Иванов Нет Нет",
Naimer.getFioOf("Иванов", "", ""),
"Метод merge возвращает неожиданное значение для входных параметров только с фамилией");
}
/**
* Тест метода getFioOf() когда предоставлено только имя
*/
@Test
public void testGetFioOf_OnlyFirstName() {
// Проверяем, что метод getFioOf вернет строку с именем и без пробелов, если остальные входные параметры являются пустыми строками.
assertEquals("Нет Иван Нет",
Naimer.getFioOf("", "Иван", ""),
"Метод merge возвращает неожиданное значение для входных параметров только с именем");
}
/**
* Тест метода getFioOf(), когда предоставлено только отчество
*/
@Test
public void testGetFioOf_OnlyLastName() {
// Проверяем, что метод getFioOf вернет строку с отчеством и без пробелов, если остальные входные параметры являются пустыми строками.
assertEquals("Нет Нет Иванович",
Naimer.getFioOf("", "", "Иванович"),
"Метод merge возвращает неожиданное значение для входных параметров только с отчеством");
}
/**
* Тест метода getFioOf() для всех входных параметров
*/
@Test
public void testGetFioOf_AllNames() {
// Проеряем, что метод getFioOf вернет "Иванов Иван Иванович" строку, когда входные параметры являются непустыми строками.
assertEquals("Иванов Иван Иванович",
Naimer.getFioOf("Иванов", "Иван", "Иванович"),
"Метод merge возвращает неожиданное значение для входных параметров с фамилией, именем и отчеством");
}
/**
* Тест метода getSecondNameOf()
*/
/**
* Тест метода getSecondNameOf() для пустых строк
* ""
*/
@Test
public void testGetSecondNameOf_EmptyStrings() {
// Проеряем, что метод getSecondNameOf вернет "Нет" строку, когда входные параметры являются пустыми строками.
assertEquals("Нет",
Naimer.getSecondNameOf(""),
"Метод getSecondNameOf возвращает неожиданное значение для пустых входных параметров");
}
/**
* Тест метода getSecondNameOf() для null
* null
*/
@Test
public void testGetSecondNameOf_Null() {
// Проеряем, что метод getSecondNameOf вернет "Нет" строку, когда входные параметры являются null.
assertEquals("Нет",
Naimer.getSecondNameOf(null),
"Метод getSecondNameOf возвращает неожиданное значение для null входных параметров");
}
/**
* Тест метода getSecondNameOf() ФИО, содержащего одно слово
* "Иванов"
*/
@Test
public void testGetSecondNameOf_OneWord() {
// Проеряем, что метод getSecondNameOf вернет слово, когда входные параметры содержат одно слово.
assertEquals("Иванов",
Naimer.getSecondNameOf("Иванов"),
"Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих одно слово");
}
/**
* Тест метода getSecondNameOf() ФИО, содержащего два слова
* "Иванов Иван"
*/
@Test
public void testGetSecondNameOf_TwoWords() {
// Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат два слова.
assertEquals("Иванов",
Naimer.getSecondNameOf("Иванов Иван"),
"Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих два слова");
}
/**
* Тест метода getSecondNameOf() ФИО, содержащего два слова и пробелы перед первым словом и после второго
* " Иванов Иван "
*/
@Test
public void testGetSecondNameOf_TwoWordsWithSpaces() {
// Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат два слова.
assertEquals("Иванов",
Naimer.getSecondNameOf(" Иванов Иван "),
"Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих два слова и излишние пробелы");
}
/**
* Тест метода getSecondNameOf() ФИО, содержащего три слова, без лишних пробелов
* "Иванов Иван Иванович"
*/
@Test
public void testGetSecondNameOf_ThreeWords() {
// Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат три слова.
assertEquals("Иванов",
Naimer.getSecondNameOf("Иванов Иван Иванович"),
"Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих три слова");
}
/**
* Тест метода getSecondNameOf() ФИО, содержащего три слова и лишние пробелы
* " Иванов Иван Иванович "
*/
@Test
public void testGetSecondNameOf_ThreeWordsWithSpaces() {
// Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат три слова.
assertEquals("Иванов",
Naimer.getSecondNameOf(" Иванов Иван Иванович "),
"Метод merge возвращает неожиданное значение для входных параметров содержащих три слова и излишние пробелы");
}
/**
* Тест метода getSecondNameOf() ФИО, содержащего четыре слова
* "Иванов Иван Иванович заочно"
*/
@Test
public void testGetSecondNameOf_FourWords() {
// Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат четыре слова.
assertEquals("Иванов",
Naimer.getSecondNameOf("Иванов Иван Иванович заочно"),
"Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих четыре слова");
}
/**
* Тест метода getSecondNameOf() ФИО, содержащего четыре слова и лишние пробелы
* " Иванов Иван Иванович заочно "
*/
@Test
public void testGetSecondNameOf_FourWordsWithSpaces() {
// Проеряем, что метод getSecondNameOf вернет "Иванов" строку, когда входные параметры содержат четыре слова.
assertEquals("Иванов",
Naimer.getSecondNameOf(" Иванов Иван Иванович заочно "),
"Метод getSecondNameOf возвращает неожиданное значение для входных параметров содержащих четыре слова и излишние пробелы");
}
/**
* Тест метода getFirstNameOf()
*/
/**
* Тест метода getFirstNameOf() ФИО, содержащего
* null
*/
@Test
public void testGetFirstNameOf_Null() {
// Проеряем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры являются null.
assertEquals("Нет",
Naimer.getFirstNameOf(null),
"Метод getFirstNameOf возвращает неожиданное значение для null входных параметров");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего пустую строку
* ""
*/
@Test
public void testGetFirstNameOf_Empty() {
// Проеряем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры являются пустой строкой.
assertEquals("Нет",
Naimer.getFirstNameOf(""),
"Метод getFirstNameOf возвращает неожиданное значение для пустой строки входных параметров");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего одно слово
* "Иванов"
*/
@Test
public void testGetFirstNameOf_OneWord() {
// Проеряем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры содержат одно слово.
assertEquals("Нет",
Naimer.getFirstNameOf("Иванов"),
"Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих одно слово");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего одно слово и лишние пробелы
* " Иванов "
*/
@Test
public void testGetFirstNameOf_OneWordWithSpaces() {
// Проверяем, что метод getFirstNameOf вернет "Нет" строку, когда входные параметры содержат одно слово с лишними пробелами.
assertEquals("Нет",
Naimer.getFirstNameOf(" Иванов "),
"Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих одно слово и излишние пробелы");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего два слова
* "Иванов Иван"
*/
@Test
public void testGetFirstNameOf_TwoWords() {
// Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат два слова.
assertEquals("Иван",
Naimer.getFirstNameOf("Иванов Иван"),
"Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих два слова");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего два слова и лишние пробелы
* " Иванов Иван "
*/
@Test
public void testGetFirstNameOf_TwoWordsWithSpaces() {
// Задаем ожидаемой значение
String expected = "Иван";
// Задаем входные параметры
String fio = " Иванов Иван ";
// Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат два слова и лишние пробелы.
assertEquals(expected,
Naimer.getFirstNameOf(fio),
"Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих два слова и излишние пробелы");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего три слова
* "Иванов Иван Иванович"
*/
@Test
public void testGetFirstNameOf_ThreeWords() {
// Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат три слова.
assertEquals("Иван",
Naimer.getFirstNameOf("Иванов Иван Иванович"),
"Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих три слова");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего три слова и лишние пробелы
* " Иванов Иван Иванович "
*/
@Test
public void testGetFirstNameOf_ThreeWordsWithSpaces() {
// Задаем ожидаемое значение
String expected = "Иван";
// Задаем входные параметры
String fio = " Иванов Иван Иванович ";
// Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат три слова.
assertEquals(expected,
Naimer.getFirstNameOf(fio),
"Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих три слова и излишние пробелы");
}
/**
* Тест метода getFirstNameOf() ФИО, содержащего четыре слова и лишние пробелы
* " Иванов Иван Иванович очнов "
*/
@Test
public void testGetFirstNameOf_FourWordsWithSpaces() {
// Задаем ожидаемое значение
String expected = "Иван";
// Задаем входные параметры
String fio = " Иванов Иван Иванович очнов ";
// Проеряем, что метод getFirstNameOf вернет второе слово, когда входные параметры содержат четыре слова и лишние пробелы.
assertEquals(expected,
Naimer.getFirstNameOf(fio),
"Метод getFirstNameOf возвращает неожиданное значение для входных параметров содержащих четыре слова и излишние пробелы");
}
/**
* Тесты метода getLastNameOf()
*/
/**
* Тест метода getLastNameOf() ФИО, содержащего null
*/
@Test
public void testGetLastNameOf_Null() {
// Проеряем, что метод getLastNameOf вернет "Нет" для null
assertEquals("Нет",
Naimer.getLastNameOf(null),
"Метод getLastNameOf возвращает неожиданное значение для null");
}
/**
* Тест метода getLastNameOf() ФИО, содержащего пустую строку
*/
@Test
public void testGetLastNameOf_Empty() {
// Задаем входные параметры
String fio = "";
// Задаем ожидаемое значение
String expected = "Нет";
// Проеряем, что метод getLastNameOf вернет "Нет" для пустой строки
assertEquals(expected,
Naimer.getLastNameOf(fio),
"Метод getLastNameOf возвращает неожиданное значение для пустой строки");
}
/**
* Тест метода getLastNameOf() ФИО, содержащего только пробелы
*/
@Test
public void testGetLastNameOf_Spaces() {
// Задаем ожидаемое значение
String expected = "Нет";
// Задаем входные параметры
String fio = " ";
// Проеряем, что метод getLastNameOf вернет "Нет" для строки заполненной только пробелами
assertEquals(expected,
Naimer.getLastNameOf(fio),
"Метод getLastNameOf возвращает неожиданное значение для строки заполненной только пробелами");
}
/**
* Тест метода getLastNameOf() ФИО, содержащего одно слово
*/
@Test
public void testGetLastNameOf_OneWord() {
// Задаем ожидаемое значение
String expected = "Нет";
// Задаем входные параметры
String fio = "Иванов";
// Проеряем, что метод getLastNameOf вернет "Нет" для одного слова
assertEquals(expected,
Naimer.getLastNameOf(fio),
"Метод getLastNameOf возвращает неожиданное значение для одного слова");
}
/**
* Тест метода getLastNameOf() ФИО, содержащего два слова
*/
@Test
public void testGetLastNameOf_TwoWords() {
// Задаем ожидаемое значение
String expected = "Нет";
// Задаем входные параметры
String fio = "Иванов Иван";
// Проеряем, что метод getLastNameOf вернет "Нет" для двух слов
assertEquals(expected,
Naimer.getLastNameOf(fio),
"Метод getLastNameOf возвращает неожиданное значение для двух слов");
}
/**
* Тест метода getLastNameOf() ФИО, содержащего три слова с излишними пробелами
*
*/
@Test
public void testGetLastNameOf_ThreeWordsWithSpaces() {
// Задаем ожидаемое значение
String expected = "Иванович";
// Задаем входные параметры
String fio = " Иванов Иван Иванович ";
// Проверяем, что метод getLastNameOf вернет "Иванович" для трех слов с излишними пробелами
assertEquals(expected,
Naimer.getLastNameOf(fio),
"Метод getLastNameOf возвращает неожиданное значение для трех слов с излишними пробелами");
}
/**
* Тест метода getLastNameOf() ФИО, содержащего четыре слова и излишние пробелы
*/
@Test
public void testGetLastNameOf_FourWordsWithSpaces() {
// Задаем ожидаемое значение
String expected = "Иванович очно";
// Задаем входные параметры
String fio = " Иванов Иван Иванович очно ";
// Проверяем, что метод getLastNameOf вернет "Иванович" для четырех слов с излишними пробелами
assertEquals(expected,
Naimer.getLastNameOf(fio),
"Метод getLastNameOf возвращает неожиданное значение для четырех слов с излишними пробелами");
}
}

61
gates/src/test/java/ru/mlokoin/gates/teh/strings/StringerCheckForEmptyTest.java

@ -0,0 +1,61 @@
package ru.mlokoin.gates.teh.strings;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
/**
* Класс для тестирования метода checkForEmpty(String)
*/
public class StringerCheckForEmptyTest {
/**
* Проверяем поведение метода checkForEmpty(String) когда на вход метода передана строка null.
*
* @see Stringer#checkForEmpty(String)
*/
@Test
public void testCheckForEmpty_NullString() {
// Ожидаем, что метод вернет true, когда входная строка является null
assertTrue(Stringer.checkForEmpty(null),
"Метод checkForEmpty возвращает неожиданное значение для null строки");
}
/**
* Проверяем поведение метода checkForEmpty(String) для пустой строки.
*
* @see Stringer#checkForEmpty(String)
*/
@Test
public void testCheckForEmpty_EmptyString() {
// Проверяем, что метод вернет true, когда входная строка является пустой
assertTrue(Stringer.checkForEmpty(""),
"Метод checkForEmpty возвращает неожиданное значение для пустой строки");
}
/**
* Проверяем поведение метода checkForEmpty(String) для строки, состоящей только из пробелов.
*
* @see Stringer#checkForEmpty(String)
*/
@Test
public void testCheckForEmpty_WhitespaceString() {
// Проверяем, что метод вернет true, когда входная строка состоит только из пробелов
// и не содержит других символов
assertTrue(Stringer.checkForEmpty(" "),
"Метод checkForEmpty возвращает неожиданное значение для строки с пробелами");
}
/**
* Проверяем поведение метода checkForEmpty(String) для непустой строки.
*
* @see Stringer#checkForEmpty(String)
*/
@Test
public void testCheckForEmpty_NonEmptyString() {
// Проверяем, что метод вернет false, когда входная строка не является пустой,
// содержит другие символы кроме пробелов и не является null
assertFalse(Stringer.checkForEmpty("hello world"),
"Метод checkForEmpty возвращает неожиданное значение для непустой строки");
}
}

7
resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/entities/Teacher.java

@ -26,17 +26,16 @@ public class Teacher{
@Id @Id
@GeneratedValue(strategy=GenerationType.AUTO) @GeneratedValue(strategy=GenerationType.AUTO)
private long id; private long id;
@Column(length=50)
private String first_name;//Имя
private String second_name;//Фамилия private String second_name;//Фамилия
private String first_name;//Имя
private String last_name;//Отчество private String last_name;//Отчество
private String employee_id; private String employee_id;
private String snils; private String snils;
// подготовить конструкторы на все варианты внесения информации о преподавателях // подготовить конструкторы на все варианты внесения информации о преподавателях
public Teacher(String first_name, String second_name, String last_name){ public Teacher(String second_name, String first_name, String last_name){
this.first_name = first_name;
this.second_name = second_name; this.second_name = second_name;
this.first_name = first_name;
this.last_name = last_name; this.last_name = last_name;
} }
} }

Loading…
Cancel
Save