Browse Source

gates update

master
esoe 3 months ago
parent
commit
5331ccb5aa
  1. 4
      gates/src/main/java/ru/mlokoin/gates/controller/v1/BuildingController.java
  2. 94
      gates/src/main/java/ru/mlokoin/gates/controller/v1/CourseController.java
  3. 2
      gates/src/main/java/ru/mlokoin/gates/controller/v1/CretareaController.java
  4. 82
      gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java
  5. 4
      gates/src/main/java/ru/mlokoin/gates/model/building/Building.java
  6. 2
      gates/src/main/java/ru/mlokoin/gates/model/course/Course.java
  7. 3
      gates/src/main/java/ru/mlokoin/gates/model/cretarea/ProgramCretarea.java
  8. 13
      gates/src/main/java/ru/mlokoin/gates/model/education/EducatonEntry.java
  9. 6
      gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocument.java
  10. 4
      gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java
  11. 2
      gates/src/main/java/ru/mlokoin/gates/model/monitor/AbsentReview.java
  12. 34
      gates/src/main/java/ru/mlokoin/gates/model/program/Program.java
  13. 13
      gates/src/main/java/ru/mlokoin/gates/model/program/ProgramWraper.java
  14. 1
      gates/src/main/java/ru/mlokoin/gates/model/student/Student.java
  15. 4
      gates/src/main/java/ru/mlokoin/gates/model/teacher/Teacher.java
  16. 1
      gates/src/main/resources/templates/courses-check.html
  17. 2
      gates/src/main/resources/templates/organization-check.html
  18. 36
      gates/src/main/resources/templates/programs-check.html

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

@ -123,9 +123,7 @@ public class BuildingController { @@ -123,9 +123,7 @@ public class BuildingController {
})
public String saveBuildings(@ModelAttribute("wrapBuildngs") BuildingWraper wraper, @PathVariable String id){
for (Building building : wraper.getList()) {
//Проверка наличия флага для добавления в базу
//по полю табельного номера
if (building.getName_full() != ""){
if (building.getName_short() != ""){
client.post()
.uri("http://resource-service-api:8181/building/create")
.body(Mono.just(building), Building.class)

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

@ -23,6 +23,7 @@ import ru.mlokoin.gates.model.course.Course; @@ -23,6 +23,7 @@ import ru.mlokoin.gates.model.course.Course;
import ru.mlokoin.gates.model.course.CourseWraper;
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.program.Program;
import ru.mlokoin.gates.model.teacher.Teacher;
import ru.mlokoin.gates.repository.Storage;
@ -88,81 +89,44 @@ public class CourseController { @@ -88,81 +89,44 @@ public class CourseController {
}
// Получение курсов из xlsx
List<Course> xlsx_courses = new ArrayList<>();// 7 столбец
Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
xlsx_courses.add(new Course((Entry<Integer, List<XlsxCell>>) entry, teachers, programs, buildings));
}
//Получение перечня курсов из базы
System.out.println("Получение списка курсов из базы ...");
List<Course> base_courses = storage.getBaseCourses();
System.out.println("Количество курсов в базе: " + base_courses.size());
/*****************************************************************************************
*
* Удаление повторяющихся курсов
* - удаляем повторяющиеся курсы в xlsx-файле
* - удаляем курсы, присутствующие в базе
* *
******************************************************************************************/
System.out.println("Удаляем повторяющиеся в xlsx-файле курсы ...");
System.out.println("Количество курсов в xlsx_courses: " + xlsx_courses.size());
List<Course> filtered = new ArrayList<Course>();
for (Course course : xlsx_courses) {
if (course != null) {
if (course.getStart_date() != null && course.getBuilding() != null && course.getTeacher() != null) {
if (!filtered.contains(course)) {
boolean exists = false;
//Проверяем наличие курса в базе
if (base_courses.size() > 0) {
//Сравниваем курс из xlsx-файла с каждой записью в базе
for (Course base_course : base_courses) {
// номер протокола нулевой, сравниваем курсы по дате начала обучения, объекту строительства, фио преподавателя
if (course.getProtocol_number() == null ||
course.getProtocol_number().isEmpty() ||
course.getProtocol_number().equals("")) {
exists = course.getTeacher().equals(base_course.getTeacher())
&& course.getProgram().equals(base_course.getProgram())
&& course.getPlace().equals(base_course.getPlace())
&& course.getStart_date().equals(base_course.getStart_date());
if (exists) {
break;
}
}
// номер протокола не нулевой, сравниваем курсы по номеру протокола
else {
exists = course.getProtocol_number().equals(base_course.getProtocol_number());
if (exists) {
break;
}
}
}
}
//Если курс еще не в списке и не существует в базе, добавляем курс в список
if (!exists) {
filtered.add(course);
}
}
System.out.println("Получение списка курсов из xlsx-файла ...");
XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
List<Course> xlsx_courses = reestr.getUniqueCourses();
//Получение курсов, отсутствующих в базе
List<Course> absent = storage.getAbsentCourses(xlsx_courses);
System.out.println("Количество уникальных курсов filtered: " + absent.size());
//актуализация данных о преподавателях, программах, объектах строительства
for (Course course : absent) {
for (Teacher teacher : teachers) {
if (course.getTeacher().isSimilar(teacher)) {
course.setTeacher(teacher);
}
}
for (Program program : programs) {
if (course.getProgram().isSimilar(program)) {
course.setProgram(program);
}
}
for (Building building : buildings) {
if (course.getBuilding().isSimilar(building)) {
course.setBuilding(building);
}
}
}
System.out.println("Количество уникальных курсов filtered: " + filtered.size());
//Передаем курсы в шаблон
if (filtered.size() > 0) {
if (absent.size() > 0) {
//Ограничиваем количество курсов, подлежащих передаче в wraper
// System.out.println("Общее количество курсов для добавления в базу: " + filtered.size());
if (filtered.size() > 200) {
filtered = filtered.subList(0, 200);
if (absent.size() > 200) {
absent = absent.subList(0, 200);
}
//Создаем wraper для передачи в шаблон
CourseWraper wraper = new CourseWraper(filtered);
CourseWraper wraper = new CourseWraper(absent);
wraper.addPrograms(programs);
wraper.addBuildings(buildings);
wraper.addTeachers(teachers);

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

@ -164,7 +164,7 @@ public class CretareaController { @@ -164,7 +164,7 @@ public class CretareaController {
* Возвращаем пользователя на страницу перечня новых критериев
* - если он не пустой
*/
return "redirect:/cretareas/check/" + id;
return "redirect:/program-cretareas/check/" + id;
}
}

82
gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java

@ -22,6 +22,7 @@ import reactor.core.publisher.Mono; @@ -22,6 +22,7 @@ import reactor.core.publisher.Mono;
import ru.mlokoin.gates.model.cretarea.ProgramCretarea;
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.program.Program;
import ru.mlokoin.gates.model.program.ProgramWraper;
import ru.mlokoin.gates.repository.Storage;
@ -48,64 +49,51 @@ public class ProgramController { @@ -48,64 +49,51 @@ public class ProgramController {
System.out.println("Получение перечня программ из xlsx-файла ...");
//получение данных файла в переменную xlsx
XlsxDocument xlsx = storage.getXlsxDocument(id);
XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
//список программ из файла
ArrayList<Program> xlsx_programs = new ArrayList<>();//7 столбец
Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) {
Program programm = new Program();
programm.setName(Stringer.clear(entry
.getValue()
.get(6)
.getContent()));
xlsx_programs.add(programm);
}
xlsx_programs.remove(0);//Удалили из списка заголовок
Set<Program> xlsx_programSet = Set.copyOf(xlsx_programs);
//список уникальных наименований из файла
System.out.println("Список уникальных сокращенных наименований критериев из файла:");
Set<String> xlsx_stringSet = new HashSet<>();
for (Program pc : xlsx_programSet) {
System.out.println(pc.getName());
xlsx_stringSet.add(pc.getName());
List<Program> unique_programs = reestr.getUniquePrograms();
//заменяем критерии программ обучения данными из базы
//получаем список критериев
System.out.println("Подстановка в объект программы критериев из базы ...");
List<ProgramCretarea> base_cretareas = storage.getBaseCretareas();
for (Program program : unique_programs) {
for (ProgramCretarea cretarea : base_cretareas) {
if (program.getCretarea().isSimilar(cretarea)) {
System.out.println("Найдено совпадение: " + program.getCretarea().getName_short());
program.setCretarea(cretarea);
break;
}
}
}
//Получение перечня программ из базы
System.out.println("Получение списка программ из базы ...");
List<Program> base_programs = storage.getBasePrograms();
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());
}
List<Program> absent = storage.getAbsentPrograms(unique_programs);
//Удаление программ присутствующих в базе
xlsx_stringSet.removeAll(base_stringSet);
//Подготавлеваем обертку формы
//unique_programs содержит строку заголовков, поэтому проверяем, чтобы было больше одной записи
if (absent.size() != 0 ) {
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);
}
/**
* Подготавлеваем обертку формы
*/
//Подготавливаем список направлений обучения для передачи в представление
List<String> study_directions = new ArrayList<>();
// study_directions.add("направления обучения");
study_directions.add("Обязательное обучение");
study_directions.add("Производственное обучение");
study_directions.add("Профессиональная переподготовка");
study_directions.add("Обучение водителей");
study_directions.add("Обучение вновь внедряемым процедурам");
// передаем список новых программ
ProgramWraper pwraper = new ProgramWraper(list);
ProgramWraper pwraper = new ProgramWraper();
pwraper.setPrograms(absent);
//подготавливаем список критериев
List<ProgramCretarea> base_cretareas = storage.getBaseCretareas();
//передаем список критериев в обертку формы, для селекта
pwraper.setCretareas(base_cretareas);
//подготавливаем список направлений обучения
pwraper.addStudyDirections(study_directions);
//передаем обертку в модель
model.addAttribute("wrapPrograms", pwraper);
model.addAttribute("id", id);

4
gates/src/main/java/ru/mlokoin/gates/model/building/Building.java

@ -38,4 +38,8 @@ public class Building implements Serializable{ @@ -38,4 +38,8 @@ public class Building implements Serializable{
public Building(Entry<Integer, List<XlsxCell>> entry) {
this.setName_short(Stringer.clear(entry.getValue().get(19).getContent()));
}
public boolean isSimilar(Building building) {
return this.getName_short().equals(building.getName_short());
}
}

2
gates/src/main/java/ru/mlokoin/gates/model/course/Course.java

@ -64,14 +64,12 @@ public class Course { @@ -64,14 +64,12 @@ public class Course {
} catch (Exception e) {
this.setStart_date(null);
}
// this.setStart_date(new Date(Long.parseLong(Stringer.clear(entry.getValue().get(7).getContent()))));
try {
this.setProtocol_date(new Date(Long.parseLong(Stringer.clear(entry.getValue().get(9).getContent()))));
} catch (Exception e) {
this.setProtocol_date(null);
}
// this.setProtocol_date(new Date(Long.parseLong(Stringer.clear(entry.getValue().get(9).getContent())))); // Stringer.clear(entry.getValue().get(9).getContent()));
this.setProtocol_number(Stringer.clear(entry.getValue().get(13).getContent()));
this.setReport_period(Stringer.clear(entry.getValue().get(17).getContent()));

3
gates/src/main/java/ru/mlokoin/gates/model/cretarea/ProgramCretarea.java

@ -37,5 +37,8 @@ public class ProgramCretarea implements Serializable{ @@ -37,5 +37,8 @@ public class ProgramCretarea implements Serializable{
}
}
public boolean isSimilar(ProgramCretarea programCretarea) {
return this.name_short.equals(programCretarea.getName_short());
}
}

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

@ -80,19 +80,14 @@ public class EducatonEntry { @@ -80,19 +80,14 @@ public class EducatonEntry {
Student xlsx_student = new Student(entry, base_organizations);
for (Student base_student : base_students) {
if (base_student.getFirst_name().equals(xlsx_student.getFirst_name())
&& base_student.getSecond_name().equals(xlsx_student.getSecond_name())
&& base_student.getLast_name().equals(xlsx_student.getLast_name())
&& base_student.getProfession().equals(xlsx_student.getProfession())
&& base_student.getDirection().equals(xlsx_student.getDirection())
&& base_student.getOrganization().getName_full().equals(xlsx_student.getOrganization().getName_full())) {
if (base_student.isSimilar(xlsx_student)){
this.student = base_student;
break;
}
}
this.ones = cells.get(16).getContent();
this.sertificate_number = cells.get(14).getContent();
this.ones = Stringer.clear(cells.get(16).getContent());
this.sertificate_number = Stringer.clear(cells.get(14).getContent());
}
}
@ -122,7 +117,7 @@ public class EducatonEntry { @@ -122,7 +117,7 @@ public class EducatonEntry {
&& educatonEntry.getSertificate_number() != ""
&& !educatonEntry.getSertificate_number().isEmpty()) {
if (educatonEntry.getSertificate_number().equals(this.getSertificate_number())) {
if (educatonEntry.getCourse().getStart_date().equals(this.getCourse().getStart_date())) {
if (educatonEntry.getCourse().isSimilar(this.course)) {
return true;
}
}

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

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

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

@ -20,7 +20,9 @@ import ru.mlokoin.gates.model.teacher.Teacher; @@ -20,7 +20,9 @@ import ru.mlokoin.gates.model.teacher.Teacher;
public class XlsxDocumentReestr extends XlsxDocument {
public XlsxDocumentReestr(XlsxDocument xlsx) {
super(xlsx);
setData(xlsx.getData());
setDocument(xlsx.getDocument());
setHeaders(xlsx.getHeaders());
}
/**

2
gates/src/main/java/ru/mlokoin/gates/model/monitor/AbsentReview.java

@ -23,7 +23,7 @@ public class AbsentReview { @@ -23,7 +23,7 @@ public class AbsentReview {
setBuildingsCount(storage.getAbsentBuildingsCount(xlsxEducations.getUniqueBuildings()));
setCoursesCount(storage.getAbsentCoursesCount(xlsxEducations.getUniqueCourses()));
setProgramCretareaCount(storage.getAbsentProgramsCount(xlsxEducations.getUniquePrograms()));
setProgramsCount(storage.getAbsentProgramsCount(xlsxEducations.getUniquePrograms()));
setTeachersCount(storage.getAbsentTeachersCount(xlsxEducations.getUniqueTeachers()));
setStudentsCount(storage.getAbsentStudentsCount(xlsxEducations.getUniqueStudents()));
setOrganizationsCount(storage.getAbsentOrganizationsCount(xlsxEducations.getUniqueOrganizations()));

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

@ -51,5 +51,39 @@ public class Program { @@ -51,5 +51,39 @@ public class Program {
public Program(Entry<Integer, List<XlsxCell>> entry) {
this.setName(Stringer.clear(entry.getValue().get(6).getContent()));
//устанавливаем длительность программы
try {
String s = Stringer.clear(entry.getValue().get(8).getContent());
if (s == "") {
s = 0 + "";
} else {
s = s.split("\\.", 2)[0];
}
this.setLenght(Integer.parseInt(s));//если что, субстринг до точки
} catch (Exception e) {
this.setLenght(0);
}
this.setStudy_direction(Stringer.clear(entry.getValue().get(11).getContent()));
//устанавливаем стоимость обучения
try {
String s = Stringer.clear(entry.getValue().get(15).getContent());
if (s == "") {
s = 0 + "";
} else {
s = s.split("\\.", 2)[0];
}
this.setPrice(Integer.parseInt(s));
} catch (Exception e) {
this.setPrice(0);
}
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()));
}
}

13
gates/src/main/java/ru/mlokoin/gates/model/program/ProgramWraper.java

@ -13,17 +13,21 @@ import ru.mlokoin.gates.model.cretarea.ProgramCretarea; @@ -13,17 +13,21 @@ import ru.mlokoin.gates.model.cretarea.ProgramCretarea;
public class ProgramWraper {
List<Program> programs;
List<ProgramCretarea> cretareas;
List<String> directions;
public ProgramWraper(){
init();
}
public ProgramWraper(ArrayList<Program> list) {
init();
this.programs = list;
}
public void init(){
this.programs = new ArrayList<>();
this.cretareas = new ArrayList<>();
this.directions = new ArrayList<>();
}
public void addProgram(Program program){
@ -34,6 +38,15 @@ public class ProgramWraper { @@ -34,6 +38,15 @@ public class ProgramWraper {
this.cretareas.add(cretarea);
}
public void addStudyDirection(String study_direction){
this.directions.add(study_direction);
}
public void addStudyDirections(List<String> study_directions){
this.directions.addAll(study_directions);
}
public String toString(){
return this.programs.toString();
}

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

@ -114,6 +114,5 @@ public class Student implements Serializable{ @@ -114,6 +114,5 @@ public class Student implements Serializable{
return true;
}
return false;
}
}

4
gates/src/main/java/ru/mlokoin/gates/model/teacher/Teacher.java

@ -103,4 +103,8 @@ public class Teacher implements Serializable{ @@ -103,4 +103,8 @@ public class Teacher implements Serializable{
this.setSecond_name(Naimer.getSecondNameOf(fio));
this.setLast_name(Naimer.getLastNameOf(fio));
}
public boolean isSimilar(Teacher teacher) {
return this.getFullName().equals(teacher.getFullName());
}
}

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

@ -41,6 +41,7 @@ @@ -41,6 +41,7 @@
<form th:action="@{/courses/save/{id}(id=${id})}"
th:method="post"
th:object="${wrapCourses}">
<input type="submit" value="POST-ALL"/>
<table rules="all">
<thead>
<th><span>Место проведения занятий (place)</span></th>

2
gates/src/main/resources/templates/organization-check.html

@ -25,6 +25,8 @@ @@ -25,6 +25,8 @@
<form th:action="@{/organizations/save/{id}(id=${id})}"
th:method="post"
th:object="${wrapOrganizations}">
<input type="submit" value="POST-ALL"/>
<table rules="all">
<thead>
<th>Форма собственности (ownership)</th>

36
gates/src/main/resources/templates/programs-check.html

@ -12,13 +12,6 @@ @@ -12,13 +12,6 @@
<body>
<header>
<h2>check-programs</h2>
<ul>
<li>Наименование программы не должно содержать знаков переноса строки.
При внесении в базу они заменяются пробелами и не проходят проверку при сравнении с наименованием в xlsx</li>
<li></li>
<li></li>
</ul>
</header>
<main>
<form th:action="@{/programs/save/{id}(id=${id})}"
@ -29,35 +22,36 @@ @@ -29,35 +22,36 @@
<th><span>Наименование программы (name)</span></th>
<th><span>Продолжительность, часов (lenght)</span></th>
<th><span>Направление обучения (study_direction)</span></th>
<th><span>Стоимость (price)</span></th>
<th><span>Стоимость, руб. (price)</span></th>
<th><span>Критерий (cretarea_id)</span></th>
</thead>
<tbody>
<tr th:each="p, pStat : *{getPrograms()}" >
<td>
<input type="text" th:field="*{programs[__${pStat.index}__].name}">
<span th:text="*{programs[__${pStat.index}__].name}"></span>
<input type="text" th:field="*{programs[__${pStat.index}__].name}" hidden>
<!-- <div></div> -->
</td>
<td>
<input type="text" th:field="*{programs[__${pStat.index}__].lenght}"/>
</td>
<td>
<select th:field="*{programs[__${pStat.index}__].study_direction}">
<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>
<input type="text" th:field="*{programs[__${pStat.index}__].study_direction}">
<!-- <select th:field="*{programs[__${pStat.index}__].study_direction}" required> -->
<!-- <select id="study_direction_list" name="study_direction_list"> -->
<!-- <option th:selected="selected" th:disabled="disabled" value="" >направления обучения</option> -->
<!-- <option th:each="option, optionStat : *{directions}" th:value="${optionStat.index}" th:text="${option}" ></option>
</select> -->
</td>
<td>
<input type="text" th:field="*{programs[__${pStat.index}__].price}"/>
</td>
<td>
<select th:field="*{programs[__${pStat.index}__].cretarea.id}">
<option value="0" disabled >выберите критерий</option>
<option th:each="option : *{cretareas}" th:value="${option.id}" th:text="${option.name_short}"></option>
</select>
<input type="text" th:field="*{programs[__${pStat.index}__].cretarea.id}"/>
<!-- <select th:field="*{programs[__${pStat.index}__].cretarea.id}" required> -->
<!-- <option th:disabled="disabled" th:selected="selected" value="0" >критерий</option> -->
<!-- <option th:each="option : *{cretareas}" th:value="${option.id}" th:text="${option.name_short}"></option>
</select> -->
</td>
</tr>
</tbody>

Loading…
Cancel
Save