Skip to content

Commit 066a2ec

Browse files
authored
Merge pull request #343 from Kernel360/refactor/dashboard-geo
WEB - 대시보드 차량 위치 지도 쿼리 최적화 및 응답 형식 변경
2 parents ee98abb + d6e6f7d commit 066a2ec

5 files changed

Lines changed: 39 additions & 45 deletions

File tree

tracky-web/src/main/java/kernel360/trackyweb/dashboard/application/DashBoardService.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package kernel360.trackyweb.dashboard.application;
22

33
import java.time.LocalDateTime;
4+
import java.util.ArrayList;
45
import java.util.HashMap;
56
import java.util.List;
67
import java.util.Map;
@@ -89,22 +90,28 @@ public DashboardStatisticsResponse getStatistics(String bizUuid) {
8990
* @return 구역 : 차량 수 map
9091
*/
9192
@Transactional(readOnly = true)
92-
public Map<String, Integer> getGeoData() {
93-
List<GpsHistoryEntity> gpsList = dashGpsHistoryProvider.findLatestGpsByMdn();
93+
public Map<String, List<String>> getGeoData(String bizUuid) {
94+
95+
List<GpsHistoryEntity> gpsList = dashGpsHistoryProvider.findLatestGps(bizUuid);
9496

9597
log.info("gpsList: {} ", gpsList);
9698

97-
Map<String, Integer> provinceCountMap = new HashMap<>();
99+
Map<String, List<String>> provinceCountMap = new HashMap<>();
98100

99101
for (GpsHistoryEntity gps : gpsList) {
100102
// DB에 저장된 위도/경도는 정수형이므로 소수로 변환 필요
101103
double lat = gps.getLat() / 1_000_000.0;
102104
double lon = gps.getLon() / 1_000_000.0;
103105

104106
String province = provinceMatcher.findProvince(lon, lat);
107+
String mdn = gps.getDrive().getCar().getMdn();
105108

106-
provinceCountMap.put(province, provinceCountMap.getOrDefault(province, 0) + 1);
109+
provinceCountMap
110+
.computeIfAbsent(province, k -> new ArrayList<>())
111+
.add(mdn);
107112
}
113+
114+
log.info("처리된 GPS 데이터: {}개", gpsList.size());
108115
log.info("provinceCountMap: {}", provinceCountMap);
109116
return provinceCountMap;
110117
}

tracky-web/src/main/java/kernel360/trackyweb/dashboard/domain/provider/DashGpsHistoryProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class DashGpsHistoryProvider {
1414

1515
private final DashGpsHistoryRepository dashGpsHistoryRepository;
1616

17-
public List<GpsHistoryEntity> findLatestGpsByMdn() {
18-
return dashGpsHistoryRepository.findLatestGpsByMdn();
17+
public List<GpsHistoryEntity> findLatestGps(String bizUuid) {
18+
return dashGpsHistoryRepository.getLatestGps(bizUuid);
1919
}
2020
}
Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,10 @@
11
package kernel360.trackyweb.dashboard.infrastructure.repository;
22

3-
import java.util.List;
4-
5-
import org.springframework.data.jpa.repository.JpaRepository;
6-
import org.springframework.data.jpa.repository.Query;
73
import org.springframework.stereotype.Repository;
84

9-
import kernel360.trackycore.core.domain.entity.GpsHistoryEntity;
105
import kernel360.trackycore.core.infrastructure.repository.GpsHistoryRepository;
116

127
@Repository
13-
public interface DashGpsHistoryRepository extends GpsHistoryRepository {
14-
15-
@Query(value = """
16-
SELECT *
17-
FROM (
18-
SELECT g.*, d.mdn,
19-
ROW_NUMBER() OVER (PARTITION BY d.mdn ORDER BY g.created_at DESC) AS rn
20-
FROM gpshistory g
21-
JOIN drive d ON g.drive_id = d.id
22-
) t
23-
WHERE t.rn = 1
24-
""", nativeQuery = true)
25-
List<GpsHistoryEntity> findLatestGpsByMdn();
8+
public interface DashGpsHistoryRepository extends GpsHistoryRepository, DashGpsHistoryRepositoryCustom {
269

2710
}
Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
package kernel360.trackyweb.dashboard.infrastructure.repository;
22

3+
import static kernel360.trackycore.core.domain.entity.QBizEntity.*;
4+
import static kernel360.trackycore.core.domain.entity.QCarEntity.*;
35
import static kernel360.trackycore.core.domain.entity.QDriveEntity.*;
46
import static kernel360.trackycore.core.domain.entity.QGpsHistoryEntity.*;
57

68
import java.util.List;
79

810
import org.springframework.stereotype.Repository;
911

10-
import com.querydsl.core.types.dsl.Expressions;
1112
import com.querydsl.jpa.JPAExpressions;
1213
import com.querydsl.jpa.impl.JPAQueryFactory;
1314

1415
import kernel360.trackycore.core.domain.entity.GpsHistoryEntity;
15-
import kernel360.trackycore.core.domain.entity.QDriveEntity;
16-
import kernel360.trackycore.core.domain.entity.QGpsHistoryEntity;
1716
import lombok.RequiredArgsConstructor;
1817

1918
@Repository
@@ -22,29 +21,32 @@ public class DashGpsHistoryRepositoryCustomImpl implements DashGpsHistoryReposit
2221

2322
private final JPAQueryFactory queryFactory;
2423

24+
/**
25+
* 대시보드 차량 위치 지도 - 업체별 최신 GPS 조회
26+
* @param bizUuid
27+
* @return
28+
*/
2529
@Override
2630
public List<GpsHistoryEntity> getLatestGps(String bizUuid) {
27-
QGpsHistoryEntity gSub = new QGpsHistoryEntity("gSub");
28-
QDriveEntity dSub = new QDriveEntity("dSub");
2931

3032
return queryFactory
31-
.selectFrom(gpsHistoryEntity)
32-
.join(gpsHistoryEntity.drive, driveEntity).fetchJoin()
33+
.select(gpsHistoryEntity)
34+
.from(gpsHistoryEntity)
35+
.join(gpsHistoryEntity.drive, driveEntity)
3336
.where(
34-
Expressions.list(
35-
driveEntity.car.mdn,
36-
gpsHistoryEntity.oTime
37-
).in(
37+
// bizUuid 필터링 + MDN별 최신 drive.id 서브쿼리
38+
gpsHistoryEntity.drive.id.in(
3839
JPAExpressions
39-
.select(
40-
dSub.car.mdn,
41-
gSub.oTime.max()
42-
)
43-
.from(gSub)
44-
.join(gSub.drive, dSub)
45-
.groupBy(dSub.car.mdn)
40+
.select(driveEntity.id.max())
41+
.from(driveEntity)
42+
.join(driveEntity.car, carEntity)
43+
.join(carEntity.biz, bizEntity)
44+
.where(bizEntity.bizUuid.eq(bizUuid))
45+
.groupBy(carEntity.mdn)
4646
)
4747
)
48+
.groupBy(driveEntity.id, driveEntity.car.mdn)
49+
.orderBy(gpsHistoryEntity.driveSeq.desc())
4850
.fetch();
4951
}
50-
}
52+
}

tracky-web/src/main/java/kernel360/trackyweb/dashboard/presentation/DashBoardController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ public ApiResponse<String> updateStatusToReturn(@PathVariable String rentUuid) {
5151
}
5252

5353
@GetMapping("/geo")
54-
public ApiResponse<Map<String, Integer>> getGeoData() {
55-
Map<String, Integer> geoMap = dashBoardService.getGeoData();
54+
public ApiResponse<Map<String, List<String>>> getGeoData(
55+
@Schema(hidden = true) @AuthenticationPrincipal MemberPrincipal memberPrincipal
56+
) {
57+
Map<String, List<String>> geoMap = dashBoardService.getGeoData(memberPrincipal.bizUuid());
5658
return ApiResponse.success(geoMap);
5759
}
5860
}

0 commit comments

Comments
 (0)