From c3f57ce8a489715965bea942d890712107add52b Mon Sep 17 00:00:00 2001 From: chominju02 Date: Wed, 3 Sep 2025 18:25:53 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EB=8C=80=EC=8B=9C=EB=B3=B4=EB=93=9C=20=EA=B0=80=EC=83=81?= =?UTF-8?q?=EA=B3=84=EC=A2=8C=20=EC=8B=A0=EC=B2=AD=20=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/admin/AdminDashboardService.java | 13 ++++++++++++- .../repository/ExamApplicationJpaRepository.java | 9 ++++++--- .../VirtualAccountLogJpaRepository.java | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/life/mosu/mosuserver/application/admin/AdminDashboardService.java b/src/main/java/life/mosu/mosuserver/application/admin/AdminDashboardService.java index 90a6fa96..d3cbd9fc 100644 --- a/src/main/java/life/mosu/mosuserver/application/admin/AdminDashboardService.java +++ b/src/main/java/life/mosu/mosuserver/application/admin/AdminDashboardService.java @@ -1,9 +1,12 @@ package life.mosu.mosuserver.application.admin; +import java.time.LocalDate; import life.mosu.mosuserver.domain.examapplication.repository.ExamApplicationJpaRepository; import life.mosu.mosuserver.domain.refund.repository.RefundFailureLogJpaRepository; import life.mosu.mosuserver.domain.user.entity.UserRole; import life.mosu.mosuserver.domain.user.repository.UserJpaRepository; +import life.mosu.mosuserver.domain.virtualaccount.DepositStatus; +import life.mosu.mosuserver.domain.virtualaccount.VirtualAccountLogJpaRepository; import life.mosu.mosuserver.presentation.admin.dto.DashBoardResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,13 +16,21 @@ public class AdminDashboardService { private final ExamApplicationJpaRepository examApplicationJpaRepository; + private final VirtualAccountLogJpaRepository virtualAccountLogJpaRepository; private final UserJpaRepository userJpaRepository; private final RefundFailureLogJpaRepository refundFailureLogJpaRepository; // 대시보드 정보 조회 public DashBoardResponse getAll() { - Long applicationCounts = examApplicationJpaRepository.countAll(); + LocalDate startDate = LocalDate.of(2025, 8, 20); + Long paymentCounts = examApplicationJpaRepository.countAllSince(startDate); + + Long virtualAccountCounts = virtualAccountLogJpaRepository.countByDepositStatus( + DepositStatus.DONE); + + Long applicationCounts = paymentCounts + virtualAccountCounts; + Long refundAbortedCounts = refundFailureLogJpaRepository.count(); Long userCounts = userJpaRepository.countByUserRoleNot(UserRole.ROLE_ADMIN); diff --git a/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java index a4699c70..30938b9f 100644 --- a/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java @@ -1,6 +1,7 @@ package life.mosu.mosuserver.domain.examapplication.repository; import io.lettuce.core.dynamic.annotation.Param; +import java.time.LocalDate; import java.util.List; import java.util.Optional; import life.mosu.mosuserver.domain.examapplication.entity.ExamApplicationJpaEntity; @@ -55,8 +56,8 @@ Optional findExamApplicationInfoById( @Query(""" SELECT new life.mosu.mosuserver.domain.examapplication.projection.ExamTicketInfoProjection( et.s3Key, - u.name, - u.birth, + pr.userName, + pr.birth, ea.examNumber, e.schoolName, e.examDate @@ -66,6 +67,7 @@ Optional findExamApplicationInfoById( LEFT JOIN ApplicationJpaEntity a on a.id = ea.applicationId LEFT JOIN ExamTicketImageJpaEntity et on et.applicationId = a.id LEFT JOIN UserJpaEntity u on a.userId = u.id + LEFT JOIN ProfileJpaEntity pr on pr.userId = u.id LEFT JOIN PaymentJpaEntity p on p.examApplicationId = ea.id WHERE ea.id = :examApplicationId AND u.id = :userId @@ -209,8 +211,9 @@ SELECT COUNT(ea) JOIN PaymentJpaEntity p ON ea.id = p.examApplicationId WHERE p.paymentStatus = 'DONE' AND p.deleted = false + AND p.createdAt >= :startDate """) - long countAll(); + long countAllSince(@Param("startDate") LocalDate startDate); @Query(""" select exists ( diff --git a/src/main/java/life/mosu/mosuserver/domain/virtualaccount/VirtualAccountLogJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/virtualaccount/VirtualAccountLogJpaRepository.java index a7f7add3..e0c5e8c7 100644 --- a/src/main/java/life/mosu/mosuserver/domain/virtualaccount/VirtualAccountLogJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/virtualaccount/VirtualAccountLogJpaRepository.java @@ -8,4 +8,5 @@ public interface VirtualAccountLogJpaRepository extends Optional findByOrderId(String orderId); + long countByDepositStatus(DepositStatus depositStatus); } From 0f4e1af86fc0ac463cf0a3830482771b451fe257 Mon Sep 17 00:00:00 2001 From: chominju02 Date: Wed, 3 Sep 2025 18:26:45 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EC=8B=A0=EC=B2=AD=20=EC=A1=B0=ED=9A=8C=20user=20->=20profile?= =?UTF-8?q?=20=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jpa/ApplicationQueryRepositoryImpl.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/life/mosu/mosuserver/infra/persistence/jpa/ApplicationQueryRepositoryImpl.java b/src/main/java/life/mosu/mosuserver/infra/persistence/jpa/ApplicationQueryRepositoryImpl.java index c553b001..39b681d9 100644 --- a/src/main/java/life/mosu/mosuserver/infra/persistence/jpa/ApplicationQueryRepositoryImpl.java +++ b/src/main/java/life/mosu/mosuserver/infra/persistence/jpa/ApplicationQueryRepositoryImpl.java @@ -99,9 +99,9 @@ private JPAQuery baseQuery() { examApplication.id, payment.paymentKey, examApplication.examNumber, - user.name, - user.gender, - user.birth, + profile.userName, + profile.gender, + profile.birth, profile.phoneNumber, application.parentPhoneNumber, profile.recommenderPhoneNumber, @@ -132,7 +132,7 @@ private JPAQuery baseQuery() { private Predicate buildNameCondition(String name) { return (name == null || name.isBlank()) ? null - : user.name.contains(name); + : profile.userName.contains(name); } private Predicate buildPhoneCondition(String phone) { @@ -163,8 +163,8 @@ private ApplicationListResponse mapToResponse(Tuple tuple, Set subjects ExamTicketResponse examTicketResponse = ExamTicketResponse.of( url, - tuple.get(user.name), - tuple.get(user.birth), + tuple.get(profile.userName), + tuple.get(profile.birth), tuple.get(examApplication.examNumber), subjectNames, tuple.get(exam.schoolName) @@ -174,20 +174,21 @@ private ApplicationListResponse mapToResponse(Tuple tuple, Set subjects Education education = tuple.get(profile.education); Grade grade = tuple.get(profile.grade); PaymentMethod paymentMethod = tuple.get(payment.paymentMethod); + Boolean isLunchChecked = tuple.get(examApplication.isLunchChecked); return new ApplicationListResponse( tuple.get(payment.paymentKey), tuple.get(examApplication.examNumber), - tuple.get(user.name), + tuple.get(profile.userName), gender != null ? gender.getGenderName() : null, - tuple.get(user.birth), + tuple.get(profile.birth), tuple.get(profile.phoneNumber), tuple.get(application.parentPhoneNumber), education != null ? education.getEducationName() : null, tuple.get(profile.schoolInfo.schoolName), grade != null ? grade.getGradeName() : null, - tuple.get(examApplication.isLunchChecked), - tuple.get(exam.lunchName), + isLunchChecked, + Boolean.TRUE.equals(isLunchChecked) ? tuple.get(exam.lunchName) : null, subjectNames, tuple.get(exam.schoolName), tuple.get(exam.examDate), @@ -208,6 +209,7 @@ private ApplicationExcelDto mapToExcel(Tuple tuple, Set subjects) { Education education = tuple.get(profile.education); Grade grade = tuple.get(profile.grade); PaymentMethod paymentMethod = tuple.get(payment.paymentMethod); + Boolean isLunchChecked = tuple.get(examApplication.isLunchChecked); String appliedAt = tuple.get(application.createdAt) .format(EXCEL_DT_FORMATTER); @@ -215,16 +217,16 @@ private ApplicationExcelDto mapToExcel(Tuple tuple, Set subjects) { return new ApplicationExcelDto( tuple.get(payment.paymentKey), tuple.get(examApplication.examNumber), - tuple.get(user.name), + tuple.get(profile.userName), gender != null ? gender.getGenderName() : null, - tuple.get(user.birth), + tuple.get(profile.birth), tuple.get(profile.phoneNumber), tuple.get(application.parentPhoneNumber), tuple.get(profile.recommenderPhoneNumber), education != null ? education.getEducationName() : null, tuple.get(profile.schoolInfo.schoolName), grade != null ? grade.getGradeName() : null, - tuple.get(exam.lunchName), + Boolean.TRUE.equals(isLunchChecked) ? tuple.get(exam.lunchName) : null, subjectNames, tuple.get(exam.schoolName), tuple.get(exam.examDate),