diff --git a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/application/DashBoardService.java b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/application/DashBoardService.java index 546f4c34..99856e12 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/application/DashBoardService.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/application/DashBoardService.java @@ -1,6 +1,7 @@ package kernel360.trackyweb.dashboard.application; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -89,12 +90,13 @@ public DashboardStatisticsResponse getStatistics(String bizUuid) { * @return 구역 : 차량 수 map */ @Transactional(readOnly = true) - public Map getGeoData() { - List gpsList = dashGpsHistoryProvider.findLatestGpsByMdn(); + public Map> getGeoData(String bizUuid) { + + List gpsList = dashGpsHistoryProvider.findLatestGps(bizUuid); log.info("gpsList: {} ", gpsList); - Map provinceCountMap = new HashMap<>(); + Map> provinceCountMap = new HashMap<>(); for (GpsHistoryEntity gps : gpsList) { // DB에 저장된 위도/경도는 정수형이므로 소수로 변환 필요 @@ -102,9 +104,14 @@ public Map getGeoData() { double lon = gps.getLon() / 1_000_000.0; String province = provinceMatcher.findProvince(lon, lat); + String mdn = gps.getDrive().getCar().getMdn(); - provinceCountMap.put(province, provinceCountMap.getOrDefault(province, 0) + 1); + provinceCountMap + .computeIfAbsent(province, k -> new ArrayList<>()) + .add(mdn); } + + log.info("처리된 GPS 데이터: {}개", gpsList.size()); log.info("provinceCountMap: {}", provinceCountMap); return provinceCountMap; } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/domain/provider/DashGpsHistoryProvider.java b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/domain/provider/DashGpsHistoryProvider.java index d33cb75c..3cf5b34d 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/domain/provider/DashGpsHistoryProvider.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/domain/provider/DashGpsHistoryProvider.java @@ -14,7 +14,7 @@ public class DashGpsHistoryProvider { private final DashGpsHistoryRepository dashGpsHistoryRepository; - public List findLatestGpsByMdn() { - return dashGpsHistoryRepository.findLatestGpsByMdn(); + public List findLatestGps(String bizUuid) { + return dashGpsHistoryRepository.getLatestGps(bizUuid); } } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepository.java b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepository.java index b9135a6e..05b034ab 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepository.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepository.java @@ -1,27 +1,10 @@ package kernel360.trackyweb.dashboard.infrastructure.repository; -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import kernel360.trackycore.core.domain.entity.GpsHistoryEntity; import kernel360.trackycore.core.infrastructure.repository.GpsHistoryRepository; @Repository -public interface DashGpsHistoryRepository extends GpsHistoryRepository { - - @Query(value = """ - SELECT * - FROM ( - SELECT g.*, d.mdn, - ROW_NUMBER() OVER (PARTITION BY d.mdn ORDER BY g.created_at DESC) AS rn - FROM gpshistory g - JOIN drive d ON g.drive_id = d.id - ) t - WHERE t.rn = 1 - """, nativeQuery = true) - List findLatestGpsByMdn(); +public interface DashGpsHistoryRepository extends GpsHistoryRepository, DashGpsHistoryRepositoryCustom { } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepositoryCustomImpl.java b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepositoryCustomImpl.java index 9ac80279..d294a5f3 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepositoryCustomImpl.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/infrastructure/repository/DashGpsHistoryRepositoryCustomImpl.java @@ -1,5 +1,7 @@ package kernel360.trackyweb.dashboard.infrastructure.repository; +import static kernel360.trackycore.core.domain.entity.QBizEntity.*; +import static kernel360.trackycore.core.domain.entity.QCarEntity.*; import static kernel360.trackycore.core.domain.entity.QDriveEntity.*; import static kernel360.trackycore.core.domain.entity.QGpsHistoryEntity.*; @@ -7,13 +9,10 @@ import org.springframework.stereotype.Repository; -import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import kernel360.trackycore.core.domain.entity.GpsHistoryEntity; -import kernel360.trackycore.core.domain.entity.QDriveEntity; -import kernel360.trackycore.core.domain.entity.QGpsHistoryEntity; import lombok.RequiredArgsConstructor; @Repository @@ -22,29 +21,32 @@ public class DashGpsHistoryRepositoryCustomImpl implements DashGpsHistoryReposit private final JPAQueryFactory queryFactory; + /** + * 대시보드 차량 위치 지도 - 업체별 최신 GPS 조회 + * @param bizUuid + * @return + */ @Override public List getLatestGps(String bizUuid) { - QGpsHistoryEntity gSub = new QGpsHistoryEntity("gSub"); - QDriveEntity dSub = new QDriveEntity("dSub"); return queryFactory - .selectFrom(gpsHistoryEntity) - .join(gpsHistoryEntity.drive, driveEntity).fetchJoin() + .select(gpsHistoryEntity) + .from(gpsHistoryEntity) + .join(gpsHistoryEntity.drive, driveEntity) .where( - Expressions.list( - driveEntity.car.mdn, - gpsHistoryEntity.oTime - ).in( + // bizUuid 필터링 + MDN별 최신 drive.id 서브쿼리 + gpsHistoryEntity.drive.id.in( JPAExpressions - .select( - dSub.car.mdn, - gSub.oTime.max() - ) - .from(gSub) - .join(gSub.drive, dSub) - .groupBy(dSub.car.mdn) + .select(driveEntity.id.max()) + .from(driveEntity) + .join(driveEntity.car, carEntity) + .join(carEntity.biz, bizEntity) + .where(bizEntity.bizUuid.eq(bizUuid)) + .groupBy(carEntity.mdn) ) ) + .groupBy(driveEntity.id, driveEntity.car.mdn) + .orderBy(gpsHistoryEntity.driveSeq.desc()) .fetch(); } -} +} \ No newline at end of file diff --git a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/presentation/DashBoardController.java b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/presentation/DashBoardController.java index 8a5dbc32..b5bcd736 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/dashboard/presentation/DashBoardController.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/dashboard/presentation/DashBoardController.java @@ -51,8 +51,10 @@ public ApiResponse updateStatusToReturn(@PathVariable String rentUuid) { } @GetMapping("/geo") - public ApiResponse> getGeoData() { - Map geoMap = dashBoardService.getGeoData(); + public ApiResponse>> getGeoData( + @Schema(hidden = true) @AuthenticationPrincipal MemberPrincipal memberPrincipal + ) { + Map> geoMap = dashBoardService.getGeoData(memberPrincipal.bizUuid()); return ApiResponse.success(geoMap); } }