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

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

@ -149,8 +149,8 @@ public class CretareaController { @@ -149,8 +149,8 @@ public class CretareaController {
+ wraper.getList().toString());
for (ProgramCretarea cretarea : wraper.getList()) {
//Проверка наличия полного наименования критерия
if (!cretarea.getName().equals("")) {
//Проверка наличия краткого наименования критерия в базе
if (!cretarea.getName_short().equals("")) {
client.post()
.uri("http://resource-service-api:8181/cretarea/create")
.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 { @@ -68,7 +68,7 @@ public class EducationsController {
}
//Обращение к xlsx-файлу как к Реестру обученных
XlsxDocumentReestr xlsxEducations = new XlsxDocumentReestr(xlsx);
XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
//получение списка студентов из базы
System.out.println("Получение списка студентов из базы ...");
@ -92,118 +92,48 @@ public class EducationsController { @@ -92,118 +92,48 @@ public class EducationsController {
base_courses = new ArrayList<>();
}
//получение списка преподавателей из базы
System.out.println("Получение списка преподавателей из базы ...");
List<Teacher> base_teachers;
try {
base_teachers = storage.getBaseTeachers();
} catch (Exception e) {
errors.add("Ошибка при получении списка преподавателей из базы :: " +e.getMessage());
System.out.println("Не удалось получить список преподавателей из базы: " + e.getMessage());
base_teachers = new ArrayList<>();
}
//получение списка программ обучения из базы
System.out.println("Получение списка программ обучения из базы ...");
List<Program> base_programs;
try {
base_programs = storage.getBasePrograms();
} catch (Exception e) {
errors.add("Ошибка при получении списка программ обучения из базы :: " +e.getMessage());
System.out.println("Не удалось получить список программ обучения из базы: " + e.getMessage());
base_programs = new ArrayList<>();
}
//получение списка объектов строительства из базы
System.out.println("Получение списка объектов строительства из базы ...");
List<Building> base_buildings;
try {
base_buildings = storage.getBaseBuildings();
} catch (Exception e) {
errors.add("Ошибка при получении списка объектов строительства из базы :: " +e.getMessage());
System.out.println("Не удалось получить список объектов строительства из базы: " + e.getMessage());
base_buildings = new ArrayList<>();
}
//получение списка организаций из базы
System.out.println("Получение списка организаций из базы ...");
List<Organization> base_organizations;
try {
base_organizations = storage.getBaseOrganizations();
} catch (Exception e) {
errors.add("Ошибка при получении списка организаций из базы :: " +e.getMessage());
System.out.println("Не удалось получить список организаций из базы: " + e.getMessage());
base_organizations = new ArrayList<>();
}
//получение списка записей об обучениях из базы
System.out.println("Получение списка записей об обучениях из базы ...");
List<EducatonEntry> base_educations;
try {
base_educations = storage.getBaseEducationEntries();
} catch (Exception e) {
errors.add("Ошибка при получении списка записей об обучениях из базы :: " +e.getMessage());
System.out.println("Не удалось получить список записей об обучениях из базы: " + e.getMessage());
base_educations = new ArrayList<>();
}
//получение списка записей об обучениях из xlsx-файла
System.out.println("Получение списка записей об обучениях из xlsx-файла ...");
List<EducatonEntry> xlsx_educations = new ArrayList<>();
try {
xlsx_educations = xlsxEducations.getEducations(base_courses, base_students, base_teachers, base_programs, base_buildings, base_organizations);
} catch (Exception e) {
errors.add("Ошибка при получении списка записей об обучениях из xlsx-файла :: " +e.getMessage());
System.out.println("Не удалось получить список записей об обучениях из xlsx-файла: " + e.getMessage());
xlsx_educations = new ArrayList<>();
}
//фильтрация записей уже присутствующих в базе
List<EducatonEntry> filtered = new ArrayList<>();
for (EducatonEntry xlsx_entry : xlsx_educations) {
if (xlsx_entry != null) {
if (xlsx_entry.getStudent() != null
|| xlsx_entry.getCourse() != null) {
if (!filtered.contains(xlsx_entry)) {
boolean exists = false;
for (EducatonEntry base_entry : base_educations) {
if (base_entry.getSertificate_number().equals(xlsx_entry.getSertificate_number())
&& 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);
}
}
List<EducatonEntry> unique = reestr.getUniqueEducations();
List<EducatonEntry> absent = storage.getAbsentEducationEntries(unique);
// удаление строки заголовков из списка записей
// absent.remove(0);
//актуалзация полей согласно базе
for (EducatonEntry educatonEntry : absent) {
for (Course course : base_courses) {
if (educatonEntry.getCourse() != null
&& course.isSimilar(educatonEntry.getCourse())) {
educatonEntry.setCourse(course);
break;
}
}
for (Student student : base_students) {
if (educatonEntry.getStudent() != null
&& student.isSimilar(educatonEntry.getStudent())) {
educatonEntry.setStudent(student);
break;
}
}
}
//ограничение количества выводимых пользователю записей
if (filtered.size() > 0) {
if (filtered.size() > 200) {
filtered = filtered.subList(0, 200);
if (absent.size() > 0) {
if (absent.size() > 200) {
absent = absent.subList(0, 200);
}
}
EducationEntryWraper wraper = new EducationEntryWraper(filtered);
EducationEntryWraper wraper = new EducationEntryWraper(absent);
wraper.setCourses(base_courses);
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("xlsxReview", new XlsxReview(xlsxEducations));
model.addAttribute("xlsxReview", new XlsxReview(reestr));
model.addAttribute("wrapEducations", wraper);
model.addAttribute("errors", errors);
model.addAttribute("filename", xlsxEducations.getDocument().getName());
model.addAttribute("filename", reestr.getDocument().getName());
model.addAttribute("id", id);
// model.addAttribute("xlsx", xlsx.getData());
// 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; @@ -17,8 +17,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import ru.mlokoin.gates.model.fs.xlsx.XlsxCell;
import ru.mlokoin.gates.model.fs.xlsx.XlsxDocument;
import ru.mlokoin.gates.model.fs.xlsx.XlsxDocumentReestr;
import ru.mlokoin.gates.model.organization.Organization;
import ru.mlokoin.gates.model.student.Student;
import ru.mlokoin.gates.model.student.StudentWraper;
@ -50,60 +50,34 @@ public class StudentController { @@ -50,60 +50,34 @@ public class StudentController {
//получение данных файла в переменную xlsx
XlsxDocument xlsx = storage.getXlsxDocument(id);
//получение перечня студентов из xlsx
ArrayList<Student> xlsx_students = new ArrayList<>();
Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
xlsx_students.add(new Student(entry, base_organizations));
}
System.out.println("Всего студентов в xlsx: " + xlsx_students.size());
//получение перечня студентов из базы
List<Student> base_students = storage.getBaseStudents();
System.out.println("Всего студентов в базе: " + base_students.size());
/**
* Удаляем повторяющихся студентов из списка
* Исключаем из списка студентов, данные о которых уже присутствуют в базе
*/
List<Student> filtered = new ArrayList<>();
for (Student xlsx_student : xlsx_students) {
if (xlsx_student != null) {
// если имя не отсутствует, считаем, что студент существует
if (xlsx_student.getFirst_name() != null){
if (!filtered.contains(xlsx_student)) {
boolean exists = false;
if (base_students.size() > 0) {
for (Student base_student : base_students) {
exists = xlsx_student.getFirst_name().equals(base_student.getFirst_name())
&& xlsx_student.getLast_name().equals(base_student.getLast_name())
&& xlsx_student.getSecond_name().equals(base_student.getSecond_name())
&& xlsx_student.getProfession().equals(base_student.getProfession())
&& xlsx_student.getOrganization().equals(base_student.getOrganization())
&& xlsx_student.getDirection().equals(base_student.getDirection());
if (exists) {
break;
}
}
}
if (!exists) {
filtered.add(xlsx_student);
}
}
XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
List<Student> unique = reestr.getUniqueStudents();
System.out.println("Всего уникальных студентов в xlsx: " + unique.size());
List<Student> absent = storage.getAbsentStudents(unique);
System.out.println("Всего отсутствующих студентов в базе: " + absent.size());
//актуализируем список организаций
for (Student student : absent) {
for (Organization organization : base_organizations) {
if (student.getOrganization() != null
&& organization.isSimilar(student.getOrganization())
) {
student.setOrganization(organization);
break;
}
}
}
System.out.println("Уникальных студентов в xlsx: " + filtered.size());
//передает список студентов в шаблон
if (filtered.size() > 0) {
if (filtered.size() > 200) {
filtered = filtered.subList(0, 200);
if (absent.size() > 0) {
if (absent.size() > 200) {
absent = absent.subList(0, 200);
}
//создаем врапер для списка студентов
StudentWraper wraper = new StudentWraper(filtered);
StudentWraper wraper = new StudentWraper(absent);
wraper.setOrganizations(base_organizations);
//передаем врапер в шаблон
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 { @@ -25,30 +25,6 @@ public class XlsxDocumentReestr extends XlsxDocument {
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-документа,
* вложенные объекты не сверены с базой, не указаны id
@ -58,7 +34,9 @@ public class XlsxDocumentReestr extends XlsxDocument { @@ -58,7 +34,9 @@ public class XlsxDocumentReestr extends XlsxDocument {
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));
if (entry.getKey() != 0){
educations.add(new EducatonEntry(entry));
}
}
return educations;
}
@ -68,30 +46,20 @@ public class XlsxDocumentReestr extends XlsxDocument { @@ -68,30 +46,20 @@ public class XlsxDocumentReestr extends XlsxDocument {
* @return
*/
public List<EducatonEntry> getUniqueEducations() {
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));
List<EducatonEntry> educations = getEducationsAsIs();
List<EducatonEntry> unique = new ArrayList<>();
for (EducatonEntry entry : educations) {
if (!unique.contains(entry)) {
unique.add(entry);
}
}
return educations;
return unique;
}
public int getEducationsCount(){
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 { @@ -84,6 +84,8 @@ public class Program {
this.setCretarea(new ProgramCretarea(entry));
}
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{ @@ -68,8 +68,8 @@ public class Student implements Serializable{
this.second_name = Naimer.getSecondNameOf(cells.get(3).getContent());
this.last_name = Naimer.getLastNameOf(cells.get(3).getContent());
this.profession = cells.get(4).getContent();
this.direction = cells.get(2).getContent();
this.profession = Stringer.clear(cells.get(4).getContent());
this.direction = Stringer.clear(cells.get(2).getContent());
/**
* Данные, отсутствующие в реестре:
* - category
@ -107,10 +107,8 @@ public class Student implements Serializable{ @@ -107,10 +107,8 @@ public class Student implements Serializable{
&& this.last_name.equals(student.getLast_name())
&& this.profession.equals(student.getProfession())
&& 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 false;

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

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

4
storage-rs/pom.xml

@ -25,12 +25,12 @@ @@ -25,12 +25,12 @@
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.0</version>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.0</version>
<version>5.3.0</version>
</dependency>
<!-- <dependency>
<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; @@ -14,6 +14,7 @@ import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
// import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
// import lombok.AllArgsConstructor;
@ -35,6 +36,7 @@ public class XlsxDocument implements Serializable{ @@ -35,6 +36,7 @@ public class XlsxDocument implements Serializable{
}
private Map<Integer, List<XlsxCell>> init(DocumentModel document) {
// IOUtils.setByteArrayMaxOverride(Integer.MAX_VALUE);
FileInputStream file;
Workbook workbook;
try {

Loading…
Cancel
Save