Browse Source

organization-check done!

master
esoe 5 months ago
parent
commit
a34bbe174a
  1. 122
      gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java
  2. 162
      gates/src/main/java/ru/mlokoin/gates/controller/OrganizationController.java
  3. 2
      gates/src/main/java/ru/mlokoin/gates/model/Building.java
  4. 31
      gates/src/main/java/ru/mlokoin/gates/model/OrganizationWraper.java
  5. 38
      gates/src/main/resources/templates/buildings-check.html
  6. 69
      gates/src/main/resources/templates/organization-check.html
  7. 6
      gates/src/main/resources/templates/view-as-educations.html

122
gates/src/main/java/ru/mlokoin/gates/controller/BuildingController.java

@ -1,6 +1,15 @@
package ru.mlokoin.gates.controller; 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.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; 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.bind.annotation.RequestMapping;
import org.springframework.web.reactive.function.client.WebClient; 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.BuildingWraper;
import ru.mlokoin.gates.model.XlsxCell;
import ru.mlokoin.gates.model.XlsxDocument;
@Controller @Controller
@RequestMapping(path = "/buildings") @RequestMapping(path = "/buildings")
@ -21,8 +34,102 @@ public class BuildingController {
@GetMapping("/check/{id}") @GetMapping("/check/{id}")
public String checkBuildings(Model model, @PathVariable String id){ public String checkBuildings(Model model, @PathVariable String id){
List<String> 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 <XlsxDocument>(){})
.block();
ArrayList<Building> xlsx_buildings = new ArrayList<>();//19 столбец
Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> 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<Building> 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<Building> base_buildings = client.method(HttpMethod.GET)
.uri("http://resource-service-api:8181/building/list")
.retrieve()
.bodyToMono(new ParameterizedTypeReference <Set<Building>>(){})
.block();
//Удаление из списка объектов строительства, присутствующих в базе
Set<String> xlsx_buildings_str = new HashSet<>();
Set<String> 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<Building> 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 "buildings-check";
// return "redirect:/document/view-as-educations/" + id; }
return "redirect:/document/view-as-educations/" + id;
} }
@PostMapping( @PostMapping(
@ -32,6 +139,19 @@ public class BuildingController {
MediaType.APPLICATION_JSON_VALUE MediaType.APPLICATION_JSON_VALUE
}) })
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()) {
//Проверка наличия флага для добавления в базу
//по полю табельного номера
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; return "redirect:/buildings/check/" + id;
} }
} }

162
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<String> 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 <XlsxDocument>(){})
.block();
ArrayList<Organization> xlsx_orgs = new ArrayList<>();//1 столбец
Map<Integer, List<XlsxCell>> map = xlsx.getData();
for (Map.Entry<Integer, List<XlsxCell>> 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<Organization> 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<Organization> base_organizations = client.method(HttpMethod.GET)
.uri("http://resource-service-api:8181/organization/list")
.retrieve()
.bodyToMono(new ParameterizedTypeReference <Set<Organization>>(){})
.block();
//Удаление из списка организаций, присутствующих в базе
Set<String> xlsx_organizations_str = new HashSet<>();
Set<String> 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<Organization> 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;
}
}

2
gates/src/main/java/ru/mlokoin/gates/model/Building.java

@ -14,7 +14,7 @@ import lombok.NoArgsConstructor;
@Data @Data
public class Building implements Serializable{ public class Building implements Serializable{
private long id; private long id;
private String name_short;//Сокращенное наименование private String name_short;//Сокращенное наименование (абревиатура)
private String name_full;//Полное наименование private String name_full;//Полное наименование
private String code_short;//Краткий код private String code_short;//Краткий код
private String code_full;//Полный код private String code_full;//Полный код

31
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<Organization> list;
public OrganizationWraper(){
init();
}
public OrganizationWraper(List<Organization> 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();
}
}

38
gates/src/main/resources/templates/buildings-check.html

@ -13,7 +13,7 @@
<header> <header>
<h2>check-buildings</h2> <h2>check-buildings</h2>
<ul> <ul>
<li></li> <li>Объекты отправляются в базу, если заполнена расшифровка наименования объекта</li>
<li></li> <li></li>
<li></li> <li></li>
</ul> </ul>
@ -22,31 +22,43 @@
<main> <main>
<div class="main-wraper"> <div class="main-wraper">
<h2>Объекты строительства, отсутствующие в базе:</h2> <h2>Объекты строительства, отсутствующие в базе:</h2>
<!-- <form th:action="@{/program-cretareas/save/{id}(id=${id})}" <form th:action="@{/buildings/save/{id}(id=${id})}"
th:method="post" th:method="post"
th:object="${wrapCretareas}"> th:object="${wrapBuildings}">
<table rules="all"> <table rules="all">
<thead> <thead>
<th> <th>Сокращение (name_short)</th>
<span>КРАТКО</span> <th>Расшифровка (name_full)</th>
</th> <th>Код-кратко (code_short)</th>
<th> <th>Код-полный (code_full)</th>
<span>ПОЛНО</span>
</th>
</thead> </thead>
<tbody> <tbody>
<tr th:each="dc, dcStat : *{getList()}" > <tr th:each="b, bStat : *{getList()}">
<td>
<input type="text" th:field="*{list[__${bStat.index}__].name_short}">
</td>
<td> <td>
<input type="text" th:field="*{list[__${dcStat.index}__].name_short}"/> <input type="text" th:field="*{list[__${bStat.index}__].name_full}">
</td> </td>
<td> <td>
<input type="text" th:field="*{list[__${dcStat.index}__].name}"/> <input type="text" th:field="*{list[__${bStat.index}__].code_short}">
</td>
<td>
<input type="text" th:field="*{list[__${bStat.index}__].code_full}">
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<input type="submit" value="POST-ALL"/> <input type="submit" value="POST-ALL"/>
</form> --> </form>
</div>
<div>
<h2>errors (потенциальные ошибки в исходном документе):
<span th:text="${#lists.size(errors)}"></span>
</h2>
<ul th:each="e: ${errors}">
<li th:text="${e}"></li>
</ul>
</div> </div>
</main> </main>
</body> </body>

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

@ -0,0 +1,69 @@
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>check-organizations</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-organizations</h2>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</header>
<main>
<div class="main-wraper">
<h2>Организации, отсутствующие в базе:</h2>
<form th:action="@{/organizations/save/{id}(id=${id})}"
th:method="post"
th:object="${wrapOrganizations}">
<table rules="all">
<thead>
<th>Форма собственности (ownership)</th>
<th>Сокращение (name_short)</th>
<th>Полное наименование (name_full)</th>
<th>Вид ПСК (type)</th>
<th>ИНН (inn)</th>
</thead>
<tbody>
<tr th:each="o, oStat : *{getList()}">
<td>
<input type="text" th:field="*{list[__${oStat.index}__].ownership}">
</td>
<td>
<input type="text" th:field="*{list[__${oStat.index}__].name_short}">
</td>
<td>
<input type="text" th:field="*{list[__${oStat.index}__].name_full}">
</td>
<td>
<input type="text" th:field="*{list[__${oStat.index}__].type}">
</td>
<td>
<input type="text" th:field="*{list[__${oStat.index}__].inn}">
</td>
</tr>
</tbody>
</table>
<input type="submit" value="POST-ALL"/>
</form>
</div>
<div>
<h2>errors (потенциальные ошибки в исходном документе):
<span th:text="${#lists.size(errors)}"></span>
</h2>
<ul th:each="e: ${errors}">
<li th:text="${e}"></li>
</ul>
</div>
</main>
</body>
</html>

6
gates/src/main/resources/templates/view-as-educations.html

@ -32,11 +32,11 @@ xmlns:th="http://www.thymeleaf.org">
<form th:action="@{/teachers/check/{id}(id=${id})}" th:method="get"> <form th:action="@{/teachers/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-TEACHERS"/> <input type="submit" value="CHECK-TEACHERS"/>
</form> </form>
<form th:action="@{#}" th:method="get"> <form th:action="@{/buildings/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-BUILDINGS"/> <input type="submit" value="CHECK-BUILDINGS"/>
</form> </form>
<form th:action="@{#}" th:method="get"> <form th:action="@{/organizations/check/{id}(id=${id})}" th:method="get">
<input type="submit" value="CHECK-PSK"/> <input type="submit" value="CHECK-ORGANIZATION"/>
</form> </form>
<form th:action="@{#}" th:method="get"> <form th:action="@{#}" th:method="get">
<input type="submit" value="CHECK-COURSES"/> <input type="submit" value="CHECK-COURSES"/>

Loading…
Cancel
Save