esoe 3 months ago
parent
commit
1a66395e7e
  1. 41
      gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java
  2. 20
      gates/src/main/java/ru/mlokoin/gates/controller/v1/InfoXlsxController.java
  3. 1
      gates/src/main/java/ru/mlokoin/gates/model/fs/Post.java
  4. 48
      gates/src/main/java/ru/mlokoin/gates/repository/Storage.java
  5. 13
      gates/src/main/resources/templates/documents.html
  6. 112
      gates/src/main/resources/templates/educations-xlsx-info.html
  7. 7
      gates/src/main/resources/templates/storage.html
  8. 4
      storage-rs/pom.xml
  9. 16
      storage-rs/src/main/java/ru/molokoin/storagers/controller/HelloController.java
  10. 8
      storage-rs/src/main/java/ru/molokoin/storagers/controller/StorageController.java
  11. 12
      storage-rs/src/main/java/ru/molokoin/storagers/model/Document.java
  12. 67
      storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxCell.java
  13. 12
      storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java
  14. 80
      storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxMultipartDocument.java
  15. 68
      storage-rs/src/main/java/ru/molokoin/storagers/service/StorageService.java
  16. 25
      storage-rs/src/main/java/ru/molokoin/storagers/service/StorageServiceFace.java

41
gates/src/main/java/ru/mlokoin/gates/controller/v1/EducationsController.java

@ -20,6 +20,7 @@ import ru.mlokoin.gates.model.building.Building;
import ru.mlokoin.gates.model.course.Course; import ru.mlokoin.gates.model.course.Course;
import ru.mlokoin.gates.model.education.EducationEntryWraper; import ru.mlokoin.gates.model.education.EducationEntryWraper;
import ru.mlokoin.gates.model.education.EducatonEntry; import ru.mlokoin.gates.model.education.EducatonEntry;
import ru.mlokoin.gates.model.fs.Post;
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.fs.xlsx.XlsxDocumentReestr;
import ru.mlokoin.gates.model.monitor.AbsentReview; import ru.mlokoin.gates.model.monitor.AbsentReview;
@ -30,6 +31,8 @@ import ru.mlokoin.gates.model.program.Program;
import ru.mlokoin.gates.model.student.Student; import ru.mlokoin.gates.model.student.Student;
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;
import org.springframework.web.bind.annotation.RequestParam;
@Controller @Controller
@RequestMapping(path = "/document/educations") @RequestMapping(path = "/document/educations")
@ -40,6 +43,43 @@ public class EducationsController {
@Autowired @Autowired
private Storage storage; private Storage storage;
/**
* Предоставление пользователю формы "educations-xlsx-info"
* - сведения о файле (file-info)
* - список ошибок в случае несоответствия форме "Реестра обученных"
* - статистика по содержимому реестра обучнных
* - инструменты для просмотра содержимого реестра
* - инструменты для публикации содержимого реестра в базе данных
*
* @param model
* @param id
* @return
*/
@GetMapping("/info/{PostID}")
public String info(Model model, @PathVariable String PostID) {
// создание списка ошибок
List<String> errors = new ArrayList<>();
System.out.println("PostID: " + PostID);
Long DocumentID = storage.getPostById(PostID).getDocument().getId();
// List<Post> posts = storage.getPostList();
// for (Post post : posts) {
// if (post.getId() == Integer.parseInt(PostID)) {
// DocumentID = post.getDocument().getId();
// }
// }
System.out.println("DocumentID: " + DocumentID);
model.addAttribute("post", storage.getPostById(PostID));
model.addAttribute("baseReview", new BaseReview(storage));
// model.addAttribute("xlsxReview", new XlsxReview(reestr));
// model.addAttribute("absentReview", new AbsentReview(reestr, storage));
return "educations-xlsx-info";
}
/** /**
* Предоставление пользователю формы "view-as-educations" * Предоставление пользователю формы "view-as-educations"
* - просмотр xlsx-файла * - просмотр xlsx-файла
@ -53,6 +93,7 @@ public class EducationsController {
@GetMapping("/view/{id}") @GetMapping("/view/{id}")
public String viewAsEducations(Model model, @PathVariable String id) { public String viewAsEducations(Model model, @PathVariable String id) {
// создание списка ошибок // создание списка ошибок
List<String> errors = new ArrayList<>(); List<String> errors = new ArrayList<>();

20
gates/src/main/java/ru/mlokoin/gates/controller/v1/InfoXlsxController.java

@ -0,0 +1,20 @@
package ru.mlokoin.gates.controller.v1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.reactive.function.client.WebClient;
import ru.mlokoin.gates.repository.Storage;
@Controller
@RequestMapping(path = "/document/educations/info")
public class InfoXlsxController {
@Autowired
private WebClient client;
@Autowired
private Storage storage;
}

1
gates/src/main/java/ru/mlokoin/gates/model/fs/Post.java

@ -19,5 +19,4 @@ public class Post implements Serializable {
this.type = type; this.type = type;
this.document = document; this.document = document;
} }
} }

48
gates/src/main/java/ru/mlokoin/gates/repository/Storage.java

@ -38,7 +38,7 @@ import ru.mlokoin.gates.teh.strings.Stringer;
public class Storage { public class Storage {
private String storageLink = "http://storage-rs:8282/api/document/content/"; private String storageLink = "http://storage-rs:8282/api/document/content/";
private String storageListLink = "http://resource-service-api:8181/storage-entry/list"; private String storageListLink = "http://resource-service-api:8181/storage-entry/list";
private String postLink = "http://resource-service-api:8181/post/list"; private String postListLink = "http://resource-service-api:8181/post/list";
private String programsLink = "http://resource-service-api:8181/program/list"; private String programsLink = "http://resource-service-api:8181/program/list";
private String buildingsLink = "http://resource-service-api:8181/building/list"; private String buildingsLink = "http://resource-service-api:8181/building/list";
private String coursesLink = "http://resource-service-api:8181/course/list"; private String coursesLink = "http://resource-service-api:8181/course/list";
@ -65,6 +65,22 @@ public class Storage {
.block(); .block();
} }
public Document getDocumentById(String id) {
// TODO: добавить линк в storage-rs, для получения документа по id
List<Document> documents = client.method(HttpMethod.GET)
.uri(storageListLink)
.retrieve()
.bodyToMono(new ParameterizedTypeReference <List<Document>>(){})
.block();
Document result = new Document();
for (Document document : documents) {
if (document.getId() == Integer.parseInt(id)) {
result = document;
}
}
return result;
}
/** /**
* Получение списка постов, размещенных в ресурсном сервисе * Получение списка постов, размещенных в ресурсном сервисе
* @param id * @param id
@ -73,10 +89,36 @@ public class Storage {
public List<Post> getPostList() { public List<Post> getPostList() {
System.out.println("Получение списка постов, размещенных в ресурсном сервисе ..."); System.out.println("Получение списка постов, размещенных в ресурсном сервисе ...");
return client.method(HttpMethod.GET) return client.method(HttpMethod.GET)
.uri(postLink) .uri(postListLink)
.retrieve()
.bodyToMono(new ParameterizedTypeReference <List<Post>>(){})
.block();
}
/**
* Получение поста по id
* @param postID
* @return
*/
public Post getPostById(String postID) {
// TODO: добавить линк в storage-rs, для получения поста по id
List<Post> posts = client.method(HttpMethod.GET)
.uri(postListLink)
.retrieve() .retrieve()
.bodyToMono(new ParameterizedTypeReference <List<Post>>(){}) .bodyToMono(new ParameterizedTypeReference <List<Post>>(){})
.block(); .block();
Post result = new Post();
for (Post post : posts) {
if (post.getId() == Integer.parseInt(postID)) {
result = post;
}
}
return result;
}
public int getPostCount(){
// TODO: добавить линк в storage-rs, для получения количества постов
return getPostList().size();
} }
/** /**
@ -518,4 +560,6 @@ public class Storage {
} }

13
gates/src/main/resources/templates/documents.html

@ -21,16 +21,15 @@ xmlns:th="http://www.thymeleaf.org">
</header> </header>
<main> <main>
<div class="main-wraper"> <div class="main-wraper">
<hr>
<!--
-->
<h2>Добавление пакетов:</h2> <h2>Добавление пакетов:</h2>
<form th:method="post" th:action="@{/document/upload}" enctype="multipart/form-data" th:object="${newPost}"> <form th:method="post" th:action="@{/document/upload}" enctype="multipart/form-data" th:object="${newPost}">
<!-- <div> --> <!-- <div> -->
<select th:field="${newPost.type}"> <select th:field="${newPost.type}">
<option value="" disabled selected>--Выберите вид загружаемого документа--</option> <option value="" disabled selected>--Выберите вид загружаемого документа--</option>
<option value="Реестр обученных">Реестр обученных</option> <option value="Реестр обученных">Реестр обученных</option>
<option value="Списочный состав">Списочный состав</option>
<option value="Заявка на обучение">Заявка на обучение</option>
<option value="Прочее ...">Прочее ...</option> <option value="Прочее ...">Прочее ...</option>
</select> </select>
<input type="file" name="file"> <input type="file" name="file">
@ -38,6 +37,7 @@ xmlns:th="http://www.thymeleaf.org">
<!-- </div> --> <!-- </div> -->
<button type="submit">Загрузить пакет</button> <button type="submit">Загрузить пакет</button>
</form> </form>
<hr>
<h2>Перечень файлов:</h2> <h2>Перечень файлов:</h2>
<table> <table>
<thead> <thead>
@ -83,6 +83,11 @@ xmlns:th="http://www.thymeleaf.org">
<input type="submit" value="VIEW"/> <input type="submit" value="VIEW"/>
</form> </form>
</td> </td>
<td>
<form th:action="@{/document/educations/info/{PostID}(PostID=${post.id})}" th:method="get">
<input type="submit" value="INFO"/>
</form>
</td>
<!-- <td> <!-- <td>
<form th:action="@{/export-as-educations/{name}(name=${doc.name})}" th:method="get"> <form th:action="@{/export-as-educations/{name}(name=${doc.name})}" th:method="get">
<input type="submit" value="EXPORT-AS-EDUCATIONS"/> <input type="submit" value="EXPORT-AS-EDUCATIONS"/>

112
gates/src/main/resources/templates/educations-xlsx-info.html

@ -0,0 +1,112 @@
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>info-xlsx</title>
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2/webcomponents-loader.min.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/gh/zerodevx/zero-md@1/src/zero-md.min.js"></script>
<style>
caption {
caption-side: top;
text-align: left;
/* padding-bottom: 10px; */
font-weight: bold;
font-size: x-large;
}
</style>
</head>
<body>
<header>
</header>
<main>
<div class="doc-info">
<h2>DASHBOARD:</h2>
<table rules="all">
<thead>
<th><span>Параметр</span></th>
<!-- <th>В файле: <span th:text="${filename}"></span></th> -->
<th>В базе данных:</th>
<!-- <th><span>отсутствующие в базе</span></th> -->
</thead>
<tbody>
<tr>
<td>
<a th:href="@{/program-cretareas/check/{id}(id=${id})}">Критерии:</a>
</td>
<!-- <td><span th:text="${xlsxReview.programCretareaCount}"></span></td> -->
<td><span th:text="${baseReview.programCretareaCount}"></span></td>
<!-- <td><span th:text="${absentReview.programCretareaCount}"></span></td> -->
</tr>
<tr>
<td>
<a th:href="@{/programs/check/{id}(id=${id})}">Программы:</a>
</td>
<!-- <td><span th:text="${xlsxReview.programsCount}"></span></td> -->
<td><span th:text="${baseReview.programsCount}"></span></td>
<!-- <td><span th:text="${absentReview.programsCount}"></span></td> -->
</tr>
<tr>
<td>
<a th:href="@{/teachers/check/{id}(id=${id})}">Преподаватели:</a>
</td>
<!-- <td><span th:text="${xlsxReview.teachersCount}"></span></td> -->
<td><span th:text="${baseReview.teachersCount}"></span></td>
<!-- <td><span th:text="${absentReview.teachersCount}"></span></td> -->
</tr>
<tr>
<td>
<a th:href="@{/buildings/check/{id}(id=${id})}">Объекты строительства:</a>
</td>
<!-- <td><span th:text="${xlsxReview.buildingsCount}"></span></td> -->
<td><span th:text="${baseReview.buildingsCount}"></span></td>
<!-- <td><span th:text="${absentReview.buildingsCount}"></span></td> -->
</tr>
<tr>
<td>
<a th:href="@{/organizations/check/{id}(id=${id})}">Организации:</a>
</td>
<!-- <td><span th:text="${xlsxReview.organizationsCount}"></span></td> -->
<td><span th:text="${baseReview.organizationsCount}"></span></td>
<!-- <td><span th:text="${absentReview.organizationsCount}"></span></td> -->
</tr>
<tr>
<td>
<a th:href="@{/courses/check/{id}(id=${id})}">Курсы:</a>
</td>
<!-- <td><span th:text="${xlsxReview.coursesCount}"></span></td> -->
<td><span th:text="${baseReview.coursesCount}"></span></td>
<!-- <td><span th:text="${absentReview.coursesCount}"></span></td> -->
</tr>
<tr>
<td>
<a th:href="@{/students/check/{id}(id=${id})}">Студенты:</a>
</td>
<!-- <td><span th:text="${xlsxReview.studentsCount}"></span></td> -->
<td><span th:text="${baseReview.studentsCount}"></span></td>
<!-- <td><span th:text="${absentReview.studentsCount}"></span></td> -->
</tr>
<tr>
<td>
<a th:href="@{/document/educations/view/{id}(id=${id})}">Обучения:</a>
</td>
<!-- <td><span th:text="${xlsxReview.educationsCount}"></span></td> -->
<td><span th:text="${baseReview.educationsCount}"></span></td>
<!-- <td><span th:text="${absentReview.educationsCount}"></span></td> -->
</tr>
</tbody>
</table>
</div>
<hr>
<div class="errors">
<h2>Ошибки:</h2>
<div th:each="error : ${errors}">
<span th:text="${error}"></span>
</div>
</div>
<hr>
</main>
</body>
</html>

7
gates/src/main/resources/templates/storage.html

@ -26,9 +26,8 @@ xmlns:th="http://www.thymeleaf.org">
<!-- <!--
--> -->
<h2>Добавление пакетов:</h2>\ <h2>Добавление пакетов:</h2>
<hr>
<h2>Перечень файлов:</h2>
<form th:action="@{/storage}" method="get"></form> <form th:action="@{/storage}" method="get"></form>
<form method="post" th:action="@{/storage/upload}" enctype="multipart/form-data"> <form method="post" th:action="@{/storage/upload}" enctype="multipart/form-data">
<div> <div>
@ -36,6 +35,8 @@ xmlns:th="http://www.thymeleaf.org">
</div> </div>
<button type="submit">Upload File</button> <button type="submit">Upload File</button>
</form> </form>
<hr>
<h2>Перечень файлов:</h2>
<table> <table>
<thead> <thead>
<tr> <tr>

4
storage-rs/pom.xml

@ -17,11 +17,11 @@
<java.version>17</java.version> <java.version>17</java.version>
</properties> </properties>
<dependencies> <dependencies>
<!-- <dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<optional>true</optional> <optional>true</optional>
</dependency> --> </dependency>
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId> <artifactId>poi</artifactId>

16
storage-rs/src/main/java/ru/molokoin/storagers/controller/HelloController.java

@ -1,9 +1,13 @@
package ru.molokoin.storagers.controller; package ru.molokoin.storagers.controller;
import java.io.IOException;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import ru.molokoin.storagers.model.DocumentModel; import ru.molokoin.storagers.model.Document;
import ru.molokoin.storagers.model.XlsxCell;
import ru.molokoin.storagers.model.XlsxMultipartDocument;
import ru.molokoin.storagers.service.StorageServiceFace; import ru.molokoin.storagers.service.StorageServiceFace;
/** /**
@ -35,8 +39,14 @@ public class HelloController {
System.out.println("Загружено документов: " + storage.list().size()); System.out.println("Загружено документов: " + storage.list().size());
System.out.println("Перечень загруженных документов:"); System.out.println("Перечень загруженных документов:");
int i = 1; int i = 1;
for (DocumentModel doc : storage.list()) { for (Document doc : storage.list()) {
System.out.println("Document#" + i + ": " + doc.getPath() + "(size#" + doc.getSize() + ")"); XlsxMultipartDocument parts = new XlsxMultipartDocument(doc);
System.out.println("Document#" + i + ": " + doc.getPath() + "(size#" + doc.getSize() + ")" + " ### lines: " + parts.getLineCount());
for (XlsxCell c: parts.line(i-1)) {
System.out.println(c.getContent());
}
parts.close();
System.out.println("---------------------");
i++; i++;
} }
return "hello"; return "hello";

8
storage-rs/src/main/java/ru/molokoin/storagers/controller/StorageController.java

@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import ru.molokoin.storagers.model.DocumentModel; import ru.molokoin.storagers.model.Document;
import ru.molokoin.storagers.model.XlsxDocument; import ru.molokoin.storagers.model.XlsxDocument;
import ru.molokoin.storagers.service.StorageServiceFace; import ru.molokoin.storagers.service.StorageServiceFace;
@ -109,7 +109,7 @@ public class StorageController {
*/ */
@GetMapping("/view/{name}") @GetMapping("/view/{name}")
public String view(Model model, @PathVariable String name) { public String view(Model model, @PathVariable String name) {
DocumentModel doc = storage.find(name); Document doc = storage.find(name);
XlsxDocument xlsx = new XlsxDocument(doc); XlsxDocument xlsx = new XlsxDocument(doc);
model.addAttribute("filename", xlsx.getDocument().getName()); model.addAttribute("filename", xlsx.getDocument().getName());
model.addAttribute("xlsx", xlsx.getData()); model.addAttribute("xlsx", xlsx.getData());
@ -139,7 +139,7 @@ public class StorageController {
* @return * @return
*/ */
@GetMapping("/api/list-uploads") @GetMapping("/api/list-uploads")
public ResponseEntity<List<DocumentModel>> getUploads(){ public ResponseEntity<List<Document>> getUploads(){
return new ResponseEntity<>(storage.list(), HttpStatus.OK); return new ResponseEntity<>(storage.list(), HttpStatus.OK);
} }
@ -160,7 +160,7 @@ public class StorageController {
*/ */
@GetMapping("/api/document/content/{filename}") @GetMapping("/api/document/content/{filename}")
public ResponseEntity<?> getDocumentContentByName(@PathVariable String filename){ public ResponseEntity<?> getDocumentContentByName(@PathVariable String filename){
DocumentModel doc = storage.find(filename); Document doc = storage.find(filename);
XlsxDocument xlsx = new XlsxDocument(doc); XlsxDocument xlsx = new XlsxDocument(doc);
return new ResponseEntity<>(xlsx, HttpStatus.OK); return new ResponseEntity<>(xlsx, HttpStatus.OK);
} }

12
storage-rs/src/main/java/ru/molokoin/storagers/model/DocumentModel.java → storage-rs/src/main/java/ru/molokoin/storagers/model/Document.java

@ -13,12 +13,12 @@ package ru.molokoin.storagers.model;
/** /**
* Данные о файле в файловой системе * Данные о файле в файловой системе
*/ */
public class DocumentModel { public class Document {
private Long id; private Long id;
private String name;//наименование файла в файловой системе ({id}.{extension}) private String name;//наименование файла в файловой системе ({id}.{extension})
private String path;//путь в файловой системе (root/{id}.{extension}) private String path;//путь в файловой системе (root/{id}.{extension})
private String extension;//расширение файла private String extension;//расширение файла
private Long size;//размер файла private Long size;//размер файла в байтах
/** /**
* @return the name * @return the name
*/ */
@ -70,7 +70,7 @@ public class DocumentModel {
/** /**
* *
*/ */
public DocumentModel() { public Document() {
} }
/** /**
* @param name * @param name
@ -78,7 +78,7 @@ public class DocumentModel {
* @param extension * @param extension
* @param size * @param size
*/ */
public DocumentModel(String name, String path, String extension, Long size) { public Document(String name, String path, String extension, Long size) {
this.name = name; this.name = name;
this.path = path; this.path = path;
this.extension = extension; this.extension = extension;
@ -102,7 +102,7 @@ public class DocumentModel {
return false; return false;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())
return false; return false;
DocumentModel other = (DocumentModel) obj; Document other = (Document) obj;
if (name == null) { if (name == null) {
if (other.name != null) if (other.name != null)
return false; return false;
@ -145,7 +145,7 @@ public class DocumentModel {
* @param extension * @param extension
* @param size * @param size
*/ */
public DocumentModel(Long id, String name, String path, String extension, Long size) { public Document(Long id, String name, String path, String extension, Long size) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.path = path; this.path = path;

67
storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxCell.java

@ -1,12 +1,12 @@
package ru.molokoin.storagers.model; package ru.molokoin.storagers.model;
// import lombok.AllArgsConstructor; import org.apache.poi.ss.usermodel.Cell;
// import lombok.Data; import org.apache.poi.ss.usermodel.DateUtil;
// import lombok.NoArgsConstructor;
// @Data /**
// @AllArgsConstructor * Класс для хранения содержимого ячейки
// @NoArgsConstructor * TODO: убрать не нужные поля
*/
public class XlsxCell { public class XlsxCell {
private String content; //содержимое ячейки private String content; //содержимое ячейки
private String textColor; //цвет шрифта private String textColor; //цвет шрифта
@ -183,4 +183,59 @@ public class XlsxCell {
this.textWeight = textWeight; this.textWeight = textWeight;
this.type = type; this.type = type;
} }
/**
* перенос данных из ячейки файла в объект java
* TODO: прогнать контент ячейки через Stringer.Clear()
* @param cell
*/
public XlsxCell(Cell cell) {
//обработка null
if (cell == null) {
this.setContent("");
this.type = "NULL";
return;
}
// обработка ячейки
switch (cell.getCellType()) {
case STRING:
this.setContent(cell.getStringCellValue());
this.setType("STRING");
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
this.setContent(String.valueOf(cell.getDateCellValue().getTime() + "" ));
this.setType("DATE");
} else {
this.setContent(String.valueOf(cell.getNumericCellValue() + ""));
this.setType("NUMERIC");
}
break;
case FORMULA:
this.setContent(String.valueOf(cell.getCellFormula() + ""));
this.setType("FORMULA");
break;
case BOOLEAN:
this.setContent(String.valueOf(cell.getBooleanCellValue()));
this.setType("BOOLEAN");
break;
case BLANK:
this.setContent("");
this.setType("BLANK");
break;
case ERROR:
this.setContent("");
this.setType("ERROR");
break;
case _NONE:
this.setContent("");
this.setType("_NONE");
break;
default:
this.setContent("");
this.setType("_NONE");
break;
}
}
} }

12
storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxDocument.java

@ -26,16 +26,16 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
// @NoArgsConstructor // @NoArgsConstructor
public class XlsxDocument implements Serializable{ public class XlsxDocument implements Serializable{
private Map<Integer, List<XlsxCell>> data; private Map<Integer, List<XlsxCell>> data;
private DocumentModel document; private Document document;
private List<XlsxCell> headers;//верхняя строка формы private List<XlsxCell> headers;//верхняя строка формы
public XlsxDocument(DocumentModel document){ public XlsxDocument(Document document){
this.document = document; this.document = document;
this.data = init(document); this.data = init(document);
this.headers = data.get(0); this.headers = data.get(0);
} }
private Map<Integer, List<XlsxCell>> init(DocumentModel document) { private Map<Integer, List<XlsxCell>> init(Document document) {
// IOUtils.setByteArrayMaxOverride(Integer.MAX_VALUE); // IOUtils.setByteArrayMaxOverride(Integer.MAX_VALUE);
FileInputStream file; FileInputStream file;
Workbook workbook; Workbook workbook;
@ -130,14 +130,14 @@ public class XlsxDocument implements Serializable{
/** /**
* @return the document * @return the document
*/ */
public DocumentModel getDocument() { public Document getDocument() {
return document; return document;
} }
/** /**
* @param document the document to set * @param document the document to set
*/ */
public void setDocument(DocumentModel document) { public void setDocument(Document document) {
this.document = document; this.document = document;
} }
@ -202,7 +202,7 @@ public class XlsxDocument implements Serializable{
* @param document * @param document
* @param headers * @param headers
*/ */
public XlsxDocument(Map<Integer, List<XlsxCell>> data, DocumentModel document, List<XlsxCell> headers) { public XlsxDocument(Map<Integer, List<XlsxCell>> data, Document document, List<XlsxCell> headers) {
this.data = data; this.data = data;
this.document = document; this.document = document;
this.headers = headers; this.headers = headers;

80
storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxMultipartDocument.java

@ -0,0 +1,80 @@
package ru.molokoin.storagers.model;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.sql.DataSourceDefinition;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Данные извлекаемые из файла порциями заданного размера
*/
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class XlsxMultipartDocument {
private Document document;
private FileInputStream fis;
private Workbook workbook;
private Sheet sheet;
public XlsxMultipartDocument(Document document){
this.document = document;
try {
this.fis = new FileInputStream(new File(document.getPath()));
this.workbook = new XSSFWorkbook(fis);
this.sheet = workbook.getSheetAt(0);
} catch (IOException e) {
System.out.println("Не читается файл: " + e.getMessage());
}
}
/**
* Получение физического количества строк в документе,
* что бы это не значило
* @return
*/
public int getLineCount() {
return sheet.getPhysicalNumberOfRows();
}
public List<XlsxCell> line(int n) {
Row row = sheet.getRow(n);
List<XlsxCell> cells = new ArrayList<>();
if (row == null) return cells; //пустая строка
//перебор ячейек в строке
for (Cell cell : row) {
cells.add(new XlsxCell(cell));
}
return cells;
}
public void close() {
try {
workbook.close();
fis.close();
} catch (IOException e) {
System.out.println("Не удалось закрыть потоки: " + e.getMessage());
}
}
}

68
storage-rs/src/main/java/ru/molokoin/storagers/service/StorageService.java

@ -18,7 +18,8 @@ import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import ru.molokoin.storagers.config.StorageConfiguration; import ru.molokoin.storagers.config.StorageConfiguration;
import ru.molokoin.storagers.model.DocumentModel; import ru.molokoin.storagers.model.Document;
import ru.molokoin.storagers.model.XlsxMultipartDocument;
@Service @Service
@ -50,45 +51,35 @@ public class StorageService implements StorageServiceFace{
} }
/**
* Получаем корневую директорию хранения файлов
*/
@Override @Override
public Path root(){ public Path root(){
return storageLocation; return storageLocation;
} }
@Override @Override
public List<DocumentModel> list() { public List<Document> list() {
List<DocumentModel> docs = new ArrayList<>(); List<Document> docs = new ArrayList<>();
/**
* Получаем список файлов в директории root // Получаем список файлов в директории root
*/
String[] files = root().toFile().list(); String[] files = root().toFile().list();
/** // извлекаем сведения о каждом файле для формирвоания сущности document
* извлекаем сведения о каждом файле для формирвоания сущности document
*/
for (String file : new ArrayList<>(Arrays.asList(files))) { for (String file : new ArrayList<>(Arrays.asList(files))) {
DocumentModel doc = new DocumentModel(); Document doc = new Document();
doc.setPath(root() + "/" + file); doc.setPath(root() + "/" + file);
/** // Извлекаем имя файла
* Извлекаем имя файла
*/
doc.setName(new File(file).getName()); doc.setName(new File(file).getName());
/** // Получаем размер файла
* Получаем размер файла
* Важно! когда у пользователя контейнера нет прав на файл - вызывается ошибка
* файлы, загруженные приложением ошибок вызывать не будут,
* только файлы перемещенные в том из операционной системы.
*/
long size = new File(doc.getPath()).length(); long size = new File(doc.getPath()).length();
doc.setSize(size); doc.setSize(size);
/** // Получаем расширение файла
* Получаем расширение файла
*/
try { try {
Optional<String> ext = Optional.ofNullable(file) Optional<String> ext = Optional.ofNullable(file)
.filter(f -> f.contains(".")) .filter(f -> f.contains("."))
@ -108,22 +99,14 @@ public class StorageService implements StorageServiceFace{
/** /**
* Найти документ по имени * Найти документ по имени
*/ */
public DocumentModel find(String name){ public Document find(String name){
return list().stream().filter(doc -> name.equals(doc.getName())) return list().stream().filter(doc -> name.equals(doc.getName()))
.findAny() .findAny()
.orElse(null); .orElse(null);
} }
@Override public XlsxMultipartDocument findXlsxMultipartDocument(String name){
public void clear() { return new XlsxMultipartDocument(find(name));
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'clear'");
}
@Override
public Resource load(long id) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'load'");
} }
/** /**
@ -146,6 +129,9 @@ public class StorageService implements StorageServiceFace{
return true; return true;
} }
/**
* Загрузка файла в хранилище
*/
@Override @Override
public Boolean store(MultipartFile file, String name_new) { public Boolean store(MultipartFile file, String name_new) {
try { try {
@ -159,9 +145,13 @@ public class StorageService implements StorageServiceFace{
} }
} }
@Override /**
public boolean store(List<Resource> resources) { * Методы для работы с реестром обученных
// TODO Auto-generated method stub * предоставляют детальные данные о содержимом реестра обученных,
throw new UnsupportedOperationException("Unimplemented method 'store'"); * чтобы избежать излишней пересылки информации
} * -
*/
} }

25
storage-rs/src/main/java/ru/molokoin/storagers/service/StorageServiceFace.java

@ -7,7 +7,7 @@ import java.util.List;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import ru.molokoin.storagers.model.DocumentModel; import ru.molokoin.storagers.model.Document;
public interface StorageServiceFace { public interface StorageServiceFace {
/** /**
@ -31,26 +31,14 @@ public interface StorageServiceFace {
* получить список размещенных на хосте и не зарегистрированных в базе файлов * получить список размещенных на хосте и не зарегистрированных в базе файлов
* @return * @return
*/ */
public List<DocumentModel> list(); public List<Document> list();
/** /**
* Поиск документа из списка по имени * Поиск документа из списка по имени
* @param name * @param name
* @return * @return
*/ */
public DocumentModel find(String name); public Document find(String name);
/**
* Удаление всех файлов, очистка хранилища
*/
public void clear();
/**
* Получение ресурса из хранилища
* @param id
* @return
*/
public Resource load(long id);
/** /**
* Удаление файла из хранилища * Удаление файла из хранилища
@ -65,11 +53,4 @@ public interface StorageServiceFace {
* @return * @return
*/ */
public Boolean store(MultipartFile file, String name_new); public Boolean store(MultipartFile file, String name_new);
/**
* Сохранение группы ресурсов в хранилище
* @param resources
* @return
*/
public boolean store(List<Resource> resources);
} }

Loading…
Cancel
Save