From 99bea206f9f25f636483148ec8565b6889756929 Mon Sep 17 00:00:00 2001 From: esoe Date: Thu, 19 Sep 2024 16:29:30 +0300 Subject: [PATCH] qq --- .../controller/v1/OrganizationController.java | 12 +- .../controller/v1/ProgramController.java | 2 +- .../model/fs/xlsx/XlsxDocumentReestr.java | 2 +- .../model/organization/Organization.java | 12 +- .../mlokoin/gates/model/program/Program.java | 6 +- .../mlokoin/gates/model/student/Student.java | 2 +- .../ru/mlokoin/gates/repository/Storage.java | 4 +- .../controllers/api/CourseController.java | 213 +++++++++++++++++- .../resourceserviceapi/enums/Base.java | 4 +- .../resourceserviceapi/enums/Courses.java | 34 +++ .../repositories/CourseRepository.java | 43 ++++ .../repositories/CourseRepositoryFace.java | 12 - .../ProgramCretareaRepository.java | 1 - .../services/CourseService.java | 173 ++++++++++++++ Описание.docx | Bin 0 -> 12409 bytes 15 files changed, 473 insertions(+), 47 deletions(-) create mode 100644 resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Courses.java create mode 100644 resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepository.java delete mode 100644 resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepositoryFace.java create mode 100644 resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/services/CourseService.java create mode 100644 Описание.docx diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java index a39b17a..c56414f 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/OrganizationController.java @@ -63,7 +63,7 @@ public class OrganizationController { } Organization organization = new Organization(); - organization.setName_full(string); + organization.setNameFull(string); xlsx_orgs.add(organization); } xlsx_orgs.remove(0);//Удалили из списка заголовок @@ -73,7 +73,7 @@ public class OrganizationController { System.out.println("###############################"); System.out.println(">> Организации из файла: " + xlsx_orgSet.size()); for (Organization organization : xlsx_orgSet) { - System.out.println("Объект строительства (xlsx): " + organization.getName_full()); + System.out.println("Объект строительства (xlsx): " + organization.getNameFull()); } //Ошибки в консоль @@ -94,13 +94,13 @@ public class OrganizationController { Set base_organizations_str = new HashSet<>(); for (Organization o : xlsx_orgSet) { - String s = o.getName_full(); + String s = o.getNameFull(); xlsx_organizations_str.add(s); } System.out.println("Организации в базе:"); for (Organization o : base_organizations) { - String s = o.getName_full(); + String s = o.getNameFull(); System.out.println("base_organizations : " + s); base_organizations_str.add(s); } @@ -114,7 +114,7 @@ public class OrganizationController { ArrayList list = new ArrayList<>(); for (String string : xlsx_organizations_str) { Organization o = new Organization(); - o.setName_full(string); + o.setNameFull(string); list.add(o); } @@ -138,7 +138,7 @@ public class OrganizationController { for (Organization organization : wraper.getList()) { //Проверка наличия флага для добавления в базу //по полю табельного номера - if (organization.getName_full() != ""){ + if (organization.getNameFull() != ""){ client.post() .uri("http://resource-service-api:8181/organization/create") .body(Mono.just(organization), Organization.class) diff --git a/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java b/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java index 91d591b..77291a9 100644 --- a/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java +++ b/gates/src/main/java/ru/mlokoin/gates/controller/v1/ProgramController.java @@ -127,7 +127,7 @@ public class ProgramController { //проверка наличия длительности программы if (program.getLenght() != null) { //проверка наличия направления обучения - if (!program.getStudy_direction().equals("")){ + if (!program.getStudyDirection().equals("")){ //проверка наличия критерия if (program.getCretarea() != null){ client.post() diff --git a/gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java b/gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java index 68b0c7d..1dac1d6 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/fs/xlsx/XlsxDocumentReestr.java @@ -179,7 +179,7 @@ public class XlsxDocumentReestr extends XlsxDocument { List organizations = getOrganizationsAsIs(); List unique = new ArrayList<>(); for (Organization organization : organizations) { - if (!unique.contains(organization) && organization.getName_full() != "") { + if (!unique.contains(organization) && organization.getNameFull() != "") { unique.add(organization); } } diff --git a/gates/src/main/java/ru/mlokoin/gates/model/organization/Organization.java b/gates/src/main/java/ru/mlokoin/gates/model/organization/Organization.java index 9ab1fa4..e0d4d7a 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/organization/Organization.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/organization/Organization.java @@ -19,8 +19,8 @@ import ru.mlokoin.gates.teh.strings.Stringer; public class Organization implements Serializable{ private long id; private String ownership;//Форма собственности ПСК - private String name_short;//Сокращенное наименование - private String name_full;//Полное наименование + private String nameShort;//Сокращенное наименование + private String nameFull;//Полное наименование private String type;//вид ПСК - производственная/сервисная private String inn;//ИНН организации @@ -34,17 +34,17 @@ public class Organization implements Serializable{ */ public Organization(String ownership, String name_short, String name_full, String type, String inn) { this.ownership = ownership; - this.name_short = name_short; - this.name_full = name_full; + this.nameShort = name_short; + this.nameFull = name_full; this.type = type; this.inn = inn; } public Organization(Entry> entry) { - this.setName_full(Stringer.clear(entry.getValue().get(1).getContent())); + this.setNameFull(Stringer.clear(entry.getValue().get(1).getContent())); } public boolean isSimilar(Organization organization) { - return this.getName_full().equals(organization.getName_full()); + return this.getNameFull().equals(organization.getNameFull()); } } diff --git a/gates/src/main/java/ru/mlokoin/gates/model/program/Program.java b/gates/src/main/java/ru/mlokoin/gates/model/program/Program.java index dd3340c..ba31008 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/program/Program.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/program/Program.java @@ -26,7 +26,7 @@ public class Program { * - Обучение вновь внедряемым процедурам * - Обучение водителей */ - private String study_direction; + private String studyDirection; private Integer price;//рублей private ProgramCretarea cretarea; @@ -42,7 +42,7 @@ public class Program { public Program(String name, Integer lenght, String study_direction, Integer price, ProgramCretarea cretarea) { this.name = name; this.lenght = lenght; - this.study_direction = study_direction; + this.studyDirection = study_direction; this.price = price; this.cretarea = cretarea; } @@ -67,7 +67,7 @@ public class Program { } - this.setStudy_direction(Stringer.clear(entry.getValue().get(Headers.PROGRAMM_STADY_DIRECTION.column()).getContent())); + this.setStudyDirection(Stringer.clear(entry.getValue().get(Headers.PROGRAMM_STADY_DIRECTION.column()).getContent())); //устанавливаем стоимость обучения try { diff --git a/gates/src/main/java/ru/mlokoin/gates/model/student/Student.java b/gates/src/main/java/ru/mlokoin/gates/model/student/Student.java index 4a0266e..9ecc10c 100644 --- a/gates/src/main/java/ru/mlokoin/gates/model/student/Student.java +++ b/gates/src/main/java/ru/mlokoin/gates/model/student/Student.java @@ -86,7 +86,7 @@ public class Student implements Serializable{ if (base_organizations != null) { this.organization = base_organizations .stream() - .filter(org -> org.getName_full().equals(organization)) + .filter(org -> org.getNameFull().equals(organization)) .findFirst() .orElse(null); } else { diff --git a/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java b/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java index 4c70bcb..8c85913 100644 --- a/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java +++ b/gates/src/main/java/ru/mlokoin/gates/repository/Storage.java @@ -571,7 +571,7 @@ public class Storage { for (Organization xlsxOrganization : xlsxList) { for (Organization baseOrganization : baseList) { - if (xlsxOrganization.getName_full().equals(baseOrganization.getName_full())) { + if (xlsxOrganization.getNameFull().equals(baseOrganization.getNameFull())) { result.remove(xlsxOrganization); break; } @@ -616,7 +616,7 @@ public class Storage { && xlsxStudent.getProfession().equals(baseStudent.getProfession()) && xlsxStudent.getDirection().equals(baseStudent.getDirection()) && xlsxStudent.getProfession().equals(baseStudent.getProfession()) - && xlsxStudent.getOrganization().getName_full().equals(baseStudent.getOrganization().getName_full())) { + && xlsxStudent.getOrganization().getNameFull().equals(baseStudent.getOrganization().getNameFull())) { result.remove(xlsxStudent); break; } diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/controllers/api/CourseController.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/controllers/api/CourseController.java index 80e8b25..7429ba6 100644 --- a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/controllers/api/CourseController.java +++ b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/controllers/api/CourseController.java @@ -1,8 +1,14 @@ package ru.molokoin.resourceserviceapi.controllers.api; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -13,28 +19,201 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import ru.molokoin.resourceserviceapi.entities.Course; -import ru.molokoin.resourceserviceapi.repositories.CourseRepositoryFace; +import ru.molokoin.resourceserviceapi.enums.Base; +import ru.molokoin.resourceserviceapi.services.CourseService; @RestController -@RequestMapping(path = "/", consumes = {"*/*"}) +@RequestMapping(path = "/api/course", consumes = {"*/*"}) public class CourseController { @Autowired - private CourseRepositoryFace repo; + private CourseService repo; - @GetMapping("/course/list") - public ResponseEntity> getCourses(){ - return new ResponseEntity<>(repo.findAll(), HttpStatus.OK); + public CourseController(CourseService repo) { + this.repo = repo; } - @GetMapping("/course/{id}") - public ResponseEntity getCourseByID(@PathVariable Integer id){ - return new ResponseEntity<>(repo.findById(id), HttpStatus.OK); + @GetMapping("/pages") + public Page courses(@RequestParam(name="page", defaultValue = "0") int pageNo, + @RequestParam(name = "size", defaultValue = "10") int pageSize, + @RequestParam(name="sortBy", defaultValue = "id") String sortBy) { + if (!Base.COURSES.contains(sortBy)) sortBy = "id"; + return repo.findAll(PageRequest.of(pageNo, pageSize, Sort.by(sortBy))); } - @PostMapping(path = "/course/create", + @GetMapping("/count") + public ResponseEntity count(){ + return new ResponseEntity<>(repo.count(), HttpStatus.OK); + } + + /** + * Возвращает страницы по одному наиболее приоритетному параметру + * @param id + * @param place + * @param startDate + * @param protocolDate + * @param protocolNumber + * @param reportPeriod + * @param teacherId + * @param teacherSecondName + * @param teacherFirstName + * @param teacherLastName + * @param teacherFio + * @param employeeId + * @param snils + * @param programId + * @param programName + * @param programLenght + * @param programStudyDirection + * @param programPrice + * @param programCretareaId + * @param programCretareaName + * @param programNameShort + * @param buildingId + * @param buildingNameShort + * @param buildingNameFull + * @param buildingCodeShort + * @param buildingCodeFull + * @param pageNo + * @param pageSize + * @param sortBy + * @return + */ + @GetMapping("") + public Page course( + @RequestParam(name="id", defaultValue = "0") Long id, + @RequestParam(name="place", defaultValue = "") String place, + @RequestParam(name="startDate", defaultValue = "") Date startDate, + @RequestParam(name="protocolDate", defaultValue = "") Date protocolDate, + @RequestParam(name="protocolNumber", defaultValue = "") String protocolNumber, + @RequestParam(name="reportPeriod", defaultValue = "") String reportPeriod, + //Параметры вложенного объекта teacher + @RequestParam(name="teacherId", defaultValue = "") Long teacherId, + @RequestParam(name="teacherSecondName", defaultValue = "") String teacherSecondName, + @RequestParam(name="teacherFirstName", defaultValue = "") String teacherFirstName, + @RequestParam(name="teacherLastName", defaultValue = "") String teacherLastName, + @RequestParam(name="teacherFio", defaultValue = "") String teacherFio, + @RequestParam(name="teacherEmployeeId", defaultValue = "") String employeeId, + @RequestParam(name="teacherSnils", defaultValue = "") String snils, + //Параметры вложенного объекта program + @RequestParam(name="programId", defaultValue = "") Long programId, + @RequestParam(name="programName", defaultValue = "") String programName, + @RequestParam(name="programLenght", defaultValue = "") String programLenght, + @RequestParam(name="programStudyDirection", defaultValue = "") String programStudyDirection, + @RequestParam(name="programPrice", defaultValue = "") String programPrice, + @RequestParam(name="programCretareaId", defaultValue = "") String programCretareaId, + @RequestParam(name="programCretareaName", defaultValue = "") String programCretareaName, + @RequestParam(name="programCretareaNameShort", defaultValue = "") String programNameShort, + //Параметры вложенного объекта building + @RequestParam(name="buildingId", defaultValue = "") Long buildingId, + @RequestParam(name="buildingNameShort", defaultValue = "") String buildingNameShort, + @RequestParam(name="buildingNameFull", defaultValue = "") String buildingNameFull, + @RequestParam(name="buildingCodeShort", defaultValue = "") String buildingCodeShort, + @RequestParam(name="buildingCodeFull", defaultValue = "") String buildingCodeFull, + //параметры возвращаемой страницы + @RequestParam(name="page", defaultValue = "0") int pageNo, + @RequestParam(name = "size", defaultValue = "10") int pageSize, + @RequestParam(name="sortBy", defaultValue = "id") String sortBy + ) { + if (!Base.COURSES.contains(sortBy)) sortBy = "id"; + + if (id > 0) { + return repo.findById(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), id); + } + + if (!place.isEmpty()) { + return repo.findByPlace(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), place); + } + + if (startDate != null) { + return repo.findByStartDate(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), startDate); + } + + if (protocolDate != null) { + return repo.findByProtocolDate(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), protocolDate); + } + + if (!protocolNumber.isEmpty()) { + return repo.findByProtocolNumber(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), protocolNumber); + } + + if (!reportPeriod.isEmpty()) { + return repo.findByReportPeriod(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), reportPeriod); + } + + if (teacherId > 0) { + return repo.findByTeacherId(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), teacherId); + } + + if (!teacherFio.isEmpty()) { + return repo.findByTeacherFio(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), teacherFio); + } + + // if (!teacherSecondName.isEmpty()) { + // return repo.findByTeacherSecondName(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), teacherSecondName); + // } + + // if (!teacherFirstName.isEmpty()) { + // return repo.findByTeacherFirstName(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), teacherFirstName); + // } + + // if (!teacherLastName.isEmpty()) { + // return repo.findByTeacherLastName(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), teacherLastName); + // } + + // if (!employeeId.isEmpty()) { + // return repo.findByTeacherEmployeeId(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), employeeId); + // } + + // if (!snils.isEmpty()) { + // return repo.findByTeacherSnils(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), snils); + // } + + // if (programId > 0) { + // return repo.findByProgramId(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), programId); + // } + + // if (!programName.isEmpty()) { + // return repo.findByProgramName(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), programName); + // } + + // if (!programLenght.isEmpty()) { + // return repo.findByProgramLenght(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), programLenght); + // } + + // if (!programStudyDirection.isEmpty()) { + // return repo.findByProgramStudyDirection(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), programStudyDirection); + // } + + // if (!programPrice.isEmpty()) { + // return repo.findByProgramPrice(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), programPrice); + // } + + // if (!buildingNameShort.isEmpty()) { + // return repo.findByBuildingNameShort(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), buildingNameShort); + // } + + // if (!buildingCodeShort.isEmpty()) { + // return repo.findByBuildingCodeShort(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), buildingCodeShort); + // } + + // if (!buildingNameFull.isEmpty()) { + // return repo.findByBuildingNameFull(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), buildingNameFull); + // } + + // if (!buildingCodeFull.isEmpty()) { + // return repo.findByBuildingCodeFull(PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), buildingCodeFull); + // } + return new PageImpl<>(new ArrayList<>(), PageRequest.of(pageNo, pageSize, Sort.by(sortBy)), 0); + } + + + + + @PostMapping(path = "/create", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity saveCourse(@RequestBody Course course) { @@ -42,7 +221,7 @@ public class CourseController { return new ResponseEntity<>(course, HttpStatus.CREATED); } - @PutMapping(path = "/course/update/{id}", + @PutMapping(path = "/update/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity updateCourse(@PathVariable Integer id, @RequestBody Course course) { @@ -59,11 +238,21 @@ public class CourseController { return new ResponseEntity<>(repo.findById(id), HttpStatus.CREATED); } - @DeleteMapping("/course/delete/{id}") + @DeleteMapping("/delete/{id}") public ResponseEntity deleteCourse(@PathVariable Long id){ Course c = repo.findById(id).get(); System.out.println(c.toString()); repo.delete(c); return new ResponseEntity<>("Запись id#" + id + " удалена ... ", HttpStatus.OK); } + + // @GetMapping("/list") + // public ResponseEntity> getCourses(){ + // return new ResponseEntity<>(repo.findAll(), HttpStatus.OK); + // } + + // @GetMapping("/{id}") + // public ResponseEntity getCourseByID(@PathVariable Integer id){ + // return new ResponseEntity<>(repo.findById(id), HttpStatus.OK); + // } } diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Base.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Base.java index 51a7f15..1de3439 100644 --- a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Base.java +++ b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Base.java @@ -10,8 +10,8 @@ public enum Base { ORGANIZATIONS (Organizations.getTitles()), // EDUCATIONS (Educations.getTitles()), BUILDINGS (Buildings.getTitles()), - CRETAREAS (Cretareas.getTitles()); - // COURSES (Courses.getTitles()), + CRETAREAS (Cretareas.getTitles()), + COURSES (Courses.getTitles()); // POSTS (Posts.getTitles()), // STORES (Stores.getTitles()); diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Courses.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Courses.java new file mode 100644 index 0000000..d2c89c7 --- /dev/null +++ b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/enums/Courses.java @@ -0,0 +1,34 @@ +package ru.molokoin.resourceserviceapi.enums; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public enum Courses { + ID("id"), + PLACE("place"), + START_DATE("startDate"), + PROTOCOL_DATE("protocolDate"), + PROTOCOL_NUMBER("protocolNumber"), + REPORT_PERIOD("reportPeriod"), + TEACHER("teacher"), + PROGRAM("program"), + BUILDING("building"); + + private String column; + + Courses(String column) { + this.column = column; + } + + public String column() { + return column; + } + + public static List getTitles() { + return Arrays.stream(Courses.values()) + .map(Courses::column) + .collect(Collectors.toList()); + } + +} diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepository.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepository.java new file mode 100644 index 0000000..991b420 --- /dev/null +++ b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepository.java @@ -0,0 +1,43 @@ +package ru.molokoin.resourceserviceapi.repositories; + +import java.util.Date; +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import ru.molokoin.resourceserviceapi.entities.Course; +import ru.molokoin.resourceserviceapi.entities.Teacher; + +@Repository +public interface CourseRepository extends JpaRepository{ + List findAll(); + Course findById(long id); + Page findById(PageRequest of, Long id); + Page findByPlace(PageRequest of, String place); + Page findByStartDate(PageRequest of, Date startDate); + Page findByProtocolNumber(PageRequest of, String protocolNumber); + Page findByProtocolDate(PageRequest of, Date protocolDate); + Page findByReportPeriod(PageRequest of, String reportPeriod); + // Page findByTeacherId(PageRequest of, Long teacherId); + // Page findByTeacherFio(PageRequest of, String teacherFio); + // Page findByTeacherSecondName(PageRequest of, String teacherSecondName); + // Page findByTeacherFirstName(PageRequest of, String teacherFirstName); + // Page findByTeacherLastName(PageRequest of, String teacherLastName); + // Page findByTeacherEmployeeId(PageRequest of, String employeeId); + // Page findByTeacherSnils(PageRequest of, String snils); + // Page findByProgramId(PageRequest of, Long programId); + // Page findByProgramName(PageRequest of, String programName); + // Page findByProgramLenght(PageRequest of, String programLenght); + // Page findByProgramStudyDirection(PageRequest of, String programStudyDirection); + // Page findByProgramPrice(PageRequest of, String programPrice); + // Page findByBuildingId(PageRequest of, String buildingNameShort); + // Page findByBuildingCodeShort(PageRequest of, String buildingCodeShort); + // Page findByBuildingNameShort(PageRequest of, String buildingNameShort); + // Page findByBuildingNameFull(PageRequest of, String buildingNameFull); + // Page findByBuildingCodeFull(PageRequest of, String buildingCodeFull); + Page findByTeacher(PageRequest of, Teacher teacher); + boolean existsByTeacher(Teacher teacher); +} diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepositoryFace.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepositoryFace.java deleted file mode 100644 index 9120014..0000000 --- a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/CourseRepositoryFace.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.molokoin.resourceserviceapi.repositories; - -import java.util.List; - -import org.springframework.data.repository.ListCrudRepository; - -import ru.molokoin.resourceserviceapi.entities.Course; - -public interface CourseRepositoryFace extends ListCrudRepository{ - List findAll(); - Course findById(long id); -} diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/ProgramCretareaRepository.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/ProgramCretareaRepository.java index 22fcf1b..c4b23c2 100644 --- a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/ProgramCretareaRepository.java +++ b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/repositories/ProgramCretareaRepository.java @@ -5,7 +5,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import ru.molokoin.resourceserviceapi.entities.Program; import ru.molokoin.resourceserviceapi.entities.ProgramCretarea; @Repository diff --git a/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/services/CourseService.java b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/services/CourseService.java new file mode 100644 index 0000000..8ba4946 --- /dev/null +++ b/resource-service-api/src/main/java/ru/molokoin/resourceserviceapi/services/CourseService.java @@ -0,0 +1,173 @@ +package ru.molokoin.resourceserviceapi.services; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort.Order; +import org.springframework.data.util.Streamable; +import org.springframework.stereotype.Service; + +import ru.molokoin.resourceserviceapi.entities.Course; +import ru.molokoin.resourceserviceapi.entities.Teacher; +import ru.molokoin.resourceserviceapi.repositories.BuildingRepository; +import ru.molokoin.resourceserviceapi.repositories.CourseRepository; +import ru.molokoin.resourceserviceapi.repositories.ProgramCretareaRepository; +import ru.molokoin.resourceserviceapi.repositories.ProgramRepository; +import ru.molokoin.resourceserviceapi.repositories.TeacherRepository; + +@Service +public class CourseService { + //репозиторий курсов + private final CourseRepository repo; + //репозиторий преподавателей + private final TeacherService teacherService; + //репозиторий объектов строительства + private final BuildingService buildingService; + //репозиторий программ обучения + private final ProgramService programService; + //репозиторий критериев + private final ProgramCretareaService programCretareaService; + + public CourseService(CourseRepository repo, + TeacherService teacherService, + BuildingService buildingService, + ProgramService programService, + ProgramCretareaService programCretareaService) { + this.repo = repo; + this.teacherService = teacherService; + this.buildingService = buildingService; + this.programService = programService; + this.programCretareaService = programCretareaService; + } + public Page findAll(PageRequest of) { + return repo.findAll(of); + } + public void save(Course course) { + repo.save(course); + } + public Course findById(Integer id) { + return repo.findById(id); + } + public Optional findById(Long id) { + return repo.findById(id); + + } + public void delete(Course c) { + repo.delete(c); + } + public List findAll() { + return repo.findAll(); + } + public Long count() { + return repo.count(); + } + public Page findById(PageRequest of, Long id) { + return repo.findById(PageRequest.of(of.getPageNumber(), of.getPageSize()), id); + } + public Page findByPlace(PageRequest of, String place) { + return repo.findByPlace(PageRequest.of(of.getPageNumber(), of.getPageSize()), place); + } + public Page findByStartDate(PageRequest of, Date startDate) { + return repo.findByStartDate(PageRequest.of(of.getPageNumber(), of.getPageSize()), startDate); + } + public Page findByProtocolNumber(PageRequest of, String protocolNumber) { + return repo.findByProtocolNumber(PageRequest.of(of.getPageNumber(), of.getPageSize()), protocolNumber); + } + public Page findByProtocolDate(PageRequest of, Date protocolDate) { + return repo.findByProtocolDate(PageRequest.of(of.getPageNumber(), of.getPageSize()), protocolDate); + } + public Page findByReportPeriod(PageRequest of, String reportPeriod) { + return repo.findByReportPeriod(PageRequest.of(of.getPageNumber(), of.getPageSize()), reportPeriod); + } + + /** + * Поиск курсов по идентификатору преподавателя + * @param of + * @param teacherId + * @return + */ + public Page findByTeacherId(PageRequest of, Long teacherId) { + Teacher teacher = null; + if (teacherId > 0 && teacherService.existsById(teacherId)) { + teacher = teacherService.findById(teacherId); + } + + if (teacher != null && repo.existsByTeacher(teacher)) { + return repo.findByTeacher(PageRequest.of(of.getPageNumber(), of.getPageSize()), teacher); + } + //пустой список курсов + return new PageImpl<>(new ArrayList(), of, 0); + } + public Page findByTeacherFio(PageRequest of, String teacherFio) { + //извлекаем из базы список преподавателей по ФИО + List teachers = new ArrayList<>(); + if (teacherFio != null && !teacherFio.isEmpty() && teacherService.existsByFIO(teacherFio)) { + teachers = teacherService.findByFIO(teacherFio); + } + + if (teachers.size() > 0) { + //курсы каждого подходящего преподавателя добавляем к страничкам ответа + Page courses = new PageImpl<>(new ArrayList(), of, 0); + for (Teacher t : teachers) { + courses.and(repo.findByTeacher(PageRequest.of(of.getPageNumber(), of.getPageSize()), t)); + } + if (courses.getTotalElements() > 0) { + return courses; + } + } + //пустой список курсов + return new PageImpl<>(new ArrayList(), of, 0); + } + + // public Page findByTeacherSecondName(PageRequest of, String teacherSecondName) { + // return repo.findByTeacherSecondName(PageRequest.of(of.getPageNumber(), of.getPageSize()), teacherSecondName); + // } + // public Page findByTeacherFirstName(PageRequest of, String teacherFirstName) { + // return repo.findByTeacherFirstName(PageRequest.of(of.getPageNumber(), of.getPageSize()), teacherFirstName); + // } + // public Page findByTeacherLastName(PageRequest of, String teacherLastName) { + // return repo.findByTeacherLastName(PageRequest.of(of.getPageNumber(), of.getPageSize()), teacherLastName); + // } + // public Page findByProgramName(PageRequest of, String programName) { + // return repo.findByProgramName(PageRequest.of(of.getPageNumber(), of.getPageSize()), programName); + // } + // public Page findByBuildingId(PageRequest of, String buildingNameShort) { + // return repo.findByBuildingId(PageRequest.of(of.getPageNumber(), of.getPageSize()), buildingNameShort); + // } + // public Page findByBuildingCodeShort(PageRequest of, String buildingCodeShort) { + // return repo.findByBuildingCodeShort(PageRequest.of(of.getPageNumber(), of.getPageSize()), buildingCodeShort); + // } + // public Page findByBuildingNameShort(PageRequest of, String buildingNameShort) { + // return repo.findByBuildingNameShort(PageRequest.of(of.getPageNumber(), of.getPageSize()), buildingNameShort); + // } + // public Page findByProgramId(PageRequest of, Long programId) { + // return repo.findByProgramId(PageRequest.of(of.getPageNumber(), of.getPageSize()), programId); + // } + // public Page findByProgramLenght(PageRequest of, String programLenght) { + // return repo.findByProgramLenght(PageRequest.of(of.getPageNumber(), of.getPageSize()), programLenght); + // } + // public Page findByTeacherEmployeeId(PageRequest of, String employeeId) { + // return repo.findByTeacherEmployeeId(PageRequest.of(of.getPageNumber(), of.getPageSize()), employeeId); + // } + // public Page findByTeacherSnils(PageRequest of, String snils) { + // return repo.findByTeacherSnils(PageRequest.of(of.getPageNumber(), of.getPageSize()), snils); + // } + // public Page findByProgramStudyDirection(PageRequest of, String programStudyDirection) { + // return repo.findByProgramStudyDirection(PageRequest.of(of.getPageNumber(), of.getPageSize()), programStudyDirection); + // } + // public Page findByProgramPrice(PageRequest of, String programPrice) { + // return repo.findByProgramPrice(PageRequest.of(of.getPageNumber(), of.getPageSize()), programPrice); + // } + // public Page findByBuildingNameFull(PageRequest of, String buildingNameFull) { + // return repo.findByBuildingNameFull(PageRequest.of(of.getPageNumber(), of.getPageSize()), buildingNameFull); + // } + // public Page findByBuildingCodeFull(PageRequest of, String buildingCodeFull) { + // return repo.findByBuildingCodeFull(PageRequest.of(of.getPageNumber(), of.getPageSize()), buildingCodeFull); + // } + +} diff --git a/Описание.docx b/Описание.docx new file mode 100644 index 0000000000000000000000000000000000000000..0eb336f5408322f231fce102be8fcd6e5c946013 GIT binary patch literal 12409 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

dIvVt9W`w1QyO< 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 A{{R30 literal 0 HcmV?d00001