esoe
5 months ago
8 changed files with 421 additions and 27 deletions
@ -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; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -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(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -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> |
Loading…
Reference in new issue