From a34bbe174a4c03003bc1e327a9eff7e6923e04bd Mon Sep 17 00:00:00 2001 From: esoe Date: Thu, 27 Jun 2024 16:23:30 +0300 Subject: [PATCH] organization-check done! --- .../gates/controller/BuildingController.java | 124 +++++++++++++- .../controller/OrganizationController.java | 162 ++++++++++++++++++ .../gates/controller/TeacherController.java | 8 +- .../java/ru/mlokoin/gates/model/Building.java | 2 +- .../gates/model/OrganizationWraper.java | 31 ++++ .../resources/templates/buildings-check.html | 46 +++-- .../templates/organization-check.html | 69 ++++++++ .../templates/view-as-educations.html | 6 +- 8 files changed, 421 insertions(+), 27 deletions(-) create mode 100644 gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java create mode 100644 gates/src/main/java/ru/mlokoin/gates/model/OrganizationWraper.java create mode 100644 gates/src/main/resources/templates/organization-check.html diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java b/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java index 242cd47..9e66ba6 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java @@ -1,6 +1,15 @@ package ru.mlokoin.gates.controller; +import java.time.Duration; +import java.util.ArrayList; +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; @@ -11,7 +20,11 @@ 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.BuildingWraper; +import ru.mlokoin.gates.model.XlsxCell; +import ru.mlokoin.gates.model.XlsxDocument; @Controller @RequestMapping(path = "/buildings") @@ -21,8 +34,102 @@ public class BuildingController { @GetMapping("/check/{id}") public String checkBuildings(Model model, @PathVariable String id){ - return "buildings-check"; - // return "redirect:/document/view-as-educations/" + id; + List errors = new ArrayList<>();//список ошибок + 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 (){}) + .block(); + + ArrayList xlsx_buildings = new ArrayList<>();//19 столбец + Map> map = xlsx.getData(); + for (Map.Entry> entry : map.entrySet()) { + /** + * Обработка пустых строк + */ + String string = ""; + try { + string = entry. + getValue(). + get(19). + getContent(); + } catch (Exception e){ + System.out.println("Не указан объект строительства: " + entry.getKey() + " :: " + e.getMessage()); + string = "-"; + } + + Building building = new Building(); + building.setName_short(string); + xlsx_buildings.add(building); + } + xlsx_buildings.remove(0);//Удалили из списка заголовок + Set xlsx_buildingSet = Set.copyOf(xlsx_buildings);//удалили повторения + + //объекты строительства вконсоль ... + System.out.println("###############################"); + System.out.println(">> Объекты строительства из файла: " + xlsx_buildingSet.size()); + for (Building building : xlsx_buildingSet) { + System.out.println("Объект строительства (xlsx): " + building.getName_short()); + } + + //Ошибки в консоль + System.out.println("###############################"); + System.out.println(">> errors: " + errors.size()); + for (String msg : errors) { + System.out.println("msg: " + msg); + } + + /** + * Получение перечня объектов строительства из базы + */ + System.out.println("Получение списка объектов строительства из базы ..."); + Set base_buildings = client.method(HttpMethod.GET) + .uri("http://resource-service-api:8181/building/list") + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + + //Удаление из списка объектов строительства, присутствующих в базе + Set xlsx_buildings_str = new HashSet<>(); + Set base_buildings_str = new HashSet<>(); + + for (Building b : xlsx_buildingSet) { + String s = b.getName_short(); + xlsx_buildings_str.add(s); + } + + System.out.println("Объекты строительства в базе:"); + for (Building b : base_buildings) { + String s = b.getName_short(); + System.out.println("base_buildings : " + s); + base_buildings_str.add(s); + } + xlsx_buildings_str.removeAll(base_buildings_str); + + /** + * Если xlsx содержит элементы, отсутствующие в базе, + * вернуть страницу проверки объектов строительства + */ + if (xlsx_buildings_str.size() != 0) { + ArrayList list = new ArrayList<>(); + for (String string : xlsx_buildings_str) { + Building b = new Building(); + b.setName_short(string); + list.add(b); + } + + BuildingWraper bw = new BuildingWraper(list); + + model.addAttribute("wrapBuildings", bw); + model.addAttribute("errors", errors); + model.addAttribute("id", id); + return "buildings-check"; + } + return "redirect:/document/view-as-educations/" + id; } @PostMapping( @@ -32,6 +139,19 @@ public class BuildingController { MediaType.APPLICATION_JSON_VALUE }) public String saveBuildings(@ModelAttribute("wrapBuildngs") BuildingWraper wraper, @PathVariable String id){ + for (Building building : wraper.getList()) { + //Проверка наличия флага для добавления в базу + //по полю табельного номера + if (building.getName_full() != ""){ + client.post() + .uri("http://resource-service-api:8181/building/create") + .body(Mono.just(building), Building.class) + .retrieve() + .toBodilessEntity() + .timeout(Duration.ofSeconds(1)) + .block(); + } + } return "redirect:/buildings/check/" + id; } } diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java b/gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java new file mode 100644 index 0000000..fe3aea1 --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java @@ -0,0 +1,162 @@ +package ru.mlokoin.gates.controller; + +import java.time.Duration; +import java.util.ArrayList; +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.BuildingWraper; +import ru.mlokoin.gates.model.Organization; +import ru.mlokoin.gates.model.OrganizationWraper; +import ru.mlokoin.gates.model.XlsxCell; +import ru.mlokoin.gates.model.XlsxDocument; + +@Controller +@RequestMapping(path = "/organizations") +public class OrganizationController { + @Autowired + private WebClient client; + + @GetMapping("/check/{id}") + public String checkOrganizations(Model model, @PathVariable String id){ + //список ошибок + List errors = new ArrayList<>(); + + 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 (){}) + .block(); + + ArrayList xlsx_orgs = new ArrayList<>();//1 столбец + Map> map = xlsx.getData(); + for (Map.Entry> entry : map.entrySet()) { + /** + * Обработка пустых строк + */ + String string = ""; + try { + string = entry. + getValue(). + get(1). + getContent(); + } catch (Exception e){ + System.out.println("Не указан объект строительства: " + entry.getKey() + " :: " + e.getMessage()); + string = "-"; + } + + Organization organization = new Organization(); + organization.setName_full(string); + xlsx_orgs.add(organization); + } + xlsx_orgs.remove(0);//Удалили из списка заголовок + Set xlsx_orgSet = Set.copyOf(xlsx_orgs);//удалили повторения + + //организации вконсоль ... + System.out.println("###############################"); + System.out.println(">> Организации из файла: " + xlsx_orgSet.size()); + for (Organization organization : xlsx_orgSet) { + System.out.println("Объект строительства (xlsx): " + organization.getName_full()); + } + + //Ошибки в консоль + System.out.println("###############################"); + System.out.println(">> errors: " + errors.size()); + for (String msg : errors) { + System.out.println("msg: " + msg); + } + + /** + * Получение перечня организаций из базы + */ + System.out.println("Получение списка организаций из базы ..."); + Set base_organizations = client.method(HttpMethod.GET) + .uri("http://resource-service-api:8181/organization/list") + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + + //Удаление из списка организаций, присутствующих в базе + Set xlsx_organizations_str = new HashSet<>(); + Set base_organizations_str = new HashSet<>(); + + for (Organization o : xlsx_orgSet) { + String s = o.getName_full(); + xlsx_organizations_str.add(s); + } + + System.out.println("Организации в базе:"); + for (Organization o : base_organizations) { + String s = o.getName_full(); + System.out.println("base_organizations : " + s); + base_organizations_str.add(s); + } + xlsx_organizations_str.removeAll(base_organizations_str); + + /** + * Если xlsx содержит элементы, отсутствующие в базе, + * вернуть страницу проверки организаций + */ + if (xlsx_organizations_str.size() != 0) { + ArrayList list = new ArrayList<>(); + for (String string : xlsx_organizations_str) { + Organization o = new Organization(); + o.setName_full(string); + list.add(o); + } + + OrganizationWraper ow = new OrganizationWraper(list); + + model.addAttribute("wrapOrganizations", ow); + model.addAttribute("errors", errors); + model.addAttribute("id", id); + return "organization-check"; + } + return "redirect:/document/view-as-educations/" + id; + } + + @PostMapping( + path="/save/{id}", + consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, + produces = { + MediaType.APPLICATION_JSON_VALUE + }) + public String saveOranizations(@ModelAttribute("wrapOrganizations") OrganizationWraper wraper, @PathVariable String id){ + for (Organization organization : wraper.getList()) { + //Проверка наличия флага для добавления в базу + //по полю табельного номера + if (organization.getName_full() != ""){ + client.post() + .uri("http://resource-service-api:8181/organization/create") + .body(Mono.just(organization), Organization.class) + .retrieve() + .toBodilessEntity() + .timeout(Duration.ofSeconds(1)) + .block(); + } + } + return "redirect:/organizations/check/" + id; + } + +} diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java b/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java index 3ed1137..bca6457 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/TeacherController.java @@ -148,10 +148,10 @@ public class TeacherController { */ System.out.println("Получение списка преподавателей из базы ..."); Set base_teachers = client.method(HttpMethod.GET) - .uri("http://resource-service-api:8181/teacher/list") - .retrieve() - .bodyToMono(new ParameterizedTypeReference >(){}) - .block(); + .uri("http://resource-service-api:8181/teacher/list") + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); /** * Удаление преподавателей присутствующих в базе diff --git a/gates/src/main/java/ru/mlokoin/gates/model/Building.java b/gates/src/main/java/ru/mlokoin/gates/model/Building.java index bd866a5..9b54206 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/Building.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/Building.java @@ -14,7 +14,7 @@ import lombok.NoArgsConstructor; @Data public class Building implements Serializable{ private long id; - private String name_short;//Сокращенное наименование + private String name_short;//Сокращенное наименование (абревиатура) private String name_full;//Полное наименование private String code_short;//Краткий код private String code_full;//Полный код diff --git a/gates/src/main/java/ru/mlokoin/gates/model/OrganizationWraper.java b/gates/src/main/java/ru/mlokoin/gates/model/OrganizationWraper.java new file mode 100644 index 0000000..c5310d5 --- /dev/null +++ b/gates/src/main/java/ru/mlokoin/gates/model/OrganizationWraper.java @@ -0,0 +1,31 @@ +package ru.mlokoin.gates.model; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +@Data +public class OrganizationWraper { + List list; + + public OrganizationWraper(){ + init(); + } + + public OrganizationWraper(List list){ + this.list = list; + } + + public void init(){ + this.list = new ArrayList<>(); + } + + public void add(Organization organization){ + this.list.add(organization); + } + public String toString(){ + return this.list.toString(); + } + +} diff --git a/gates/src/main/resources/templates/buildings-check.html b/gates/src/main/resources/templates/buildings-check.html index 1874eb6..342d085 100644 --- a/gates/src/main/resources/templates/buildings-check.html +++ b/gates/src/main/resources/templates/buildings-check.html @@ -13,7 +13,7 @@

check-buildings

    -
  • +
  • Объекты отправляются в базу, если заполнена расшифровка наименования объекта
@@ -22,31 +22,43 @@

Объекты строительства, отсутствующие в базе:

- + +
+
+

errors (потенциальные ошибки в исходном документе): + +

+
    +
  • +
diff --git a/gates/src/main/resources/templates/organization-check.html b/gates/src/main/resources/templates/organization-check.html new file mode 100644 index 0000000..c47bd1e --- /dev/null +++ b/gates/src/main/resources/templates/organization-check.html @@ -0,0 +1,69 @@ + + + + + check-organizations + + + + + + +
+

check-organizations

+
    +
  • +
  • +
  • +
+ +
+
+
+

Организации, отсутствующие в базе:

+
+ + + + + + + + + + + + + + + + + +
Форма собственности (ownership)Сокращение (name_short)Полное наименование (name_full)Вид ПСК (type)ИНН (inn)
+ + + + + + + + + +
+ +
+
+
+

errors (потенциальные ошибки в исходном документе): + +

+
    +
  • +
+
+
+ + \ No newline at end of file diff --git a/gates/src/main/resources/templates/view-as-educations.html b/gates/src/main/resources/templates/view-as-educations.html index 8c7e1dc..0d4e185 100644 --- a/gates/src/main/resources/templates/view-as-educations.html +++ b/gates/src/main/resources/templates/view-as-educations.html @@ -32,11 +32,11 @@ xmlns:th="http://www.thymeleaf.org">
-
+
-
- + +