관리자 - 일별 전체 회원수 API

- 페이지 계산 수정
This commit is contained in:
Klaus 2025-03-14 23:55:04 +09:00
parent 1dec8913c5
commit 74fecddf95
3 changed files with 99 additions and 47 deletions

View File

@ -21,8 +21,7 @@ class AdminMemberStatisticsController(private val service: AdminMemberStatistics
service.getStatistics( service.getStatistics(
startDateStr = startDateStr, startDateStr = startDateStr,
endDateStr = endDateStr, endDateStr = endDateStr,
offset = pageable.offset, pageable = pageable
limit = pageable.pageSize.toLong()
) )
) )
} }

View File

@ -39,41 +39,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory)
.size .size
} }
fun getSignUpCountInRange(startDate: LocalDateTime, endDate: LocalDateTime): List<DateAndMemberCount> { fun getPaymentMemberCount(startDate: LocalDateTime, endDate: LocalDateTime): Int {
return queryFactory
.select(
QDateAndMemberCount(
getFormattedDate(member.createdAt),
member.id.countDistinct().castToNum(Int::class.java)
)
)
.from(member)
.where(
member.createdAt.goe(startDate),
member.createdAt.loe(endDate)
)
.groupBy(getFormattedDate(member.createdAt))
.fetch()
}
fun getSignOutCountInRange(startDate: LocalDateTime, endDate: LocalDateTime): List<DateAndMemberCount> {
return queryFactory
.select(
QDateAndMemberCount(
getFormattedDate(signOut.createdAt),
signOut.id.countDistinct().castToNum(Int::class.java)
)
)
.from(signOut)
.where(
signOut.createdAt.goe(startDate),
signOut.createdAt.loe(endDate)
)
.groupBy(getFormattedDate(signOut.createdAt))
.fetch()
}
fun getPaymentMemberCountInRange(startDate: LocalDateTime, endDate: LocalDateTime): List<DateAndMemberCount> {
return queryFactory return queryFactory
.select( .select(
QDateAndMemberCount( QDateAndMemberCount(
@ -92,6 +58,83 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory)
) )
.groupBy(getFormattedDate(charge.createdAt)) .groupBy(getFormattedDate(charge.createdAt))
.fetch() .fetch()
.sumOf { it.memberCount }
}
fun getSignUpCountInRange(
startDate: LocalDateTime,
endDate: LocalDateTime,
offset: Long,
limit: Long
): List<DateAndMemberCount> {
return queryFactory
.select(
QDateAndMemberCount(
getFormattedDate(member.createdAt),
member.id.countDistinct().castToNum(Int::class.java)
)
)
.from(member)
.where(
member.createdAt.goe(startDate),
member.createdAt.loe(endDate)
)
.groupBy(getFormattedDate(member.createdAt))
.offset(offset)
.limit(limit)
.fetch()
}
fun getSignOutCountInRange(
startDate: LocalDateTime,
endDate: LocalDateTime,
offset: Long,
limit: Long
): List<DateAndMemberCount> {
return queryFactory
.select(
QDateAndMemberCount(
getFormattedDate(signOut.createdAt),
signOut.id.countDistinct().castToNum(Int::class.java)
)
)
.from(signOut)
.where(
signOut.createdAt.goe(startDate),
signOut.createdAt.loe(endDate)
)
.groupBy(getFormattedDate(signOut.createdAt))
.offset(offset)
.limit(limit)
.fetch()
}
fun getPaymentMemberCountInRange(
startDate: LocalDateTime,
endDate: LocalDateTime,
offset: Long,
limit: Long
): List<DateAndMemberCount> {
return queryFactory
.select(
QDateAndMemberCount(
getFormattedDate(charge.createdAt),
member.id.countDistinct().castToNum(Int::class.java)
)
)
.from(charge)
.innerJoin(charge.member, member)
.leftJoin(charge.payment, payment)
.where(
charge.status.eq(ChargeStatus.CHARGE),
payment.status.eq(PaymentStatus.COMPLETE),
charge.createdAt.goe(startDate),
charge.createdAt.loe(endDate)
)
.groupBy(getFormattedDate(charge.createdAt))
.offset(offset)
.limit(limit)
.fetch()
} }
private fun getFormattedDate(dateTimePath: DateTimePath<LocalDateTime>): StringTemplate { private fun getFormattedDate(dateTimePath: DateTimePath<LocalDateTime>): StringTemplate {

View File

@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.admin.statistics.member package kr.co.vividnext.sodalive.admin.statistics.member
import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.common.SodaException
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalTime import java.time.LocalTime
@ -13,14 +14,13 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics
fun getStatistics( fun getStatistics(
startDateStr: String, startDateStr: String,
endDateStr: String, endDateStr: String,
offset: Long, pageable: Pageable
limit: Long
): GetMemberStatisticsResponse { ): GetMemberStatisticsResponse {
val dateRange = getPagedDateRange( val dateRange = getPagedDateRange(
startDate = startDateStr, startDate = startDateStr,
endDate = endDateStr, endDate = endDateStr,
page = (offset + 1).toInt(), page = pageable.pageNumber + 1,
pageSize = limit.toInt() pageSize = pageable.pageSize
) )
if (dateRange == null) { if (dateRange == null) {
@ -39,19 +39,29 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics
val totalSignUpCount = repository.getTotalSignUpCount(startDate = startDate, endDate = endDate) val totalSignUpCount = repository.getTotalSignUpCount(startDate = startDate, endDate = endDate)
val totalSignOutCount = repository.getTotalSignOutCount(startDate = startDate, endDate = endDate) val totalSignOutCount = repository.getTotalSignOutCount(startDate = startDate, endDate = endDate)
val totalPaymentMemberCount = repository.getPaymentMemberCount(startDate = startDate, endDate = endDate)
val signUpCountInRange = repository.getSignUpCountInRange(startDate = startDate, endDate = endDate) val signUpCountInRange = repository.getSignUpCountInRange(
.associateBy({ it.date }, { it.memberCount }) startDate = startDate,
endDate = endDate,
offset = pageable.offset,
limit = pageable.pageSize.toLong()
).associateBy({ it.date }, { it.memberCount })
val signOutCountInRange = repository.getSignOutCountInRange(startDate = startDate, endDate = endDate) val signOutCountInRange = repository.getSignOutCountInRange(
.associateBy({ it.date }, { it.memberCount }) startDate = startDate,
endDate = endDate,
offset = pageable.offset,
limit = pageable.pageSize.toLong()
).associateBy({ it.date }, { it.memberCount })
val paymentMemberCountInRange = repository.getPaymentMemberCountInRange( val paymentMemberCountInRange = repository.getPaymentMemberCountInRange(
startDate = startDate, startDate = startDate,
endDate = endDate endDate = endDate,
offset = pageable.offset,
limit = pageable.pageSize.toLong()
) )
val totalPaymentMemberCount = paymentMemberCountInRange.sumOf { it.memberCount }
val paymentMemberCountInRangeMap = paymentMemberCountInRange.associateBy({ it.date }, { it.memberCount }) val paymentMemberCountInRangeMap = paymentMemberCountInRange.associateBy({ it.date }, { it.memberCount })
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")