parent
81fa445964
commit
353807404a
|
@ -82,6 +82,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory)
|
|||
.groupBy(getFormattedDate(member.createdAt))
|
||||
.offset(offset)
|
||||
.limit(limit)
|
||||
.orderBy(member.createdAt.desc())
|
||||
.fetch()
|
||||
}
|
||||
|
||||
|
@ -106,6 +107,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory)
|
|||
.groupBy(getFormattedDate(signOut.createdAt))
|
||||
.offset(offset)
|
||||
.limit(limit)
|
||||
.orderBy(signOut.createdAt.desc())
|
||||
.fetch()
|
||||
}
|
||||
|
||||
|
@ -134,6 +136,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory)
|
|||
.groupBy(getFormattedDate(charge.createdAt))
|
||||
.offset(offset)
|
||||
.limit(limit)
|
||||
.orderBy(charge.createdAt.desc())
|
||||
.fetch()
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ import kr.co.vividnext.sodalive.common.SodaException
|
|||
import org.springframework.data.domain.Pageable
|
||||
import org.springframework.stereotype.Service
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
import java.time.LocalTime
|
||||
import java.time.ZoneId
|
||||
import java.time.format.DateTimeFormatter
|
||||
|
@ -16,9 +17,16 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics
|
|||
endDateStr: String,
|
||||
pageable: Pageable
|
||||
): GetMemberStatisticsResponse {
|
||||
val startDate = LocalDate.parse(startDateStr)
|
||||
val endDate = LocalDate.parse(endDateStr)
|
||||
val now = LocalDateTime.now()
|
||||
.atZone(ZoneId.of("UTC"))
|
||||
.withZoneSameInstant(ZoneId.of("Asia/Seoul"))
|
||||
.toLocalDate()
|
||||
|
||||
val dateRange = getPagedDateRange(
|
||||
startDate = startDateStr,
|
||||
endDate = endDateStr,
|
||||
startDate = startDate,
|
||||
endDate = endDate.coerceAtMost(now),
|
||||
page = pageable.pageNumber + 1,
|
||||
pageSize = pageable.pageSize
|
||||
)
|
||||
|
@ -27,47 +35,47 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics
|
|||
throw SodaException("잘못된 접근입니다.")
|
||||
}
|
||||
|
||||
var startDate = LocalDate.parse(startDateStr).atStartOfDay()
|
||||
var startDateTime = startDate.atStartOfDay()
|
||||
.atZone(ZoneId.of("Asia/Seoul"))
|
||||
.withZoneSameInstant(ZoneId.of("UTC"))
|
||||
.toLocalDateTime()
|
||||
|
||||
var endDate = LocalDate.parse(endDateStr).atTime(LocalTime.MAX)
|
||||
var endDateTime = endDate.atTime(LocalTime.MAX)
|
||||
.atZone(ZoneId.of("Asia/Seoul"))
|
||||
.withZoneSameInstant(ZoneId.of("UTC"))
|
||||
.toLocalDateTime()
|
||||
|
||||
val totalSignUpCount = repository.getTotalSignUpCount(startDate = startDate, endDate = endDate)
|
||||
val totalSignOutCount = repository.getTotalSignOutCount(startDate = startDate, endDate = endDate)
|
||||
val totalPaymentMemberCount = repository.getPaymentMemberCount(startDate = startDate, endDate = endDate)
|
||||
val totalSignUpCount = repository.getTotalSignUpCount(startDate = startDateTime, endDate = endDateTime)
|
||||
val totalSignOutCount = repository.getTotalSignOutCount(startDate = startDateTime, endDate = endDateTime)
|
||||
val totalPaymentMemberCount = repository.getPaymentMemberCount(startDate = startDateTime, endDate = endDateTime)
|
||||
|
||||
startDate = dateRange.startDate
|
||||
startDateTime = dateRange.startDate
|
||||
.atZone(ZoneId.of("Asia/Seoul"))
|
||||
.withZoneSameInstant(ZoneId.of("UTC"))
|
||||
.toLocalDateTime()
|
||||
|
||||
endDate = dateRange.endDate
|
||||
endDateTime = dateRange.endDate
|
||||
.atZone(ZoneId.of("Asia/Seoul"))
|
||||
.withZoneSameInstant(ZoneId.of("UTC"))
|
||||
.toLocalDateTime()
|
||||
|
||||
val signUpCountInRange = repository.getSignUpCountInRange(
|
||||
startDate = startDate,
|
||||
endDate = endDate,
|
||||
startDate = startDateTime,
|
||||
endDate = endDateTime,
|
||||
offset = pageable.offset,
|
||||
limit = pageable.pageSize.toLong()
|
||||
).associateBy({ it.date }, { it.memberCount })
|
||||
|
||||
val signOutCountInRange = repository.getSignOutCountInRange(
|
||||
startDate = startDate,
|
||||
endDate = endDate,
|
||||
startDate = startDateTime,
|
||||
endDate = endDateTime,
|
||||
offset = pageable.offset,
|
||||
limit = pageable.pageSize.toLong()
|
||||
).associateBy({ it.date }, { it.memberCount })
|
||||
|
||||
val paymentMemberCountInRange = repository.getPaymentMemberCountInRange(
|
||||
startDate = startDate,
|
||||
endDate = endDate,
|
||||
startDate = startDateTime,
|
||||
endDate = endDateTime,
|
||||
offset = pageable.offset,
|
||||
limit = pageable.pageSize.toLong()
|
||||
)
|
||||
|
@ -75,8 +83,8 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics
|
|||
val paymentMemberCountInRangeMap = paymentMemberCountInRange.associateBy({ it.date }, { it.memberCount })
|
||||
|
||||
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
|
||||
val items = generateSequence(dateRange.startDate) { it.plusDays(1) }
|
||||
.takeWhile { !it.isAfter(dateRange.endDate) }
|
||||
val items = generateSequence(dateRange.endDate) { it.minusDays(1) }
|
||||
.takeWhile { !it.isBefore(dateRange.startDate) }
|
||||
.map {
|
||||
val date = it.format(formatter)
|
||||
GetMemberStatisticsItem(
|
||||
|
@ -97,17 +105,14 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics
|
|||
)
|
||||
}
|
||||
|
||||
private fun getPagedDateRange(startDate: String, endDate: String, page: Int, pageSize: Int): PagedDateRange? {
|
||||
val start = LocalDate.parse(startDate)
|
||||
val end = LocalDate.parse(endDate)
|
||||
|
||||
val totalDays = ChronoUnit.DAYS.between(start, end).toInt() + 1
|
||||
private fun getPagedDateRange(startDate: LocalDate, endDate: LocalDate, page: Int, pageSize: Int): PagedDateRange? {
|
||||
val totalDays = ChronoUnit.DAYS.between(startDate, endDate).toInt() + 1
|
||||
val totalPages = (totalDays + pageSize - 1) / pageSize // 전체 페이지 개수 계산
|
||||
|
||||
if (page < 1 || page > totalPages) return null // 페이지 범위를 벗어나면 null 반환
|
||||
|
||||
val rangeStart = start.plusDays((page - 1) * pageSize.toLong()).atStartOfDay()
|
||||
val rangeEnd = start.plusDays((page * pageSize - 1).toLong()).coerceAtMost(end).atTime(LocalTime.MAX)
|
||||
val rangeEnd = endDate.minusDays((page - 1) * pageSize.toLong()).atTime(LocalTime.MAX)
|
||||
val rangeStart = endDate.minusDays((page * pageSize - 1).toLong()).coerceAtLeast(startDate).atStartOfDay()
|
||||
|
||||
return PagedDateRange(rangeStart, rangeEnd, totalDays)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue