-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathDashBoardService.java
More file actions
138 lines (114 loc) · 4.68 KB
/
DashBoardService.java
File metadata and controls
138 lines (114 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package kernel360.trackyweb.dashboard.application;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StopWatch;
import kernel360.trackycore.core.common.api.ApiResponse;
import kernel360.trackycore.core.domain.entity.MonthlyStatisticEntity;
import kernel360.trackycore.core.domain.entity.RentEntity;
import kernel360.trackycore.core.domain.entity.enums.RentStatus;
import kernel360.trackycore.core.domain.provider.BizProvider;
import kernel360.trackycore.core.domain.provider.RentProvider;
import kernel360.trackyweb.car.domain.provider.CarDomainProvider;
import kernel360.trackyweb.dashboard.application.dto.response.DashboardCarStatusResponse;
import kernel360.trackyweb.dashboard.application.dto.response.DashboardReturnResponse;
import kernel360.trackyweb.dashboard.application.dto.response.DashboardStatisticsResponse;
import kernel360.trackyweb.dashboard.domain.provider.DashGpsHistoryProvider;
import kernel360.trackyweb.dashboard.infrastructure.components.ProvinceMatcher;
import kernel360.trackyweb.rent.domain.provider.RentDomainProvider;
import kernel360.trackyweb.statistic.domain.provider.DailyStatisticProvider;
import kernel360.trackyweb.statistic.domain.provider.MonthlyStatisticProvider;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@RequiredArgsConstructor
public class DashBoardService {
private final DashGpsHistoryProvider dashGpsHistoryProvider;
private final BizProvider bizProvider;
private final CarDomainProvider carDomainProvider;
private final RentProvider rentProvider;
private final RentDomainProvider rentDomainProvider;
private final ProvinceMatcher provinceMatcher;
private final MonthlyStatisticProvider monthlyStatisticProvider;
private final DailyStatisticProvider dailyStatisticProvider;
/**
* 반납 조회( 지연된 반납 )
*
* @param
* @return 지연된 반납 list
*/
public ApiResponse<List<DashboardReturnResponse>> getDelayedReturn(String bizUuid) {
LocalDateTime now = LocalDateTime.now();
List<RentEntity> delayedRents = rentDomainProvider.findDelayedRentList(bizUuid, now);
return ApiResponse.success(
delayedRents.stream()
.map(rent -> {
var car = rent.getCar();
return new DashboardReturnResponse(
rent.getRentUuid(),
rent.getRenterName(),
rent.getRentStatus(),
rent.getRentEtime(),
car.getMdn(),
car.getCarPlate(),
car.getCarType()
);
})
.collect(Collectors.toList())
);
}
/**
* 대시보드용 통계 데이터
*
* @return Statistics 통계 데이터
*/
@Transactional(readOnly = true)
public DashboardStatisticsResponse getStatistics(String bizUuid) {
MonthlyStatisticEntity monthlyStatisticEntity = monthlyStatisticProvider.getDashBoardStatistic(bizUuid);
List<Integer> dailyDriveCount = dailyStatisticProvider.getDailyDriveCount(bizUuid);
return DashboardStatisticsResponse.create(monthlyStatisticEntity.getAvgOperationRate(),
monthlyStatisticEntity.getNonOperatingCarCount(),
monthlyStatisticEntity.getTotalDriveCount(), dailyDriveCount);
}
/**
* geo 기반 영역 안의 차량 수 hashmap 구하기
*
* @return 구역 : 차량 수 map
*/
@Transactional(readOnly = true)
public Map<String, Integer> getGeoData(String bizUuid) {
Long bizId = bizProvider.getBiz(bizUuid).getId();
// Map<String, int[]> map = dashGpsHistoryProvider.findLatestGps(bizId); // 개선 전
Map<String, int[]> map = dashGpsHistoryProvider.findLatestLatLon(bizId); // 개선 후
int[] lats = map.get("lats");
int[] lons = map.get("lons");
Map<String, Integer> provinceCountMap = new HashMap<>();
StopWatch st = new StopWatch();
st.start("provinceMatcher");
for (int i = 0; i < lats.length; i++) {
// DB에 저장된 위도/경도는 정수형이므로 소수로 변환 필요
double lat = lats[i] / 1_000_000.0;
double lon = lons[i] / 1_000_000.0;
String province = provinceMatcher.findProvince(lon, lat);
provinceCountMap.put(province, provinceCountMap.getOrDefault(province, 0) + 1);
}
st.stop();
log.info("{}", st.prettyPrint());
log.info("provinceCountMap: {}", provinceCountMap);
return provinceCountMap;
}
@Transactional
public ApiResponse<String> updateStatusToReturn(String rentUuid) {
RentEntity rent = rentProvider.getRent(rentUuid);
rent.updateStatus(RentStatus.RETURNED);
return ApiResponse.success("반납 처리 완료");
}
public List<DashboardCarStatusResponse> getAllCarStatus(String bizUuid) {
return carDomainProvider.getCarStatusCounts(bizUuid);
}
}