Browse Source

works on low data limits

master
esoe 3 months ago
parent
commit
a5cc8b6334
  1. 2
      gates/src/main/java/ru/mlokoin/gates/config/WebConfig.java
  2. 4
      gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java
  3. 126
      gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java
  4. 70
      gates/src/main/java/ru/mlokoin/gates/controller/v1/StudentController.java
  5. 52
      gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java
  6. 4
      gates/src/main/java/ru/mlokoin/gates/model/program/Program.java
  7. 8
      gates/src/main/java/ru/mlokoin/gates/model/student/Student.java
  8. 6
      gates/src/main/java/ru/mlokoin/gates/repository/Storage.java
  9. 4
      storage-rs/pom.xml
  10. 2
      storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java

2
gates/src/main/java/ru/mlokoin/gates/config/WebConfig.java

@ -9,7 +9,7 @@ import org.springframework.web.reactive.function.client.WebClient;
public class WebConfig { public class WebConfig {
@Bean @Bean
WebClient webClient() { WebClient webClient() {
final int maxInMemorySize = 50 * 1024 * 1024; // 50MB final int maxInMemorySize = 1000 * 1024 * 1024; // 1000MB
final ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder() final ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(maxInMemorySize)) .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(maxInMemorySize))
.build(); .build();

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

@ -149,8 +149,8 @@ public class CretareaController {
+ wraper.getList().toString()); + wraper.getList().toString());
for (ProgramCretarea cretarea : wraper.getList()) { for (ProgramCretarea cretarea : wraper.getList()) {
//Проверка наличия полного наименования критерия //Проверка наличия краткого наименования критерия в базе
if (!cretarea.getName().equals("")) { if (!cretarea.getName_short().equals("")) {
client.post() client.post()
.uri("http://resource-service-api:8181/cretarea/create") .uri("http://resource-service-api:8181/cretarea/create")
.body(Mono.just(cretarea), ProgramCretarea.class) .body(Mono.just(cretarea), ProgramCretarea.class)

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

@ -68,7 +68,7 @@ public class EducationsController {
} }
//Обращение к xlsx-файлу как к Реестру обученных //Обращение к xlsx-файлу как к Реестру обученных
XlsxDocumentReestr xlsxEducations = new XlsxDocumentReestr(xlsx); XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
//получение списка студентов из базы //получение списка студентов из базы
System.out.println("Получение списка студентов из базы ..."); System.out.println("Получение списка студентов из базы ...");
@ -92,118 +92,48 @@ public class EducationsController {
base_courses = new ArrayList<>(); base_courses = new ArrayList<>();
} }
//получение списка преподавателей из базы
System.out.println("Получение списка преподавателей из базы ...");
List<Teacher> base_teachers;
try {
base_teachers = storage.getBaseTeachers();
} catch (Exception e) {
errors.add("Ошибка при получении списка преподавателей из базы :: " +e.getMessage());
System.out.println("Не удалось получить список преподавателей из базы: " + e.getMessage());
base_teachers = new ArrayList<>();
}
//получение списка программ обучения из базы
System.out.println("Получение списка программ обучения из базы ...");
List<Program> base_programs;
try {
base_programs = storage.getBasePrograms();
} catch (Exception e) {
errors.add("Ошибка при получении списка программ обучения из базы :: " +e.getMessage());
System.out.println("Не удалось получить список программ обучения из базы: " + e.getMessage());
base_programs = new ArrayList<>();
}
//получение списка объектов строительства из базы
System.out.println("Получение списка объектов строительства из базы ...");
List<Building> base_buildings;
try {
base_buildings = storage.getBaseBuildings();
} catch (Exception e) {
errors.add("Ошибка при получении списка объектов строительства из базы :: " +e.getMessage());
System.out.println("Не удалось получить список объектов строительства из базы: " + e.getMessage());
base_buildings = new ArrayList<>();
}
//получение списка организаций из базы
System.out.println("Получение списка организаций из базы ...");
List<Organization> base_organizations;
try {
base_organizations = storage.getBaseOrganizations();
} catch (Exception e) {
errors.add("Ошибка при получении списка организаций из базы :: " +e.getMessage());
System.out.println("Не удалось получить список организаций из базы: " + e.getMessage());
base_organizations = new ArrayList<>();
}
//получение списка записей об обучениях из базы
System.out.println("Получение списка записей об обучениях из базы ...");
List<EducatonEntry> base_educations;
try {
base_educations = storage.getBaseEducationEntries();
} catch (Exception e) {
errors.add("Ошибка при получении списка записей об обучениях из базы :: " +e.getMessage());
System.out.println("Не удалось получить список записей об обучениях из базы: " + e.getMessage());
base_educations = new ArrayList<>();
}
//получение списка записей об обучениях из xlsx-файла //получение списка записей об обучениях из xlsx-файла
System.out.println("Получение списка записей об обучениях из xlsx-файла ..."); List<EducatonEntry> unique = reestr.getUniqueEducations();
List<EducatonEntry> xlsx_educations = new ArrayList<>(); List<EducatonEntry> absent = storage.getAbsentEducationEntries(unique);
try {
xlsx_educations = xlsxEducations.getEducations(base_courses, base_students, base_teachers, base_programs, base_buildings, base_organizations); // удаление строки заголовков из списка записей
} catch (Exception e) { // absent.remove(0);
errors.add("Ошибка при получении списка записей об обучениях из xlsx-файла :: " +e.getMessage());
System.out.println("Не удалось получить список записей об обучениях из xlsx-файла: " + e.getMessage()); //актуалзация полей согласно базе
xlsx_educations = new ArrayList<>(); for (EducatonEntry educatonEntry : absent) {
} for (Course course : base_courses) {
if (educatonEntry.getCourse() != null
//фильтрация записей уже присутствующих в базе && course.isSimilar(educatonEntry.getCourse())) {
List<EducatonEntry> filtered = new ArrayList<>(); educatonEntry.setCourse(course);
for (EducatonEntry xlsx_entry : xlsx_educations) { break;
if (xlsx_entry != null) { }
if (xlsx_entry.getStudent() != null }
|| xlsx_entry.getCourse() != null) { for (Student student : base_students) {
if (!filtered.contains(xlsx_entry)) { if (educatonEntry.getStudent() != null
boolean exists = false; && student.isSimilar(educatonEntry.getStudent())) {
for (EducatonEntry base_entry : base_educations) { educatonEntry.setStudent(student);
if (base_entry.getSertificate_number().equals(xlsx_entry.getSertificate_number()) break;
&& base_entry.getCourse().getProtocol_number().equals(xlsx_entry.getCourse().getProtocol_number())
&& base_entry.getCourse().getPlace().equals(xlsx_entry.getCourse().getPlace())
&& base_entry.getCourse().getStart_date().equals(xlsx_entry.getCourse().getStart_date())
&& base_entry.getCourse().getTeacher().getFullName().equals(xlsx_entry.getCourse().getTeacher().getFullName())
&& base_entry.getCourse().getBuilding().getName_short().equals(xlsx_entry.getCourse().getBuilding().getName_short())
&& base_entry.getCourse().getProgram().getName().equals(xlsx_entry.getCourse().getProgram().getName())) {
exists = true;
break;
}
}
if (!exists) {
filtered.add(xlsx_entry);
}
}
} }
} }
} }
//ограничение количества выводимых пользователю записей //ограничение количества выводимых пользователю записей
if (filtered.size() > 0) { if (absent.size() > 0) {
if (filtered.size() > 200) { if (absent.size() > 200) {
filtered = filtered.subList(0, 200); absent = absent.subList(0, 200);
} }
} }
EducationEntryWraper wraper = new EducationEntryWraper(filtered); EducationEntryWraper wraper = new EducationEntryWraper(absent);
wraper.setCourses(base_courses); wraper.setCourses(base_courses);
wraper.setStudents(base_students); wraper.setStudents(base_students);
//передача данных в модель //передача данных в модель
model.addAttribute("absentReview", new AbsentReview(xlsxEducations, storage)); model.addAttribute("absentReview", new AbsentReview(reestr, storage));
model.addAttribute("baseReview", new BaseReview(storage)); model.addAttribute("baseReview", new BaseReview(storage));
model.addAttribute("xlsxReview", new XlsxReview(xlsxEducations)); model.addAttribute("xlsxReview", new XlsxReview(reestr));
model.addAttribute("wrapEducations", wraper); model.addAttribute("wrapEducations", wraper);
model.addAttribute("errors", errors); model.addAttribute("errors", errors);
model.addAttribute("filename", xlsxEducations.getDocument().getName()); model.addAttribute("filename", reestr.getDocument().getName());
model.addAttribute("id", id); model.addAttribute("id", id);
// model.addAttribute("xlsx", xlsx.getData()); // model.addAttribute("xlsx", xlsx.getData());
// model.addAttribute("headers", xlsx.getHeaders()); // model.addAttribute("headers", xlsx.getHeaders());

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

@ -17,8 +17,8 @@ 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.fs.xlsx.XlsxCell;
import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument; import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument;
import ru.mlokoin.gates.model.fs.xlsx.XlsxDocumentReestr;
import ru.mlokoin.gates.model.organization.Organization; import ru.mlokoin.gates.model.organization.Organization;
import ru.mlokoin.gates.model.student.Student; import ru.mlokoin.gates.model.student.Student;
import ru.mlokoin.gates.model.student.StudentWraper; import ru.mlokoin.gates.model.student.StudentWraper;
@ -50,60 +50,34 @@ public class StudentController {
//получение данных файла в переменную xlsx //получение данных файла в переменную xlsx
XlsxDocument xlsx = storage.getXlsxDocument(id); XlsxDocument xlsx = storage.getXlsxDocument(id);
XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
//получение перечня студентов из xlsx
ArrayList<Student> xlsx_students = new ArrayList<>(); List<Student> unique = reestr.getUniqueStudents();
Map<Integer, List<XlsxCell>> map = xlsx.getData(); System.out.println("Всего уникальных студентов в xlsx: " + unique.size());
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { List<Student> absent = storage.getAbsentStudents(unique);
xlsx_students.add(new Student(entry, base_organizations)); System.out.println("Всего отсутствующих студентов в базе: " + absent.size());
}
System.out.println("Всего студентов в xlsx: " + xlsx_students.size()); //актуализируем список организаций
for (Student student : absent) {
//получение перечня студентов из базы for (Organization organization : base_organizations) {
List<Student> base_students = storage.getBaseStudents(); if (student.getOrganization() != null
System.out.println("Всего студентов в базе: " + base_students.size()); && organization.isSimilar(student.getOrganization())
) {
/** student.setOrganization(organization);
* Удаляем повторяющихся студентов из списка break;
* Исключаем из списка студентов, данные о которых уже присутствуют в базе
*/
List<Student> filtered = new ArrayList<>();
for (Student xlsx_student : xlsx_students) {
if (xlsx_student != null) {
// если имя не отсутствует, считаем, что студент существует
if (xlsx_student.getFirst_name() != null){
if (!filtered.contains(xlsx_student)) {
boolean exists = false;
if (base_students.size() > 0) {
for (Student base_student : base_students) {
exists = xlsx_student.getFirst_name().equals(base_student.getFirst_name())
&& xlsx_student.getLast_name().equals(base_student.getLast_name())
&& xlsx_student.getSecond_name().equals(base_student.getSecond_name())
&& xlsx_student.getProfession().equals(base_student.getProfession())
&& xlsx_student.getOrganization().equals(base_student.getOrganization())
&& xlsx_student.getDirection().equals(base_student.getDirection());
if (exists) {
break;
}
}
}
if (!exists) {
filtered.add(xlsx_student);
}
}
} }
} }
} }
System.out.println("Уникальных студентов в xlsx: " + filtered.size());
//передает список студентов в шаблон //передает список студентов в шаблон
if (filtered.size() > 0) { if (absent.size() > 0) {
if (filtered.size() > 200) { if (absent.size() > 200) {
filtered = filtered.subList(0, 200); absent = absent.subList(0, 200);
} }
//создаем врапер для списка студентов //создаем врапер для списка студентов
StudentWraper wraper = new StudentWraper(filtered); StudentWraper wraper = new StudentWraper(absent);
wraper.setOrganizations(base_organizations);
//передаем врапер в шаблон //передаем врапер в шаблон
model.addAttribute("studentWraper", wraper); model.addAttribute("studentWraper", wraper);

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

@ -25,30 +25,6 @@ public class XlsxDocumentReestr extends XlsxDocument {
setHeaders(xlsx.getHeaders()); setHeaders(xlsx.getHeaders());
} }
/**
* Получение списка обучений с вложенными объектами сверенными с базой и содержащими id
* @param base_courses
* @param base_students
* @param base_teachers
* @param base_programs
* @param base_buildings
* @param base_organizations
* @return
*/
public List<EducatonEntry> getEducations(List<Course> base_courses,
List<Student> base_students,
List<Teacher> base_teachers,
List<Program> base_programs,
List<Building> base_buildings,
List<Organization> base_organizations) {
List<EducatonEntry> educations = new ArrayList<>();
Map<Integer, List<XlsxCell>> map = getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
educations.add(new EducatonEntry(entry, base_courses, base_students, base_teachers, base_programs, base_buildings, base_organizations));
}
return educations;
}
/** /**
* Получить список обучений из xlsx-документа, * Получить список обучений из xlsx-документа,
* вложенные объекты не сверены с базой, не указаны id * вложенные объекты не сверены с базой, не указаны id
@ -58,7 +34,9 @@ public class XlsxDocumentReestr extends XlsxDocument {
List<EducatonEntry> educations = new ArrayList<>(); List<EducatonEntry> educations = new ArrayList<>();
Map<Integer, List<XlsxCell>> map = getData(); Map<Integer, List<XlsxCell>> map = getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
educations.add(new EducatonEntry(entry)); if (entry.getKey() != 0){
educations.add(new EducatonEntry(entry));
}
} }
return educations; return educations;
} }
@ -68,30 +46,20 @@ public class XlsxDocumentReestr extends XlsxDocument {
* @return * @return
*/ */
public List<EducatonEntry> getUniqueEducations() { public List<EducatonEntry> getUniqueEducations() {
List<EducatonEntry> educations = new ArrayList<>(); List<EducatonEntry> educations = getEducationsAsIs();
Map<Integer, List<XlsxCell>> map = getData(); List<EducatonEntry> unique = new ArrayList<>();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { for (EducatonEntry entry : educations) {
educations.add(new EducatonEntry(entry)); if (!unique.contains(entry)) {
unique.add(entry);
}
} }
return educations; return unique;
} }
public int getEducationsCount(){ public int getEducationsCount(){
return getUniqueEducations().size(); return getUniqueEducations().size();
} }
/**
* Подсчет количества обучений
* @return количество внесенных в реестр обучений
* считаем по количеству строк в документе, отнимаем одну строку, содержащую заголовки
*/
// public int getEducationsCount() {
// if (getData() == null || getData().isEmpty() || getData().size() == 0 || getData().size() == 1) {
// return 0;
// }
// return getData().size() -1;
// }
/** /**
* Получить список критериев из Реестра обученных * Получить список критериев из Реестра обученных
* *

4
gates/src/main/java/ru/mlokoin/gates/model/program/Program.java

@ -84,6 +84,8 @@ public class Program {
this.setCretarea(new ProgramCretarea(entry)); this.setCretarea(new ProgramCretarea(entry));
} }
public boolean isSimilar(Program program) { public boolean isSimilar(Program program) {
return (this.getName().equals(program.getName()) && this.getLenght().equals(program.getLenght()) && this.getPrice().equals(program.getPrice())); return (this.getName().equals(program.getName())
&& this.getLenght().equals(program.getLenght())
&& this.getPrice().equals(program.getPrice()));
} }
} }

8
gates/src/main/java/ru/mlokoin/gates/model/student/Student.java

@ -68,8 +68,8 @@ public class Student implements Serializable{
this.second_name = Naimer.getSecondNameOf(cells.get(3).getContent()); this.second_name = Naimer.getSecondNameOf(cells.get(3).getContent());
this.last_name = Naimer.getLastNameOf(cells.get(3).getContent()); this.last_name = Naimer.getLastNameOf(cells.get(3).getContent());
this.profession = cells.get(4).getContent(); this.profession = Stringer.clear(cells.get(4).getContent());
this.direction = cells.get(2).getContent(); this.direction = Stringer.clear(cells.get(2).getContent());
/** /**
* Данные, отсутствующие в реестре: * Данные, отсутствующие в реестре:
* - category * - category
@ -107,10 +107,8 @@ public class Student implements Serializable{
&& this.last_name.equals(student.getLast_name()) && this.last_name.equals(student.getLast_name())
&& this.profession.equals(student.getProfession()) && this.profession.equals(student.getProfession())
&& this.direction.equals(student.getDirection()) && this.direction.equals(student.getDirection())
&& this.organization.isSimilar(student.getOrganization())
) { ) {
if (this.organization != null && student.getOrganization() != null) {
return this.organization.isSimilar(student.getOrganization());
}
return true; return true;
} }
return false; return false;

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

@ -101,14 +101,16 @@ public class Storage {
if (xlsxList == null || xlsxList.isEmpty()) { if (xlsxList == null || xlsxList.isEmpty()) {
return new ArrayList<Program>(); return new ArrayList<Program>();
} }
List<Program> result = new ArrayList<>(xlsxList); List<Program> result = new ArrayList<>(xlsxList);
if (baseList == null || baseList.isEmpty()) { if (baseList == null || baseList.isEmpty()) {
return result; return result;
} }
for (Program program : xlsxList) { for (Program program : xlsxList) {
for (Program baseProgram : baseList) { for (Program baseProgram : baseList) {
if (program.getName().equals(baseProgram.getName())) { if (program.isSimilar(baseProgram)) {
result.remove(program); result.remove(program);
break; break;
} }
@ -436,7 +438,7 @@ public class Storage {
return list; return list;
} }
private List<EducatonEntry> getAbsentEducationEntries(List<EducatonEntry> xlsxList) { public List<EducatonEntry> getAbsentEducationEntries(List<EducatonEntry> xlsxList) {
List<EducatonEntry> baseList = getBaseEducationEntries(); List<EducatonEntry> baseList = getBaseEducationEntries();
if (xlsxList == null || xlsxList.isEmpty()) { if (xlsxList == null || xlsxList.isEmpty()) {
return new ArrayList<EducatonEntry>(); return new ArrayList<EducatonEntry>();

4
storage-rs/pom.xml

@ -25,12 +25,12 @@
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId> <artifactId>poi</artifactId>
<version>5.2.0</version> <version>5.3.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<version>5.2.0</version> <version>5.3.0</version>
</dependency> </dependency>
<!-- <dependency> <!-- <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

2
storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java

@ -14,6 +14,7 @@ import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
// import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
// import lombok.AllArgsConstructor; // import lombok.AllArgsConstructor;
@ -35,6 +36,7 @@ public class XlsxDocument implements Serializable{
} }
private Map<Integer, List<XlsxCell>> init(DocumentModel document) { private Map<Integer, List<XlsxCell>> init(DocumentModel document) {
// IOUtils.setByteArrayMaxOverride(Integer.MAX_VALUE);
FileInputStream file; FileInputStream file;
Workbook workbook; Workbook workbook;
try { try {

Loading…
Cancel
Save