Fix availability checks
This commit is contained in:
@@ -39,4 +39,7 @@ public interface AppointmentRepository extends JpaRepository<Appointment, Long>
|
||||
|
||||
@Query("SELECT a FROM Appointment a JOIN FETCH a.service WHERE a.employee.employeeId = :employeeId AND a.appointmentDate = :date AND LOWER(a.appointmentStatus) NOT IN ('cancelled', 'missed')")
|
||||
List<Appointment> findByEmployeeEmployeeIdAndAppointmentDate(@Param("employeeId") Long employeeId, @Param("date") LocalDate date);
|
||||
|
||||
@Query("SELECT a FROM Appointment a JOIN FETCH a.service WHERE a.employee.employeeId IN :employeeIds AND a.appointmentDate = :date AND LOWER(a.appointmentStatus) NOT IN ('cancelled', 'missed')")
|
||||
List<Appointment> findByEmployeeEmployeeIdInAndAppointmentDate(@Param("employeeIds") List<Long> employeeIds, @Param("date") LocalDate date);
|
||||
}
|
||||
|
||||
@@ -211,6 +211,17 @@ public class AppointmentService {
|
||||
.map(EmployeeStore::getEmployee)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (assignableEmployees.isEmpty()) {
|
||||
return List.of();
|
||||
}
|
||||
|
||||
List<Long> employeeIds = assignableEmployees.stream().map(Employee::getEmployeeId).collect(Collectors.toList());
|
||||
List<Appointment> allAppointments = appointmentRepository.findByEmployeeEmployeeIdInAndAppointmentDate(employeeIds, date);
|
||||
|
||||
// Group by employee for faster lookup in the loop
|
||||
java.util.Map<Long, List<Appointment>> appointmentsByEmployee = allAppointments.stream()
|
||||
.collect(Collectors.groupingBy(a -> a.getEmployee().getEmployeeId()));
|
||||
|
||||
List<String> availableSlots = new ArrayList<>();
|
||||
LocalTime startTime = LocalTime.of(9, 0);
|
||||
LocalTime endTime = LocalTime.of(17, 0);
|
||||
@@ -220,7 +231,7 @@ public class AppointmentService {
|
||||
while (!currentTime.isAfter(latestStart)) {
|
||||
final LocalTime slotTime = currentTime;
|
||||
boolean anyEmployeeAvailable = assignableEmployees.stream().anyMatch(emp -> {
|
||||
List<Appointment> empAppointments = appointmentRepository.findByEmployeeEmployeeIdAndAppointmentDate(emp.getEmployeeId(), date);
|
||||
List<Appointment> empAppointments = appointmentsByEmployee.getOrDefault(emp.getEmployeeId(), List.of());
|
||||
return isSlotAvailable(empAppointments, service, slotTime, null);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user