From 639b1c6c24d760546e48c3bb77d168d96877572c Mon Sep 17 00:00:00 2001 From: lynxwq2 Date: Thu, 4 Dec 2025 16:17:26 +0300 Subject: [PATCH] =?UTF-8?q?+=D0=B1=D1=83=D0=BA=D0=B8=D0=BD=D0=B3=20(=D0=BF?= =?UTF-8?q?=D0=BE=D1=87=D1=82=D0=B8=20=D0=B1=D0=B5=D0=B7=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D0=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nto/controller/BookingController.java | 29 +++++-- .../java/com/example/nto/entity/Booking.java | 8 ++ .../nto/repository/BookingRepository.java | 5 +- .../nto/repository/PlaceRepository.java | 1 - .../example/nto/service/BookingService.java | 4 +- .../nto/service/impl/BookingServiceImpl.java | 84 +++++++++++++++++-- 6 files changed, 113 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/nto/controller/BookingController.java b/src/main/java/com/example/nto/controller/BookingController.java index 106db06..6c90218 100644 --- a/src/main/java/com/example/nto/controller/BookingController.java +++ b/src/main/java/com/example/nto/controller/BookingController.java @@ -2,9 +2,13 @@ package com.example.nto.controller; import com.example.nto.entity.Booking; import com.example.nto.service.BookingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; +import java.util.List; +import java.util.Map; /** * TODO: ДОРАБОТАТЬ в рамках задания @@ -12,9 +16,22 @@ import java.time.LocalDate; * МОЖНО: Добавлять методы, аннотации, зависимости * НЕЛЬЗЯ: Изменять название класса и пакета */ -//@RestController -//@RequestMapping("/api") -//public class BookingController { -// -// -//} +@RestController +@RequestMapping("/api") +public class BookingController { + + private final BookingService bookingService; + + @Autowired + public BookingController(BookingService bookingService) { + this.bookingService = bookingService; + } + + @GetMapping("/{code}/booking") + public ResponseEntity>> getAvailablePlaces( + @PathVariable String code + ) { + Map> response = bookingService.getAvailablePlaces(code); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/example/nto/entity/Booking.java b/src/main/java/com/example/nto/entity/Booking.java index 045592b..5eb54d9 100644 --- a/src/main/java/com/example/nto/entity/Booking.java +++ b/src/main/java/com/example/nto/entity/Booking.java @@ -37,4 +37,12 @@ public class Booking { @JoinColumn(name = "employee_id") @JsonBackReference private Employee employee; + + + + @Data + public static class AvailablePlaceDto { + private long id; + private String place; + } } diff --git a/src/main/java/com/example/nto/repository/BookingRepository.java b/src/main/java/com/example/nto/repository/BookingRepository.java index 2a264b7..64e730e 100644 --- a/src/main/java/com/example/nto/repository/BookingRepository.java +++ b/src/main/java/com/example/nto/repository/BookingRepository.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import java.sql.Date; +import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -18,7 +19,7 @@ import java.util.Optional; @Service @Repository public interface BookingRepository extends JpaRepository { - Optional findById(long id); + List findByDateAndEmployeeByCode(List dates, String code); - List findByEmployee_Code(String code); + Optional findById(String code); } diff --git a/src/main/java/com/example/nto/repository/PlaceRepository.java b/src/main/java/com/example/nto/repository/PlaceRepository.java index 616ae0d..638d706 100644 --- a/src/main/java/com/example/nto/repository/PlaceRepository.java +++ b/src/main/java/com/example/nto/repository/PlaceRepository.java @@ -13,5 +13,4 @@ import java.util.Optional; * НЕЛЬЗЯ: Изменять название класса и пакета */ public interface PlaceRepository extends JpaRepository { - Optional findPlaceById(long id); } diff --git a/src/main/java/com/example/nto/service/BookingService.java b/src/main/java/com/example/nto/service/BookingService.java index c500134..206b655 100644 --- a/src/main/java/com/example/nto/service/BookingService.java +++ b/src/main/java/com/example/nto/service/BookingService.java @@ -4,6 +4,7 @@ import com.example.nto.entity.Booking; import com.example.nto.entity.Employee; import java.util.List; +import java.util.Map; import java.util.Optional; /** @@ -14,6 +15,7 @@ import java.util.Optional; */ public interface BookingService { List getAll(); - Optional getById(long id); + Optional getBookingById(String code); + Map> getAvailablePlaces(String code); } diff --git a/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java b/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java index a25620f..3051a96 100644 --- a/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java @@ -1,13 +1,19 @@ package com.example.nto.service.impl; import com.example.nto.entity.Booking; +import com.example.nto.entity.Employee; +import com.example.nto.entity.Place; import com.example.nto.repository.BookingRepository; +import com.example.nto.repository.EmployeeRepository; +import com.example.nto.repository.PlaceRepository; import com.example.nto.service.BookingService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Optional; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; /** * TODO: ДОРАБОТАТЬ в рамках задания @@ -20,10 +26,8 @@ import java.util.Optional; public class BookingServiceImpl implements BookingService { private final BookingRepository bookingRepository; - - public BookingServiceImpl(BookingRepository bookingRepository) { - this.bookingRepository = bookingRepository; - } + private final PlaceRepository placeRepository; + private final EmployeeRepository employeeRepository; @Override public List getAll() { @@ -31,8 +35,72 @@ public class BookingServiceImpl implements BookingService { } @Override - public Optional getById(long id) { - return bookingRepository.findById(id); + public Optional getBookingById(String code) { + return bookingRepository.findById(code); } + @Autowired + public BookingServiceImpl(BookingRepository bookingRepository, PlaceRepository placeRepository, + EmployeeRepository employeeRepository) { + this.bookingRepository = bookingRepository; + this.placeRepository = placeRepository; + this.employeeRepository = employeeRepository; + } + public Map> getAvailablePlaces(String employeeCode) { + // 1. Получаем сотрудника (для контекста) + Employee employee = employeeRepository.findByCode(employeeCode) + .orElseThrow(() -> new RuntimeException("Employee not found")); + + // 2. Определяем диапазон дат: сегодня + 3 дня + LocalDate today = LocalDate.now(); + List targetDates = List.of( + today, + today.plusDays(1), + today.plusDays(2), + today.plusDays(3) + ); + + // 3. Получаем все места из БД + List allPlaces = placeRepository.findAll(); + + // 4. Находим все бронирования на целевые даты + List bookings = bookingRepository.findByDateAndEmployeeByCode(targetDates, employeeCode); + + // 5. Группируем бронирования по датам + Map> bookingsByDate = bookings.stream() + .collect(Collectors.groupingBy(Booking::getDate)); + + // 6. Формируем итоговый ответ + Map> result = new HashMap<>(); + + for (LocalDate date : targetDates) { + String dateKey = date.toString(); // Формат: "yyyy-MM-dd" + + // Берём бронирования на эту дату + List dayBookings = bookingsByDate.getOrDefault(date, List.of()); + + // Собираем ID занятых мест + Set occupiedPlaceIds = dayBookings.stream() + .map(booking -> booking.getPlace().getId()) + .collect(Collectors.toSet()); + + // Фильтруем свободные места + List available = allPlaces.stream() + .filter(place -> !occupiedPlaceIds.contains(place.getId())) + .map(place -> { + Booking.AvailablePlaceDto dto = new Booking.AvailablePlaceDto(); + dto.setId(place.getId()); + dto.setPlace(place.getPlace()); + return dto; + }) + .collect(Collectors.toList()); + + result.put(dateKey, available); + } + + return result; + } } + + +