diff --git a/backend/src/main/java/edu/zut/bookrider/config/SystemConstants.java b/backend/src/main/java/edu/zut/bookrider/config/SystemConstants.java index 87bb535d..3e6e1ef6 100644 --- a/backend/src/main/java/edu/zut/bookrider/config/SystemConstants.java +++ b/backend/src/main/java/edu/zut/bookrider/config/SystemConstants.java @@ -10,4 +10,5 @@ public class SystemConstants { public static final BigDecimal ADDITIONAL_ITEM_COST = BigDecimal.valueOf(1.00); public static final BigDecimal DAILY_LATE_FEE = BigDecimal.valueOf(1.00); public static final int RETURN_DEADLINE_DAYS = 30; + public static final long URGENT_ORDER_THRESHOLD_MINUTES = 15; } diff --git a/backend/src/main/java/edu/zut/bookrider/repository/OrderRepository.java b/backend/src/main/java/edu/zut/bookrider/repository/OrderRepository.java index bd16b3ec..86b7b357 100644 --- a/backend/src/main/java/edu/zut/bookrider/repository/OrderRepository.java +++ b/backend/src/main/java/edu/zut/bookrider/repository/OrderRepository.java @@ -10,6 +10,7 @@ import org.springframework.data.repository.query.Param; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -21,14 +22,26 @@ public interface OrderRepository extends JpaRepository { @Query("SELECT o FROM Order o " + "JOIN o.library l " + "JOIN l.address a " + - "WHERE (o.status = 'ACCEPTED' AND o.isReturn = false) " + - "OR (o.status = 'PENDING' AND o.isReturn = true) " + + "WHERE " + + "((o.status = 'ACCEPTED' AND o.isReturn = false) " + + "OR (o.status = 'PENDING' AND o.isReturn = true)) " + "AND (ST_DistanceSphere(ST_MakePoint(a.latitude, a.longitude), " + - "ST_MakePoint(:driverLatitude, :driverLongitude)) <= :maxDistanceInMeters)") + "ST_MakePoint(:driverLatitude, :driverLongitude)) <= :maxDistanceInMeters) " + + + "ORDER BY " + + "CASE WHEN (" + + " (o.status = 'ACCEPTED' AND o.isReturn = false AND o.acceptedAt < :olderThanDate) " + + " OR " + + " (o.status = 'PENDING' AND o.isReturn = true AND o.createdAt < :olderThanDate) " + + ") THEN 0 ELSE 1 END ASC, " + + + "ST_DistanceSphere(ST_MakePoint(a.latitude, a.longitude), " + + "ST_MakePoint(:driverLatitude, :driverLongitude)) ASC") Page findOrdersForDriverWithDistance( @Param("driverLatitude") BigDecimal driverLatitude, @Param("driverLongitude") BigDecimal driverLongitude, @Param("maxDistanceInMeters") double maxDistanceInMeters, + @Param("olderThanDate") LocalDateTime olderThanDate, Pageable pageable); Page findByDriverIdAndStatusIn(String driverId, List status, Pageable pageable); diff --git a/backend/src/main/java/edu/zut/bookrider/service/OrderService.java b/backend/src/main/java/edu/zut/bookrider/service/OrderService.java index fbcc797e..4b3a1689 100644 --- a/backend/src/main/java/edu/zut/bookrider/service/OrderService.java +++ b/backend/src/main/java/edu/zut/bookrider/service/OrderService.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import static edu.zut.bookrider.config.SystemConstants.SERVICE_FEE_PERCENTAGE; +import static edu.zut.bookrider.config.SystemConstants.URGENT_ORDER_THRESHOLD_MINUTES; import static java.util.Objects.isNull; @RequiredArgsConstructor @@ -272,10 +273,14 @@ public PageResponseDTO getDriverPendingOrdersWithDistance( @Valid CoordinateDTO location, double maxDistanceInMeters, int page, int size) { Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending()); + LocalDateTime olderThanDate = LocalDateTime.now().minusMinutes(URGENT_ORDER_THRESHOLD_MINUTES); Page pendingOrders = orderRepository.findOrdersForDriverWithDistance( BigDecimal.valueOf(location.getLatitude()), BigDecimal.valueOf(location.getLongitude()), - maxDistanceInMeters, pageable); + maxDistanceInMeters, + olderThanDate, + pageable + ); List pendingOrderDtos = pendingOrders.getContent().stream().map(order -> { OrderResponseDTO dto = orderMapper.map(order);