test #286
@@ -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()
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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")
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user