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 {
}) })
public String saveBuildings(@ModelAttribute("wrapBuildngs") BuildingWraper wraper, @PathVariable String id){ public String saveBuildings(@ModelAttribute("wrapBuildngs") BuildingWraper wraper, @PathVariable String id){
for (Building building : wraper.getList()) { for (Building building : wraper.getList()) {
//Проверка наличия флага для добавления в базу if (building.getName_short() != ""){
//по полю табельного номера
if (building.getName_full() != ""){
client.post() client.post()
.uri("http://resource-service-api:8181/building/create") .uri("http://resource-service-api:8181/building/create")
.body(Mono.just(building), Building.class) .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;
import ru.mlokoin.gates.model.course.CourseWraper; import ru.mlokoin.gates.model.course.CourseWraper;
import ru.mlokoin.gates.model.fs.xlsx.XlsxCell; 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.program.Program; import ru.mlokoin.gates.model.program.Program;
import ru.mlokoin.gates.model.teacher.Teacher; import ru.mlokoin.gates.model.teacher.Teacher;
import ru.mlokoin.gates.repository.Storage; import ru.mlokoin.gates.repository.Storage;
@ -88,81 +89,44 @@ public class CourseController {
} }
// Получение курсов из xlsx // Получение курсов из xlsx
List<Course> xlsx_courses = new ArrayList<>();// 7 столбец System.out.println("Получение списка курсов из xlsx-файла ...");
Map<Integer, List<XlsxCell>> map = xlsx.getData(); XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { List<Course> xlsx_courses = reestr.getUniqueCourses();
xlsx_courses.add(new Course((Entry<Integer, List<XlsxCell>>) entry, teachers, programs, buildings));
} //Получение курсов, отсутствующих в базе
List<Course> absent = storage.getAbsentCourses(xlsx_courses);
//Получение перечня курсов из базы System.out.println("Количество уникальных курсов filtered: " + absent.size());
System.out.println("Получение списка курсов из базы ...");
List<Course> base_courses = storage.getBaseCourses(); //актуализация данных о преподавателях, программах, объектах строительства
System.out.println("Количество курсов в базе: " + base_courses.size()); for (Course course : absent) {
for (Teacher teacher : teachers) {
/***************************************************************************************** if (course.getTeacher().isSimilar(teacher)) {
* course.setTeacher(teacher);
* Удаление повторяющихся курсов }
* - удаляем повторяющиеся курсы в xlsx-файле }
* - удаляем курсы, присутствующие в базе for (Program program : programs) {
* * if (course.getProgram().isSimilar(program)) {
******************************************************************************************/ course.setProgram(program);
System.out.println("Удаляем повторяющиеся в xlsx-файле курсы ..."); }
System.out.println("Количество курсов в xlsx_courses: " + xlsx_courses.size()); }
List<Course> filtered = new ArrayList<Course>(); for (Building building : buildings) {
for (Course course : xlsx_courses) { if (course.getBuilding().isSimilar(building)) {
if (course != null) { course.setBuilding(building);
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("Количество уникальных курсов filtered: " + filtered.size());
//Передаем курсы в шаблон //Передаем курсы в шаблон
if (filtered.size() > 0) { if (absent.size() > 0) {
//Ограничиваем количество курсов, подлежащих передаче в wraper //Ограничиваем количество курсов, подлежащих передаче в wraper
// System.out.println("Общее количество курсов для добавления в базу: " + filtered.size()); // System.out.println("Общее количество курсов для добавления в базу: " + filtered.size());
if (filtered.size() > 200) { if (absent.size() > 200) {
filtered = filtered.subList(0, 200); absent = absent.subList(0, 200);
} }
//Создаем wraper для передачи в шаблон //Создаем wraper для передачи в шаблон
CourseWraper wraper = new CourseWraper(filtered); CourseWraper wraper = new CourseWraper(absent);
wraper.addPrograms(programs); wraper.addPrograms(programs);
wraper.addBuildings(buildings); wraper.addBuildings(buildings);
wraper.addTeachers(teachers); wraper.addTeachers(teachers);

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

@ -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;
import ru.mlokoin.gates.model.cretarea.ProgramCretarea; import ru.mlokoin.gates.model.cretarea.ProgramCretarea;
import ru.mlokoin.gates.model.fs.xlsx.XlsxCell; 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.program.Program; import ru.mlokoin.gates.model.program.Program;
import ru.mlokoin.gates.model.program.ProgramWraper; import ru.mlokoin.gates.model.program.ProgramWraper;
import ru.mlokoin.gates.repository.Storage; import ru.mlokoin.gates.repository.Storage;
@ -48,64 +49,51 @@ public class ProgramController {
System.out.println("Получение перечня программ из xlsx-файла ..."); System.out.println("Получение перечня программ из xlsx-файла ...");
//получение данных файла в переменную xlsx //получение данных файла в переменную xlsx
XlsxDocument xlsx = storage.getXlsxDocument(id); XlsxDocument xlsx = storage.getXlsxDocument(id);
XlsxDocumentReestr reestr = new XlsxDocumentReestr(xlsx);
//список программ из файла //список программ из файла
ArrayList<Program> xlsx_programs = new ArrayList<>();//7 столбец List<Program> unique_programs = reestr.getUniquePrograms();
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 System.out.println("Подстановка в объект программы критериев из базы ...");
.getValue() List<ProgramCretarea> base_cretareas = storage.getBaseCretareas();
.get(6) for (Program program : unique_programs) {
.getContent())); for (ProgramCretarea cretarea : base_cretareas) {
xlsx_programs.add(programm); if (program.getCretarea().isSimilar(cretarea)) {
} System.out.println("Найдено совпадение: " + program.getCretarea().getName_short());
xlsx_programs.remove(0);//Удалили из списка заголовок program.setCretarea(cretarea);
Set<Program> xlsx_programSet = Set.copyOf(xlsx_programs); break;
}
//список уникальных наименований из файла }
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> absent = storage.getAbsentPrograms(unique_programs);
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());
}
//Удаление программ присутствующих в базе //Подготавлеваем обертку формы
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.setCretareas(base_cretareas);
//подготавливаем список направлений обучения
pwraper.addStudyDirections(study_directions);
//передаем обертку в модель //передаем обертку в модель
model.addAttribute("wrapPrograms", pwraper); model.addAttribute("wrapPrograms", pwraper);
model.addAttribute("id", id); 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{
public Building(Entry<Integer, List<XlsxCell>> entry) { public Building(Entry<Integer, List<XlsxCell>> entry) {
this.setName_short(Stringer.clear(entry.getValue().get(19).getContent())); 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 {
} catch (Exception e) { } catch (Exception e) {
this.setStart_date(null); this.setStart_date(null);
} }
// this.setStart_date(new Date(Long.parseLong(Stringer.clear(entry.getValue().get(7).getContent()))));
try { try {
this.setProtocol_date(new Date(Long.parseLong(Stringer.clear(entry.getValue().get(9).getContent())))); this.setProtocol_date(new Date(Long.parseLong(Stringer.clear(entry.getValue().get(9).getContent()))));
} catch (Exception e) { } catch (Exception e) {
this.setProtocol_date(null); 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.setProtocol_number(Stringer.clear(entry.getValue().get(13).getContent()));
this.setReport_period(Stringer.clear(entry.getValue().get(17).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{
} }
} }
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 {
Student xlsx_student = new Student(entry, base_organizations); Student xlsx_student = new Student(entry, base_organizations);
for (Student base_student : base_students) { for (Student base_student : base_students) {
if (base_student.getFirst_name().equals(xlsx_student.getFirst_name()) if (base_student.isSimilar(xlsx_student)){
&& 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())) {
this.student = base_student; this.student = base_student;
break; break;
} }
} }
this.ones = cells.get(16).getContent(); this.ones = Stringer.clear(cells.get(16).getContent());
this.sertificate_number = cells.get(14).getContent(); this.sertificate_number = Stringer.clear(cells.get(14).getContent());
} }
} }
@ -122,7 +117,7 @@ public class EducatonEntry {
&& educatonEntry.getSertificate_number() != "" && educatonEntry.getSertificate_number() != ""
&& !educatonEntry.getSertificate_number().isEmpty()) { && !educatonEntry.getSertificate_number().isEmpty()) {
if (educatonEntry.getSertificate_number().equals(this.getSertificate_number())) { 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; return true;
} }
} }

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

@ -16,10 +16,4 @@ public class XlsxDocument implements Serializable{
private Map<Integer, List<XlsxCell>> data; private Map<Integer, List<XlsxCell>> data;
private Document document; private Document document;
private List<XlsxCell> headers; 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;
public class XlsxDocumentReestr extends XlsxDocument { public class XlsxDocumentReestr extends XlsxDocument {
public XlsxDocumentReestr(XlsxDocument xlsx) { 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 {
setBuildingsCount(storage.getAbsentBuildingsCount(xlsxEducations.getUniqueBuildings())); setBuildingsCount(storage.getAbsentBuildingsCount(xlsxEducations.getUniqueBuildings()));
setCoursesCount(storage.getAbsentCoursesCount(xlsxEducations.getUniqueCourses())); setCoursesCount(storage.getAbsentCoursesCount(xlsxEducations.getUniqueCourses()));
setProgramCretareaCount(storage.getAbsentProgramsCount(xlsxEducations.getUniquePrograms())); setProgramsCount(storage.getAbsentProgramsCount(xlsxEducations.getUniquePrograms()));
setTeachersCount(storage.getAbsentTeachersCount(xlsxEducations.getUniqueTeachers())); setTeachersCount(storage.getAbsentTeachersCount(xlsxEducations.getUniqueTeachers()));
setStudentsCount(storage.getAbsentStudentsCount(xlsxEducations.getUniqueStudents())); setStudentsCount(storage.getAbsentStudentsCount(xlsxEducations.getUniqueStudents()));
setOrganizationsCount(storage.getAbsentOrganizationsCount(xlsxEducations.getUniqueOrganizations())); setOrganizationsCount(storage.getAbsentOrganizationsCount(xlsxEducations.getUniqueOrganizations()));

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

@ -51,5 +51,39 @@ public class Program {
public Program(Entry<Integer, List<XlsxCell>> entry) { public Program(Entry<Integer, List<XlsxCell>> entry) {
this.setName(Stringer.clear(entry.getValue().get(6).getContent())); 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;
public class ProgramWraper { public class ProgramWraper {
List<Program> programs; List<Program> programs;
List<ProgramCretarea> cretareas; List<ProgramCretarea> cretareas;
List<String> directions;
public ProgramWraper(){ public ProgramWraper(){
init(); init();
} }
public ProgramWraper(ArrayList<Program> list) { public ProgramWraper(ArrayList<Program> list) {
init();
this.programs = list; this.programs = list;
} }
public void init(){ public void init(){
this.programs = new ArrayList<>(); this.programs = new ArrayList<>();
this.cretareas = new ArrayList<>();
this.directions = new ArrayList<>();
} }
public void addProgram(Program program){ public void addProgram(Program program){
@ -34,6 +38,15 @@ public class ProgramWraper {
this.cretareas.add(cretarea); 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(){ public String toString(){
return this.programs.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{
return true; return true;
} }
return false; return false;
} }
} }

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

@ -103,4 +103,8 @@ public class Teacher implements Serializable{
this.setSecond_name(Naimer.getSecondNameOf(fio)); this.setSecond_name(Naimer.getSecondNameOf(fio));
this.setLast_name(Naimer.getLastNameOf(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 @@
<form th:action="@{/courses/save/{id}(id=${id})}" <form th:action="@{/courses/save/{id}(id=${id})}"
th:method="post" th:method="post"
th:object="${wrapCourses}"> th:object="${wrapCourses}">
<input type="submit" value="POST-ALL"/>
<table rules="all"> <table rules="all">
<thead> <thead>
<th><span>Место проведения занятий (place)</span></th> <th><span>Место проведения занятий (place)</span></th>

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

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

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

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

Loading…
Cancel
Save