From b69a8b85d307f4fb3ac52801af9124b1bf5b78ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=83=9D=ED=83=9D?= Date: Mon, 5 May 2025 00:40:41 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20#314=20=EC=9D=BC=EA=B0=84=20?= =?UTF-8?q?=ED=86=B5=EA=B3=84=20API=EC=97=90=20=EC=8B=9C=EA=B0=84=EB=B3=84?= =?UTF-8?q?=20=EC=9A=B4=ED=96=89=EB=9F=89=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/provider/DriveDomainProvider.java | 19 ++++++++++------ .../application/StatisticService.java | 14 +++++------- .../dto/response/DailyStatisticResponse.java | 19 ++++++++-------- .../response/MonthlyStatisticResponse.java | 10 ++++----- .../daily/DailyStatisticDomainRepository.java | 1 - .../provider/TimeDistanceDomainProvider.java | 22 +++++++++++++++++++ .../TimeDistanceDomainRepositoryCustom.java | 7 ++++++ ...imeDistanceDomainRepositoryCustomImpl.java | 17 ++++++++++++++ 8 files changed, 79 insertions(+), 30 deletions(-) diff --git a/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java b/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java index b46a0353..df78c532 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java @@ -45,18 +45,23 @@ public DriveEntity findRunningDriveById(Long driveId) { .orElseThrow(() -> GlobalException.throwError(ErrorCode.NOT_REALTIME_DRIVE)); } - public DriveHistory findByDriveId(Long driveId) { - return driveDomainRepository.findByDriveId(driveId) - .orElseThrow(() -> GlobalException.throwError(ErrorCode.DRIVE_NOT_FOUND)); - } + public DriveHistory findByDriveId(Long driveId) { + return driveDomainRepository.findByDriveId(driveId) + .orElseThrow(() -> GlobalException.throwError(ErrorCode.DRIVE_NOT_FOUND)); + } public List findByMdn(String mdn) { return driveDomainRepository.findDriveListByMdn(mdn); } - public Double getTotalDriveDistance() { - return driveDomainRepository.getTotalDriveDistance(); - } + //일일 통계 - 당일 운행 차량 수 (distinct mdn) + public List countOperationCarGroupedByBizId(LocalDate targetDate) { + return driveDomainRepository.findOperationMdnGroupedByBizId(targetDate); + } + + public Double getTotalDriveDistance() { + return driveDomainRepository.getTotalDriveDistance(); + } public Long getTotalDriveDurationInMinutes() { return driveDomainRepository.getTotalDriveDurationInMinutes(); diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java index 8d366965..661f74b8 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java @@ -15,6 +15,7 @@ import kernel360.trackyweb.statistic.application.dto.response.MonthlyStatisticResponse; import kernel360.trackyweb.statistic.domain.provider.DailyStatisticProvider; import kernel360.trackyweb.statistic.domain.provider.MonthlyStatisticProvider; +import kernel360.trackyweb.timedistance.domain.provider.TimeDistanceDomainProvider; import lombok.RequiredArgsConstructor; @Service @@ -23,6 +24,7 @@ public class StatisticService { private final DailyStatisticProvider dailyStatisticProvider; private final MonthlyStatisticProvider monthlyStatisticProvider; + private final TimeDistanceDomainProvider timeDistanceDomainProvider; private final BizProvider bizProvider; public ApiResponse getDailyStatistic(String bizUuid, LocalDate date) { @@ -31,11 +33,9 @@ public ApiResponse getDailyStatistic(String bizUuid, Loc DailyStatisticEntity dailyStatistic = dailyStatisticProvider.getDailyStatistic(bizId, date); - List list = new ArrayList<>(); - for (int i = 0; i < 24; i++) { - list.add(1); - } - DailyStatisticResponse response = DailyStatisticResponse.from(dailyStatistic, list); + long[] hourlyDriveCounts = timeDistanceDomainProvider.getHourlyDriveCounts(bizId, date); + + DailyStatisticResponse response = DailyStatisticResponse.from(dailyStatistic, hourlyDriveCounts); return ApiResponse.success(response); } @@ -44,9 +44,7 @@ public ApiResponse getMonthlyStatistic(String bizUuid, Long bizId = bizProvider.getBiz(bizUuid).getId(); - LocalDate localDate = date.atDay(1); - - MonthlyStatisticEntity monthlyStatistic = monthlyStatisticProvider.getMonthlyStatistic(bizId, localDate); + MonthlyStatisticEntity monthlyStatistic = monthlyStatisticProvider.getMonthlyStatistic(bizId, date.atDay(1)); List list = new ArrayList<>(); for (int i = 0; i < 12; i++) { diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/DailyStatisticResponse.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/DailyStatisticResponse.java index c8ef1b51..5f4ea46d 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/DailyStatisticResponse.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/DailyStatisticResponse.java @@ -1,7 +1,7 @@ package kernel360.trackyweb.statistic.application.dto.response; +import java.util.ArrayList; import java.util.List; -import java.util.stream.IntStream; import kernel360.trackycore.core.domain.entity.DailyStatisticEntity; @@ -15,22 +15,23 @@ public record Summary( double averageOperationRate, long totalDrivingSeconds, int totalDriveCount, - double totalDrivingDistanceKm // 저장 단위는 km로 가정 + double totalDrivingDistance ) { } public record HourlyStat( int hour, - int driveCount + long driveCount ) { } - public static DailyStatisticResponse from(DailyStatisticEntity e, List hourlyDriveCounts) { - List hourlyStats = IntStream.range(0, 24) - .mapToObj(i -> new DailyStatisticResponse.HourlyStat( - i, - hourlyDriveCounts.get(i) - )).toList(); + public static DailyStatisticResponse from(DailyStatisticEntity e, long[] hourlyDriveCounts) { + List hourlyStats = new ArrayList<>(); + + for (int i = 0; i < hourlyDriveCounts.length; i++) { + HourlyStat hourlyStat = new HourlyStat(i, hourlyDriveCounts[i]); + hourlyStats.add(hourlyStat); + } return new DailyStatisticResponse( new Summary( diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java index 4d9bb439..3a412287 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java @@ -7,7 +7,7 @@ public record MonthlyStatisticResponse( Summary summary, - List monthlyStat + List monthlyStat ) { public record Summary( int totalCarCount, @@ -15,11 +15,11 @@ public record Summary( double averageOperationRate, long totalDrivingSeconds, int totalDriveCount, - double totalDrivingDistanceKm // 저장 단위는 km로 가정 + double totalDrivingDistance ) { } - public record MonthlyStat( + public record MonthlyStats( int year, int month, int driveCount, @@ -32,8 +32,8 @@ public static MonthlyStatisticResponse from(MonthlyStatisticEntity e, List monthlyDriveDistances ) { int currentMonth = e.getDate().getMonthValue(); - List monthlyStats = IntStream.range(0, currentMonth) - .mapToObj(i -> new MonthlyStat( + List monthlyStats = IntStream.range(0, currentMonth) + .mapToObj(i -> new MonthlyStats( e.getDate().getYear(), i + 1, monthlyDriveCounts.get(i), diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/daily/DailyStatisticDomainRepository.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/daily/DailyStatisticDomainRepository.java index 3abc7d78..11cb4a1a 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/daily/DailyStatisticDomainRepository.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/daily/DailyStatisticDomainRepository.java @@ -9,5 +9,4 @@ public interface DailyStatisticDomainRepository extends DailyStatisticRepository, DailyStatisticRepositoryCustom { Optional findByBizIdAndDate(Long bizId, LocalDate date); - } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java index 06c5c1c1..7dd26985 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java @@ -1,12 +1,17 @@ package kernel360.trackyweb.timedistance.domain.provider; import java.time.LocalDate; +import java.util.List; import java.util.Map; import org.springframework.stereotype.Component; import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; +import com.querydsl.core.Tuple; + +import kernel360.trackycore.core.domain.entity.QTimeDistanceEntity; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationTime; import kernel360.trackyweb.timedistance.infrastructure.repository.TimeDistanceDomainRepository; import lombok.RequiredArgsConstructor; @@ -16,6 +21,23 @@ public class TimeDistanceDomainProvider { private final TimeDistanceDomainRepository timeDistanceDomainRepository; + public long[] getHourlyDriveCounts(Long bizId, LocalDate targetDate) { + + List hourlyDriveCount = timeDistanceDomainRepository.countByBizIdAndDateGroupedByHour(bizId, targetDate); + + long[] hourlyStat = new long[24]; + + for (Tuple tuple : hourlyDriveCount) { + Integer hour = tuple.get(QTimeDistanceEntity.timeDistanceEntity.hour); + Long driveCount = tuple.get(QTimeDistanceEntity.timeDistanceEntity.count()); + + if (hour != null && driveCount != null) { + hourlyStat[hour] = driveCount; + } + } + return hourlyStat; + } + public Map calculateDailyOperationTime(LocalDate targetDate) { return OperationSeconds.toMap(timeDistanceDomainRepository.getDailyOperationTime(targetDate)); } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java index 3f48b086..7a4a0d95 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java @@ -5,9 +5,16 @@ import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; +import com.querydsl.core.Tuple; + +import kernel360.trackyweb.timedistance.application.dto.internal.OperationTime; public interface TimeDistanceDomainRepositoryCustom { List getDailyOperationTime(LocalDate targetDate); + List getTotalOperationTimeGroupedByBIzId(LocalDate targetDate); + List getDailyOperationDistance(LocalDate targetDate); + + List countByBizIdAndDateGroupedByHour(Long bizId, LocalDate targetDate); } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java index e3b2071f..701eadb1 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java @@ -8,9 +8,12 @@ import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; import org.springframework.stereotype.Repository; +import com.querydsl.core.Tuple; import com.querydsl.jpa.impl.JPAQueryFactory; import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; +import kernel360.trackycore.core.domain.entity.QTimeDistanceEntity; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationTime; import lombok.RequiredArgsConstructor; @Repository @@ -19,6 +22,20 @@ public class TimeDistanceDomainRepositoryCustomImpl implements TimeDistanceDomai private final JPAQueryFactory queryFactory; + @Override + public List countByBizIdAndDateGroupedByHour(Long bizId, LocalDate targetDate) { + QTimeDistanceEntity e = QTimeDistanceEntity.timeDistanceEntity; + + return queryFactory.select(e.hour, e.count()) + .from(e) + .where(e.biz.id.eq(bizId) + .and(e.date.eq(targetDate)) + ) + .groupBy(e.hour) + .orderBy(e.hour.asc()) + .fetch(); + } + @Override public List getDailyOperationTime(LocalDate targetDate) { return queryFactory From b058d069c38a8b13ed4857df24ac9909dac10add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=83=9D=ED=83=9D?= Date: Thu, 8 May 2025 12:14:20 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat=20#314=20=EC=9B=94=EA=B0=84=20?= =?UTF-8?q?=ED=86=B5=EA=B3=84=20API=20=EC=9D=91=EB=8B=B5=EC=97=90=20?= =?UTF-8?q?=EC=9B=94=EB=B3=84=20=EC=9A=B4=ED=96=89=EB=9F=89,=20=EC=9A=B4?= =?UTF-8?q?=ED=96=89=EA=B1=B0=EB=A6=AC=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/provider/DriveDomainProvider.java | 81 +++++++++---------- .../application/StatisticService.java | 24 +++--- .../response/MonthlyStatisticResponse.java | 29 ++++--- .../provider/MonthlyStatisticProvider.java | 7 ++ .../MonthlyStatisticDomainRepository.java | 3 +- ...onthlyStatisticDomainRepositoryCustom.java | 11 +++ .../MonthlyStatisticDomainRepositoryImpl.java | 34 ++++++++ .../presentation/StatisticController.java | 5 +- .../provider/TimeDistanceDomainProvider.java | 5 +- .../TimeDistanceDomainRepositoryCustom.java | 7 +- ...imeDistanceDomainRepositoryCustomImpl.java | 44 +++++----- 11 files changed, 146 insertions(+), 104 deletions(-) create mode 100644 tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java create mode 100644 tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java diff --git a/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java b/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java index df78c532..d15b9b8c 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/drive/domain/provider/DriveDomainProvider.java @@ -4,8 +4,6 @@ import java.util.List; import java.util.Map; -import kernel360.trackyweb.drive.application.dto.internal.NonOperatedCar; -import kernel360.trackyweb.drive.application.dto.internal.OperationTotalCount; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; @@ -13,7 +11,9 @@ import kernel360.trackycore.core.common.exception.ErrorCode; import kernel360.trackycore.core.common.exception.GlobalException; import kernel360.trackycore.core.domain.entity.DriveEntity; +import kernel360.trackyweb.drive.application.dto.internal.NonOperatedCar; import kernel360.trackyweb.drive.application.dto.internal.OperationCarCount; +import kernel360.trackyweb.drive.application.dto.internal.OperationTotalCount; import kernel360.trackyweb.drive.domain.DriveHistory; import kernel360.trackyweb.drive.infrastructure.repository.DriveDomainRepository; import lombok.RequiredArgsConstructor; @@ -22,63 +22,58 @@ @RequiredArgsConstructor public class DriveDomainProvider { - private final DriveDomainRepository driveDomainRepository; + private final DriveDomainRepository driveDomainRepository; - public Page searchDrivesByFilter( - String search, - String mdn, - LocalDate startDateTime, - LocalDate endDateTime, - Pageable pageable) { - return driveDomainRepository.searchByFilter(search, mdn, startDateTime, endDateTime, pageable); - } + public Page searchDrivesByFilter( + String search, + String mdn, + LocalDate startDateTime, + LocalDate endDateTime, + Pageable pageable) { + return driveDomainRepository.searchByFilter(search, mdn, startDateTime, endDateTime, pageable); + } - public Page findRunningDriveList( - String search, - Pageable pageable - ) { - return driveDomainRepository.findRunningDriveList(search, pageable); - } + public Page findRunningDriveList( + String search, + Pageable pageable + ) { + return driveDomainRepository.findRunningDriveList(search, pageable); + } - public DriveEntity findRunningDriveById(Long driveId) { - return driveDomainRepository.findRunningDriveById(driveId) - .orElseThrow(() -> GlobalException.throwError(ErrorCode.NOT_REALTIME_DRIVE)); - } + public DriveEntity findRunningDriveById(Long driveId) { + return driveDomainRepository.findRunningDriveById(driveId) + .orElseThrow(() -> GlobalException.throwError(ErrorCode.NOT_REALTIME_DRIVE)); + } public DriveHistory findByDriveId(Long driveId) { return driveDomainRepository.findByDriveId(driveId) .orElseThrow(() -> GlobalException.throwError(ErrorCode.DRIVE_NOT_FOUND)); } - public List findByMdn(String mdn) { - return driveDomainRepository.findDriveListByMdn(mdn); - } - - //일일 통계 - 당일 운행 차량 수 (distinct mdn) - public List countOperationCarGroupedByBizId(LocalDate targetDate) { - return driveDomainRepository.findOperationMdnGroupedByBizId(targetDate); + public List findByMdn(String mdn) { + return driveDomainRepository.findDriveListByMdn(mdn); } public Double getTotalDriveDistance() { return driveDomainRepository.getTotalDriveDistance(); } - public Long getTotalDriveDurationInMinutes() { - return driveDomainRepository.getTotalDriveDurationInMinutes(); - } + public Long getTotalDriveDurationInMinutes() { + return driveDomainRepository.getTotalDriveDurationInMinutes(); + } - //일일 통계 - 당일 운행 차량 수 (distinct mdn) - public Map countDailyOperationCar(LocalDate targetDate) { - return OperationCarCount.toMap(driveDomainRepository.getDailyOperationCar(targetDate)); - } + //일일 통계 - 당일 운행 차량 수 (distinct mdn) + public Map countDailyOperationCar(LocalDate targetDate) { + return OperationCarCount.toMap(driveDomainRepository.getDailyOperationCar(targetDate)); + } - //일일 통계 - 당일 총 운행 수 - public Map countDailyTotalOperation(LocalDate targetDate) { - return OperationTotalCount.toMap(driveDomainRepository.getDailyTotalOperation(targetDate)); - } + //일일 통계 - 당일 총 운행 수 + public Map countDailyTotalOperation(LocalDate targetDate) { + return OperationTotalCount.toMap(driveDomainRepository.getDailyTotalOperation(targetDate)); + } - //월별 통계 - 미운행 차량 수 - public Map getNonOperatedCars(LocalDate targetDate) { - return NonOperatedCar.toMap(driveDomainRepository.getNonOperatedCars(targetDate)); - } + //월별 통계 - 미운행 차량 수 + public Map getNonOperatedCars(LocalDate targetDate) { + return NonOperatedCar.toMap(driveDomainRepository.getNonOperatedCars(targetDate)); + } } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java index 661f74b8..2c61ce8f 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java @@ -2,11 +2,12 @@ import java.time.LocalDate; import java.time.YearMonth; -import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; +import com.querydsl.core.Tuple; + import kernel360.trackycore.core.common.api.ApiResponse; import kernel360.trackycore.core.domain.entity.DailyStatisticEntity; import kernel360.trackycore.core.domain.entity.MonthlyStatisticEntity; @@ -40,23 +41,22 @@ public ApiResponse getDailyStatistic(String bizUuid, Loc return ApiResponse.success(response); } - public ApiResponse getMonthlyStatistic(String bizUuid, YearMonth date) { + public ApiResponse getMonthlyStatistic(String bizUuid, YearMonth date, + YearMonth targetDate) { + + if (targetDate == null) { + targetDate = date.minusYears(1).plusMonths(1); + } Long bizId = bizProvider.getBiz(bizUuid).getId(); MonthlyStatisticEntity monthlyStatistic = monthlyStatisticProvider.getMonthlyStatistic(bizId, date.atDay(1)); - List list = new ArrayList<>(); - for (int i = 0; i < 12; i++) { - list.add(1); - } - List list2 = new ArrayList<>(); - for (int i = 0; i < 12; i++) { - list2.add(1L); - } - MonthlyStatisticResponse response = MonthlyStatisticResponse.from(monthlyStatistic, list, list2); + List monthlyDataTuples = monthlyStatisticProvider.getMonthlyDataTuples(bizId, date.atDay(1), + targetDate.atDay(1)); + + MonthlyStatisticResponse response = MonthlyStatisticResponse.from(monthlyStatistic, monthlyDataTuples); return ApiResponse.success(response); } - } \ No newline at end of file diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java index 3a412287..5ecb18ad 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java @@ -1,13 +1,14 @@ package kernel360.trackyweb.statistic.application.dto.response; import java.util.List; -import java.util.stream.IntStream; + +import com.querydsl.core.Tuple; import kernel360.trackycore.core.domain.entity.MonthlyStatisticEntity; public record MonthlyStatisticResponse( Summary summary, - List monthlyStat + List monthlyStats ) { public record Summary( int totalCarCount, @@ -23,22 +24,20 @@ public record MonthlyStats( int year, int month, int driveCount, - long driveDistance + double driveDistance ) { } - public static MonthlyStatisticResponse from(MonthlyStatisticEntity e, - List monthlyDriveCounts, - List monthlyDriveDistances - ) { - int currentMonth = e.getDate().getMonthValue(); - List monthlyStats = IntStream.range(0, currentMonth) - .mapToObj(i -> new MonthlyStats( - e.getDate().getYear(), - i + 1, - monthlyDriveCounts.get(i), - monthlyDriveDistances.get(i) - )).toList(); + public static MonthlyStatisticResponse from(MonthlyStatisticEntity e, List monthlyDataTuples) { + + List monthlyStats = monthlyDataTuples.stream().map(tuple -> { + int year = tuple.get(0, Integer.class); + int month = tuple.get(1, Integer.class); + int driveCount = tuple.get(2, Integer.class); + double driveDistance = tuple.get(3, Double.class); + + return new MonthlyStats(year, month, driveCount, driveDistance); + }).toList(); return new MonthlyStatisticResponse( new Summary( diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java index 3b1e9813..0486d2ee 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java @@ -6,6 +6,8 @@ import org.springframework.stereotype.Component; +import com.querydsl.core.Tuple; + import jakarta.transaction.Transactional; import kernel360.trackycore.core.common.exception.ErrorCode; import kernel360.trackycore.core.common.exception.GlobalException; @@ -42,4 +44,9 @@ public void saveMonthlyStatistic(List resultEntities) { } } } + + public List getMonthlyDataTuples(Long bizId, LocalDate localDate, LocalDate localDate1) { + + return monthlyStatisticRepository.getMonthlyDataTuples(bizId, localDate, localDate1); + } } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepository.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepository.java index c4e61b8c..0c4c1afa 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepository.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepository.java @@ -7,8 +7,7 @@ import kernel360.trackycore.core.infrastructure.repository.MonthlyStatisticRepository; public interface MonthlyStatisticDomainRepository - extends MonthlyStatisticRepository { + extends MonthlyStatisticRepository, MonthlyStatisticDomainRepositoryCustom { Optional findByBizIdAndDate(Long bizId, LocalDate date); - } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java new file mode 100644 index 00000000..c80f598b --- /dev/null +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java @@ -0,0 +1,11 @@ +package kernel360.trackyweb.statistic.infrastructure.repository.monthly; + +import java.time.LocalDate; +import java.util.List; + +import com.querydsl.core.Tuple; + +public interface MonthlyStatisticDomainRepositoryCustom { + + List getMonthlyDataTuples(Long bizId, LocalDate currentDate, LocalDate targetDate); +} diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java new file mode 100644 index 00000000..7b6777e3 --- /dev/null +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java @@ -0,0 +1,34 @@ +package kernel360.trackyweb.statistic.infrastructure.repository.monthly; + +import java.time.LocalDate; +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.querydsl.core.Tuple; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import kernel360.trackycore.core.domain.entity.QMonthlyStatisticEntity; +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class MonthlyStatisticDomainRepositoryImpl implements MonthlyStatisticDomainRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Override + public List getMonthlyDataTuples(Long bizId, LocalDate currentDate, LocalDate targetDate) { + QMonthlyStatisticEntity e = QMonthlyStatisticEntity.monthlyStatisticEntity; + + return queryFactory.select(e.date.year(), e.date.month(), e.totalDriveCount.sum(), e.totalDriveDistance.sum()) + .from(e) + .where( + e.bizId.eq(bizId) + .and(e.date.between(targetDate, currentDate)) + ) + .groupBy(e.date.yearMonth()) + .orderBy(e.date.yearMonth().asc()) + .fetch(); + } +} diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/presentation/StatisticController.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/presentation/StatisticController.java index cd28f729..a7334af1 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/presentation/StatisticController.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/presentation/StatisticController.java @@ -40,8 +40,9 @@ public ApiResponse getDailyStatistic( public ApiResponse getMonthlyStatistic( @AuthenticationPrincipal MemberPrincipal memberPrincipal, @RequestParam(name = "date") - YearMonth date + YearMonth date, + YearMonth targetDate ) { - return statisticService.getMonthlyStatistic(memberPrincipal.bizUuid(), date); + return statisticService.getMonthlyStatistic(memberPrincipal.bizUuid(), date, targetDate); } } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java index 7dd26985..42af3528 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/domain/provider/TimeDistanceDomainProvider.java @@ -6,12 +6,11 @@ import org.springframework.stereotype.Component; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; import com.querydsl.core.Tuple; import kernel360.trackycore.core.domain.entity.QTimeDistanceEntity; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationTime; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; import kernel360.trackyweb.timedistance.infrastructure.repository.TimeDistanceDomainRepository; import lombok.RequiredArgsConstructor; diff --git a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java index 7a4a0d95..cbb303fe 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustom.java @@ -3,17 +3,14 @@ import java.time.LocalDate; import java.util.List; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; import com.querydsl.core.Tuple; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationTime; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; public interface TimeDistanceDomainRepositoryCustom { List getDailyOperationTime(LocalDate targetDate); - List getTotalOperationTimeGroupedByBIzId(LocalDate targetDate); - List getDailyOperationDistance(LocalDate targetDate); List countByBizIdAndDateGroupedByHour(Long bizId, LocalDate targetDate); diff --git a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java index 701eadb1..70f0f044 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/timedistance/infrastructure/repository/TimeDistanceDomainRepositoryCustomImpl.java @@ -1,19 +1,19 @@ package kernel360.trackyweb.timedistance.infrastructure.repository; import static kernel360.trackycore.core.domain.entity.QTimeDistanceEntity.*; + import java.time.LocalDate; import java.util.List; -import com.querydsl.core.types.Projections; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; import org.springframework.stereotype.Repository; import com.querydsl.core.Tuple; +import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; import kernel360.trackycore.core.domain.entity.QTimeDistanceEntity; -import kernel360.trackyweb.timedistance.application.dto.internal.OperationTime; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationDistance; +import kernel360.trackyweb.timedistance.application.dto.internal.OperationSeconds; import lombok.RequiredArgsConstructor; @Repository @@ -39,30 +39,30 @@ public List countByBizIdAndDateGroupedByHour(Long bizId, LocalDate target @Override public List getDailyOperationTime(LocalDate targetDate) { return queryFactory - .select(Projections.constructor( - OperationSeconds.class, - timeDistanceEntity.biz.id, - timeDistanceEntity.seconds.sum() - )) - .from(timeDistanceEntity) - .where(timeDistanceEntity.date.eq(targetDate)) - .groupBy(timeDistanceEntity.biz.id) - .fetch(); + .select(Projections.constructor( + OperationSeconds.class, + timeDistanceEntity.biz.id, + timeDistanceEntity.seconds.sum() + )) + .from(timeDistanceEntity) + .where(timeDistanceEntity.date.eq(targetDate)) + .groupBy(timeDistanceEntity.biz.id) + .fetch(); } @Override public List getDailyOperationDistance(LocalDate targetDate) { return queryFactory - .select(Projections.constructor( - OperationDistance.class, - timeDistanceEntity.biz.id, - timeDistanceEntity.distance.sum() - )) - .from(timeDistanceEntity) - .where(timeDistanceEntity.date.eq(targetDate)) - .groupBy(timeDistanceEntity.biz.id) - .fetch(); + .select(Projections.constructor( + OperationDistance.class, + timeDistanceEntity.biz.id, + timeDistanceEntity.distance.sum() + )) + .from(timeDistanceEntity) + .where(timeDistanceEntity.date.eq(targetDate)) + .groupBy(timeDistanceEntity.biz.id) + .fetch(); } } From 51533fd2bf3aa4c6be4b2d45afa6f0d6140ce968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=83=9D=ED=83=9D?= Date: Thu, 8 May 2025 12:25:25 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix=20#314=20=EC=9B=94=EB=B3=84=20=EC=9A=B4?= =?UTF-8?q?=ED=96=89=EB=9F=89,=20=EC=9A=B4=ED=96=89=EA=B1=B0=EB=A6=AC=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EB=A1=9C=EC=A7=81=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../statistic/application/StatisticService.java | 7 +++---- .../dto/response/MonthlyStatisticResponse.java | 13 +------------ .../domain/provider/MonthlyStatisticProvider.java | 8 ++++---- .../MonthlyStatisticDomainRepositoryCustom.java | 5 +++-- .../MonthlyStatisticDomainRepositoryImpl.java | 15 ++++++++++++--- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java index 2c61ce8f..60cd7e5b 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/StatisticService.java @@ -6,8 +6,6 @@ import org.springframework.stereotype.Service; -import com.querydsl.core.Tuple; - import kernel360.trackycore.core.common.api.ApiResponse; import kernel360.trackycore.core.domain.entity.DailyStatisticEntity; import kernel360.trackycore.core.domain.entity.MonthlyStatisticEntity; @@ -52,10 +50,11 @@ public ApiResponse getMonthlyStatistic(String bizUuid, MonthlyStatisticEntity monthlyStatistic = monthlyStatisticProvider.getMonthlyStatistic(bizId, date.atDay(1)); - List monthlyDataTuples = monthlyStatisticProvider.getMonthlyDataTuples(bizId, date.atDay(1), + List monthlyStats = monthlyStatisticProvider.getMonthlyDataTuples(bizId, + date.atDay(1), targetDate.atDay(1)); - MonthlyStatisticResponse response = MonthlyStatisticResponse.from(monthlyStatistic, monthlyDataTuples); + MonthlyStatisticResponse response = MonthlyStatisticResponse.from(monthlyStatistic, monthlyStats); return ApiResponse.success(response); } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java index 5ecb18ad..bb0d0853 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/application/dto/response/MonthlyStatisticResponse.java @@ -2,8 +2,6 @@ import java.util.List; -import com.querydsl.core.Tuple; - import kernel360.trackycore.core.domain.entity.MonthlyStatisticEntity; public record MonthlyStatisticResponse( @@ -28,16 +26,7 @@ public record MonthlyStats( ) { } - public static MonthlyStatisticResponse from(MonthlyStatisticEntity e, List monthlyDataTuples) { - - List monthlyStats = monthlyDataTuples.stream().map(tuple -> { - int year = tuple.get(0, Integer.class); - int month = tuple.get(1, Integer.class); - int driveCount = tuple.get(2, Integer.class); - double driveDistance = tuple.get(3, Double.class); - - return new MonthlyStats(year, month, driveCount, driveDistance); - }).toList(); + public static MonthlyStatisticResponse from(MonthlyStatisticEntity e, List monthlyStats) { return new MonthlyStatisticResponse( new Summary( diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java index 0486d2ee..a5d684e1 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/domain/provider/MonthlyStatisticProvider.java @@ -6,12 +6,11 @@ import org.springframework.stereotype.Component; -import com.querydsl.core.Tuple; - import jakarta.transaction.Transactional; import kernel360.trackycore.core.common.exception.ErrorCode; import kernel360.trackycore.core.common.exception.GlobalException; import kernel360.trackycore.core.domain.entity.MonthlyStatisticEntity; +import kernel360.trackyweb.statistic.application.dto.response.MonthlyStatisticResponse; import kernel360.trackyweb.statistic.infrastructure.repository.monthly.MonthlyStatisticDomainRepository; import lombok.RequiredArgsConstructor; @@ -45,8 +44,9 @@ public void saveMonthlyStatistic(List resultEntities) { } } - public List getMonthlyDataTuples(Long bizId, LocalDate localDate, LocalDate localDate1) { + public List getMonthlyDataTuples(Long bizId, LocalDate localDate, + LocalDate localDate1) { - return monthlyStatisticRepository.getMonthlyDataTuples(bizId, localDate, localDate1); + return monthlyStatisticRepository.getMonthlyStats(bizId, localDate, localDate1); } } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java index c80f598b..4b6f40e4 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryCustom.java @@ -3,9 +3,10 @@ import java.time.LocalDate; import java.util.List; -import com.querydsl.core.Tuple; +import kernel360.trackyweb.statistic.application.dto.response.MonthlyStatisticResponse; public interface MonthlyStatisticDomainRepositoryCustom { - List getMonthlyDataTuples(Long bizId, LocalDate currentDate, LocalDate targetDate); + List getMonthlyStats(Long bizId, LocalDate currentDate, + LocalDate targetDate); } diff --git a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java index 7b6777e3..990ba7e8 100644 --- a/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java +++ b/tracky-web/src/main/java/kernel360/trackyweb/statistic/infrastructure/repository/monthly/MonthlyStatisticDomainRepositoryImpl.java @@ -5,10 +5,11 @@ import org.springframework.stereotype.Repository; -import com.querydsl.core.Tuple; +import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; import kernel360.trackycore.core.domain.entity.QMonthlyStatisticEntity; +import kernel360.trackyweb.statistic.application.dto.response.MonthlyStatisticResponse; import lombok.RequiredArgsConstructor; @Repository @@ -18,10 +19,18 @@ public class MonthlyStatisticDomainRepositoryImpl implements MonthlyStatisticDom private final JPAQueryFactory queryFactory; @Override - public List getMonthlyDataTuples(Long bizId, LocalDate currentDate, LocalDate targetDate) { + public List getMonthlyStats(Long bizId, LocalDate currentDate, + LocalDate targetDate) { QMonthlyStatisticEntity e = QMonthlyStatisticEntity.monthlyStatisticEntity; - return queryFactory.select(e.date.year(), e.date.month(), e.totalDriveCount.sum(), e.totalDriveDistance.sum()) + return queryFactory.select( + Projections.constructor( + MonthlyStatisticResponse.MonthlyStats.class, + e.date.year(), + e.date.month(), + e.totalDriveCount.sum(), + e.totalDriveDistance.sum() + )) .from(e) .where( e.bizId.eq(bizId)