Browse Source
modified: gates/src/main/java/ru/mlokoin/gates/model/Building.java modified: gates/src/main/java/ru/mlokoin/gates/model/Course.java new file: gates/src/main/java/ru/mlokoin/gates/model/CourseWraper.java modified: gates/src/main/java/ru/mlokoin/gates/model/Program.java modified: gates/src/main/java/ru/mlokoin/gates/model/Teacher.java new file: gates/src/main/resources/templates/courses-check.html modified: gates/src/main/resources/templates/view-as-educations.html modified: storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java modified: storage-rs/src/main/resources/application.yamlmaster
esoe
5 months ago
10 changed files with 394 additions and 4 deletions
@ -0,0 +1,214 @@ |
|||||||
|
package ru.mlokoin.gates.controller; |
||||||
|
|
||||||
|
import java.time.Duration; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.core.ParameterizedTypeReference; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.stereotype.Controller; |
||||||
|
import org.springframework.ui.Model; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute; |
||||||
|
import org.springframework.web.bind.annotation.PathVariable; |
||||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||||
|
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.Building; |
||||||
|
import ru.mlokoin.gates.model.Course; |
||||||
|
import ru.mlokoin.gates.model.Program; |
||||||
|
import ru.mlokoin.gates.model.ProgramCretarea; |
||||||
|
import ru.mlokoin.gates.model.ProgramWraper; |
||||||
|
import ru.mlokoin.gates.model.Teacher; |
||||||
|
import ru.mlokoin.gates.model.XlsxCell; |
||||||
|
import ru.mlokoin.gates.model.XlsxDocument; |
||||||
|
|
||||||
|
@Controller |
||||||
|
@RequestMapping(path = "/courses") |
||||||
|
public class CourseController { |
||||||
|
@Autowired |
||||||
|
private WebClient client; |
||||||
|
|
||||||
|
@GetMapping("/check/{id}") |
||||||
|
public String checkCoursess(Model model, @PathVariable String id) { |
||||||
|
System.out.println("Проверка курсов, для внесения в базу ..."); |
||||||
|
System.out.println("Получение перечня курсов из xlsx-файла ..."); |
||||||
|
//получение данных файла в переменную xlsx
|
||||||
|
XlsxDocument xlsx = client.method(HttpMethod.GET) |
||||||
|
.uri("http://storage-rs:8282/api/document/content/" |
||||||
|
+ id + ".xlsx") |
||||||
|
.retrieve() |
||||||
|
.bodyToMono(new ParameterizedTypeReference <XlsxDocument>(){}) |
||||||
|
.block(); |
||||||
|
//список курсов из файла
|
||||||
|
List<Course> xlsx_courses = new ArrayList<>();//7 столбец
|
||||||
|
Map<Integer, List<XlsxCell>> map = xlsx.getData(); |
||||||
|
for (Map.Entry<Integer, List<XlsxCell>> entry : map.entrySet()) { |
||||||
|
Course course = new Course(); |
||||||
|
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("Список протоколов из файла:" + xlsx_courseSet.size()); |
||||||
|
// Set<String> xlsx_stringSet = new HashSet<>();
|
||||||
|
for (Course c : xlsx_courseSet) { |
||||||
|
System.out.println(c.getProtocol_number() + " от " + c.getProtocol_date()); |
||||||
|
// xlsx_stringSet.add(c.);
|
||||||
|
} |
||||||
|
|
||||||
|
// //Получение перечня программ из базы
|
||||||
|
// System.out.println("Получение списка программ из базы ...");
|
||||||
|
// List<Program> base_programs = client.method(HttpMethod.GET)
|
||||||
|
// .uri("http://resource-service-api:8181/program/list")
|
||||||
|
// .retrieve()
|
||||||
|
// .bodyToMono(new ParameterizedTypeReference <List<Program>>(){})
|
||||||
|
// .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;
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Добавление новых программ обучения в базу |
||||||
|
* @param wraper |
||||||
|
* @param id |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@PostMapping( |
||||||
|
path="/save/{id}", |
||||||
|
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, |
||||||
|
produces = { |
||||||
|
MediaType.APPLICATION_JSON_VALUE |
||||||
|
}) |
||||||
|
public String savePrograms(@ModelAttribute("wrapPrograms") ProgramWraper wraper, @PathVariable String id){ |
||||||
|
/** |
||||||
|
* Отправляем запросы на добавление новых программ в базу |
||||||
|
*/ |
||||||
|
System.out.println("Программы для добавления в базу: " |
||||||
|
+ wraper.getPrograms().toString()); |
||||||
|
for (Program program : wraper.getPrograms()) { |
||||||
|
//Проверка наличия полного наименования имени программы
|
||||||
|
if (!program.getName().equals("")) { |
||||||
|
//проверка наличия длительности программы
|
||||||
|
if (program.getLenght() != null) { |
||||||
|
//проверка наличия направления обучения
|
||||||
|
if (!program.getStudy_direction().equals("")){ |
||||||
|
//проверка наличия критерия
|
||||||
|
if (program.getCretarea() != null){ |
||||||
|
client.post() |
||||||
|
.uri("http://resource-service-api:8181/program/create") |
||||||
|
.body(Mono.just(program), Program.class) |
||||||
|
.retrieve() |
||||||
|
.toBodilessEntity() |
||||||
|
.timeout(Duration.ofSeconds(1)) |
||||||
|
.block(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
/** |
||||||
|
* Возвращаем пользователя на страницу перечня новых критериев |
||||||
|
* - если он не пустой |
||||||
|
*/ |
||||||
|
return "redirect:/programs/check/" + id; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package ru.mlokoin.gates.model; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class CourseWraper { |
||||||
|
List<Course> courses; |
||||||
|
List<Program> programs; |
||||||
|
List<Building> buildings; |
||||||
|
List<Teacher> teachers; |
||||||
|
|
||||||
|
public CourseWraper(){ |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
public CourseWraper(List<Course> list) { |
||||||
|
this.courses = list; |
||||||
|
} |
||||||
|
public void init(){ |
||||||
|
this.courses = new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
public void addCourse(Course course){ |
||||||
|
this.courses.add(course); |
||||||
|
} |
||||||
|
|
||||||
|
public void addProgram(Program program){ |
||||||
|
this.programs.add(program); |
||||||
|
} |
||||||
|
|
||||||
|
public void addBuilding(Building building){ |
||||||
|
this.buildings.add(building); |
||||||
|
} |
||||||
|
|
||||||
|
public void addTeacher(Teacher teacher){ |
||||||
|
this.teachers.add(teacher); |
||||||
|
} |
||||||
|
|
||||||
|
public String toString(){ |
||||||
|
return this.courses.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
<!DOCTYPE HTML> |
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" |
||||||
|
xmlns:th="http://www.thymeleaf.org"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<title>check-courses</title> |
||||||
|
<!-- Скрипт обработки thymeleaf компонентов --> |
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2/webcomponents-loader.min.js"></script> |
||||||
|
<!-- скрипт просмотра *.MD документов --> |
||||||
|
<!-- <script type="module" src="https://cdn.jsdelivr.net/gh/zerodevx/zero-md@1/src/zero-md.min.js"></script> --> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<header> |
||||||
|
<h2>check-courses</h2> |
||||||
|
<ul> |
||||||
|
<li></li> |
||||||
|
<li></li> |
||||||
|
</ul> |
||||||
|
|
||||||
|
</header> |
||||||
|
<main> |
||||||
|
<!-- <form th:action="@{/courses/save/{id}(id=${id})}" |
||||||
|
th:method="post" |
||||||
|
th:object="${wrapCourses}"> |
||||||
|
<table rules="all"> |
||||||
|
<thead> |
||||||
|
<th><span>Место проведения занятий (place)</span></th> |
||||||
|
<th><span>Дата начала (start_date)</span></th> |
||||||
|
<th><span>Дата протокола (protocol_date)</span></th> |
||||||
|
<th><span>Номер протокола (protocol_number)</span></th> |
||||||
|
<th><span>Отчетный период (report_period)</span></th> |
||||||
|
<th><span>Преподаватель (teacher)</span></th> |
||||||
|
<th><span>Программа обучения (program)</span></th> |
||||||
|
<th><span>Объект строительства (building)</span></th> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
<tr th:each="course, courseStat : *{getCourses()}" > |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{programs[__${courseStat.index}__].name}"> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{programs[__${courseStat.index}__].lenght}"/> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<select th:field="*{programs[__${courseStat.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> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
<input type="text" th:field="*{programs[__${courseStat.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> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<input type="submit" value="POST-ALL"/> |
||||||
|
</form> --> |
||||||
|
</main> |
||||||
|
</body> |
||||||
|
</html> |
Loading…
Reference in new issue