esoe 3 months ago
parent
commit
52a4cb3d3b
  1. 97
      storage-rs/src/main/java/ru/molokoin/storagers/controller/StorageController.java
  2. 104
      storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxCell.java
  3. 35
      storage-rs/src/main/java/ru/molokoin/storagers/model/XlsxMultipartDocument.java
  4. 9
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Building.java
  5. 23
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Course.java
  6. 70
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Cretarea.java
  7. 22
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/EducationEntry.java
  8. 49
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Headers.java
  9. 18
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Organization.java
  10. 26
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Program.java
  11. 26
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Student.java
  12. 11
      storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Teacher.java
  13. 72
      storage-rs/src/main/java/ru/molokoin/storagers/util/Stringer.java

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

@ -2,6 +2,7 @@ package ru.molokoin.storagers.controller; @@ -2,6 +2,7 @@ package ru.molokoin.storagers.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@ -16,7 +17,9 @@ import org.springframework.web.bind.annotation.RequestParam; @@ -16,7 +17,9 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import ru.molokoin.storagers.model.Document;
import ru.molokoin.storagers.model.XlsxCell;
import ru.molokoin.storagers.model.XlsxDocument;
import ru.molokoin.storagers.model.XlsxMultipartDocument;
import ru.molokoin.storagers.service.StorageServiceFace;
/**
@ -29,11 +32,6 @@ import ru.molokoin.storagers.service.StorageServiceFace; @@ -29,11 +32,6 @@ import ru.molokoin.storagers.service.StorageServiceFace;
@Controller
@RequestMapping(path = "/", consumes = {"*/*"})
public class StorageController {
/**
* Подключаем сервис доступа к базе даных
*/
// private DocumentFace database;
/**
* получаем в переменную root
* значение свойства storage.location
@ -146,7 +144,7 @@ public class StorageController { @@ -146,7 +144,7 @@ public class StorageController {
/**
* Получение метаданных о файле
* @param filename
* @return
* @return ResponseEntity<Document>
*/
@GetMapping("/api/document/{filename}")
public ResponseEntity<?> getDocumentByName(@PathVariable String filename){
@ -165,6 +163,93 @@ public class StorageController { @@ -165,6 +163,93 @@ public class StorageController {
return new ResponseEntity<>(xlsx, HttpStatus.OK);
}
/**
* Получение содержимого файла в json формате
* данные предоставляются построчно
* @param filename
* @return
*/
@GetMapping("/api/document/{filename}/content/line/{line}")
public ResponseEntity<?> getDocumentContentByLines(@PathVariable String filename, @PathVariable String line){
Document doc = storage.find(filename);
XlsxMultipartDocument parts = new XlsxMultipartDocument(doc);
List<XlsxCell> cells = parts.line(Integer.parseInt(line));
return new ResponseEntity<>(cells, HttpStatus.OK);
}
@GetMapping("/api/document/{filename}/content/part/{from}/{count}")
public ResponseEntity<?> getDocumentContentByParts(@PathVariable String filename, @PathVariable String from, @PathVariable String count){
Document doc = storage.find(filename);
XlsxMultipartDocument parts = new XlsxMultipartDocument(doc);
// System.out.println(parts.getLineCount());
Map<Integer, List<XlsxCell>> cells = parts.lines(Integer.parseInt(from), Integer.parseInt(count));
return new ResponseEntity<>(cells, HttpStatus.OK);
}
@GetMapping("/api/document/{filename}/content/length")
public ResponseEntity<?> getDocumentContentLenght(@PathVariable String filename){
Document doc = storage.find(filename);
XlsxMultipartDocument parts = new XlsxMultipartDocument(doc);
return new ResponseEntity<>(parts.getLineCount(), HttpStatus.OK);
}
/**
* Получение одного столбца в json формате
* @param filename
* @return
*/
@GetMapping("/api/document/{filename}/content/column/{num}")
public ResponseEntity<?> getDocumentContentByColumn(@PathVariable String filename, @PathVariable String num){
Document doc = storage.find(filename);
XlsxMultipartDocument parts = new XlsxMultipartDocument(doc);
List<XlsxCell> cells = parts.column(Integer.parseInt(num));
return new ResponseEntity<>(cells, HttpStatus.OK);
}
/**
* получение списка уникальных эементов в столбце
* @param filename
* @return
*/
@GetMapping("/api/document/{filename}/content/column/{num}/unique")
public ResponseEntity<?> getDocumentContentByColumnUnique(@PathVariable String filename, @PathVariable String num){
Document doc = storage.find(filename);
XlsxMultipartDocument parts = new XlsxMultipartDocument(doc);
List<XlsxCell> cells = parts.columnUnique(Integer.parseInt(num));
return new ResponseEntity<>(cells, HttpStatus.OK);
}
/*
* TODO : сортировка
* - получение уникальных элементов столбца,
* отсортированных по алфавиту
* отсортированных по возростанию/убыванию
*
* sort-up
* sort-down
* - сортировка данных в выборке (part)
*
* TODO : фильтрация
* - получение данных (lines) по определенному значению в столбце
* в запросе указываем номер столбца,
* значение передаем атрибутом к запросу
*/
/**
*
* @param filename
* @return
*/
/**
* Удаление файла по имени
*/

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

@ -3,20 +3,18 @@ package ru.molokoin.storagers.model; @@ -3,20 +3,18 @@ package ru.molokoin.storagers.model;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import ru.molokoin.storagers.util.Stringer;
/**
* Класс для хранения содержимого ячейки
* TODO: убрать не нужные поля
*/
public class XlsxCell {
private String content; //содержимое ячейки
private String textColor; //цвет шрифта
private String bgColor; // цвет заливки ячейки
private String textSize; //8-12-14-24 размеры шрифта
private int textWeight; //жирность: bold (900), normal(500),
private String type;// STRING, NUMERIC, BOOLEAN, FORMULA
public XlsxCell(String content){
this.content = content;
setContent(content);
}
/**
@ -30,63 +28,9 @@ public class XlsxCell { @@ -30,63 +28,9 @@ public class XlsxCell {
* @param content the content to set
*/
public void setContent(String content) {
this.content = content;
}
/**
* @return the textColor
*/
public String getTextColor() {
return textColor;
}
/**
* @param textColor the textColor to set
*/
public void setTextColor(String textColor) {
this.textColor = textColor;
}
/**
* @return the bgColor
*/
public String getBgColor() {
return bgColor;
}
/**
* @param bgColor the bgColor to set
*/
public void setBgColor(String bgColor) {
this.bgColor = bgColor;
}
/**
* @return the textSize
*/
public String getTextSize() {
return textSize;
}
/**
* @param textSize the textSize to set
*/
public void setTextSize(String textSize) {
this.textSize = textSize;
}
/**
* @return the textWeight
*/
public int getTextWeight() {
return textWeight;
}
/**
* @param textWeight the textWeight to set
*/
public void setTextWeight(int textWeight) {
this.textWeight = textWeight;
//убираем лишние пробельные символы
//заменяем пустые строки на ""
this.content = Stringer.clear(content);
}
/**
@ -108,10 +52,6 @@ public class XlsxCell { @@ -108,10 +52,6 @@ public class XlsxCell {
final int prime = 31;
int result = 1;
result = prime * result + ((content == null) ? 0 : content.hashCode());
result = prime * result + ((textColor == null) ? 0 : textColor.hashCode());
result = prime * result + ((bgColor == null) ? 0 : bgColor.hashCode());
result = prime * result + ((textSize == null) ? 0 : textSize.hashCode());
result = prime * result + textWeight;
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@ -130,23 +70,6 @@ public class XlsxCell { @@ -130,23 +70,6 @@ public class XlsxCell {
return false;
} else if (!content.equals(other.content))
return false;
if (textColor == null) {
if (other.textColor != null)
return false;
} else if (!textColor.equals(other.textColor))
return false;
if (bgColor == null) {
if (other.bgColor != null)
return false;
} else if (!bgColor.equals(other.bgColor))
return false;
if (textSize == null) {
if (other.textSize != null)
return false;
} else if (!textSize.equals(other.textSize))
return false;
if (textWeight != other.textWeight)
return false;
if (type == null) {
if (other.type != null)
return false;
@ -157,8 +80,7 @@ public class XlsxCell { @@ -157,8 +80,7 @@ public class XlsxCell {
@Override
public String toString() {
return "XlsxCell [content=" + content + ", textColor=" + textColor + ", bgColor=" + bgColor + ", textSize="
+ textSize + ", textWeight=" + textWeight + ", type=" + type + "]";
return "XlsxCell [content=" + content + ", type=" + type + "]";
}
/**
@ -175,13 +97,9 @@ public class XlsxCell { @@ -175,13 +97,9 @@ public class XlsxCell {
* @param textWeight
* @param type
*/
public XlsxCell(String content, String textColor, String bgColor, String textSize, int textWeight, String type) {
this.content = content;
this.textColor = textColor;
this.bgColor = bgColor;
this.textSize = textSize;
this.textWeight = textWeight;
this.type = type;
public XlsxCell(String content, String type) {
this.setContent(content);
this.setType(type);
}
/**
@ -193,7 +111,7 @@ public class XlsxCell { @@ -193,7 +111,7 @@ public class XlsxCell {
//обработка null
if (cell == null) {
this.setContent("");
this.type = "NULL";
this.setType("NULL");
return;
}

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

@ -9,14 +9,11 @@ import java.util.List; @@ -9,14 +9,11 @@ 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;
@ -61,8 +58,10 @@ public class XlsxMultipartDocument { @@ -61,8 +58,10 @@ public class XlsxMultipartDocument {
List<XlsxCell> cells = new ArrayList<>();
if (row == null) return cells; //пустая строка
//перебор ячейек в строке
for (Cell cell : row) {
int i = 0;
int max = row.getLastCellNum();
for (; i < max; i++) {
Cell cell = row.getCell(i);
cells.add(new XlsxCell(cell));
}
return cells;
@ -75,6 +74,32 @@ public class XlsxMultipartDocument { @@ -75,6 +74,32 @@ public class XlsxMultipartDocument {
} catch (IOException e) {
System.out.println("Не удалось закрыть потоки: " + e.getMessage());
}
}
public Map<Integer, List<XlsxCell>> lines(int from, int count) {
Map<Integer, List<XlsxCell>> lines = new HashMap<>();
for (int i = from; i < from + count; i++) {
lines.put(i, line(i));
}
return lines;
}
public List<XlsxCell> column(int num) {
List<XlsxCell> cells = new ArrayList<>();
for (int i = 0; i < getLineCount(); i++) {
cells.add(line(i).get(num));
}
return cells;
}
public List<XlsxCell> columnUnique(int num) {
List<XlsxCell> cells = new ArrayList<>();
for (int i = 0; i < getLineCount(); i++) {
if (!cells.contains(line(i).get(num)))
cells.add(line(i).get(num));
}
return cells;
}
}

9
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Building.java

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
package ru.molokoin.storagers.model.educations;
public class Building {
private long id;
private String name_short;//Сокращенное наименование (абревиатура)
private String name_full;//Полное наименование
private String code_short;//Краткий код
private String code_full;//Полный код
}

23
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Course.java

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
package ru.molokoin.storagers.model.educations;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Course {
private long id;//уникальный идентификатор курса
private String place;//место проведения занятий
private Date start_date;//дата начала курса
private Date protocol_date;//дата протокола
private String protocol_number;//номер протокола
private String report_period;//отчетный период (наименование месяца)
private Teacher teacher;//сведения о преподаватле
private Program program;//сведения о программе обучения
private Building building;//сведения об объекте строиbernate
}

70
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Cretarea.java

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
package ru.molokoin.storagers.model.educations;
import java.util.List;
import java.util.Map.Entry;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import ru.molokoin.storagers.model.XlsxCell;
import ru.molokoin.storagers.util.Stringer;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Cretarea {
private long id;
private String name;//Наименование
private String nameShort;//Наименование : сокращенно
public Cretarea(String nameShort) {
setNameShort(nameShort);
}
public Cretarea(List<XlsxCell> cells) {
this(cells.get(Headers.CRETAREA_NAME_SHORT.column()).getContent());
}
public Cretarea(Entry<Integer, List<XlsxCell>> entry) {
this(entry.getValue());
}
public void setNameShort(String nameShort) {
if (!Stringer.isEmpty(nameShort)){
this.nameShort = Stringer.clear(nameShort);
} else {
this.nameShort = "";
}
}
public String getNameShort() {
return this.nameShort;
}
/**
* Сравнение критериев по полю name_short - "Наименование : сокращенно"
* остальные поля будут пустыми при чтении документа
*
* @param cretarea
* @return true - если совпадают
*/
public boolean isSimilar(Cretarea cretarea) {
return this.nameShort.equals(cretarea.getNameShort());
}
/**
* Проверка наличия сокращенного наименования критерия
* @return true - если пусто
*/
public boolean isEmpty() {
return this.nameShort == null
|| this.nameShort.isEmpty()
|| this.nameShort.trim().isEmpty()
|| this.nameShort.equals("");
}
}

22
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/EducationEntry.java

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
package ru.molokoin.storagers.model.educations;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class EducationEntry {
private long id;
private String sertificate_number;//номер удостоверения
private String frdo_number;//ФРДО номер по реестру
private String eisot_number;//ЕИСОТ номер по реестру
private String ones;//единички (вспомогатльный столбец)
private Course course;//сведения о курсе
private Student student;//сведения о студенте
}

49
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Headers.java

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
package ru.molokoin.storagers.model.educations;
/**
* Список заголовков таблицы
* добавить поле, для хранения типа данных столбца
*/
public enum Headers {
ORGANIZATION_TYPE(0, "Тип организации"),
ORGANIZATION_NAME_FULL(1, "ПСК"),
STUDENT_DIRECTION(2, "Структурное подразделение"),
STUDENT_FULL_NAME(3, "ФИО обучающегося"),
STUDENT_PROFESSION(4, "Профессия"),
COURSE_PLACE(5, "Место проведения обучения"),
PROGRAM_NAME(6, "Программа обучения"),
COURSE_START_DATE(7, "Дата начала обучения"),
PROGRAM_LENGHT(8, "Продолжительность программы"),
COURSE_PROTOCOL_DATE(9, "Дата протокола"),
STUDENT_CATEGORY(10, "Категория обучаемых"),
PROGRAMM_STADY_DIRECTION(11, "Направление обучения"),
CRETAREA_NAME_SHORT(12, "Критерий"),
COURSE_PROTOCOL_NUMBER(13, "Номер протокола"),
EDUCATION_SERTIFICATE_NUMBER(14, "Номер удостоверения"),
PROGRAM_PRICE(15, "Стоимость обучения"),
EDUCATIONS_ONES(16, "Единички"),
COURSE_REPORT_PERIOD(17, "Отчетный период"),
TEACHER_FULL_NAME(18, "Преподаватель"),
BUILDING_NAME_SHORT(19, "Объект");
private Headers(int column, String title) {
this.column = column;
this.title = title;
}
public int column() {
return column;
}
public String title() {
return title;
}
private int column;
private String title;
}

18
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Organization.java

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
package ru.molokoin.storagers.model.educations;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Organization {
private long id;
private String ownership;//Форма собственности ПСК
private String name_short;//Сокращенное наименование
private String name_full;//Полное наименование (1)
private String type;//вид ПСК - производственная/сервисная (0)
private String inn;//ИНН организации
}

26
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Program.java

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
package ru.molokoin.storagers.model.educations;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Program {
private long id;
private String name;//Наименование
private Integer lenght;//длительность программы в часах
/**
* Направление обучения:
* - Обязательное обучение
* - Производственное обучение
* - Обучение вновь внедряемым процедурам
* - Обучение водителей
*/
private String study_direction;
private Integer price;//рублей
private Cretarea cretarea;
}

26
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Student.java

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
package ru.molokoin.storagers.model.educations;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {
private long id;
private String first_name;//Имя
private String second_name;//Отчество
private String last_name;//Фамилия
private String profession;//Профессия
private String category;//Категория (ИТР или рабочий)
private String direction;//Структурное подразделение
private String snils;//СНИЛС
private Date berth;//Дата рождения
private String sitizenship;//Гражданство
private String sex;//Пол (Муж/Жен)
private Organization organization;//Организация - работодатель
}

11
storage-rs/src/main/java/ru/molokoin/storagers/model/educations/Teacher.java

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
package ru.molokoin.storagers.model.educations;
public class Teacher {
private long id;
private String first_name;//Имя
private String second_name;//Фамилия
private String last_name;//Отчество
private String employee_id;
private String snils;
}

72
storage-rs/src/main/java/ru/molokoin/storagers/util/Stringer.java

@ -0,0 +1,72 @@ @@ -0,0 +1,72 @@
package ru.molokoin.storagers.util;
/**
* Класс для работы со строками
*/
public class Stringer {
/**
* Проверяет, является ли переданная строка null, пустой строкой или состоит только из пробелов.
*
* @param str Строка для проверки
* @return True если строка является null, пустой строкой или состоит только из пробелов
* False в противном случае
*/
public static Boolean checkForEmpty(String str) {
// Check if the string is null
if (str == null) {
return true;
}
// Check if the string is empty or consists only of whitespace characters
if (str.isEmpty() || str.trim().isEmpty()) {
return true;
}
// The string is not null, not empty and does not consist only of whitespace characters
return false;
}
/**
* Удаляет регулярным выражением лишние пробельные символы из строки.
*
* Заменяет знаки переноса строки на пробелы с помощью использования регулярного выражения
* \s+ - пробелы (и все ниже приведенные пробельные символы)
* \t - табуляция
* \v - вертикальная табуляция
* \r - перенос в начало строки
* \n - перенос строки
* \f - форматированный перенос строки
*
* Осавляет по одному пробелу между словами, если слов больше одного
* Возвращает пустую строку, если получена строка null
*
* @param string строка для обработки
* @return строку без лишних пробелов или пустую строку
*/
public static String clear(String string) {
// Проверяем, не является ли строка null. Если строка null, возвращаем пустую строку.
if (string == null) {
return "";
}
// Удаляем лишние пробелы из строки.
return string.replaceAll("\\s+", " ").trim();
}
/**
*
* @param str
* @return
*/
public static boolean isEmpty(String str) {
// Check if the string is null
if (str == null) {
return true;
}
// Check if the string is empty or consists only of whitespace characters
if (str.isEmpty() || str.trim().isEmpty()) {
return true;
}
// The string is not null, not empty and does not consist only of whitespace characters
return false;
}
}
Loading…
Cancel
Save