From 1e6141a48a9c7ec46cd0f4d5567f13286675c684 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:34:25 +0900 Subject: [PATCH 01/19] =?UTF-8?q?refactor:=20ApiResult=EC=97=90=20error=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20null=EB=A1=9C=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/nowait/common/api/ApiResult.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nowait-common/src/main/java/com/nowait/common/api/ApiResult.java b/nowait-common/src/main/java/com/nowait/common/api/ApiResult.java index 73509f56..17247f42 100644 --- a/nowait-common/src/main/java/com/nowait/common/api/ApiResult.java +++ b/nowait-common/src/main/java/com/nowait/common/api/ApiResult.java @@ -19,7 +19,5 @@ public T getResponse() { return response; } - public ApiError getError() { - return error; - } + // public ApiError getError() { return success ? null : error; } } From de18a50ebda555980e711d1fa26d4c09d0458f42 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:36:05 +0900 Subject: [PATCH 02/19] =?UTF-8?q?chore(build):=20QueryDsl=EC=9D=84=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nowait-domain/domain-core-rdb/build.gradle | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nowait-domain/domain-core-rdb/build.gradle b/nowait-domain/domain-core-rdb/build.gradle index 01bc023b..daa8ad3d 100644 --- a/nowait-domain/domain-core-rdb/build.gradle +++ b/nowait-domain/domain-core-rdb/build.gradle @@ -31,6 +31,12 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-validation' + //QueryDsl + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + // SWAGGER implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0' @@ -38,7 +44,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.26' // Jackson - api 'com.fasterxml.jackson.core:jackson-databind:2.15.2' // Jackson 핵심 + api 'com.fasterxml.jackson.core:jackson-databind:2.15.2' api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' testImplementation 'org.junit.jupiter:junit-jupiter' From ed760cc53cea52e2fc8eb41d1e6fab9ed08694d6 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:38:54 +0900 Subject: [PATCH 03/19] =?UTF-8?q?feat(Order):=20=EB=A7=A4=EC=B6=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EB=A5=BC=20=EC=9C=84=ED=95=9C=20sales=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=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 --- .../order/controller/OrderController.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java index 6c2b845d..fe7144f6 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java @@ -17,6 +17,7 @@ import com.nowait.applicationadmin.order.dto.OrderStatusUpdateResponseDto; import com.nowait.applicationadmin.order.service.OrderService; import com.nowait.common.api.ApiUtils; +import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; import com.nowait.domaincorerdb.user.entity.MemberDetails; import io.swagger.v3.oas.annotations.Operation; @@ -63,4 +64,19 @@ public ResponseEntity updateOrderStatus( .status(HttpStatus.OK) .body(ApiUtils.success(response)); } + + @GetMapping("/sales") + @Operation(summary = "오늘의 매출 조회", description = "오늘의 매출을 조회합니다.") + @ApiResponse(responseCode = "200", description = "오늘의 매출 조회 성공") + public ResponseEntity getTodaySales(@AuthenticationPrincipal MemberDetails memberDetails) { + OrderSalesSumResponse sales = orderService.getSaleSumByStoreId(memberDetails); + + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + sales + ) + ); + } } From acda7bfd72926d1e55052f89bf8e934ea2210a68 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:40:03 +0900 Subject: [PATCH 04/19] =?UTF-8?q?feat(Order):=20=EB=A7=A4=EC=B6=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EB=A5=BC=20=EC=9C=84=ED=95=9C=20getSaleSumBy?= =?UTF-8?q?StoreId=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/service/OrderService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java index 19ec26c7..0e23034e 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java @@ -9,6 +9,7 @@ import com.nowait.applicationadmin.order.dto.OrderResponseDto; import com.nowait.applicationadmin.order.dto.OrderStatusUpdateResponseDto; import com.nowait.common.enums.Role; +import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; import com.nowait.domaincorerdb.order.entity.OrderStatus; import com.nowait.domaincorerdb.order.entity.UserOrder; import com.nowait.domaincorerdb.order.exception.OrderNotFoundException; @@ -56,4 +57,16 @@ public OrderStatusUpdateResponseDto updateOrderStatus(Long orderId, OrderStatus userOrder.updateStatus(newStatus); return OrderStatusUpdateResponseDto.fromEntity(userOrder); } + + @Transactional(readOnly = true) + public OrderSalesSumResponse getSaleSumByStoreId(MemberDetails memberDetails) { + User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); + Long storeId = user.getStoreId(); + + if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) { + throw new OrderViewUnauthorizedException(); + } + + return orderRepository.findSalesSumByStoreId(storeId); + } } From 96b96bb86d37ee81d35531f8c68e67b3574815e7 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:40:19 +0900 Subject: [PATCH 05/19] =?UTF-8?q?feat(Order):=20=EB=A7=A4=EC=B6=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EB=A5=BC=20=EC=9C=84=ED=95=9C=20OrderSalesSu?= =?UTF-8?q?mResponse=20dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/dto/OrderSalesSumResponse.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumResponse.java diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumResponse.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumResponse.java new file mode 100644 index 00000000..5dc279e8 --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumResponse.java @@ -0,0 +1,20 @@ +package com.nowait.domaincorerdb.order.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class OrderSalesSumResponse { + Long storeId; + Integer todaySalesSum; + Integer yesterdaySalesSum; + Integer previousDaySales; + + public OrderSalesSumResponse(Long storeId, Integer todaySalesSum, Integer yesterdaySalesSum, Integer previousDaySales) { + this.storeId = storeId; + this.todaySalesSum = todaySalesSum; + this.yesterdaySalesSum = yesterdaySalesSum; + this.previousDaySales = previousDaySales; + } +} From 26d87dd06a25a38a687995a6b550c68ee98338e4 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:41:09 +0900 Subject: [PATCH 06/19] feat(Order): extends OrderCustomRepository --- .../domaincorerdb/order/repository/OrderRepository.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java index 96db42c4..ff051a83 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java @@ -8,11 +8,9 @@ import com.nowait.domaincorerdb.order.entity.UserOrder; @Repository -public interface OrderRepository extends JpaRepository { +public interface OrderRepository extends JpaRepository, OrderCustomRepository { boolean existsBySignatureAndCreatedAtAfter(String signature, LocalDateTime createdAt); List findByStore_StoreIdAndTableIdAndSessionId(Long storeId, Long tableId, String sessionId); List findAllByStore_StoreId(Long storeId); - - } From 804d127d491008f0a5658fed18a73883d42c7d8b Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:41:32 +0900 Subject: [PATCH 07/19] =?UTF-8?q?feat(Order):=20QueryDsl=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9D=84=20=EC=9C=84=ED=95=9C=20config=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 --- .../domaincorerdb/config/QueryDslConfig.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/config/QueryDslConfig.java diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/config/QueryDslConfig.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/config/QueryDslConfig.java new file mode 100644 index 00000000..f75d497b --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/config/QueryDslConfig.java @@ -0,0 +1,20 @@ +package com.nowait.domaincorerdb.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.querydsl.jpa.impl.JPAQueryFactory; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; + +@Configuration +public class QueryDslConfig { + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} From 33e68c1754576c99166b81e41318cf61a93b50bf Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:41:48 +0900 Subject: [PATCH 08/19] =?UTF-8?q?feat(Order):=20=EB=A7=A4=EC=B6=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20findSalesSumByStoreId=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/OrderCustomRepository.java | 8 ++ .../repository/OrderCustomRepositoryImpl.java | 76 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java create mode 100644 nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java new file mode 100644 index 00000000..c02d1a77 --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java @@ -0,0 +1,8 @@ +package com.nowait.domaincorerdb.order.repository; + +import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; + +public interface OrderCustomRepository { + + OrderSalesSumResponse findSalesSumByStoreId(Long storeId); +} diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java new file mode 100644 index 00000000..c828a64e --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java @@ -0,0 +1,76 @@ +package com.nowait.domaincorerdb.order.repository; + +import static com.nowait.domaincorerdb.order.entity.OrderStatus.*; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; +import com.nowait.domaincorerdb.order.entity.QUserOrder; +import com.querydsl.jpa.impl.JPAQueryFactory; + +public class OrderCustomRepositoryImpl implements OrderCustomRepository { + + private final JPAQueryFactory queryFactory; + + public OrderCustomRepositoryImpl(JPAQueryFactory queryFactory) { + this.queryFactory = queryFactory; + } + + QUserOrder u = QUserOrder.userOrder; + + @Override + public OrderSalesSumResponse findSalesSumByStoreId(Long storeId) { + // 1. 날짜 기준 설정 (시작은 자정, 끝은 다음 날 자정) + LocalDate today = LocalDate.now(); + LocalDate yesterday = today.minusDays(1); + + LocalDateTime todayStart = today.atStartOfDay(); + LocalDateTime todayEnd = today.plusDays(1).atStartOfDay(); // 내일 00:00:00 + + LocalDateTime yesterdayStart = yesterday.atStartOfDay(); + LocalDateTime yesterdayEnd = today.atStartOfDay(); + + // 2. 오늘 매출 합산 + Integer todaySum = queryFactory + .select(u.totalPrice.sum()) + .from(u) + .where( + u.store.storeId.eq(storeId), + u.createdAt.goe(todayStart), + u.createdAt.lt(todayEnd), + u.status.eq(COOKED) + ) + .fetchOne(); + + // 3. 어제 매출 합산 + Integer yesterdaySum = queryFactory + .select(u.totalPrice.sum()) + .from(u) + .where( + u.store.storeId.eq(storeId), + u.createdAt.goe(yesterdayStart), + u.createdAt.lt(yesterdayEnd), + u.status.eq(COOKED) + ) + .fetchOne(); + + Integer previousDaySales = queryFactory + .select(u.totalPrice.sum()) + .from(u) + .where( + u.store.storeId.eq(storeId), + u.createdAt.lt(yesterdayEnd), + u.status.eq(COOKED) + ) + .fetchOne(); + + // null 방어 처리 + if (todaySum == null) todaySum = 0; + if (yesterdaySum == null) yesterdaySum = 0; + if (previousDaySales == null) previousDaySales = 0; + + // 4. 응답 객체 생성 + return new OrderSalesSumResponse(storeId, todaySum, yesterdaySum, previousDaySales); + } +} From f03d1ecd38fa568ad41c42a1fdc5f8fa1955e420 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 15:42:13 +0900 Subject: [PATCH 09/19] =?UTF-8?q?refactor(storepayment):=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StorePaymentController.java | 10 +++++----- .../storePayment/dto/StorePaymentCreateRequest.java | 3 ++- .../storePayment/dto/StorePaymentCreateResponse.java | 2 +- .../storePayment/dto/StorePaymentReadDto.java | 2 +- .../storePayment/dto/StorePaymentUpdateRequest.java | 2 +- .../storePayment/service/StorePaymentService.java | 10 +++++----- .../storePayment/service/StorePaymentServiceImpl.java | 10 +++++----- 7 files changed, 20 insertions(+), 19 deletions(-) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/controller/StorePaymentController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/controller/StorePaymentController.java index df8bc44a..82c1784a 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/controller/StorePaymentController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/controller/StorePaymentController.java @@ -1,4 +1,4 @@ -package com.nowait.applicationadmin.storePayment.controller; +package com.nowait.applicationadmin.storepayment.controller; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -10,10 +10,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateRequest; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateResponse; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentUpdateRequest; -import com.nowait.applicationadmin.storePayment.service.StorePaymentService; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentCreateRequest; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentCreateResponse; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentUpdateRequest; +import com.nowait.applicationadmin.storepayment.service.StorePaymentService; import com.nowait.common.api.ApiUtils; import com.nowait.domaincorerdb.user.entity.MemberDetails; diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateRequest.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateRequest.java index 4a292ce3..13801ccb 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateRequest.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateRequest.java @@ -1,4 +1,5 @@ -package com.nowait.applicationadmin.storePayment.dto; +package com.nowait.applicationadmin.storepayment.dto; + import com.nowait.domaincorerdb.storepayment.entity.StorePayment; diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateResponse.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateResponse.java index 250a6b1f..47bead90 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateResponse.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentCreateResponse.java @@ -1,4 +1,4 @@ -package com.nowait.applicationadmin.storePayment.dto; +package com.nowait.applicationadmin.storepayment.dto; import java.time.LocalDateTime; diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentReadDto.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentReadDto.java index 329d799a..04f2e0f6 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentReadDto.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentReadDto.java @@ -1,4 +1,4 @@ -package com.nowait.applicationadmin.storePayment.dto; +package com.nowait.applicationadmin.storepayment.dto; import java.time.LocalDateTime; diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentUpdateRequest.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentUpdateRequest.java index 71f4c979..50320aab 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentUpdateRequest.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/dto/StorePaymentUpdateRequest.java @@ -1,4 +1,4 @@ -package com.nowait.applicationadmin.storePayment.dto; +package com.nowait.applicationadmin.storepayment.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentService.java index b0324dab..4cf3c76f 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentService.java @@ -1,9 +1,9 @@ -package com.nowait.applicationadmin.storePayment.service; +package com.nowait.applicationadmin.storepayment.service; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateRequest; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateResponse; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentReadDto; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentUpdateRequest; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentCreateRequest; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentCreateResponse; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentReadDto; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentUpdateRequest; import com.nowait.domaincorerdb.user.entity.MemberDetails; public interface StorePaymentService { diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentServiceImpl.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentServiceImpl.java index 5eb6fbca..ff95015d 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentServiceImpl.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/storePayment/service/StorePaymentServiceImpl.java @@ -1,12 +1,12 @@ -package com.nowait.applicationadmin.storePayment.service; +package com.nowait.applicationadmin.storepayment.service; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateRequest; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentCreateResponse; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentReadDto; -import com.nowait.applicationadmin.storePayment.dto.StorePaymentUpdateRequest; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentCreateRequest; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentCreateResponse; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentReadDto; +import com.nowait.applicationadmin.storepayment.dto.StorePaymentUpdateRequest; import com.nowait.common.enums.Role; import com.nowait.domaincorerdb.storepayment.entity.StorePayment; import com.nowait.domaincorerdb.storepayment.exception.StorePaymentAlreadyExistsException; From 2ded7120e5a822a2e35a9f6c2b4826294aaa46a3 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Mon, 14 Jul 2025 16:31:48 +0900 Subject: [PATCH 10/19] =?UTF-8?q?refactor(UserOrder):=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/controller/OrderController.java | 88 +++++++++---------- .../order/service/OrderService.java | 19 ++-- ...Response.java => OrderSalesSumDetail.java} | 5 +- .../repository/OrderCustomRepository.java | 4 +- .../repository/OrderCustomRepositoryImpl.java | 6 +- .../order/repository/OrderRepository.java | 4 +- 6 files changed, 64 insertions(+), 62 deletions(-) rename nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/{OrderSalesSumResponse.java => OrderSalesSumDetail.java} (69%) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java index fe7144f6..23649fb0 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java @@ -17,7 +17,7 @@ import com.nowait.applicationadmin.order.dto.OrderStatusUpdateResponseDto; import com.nowait.applicationadmin.order.service.OrderService; import com.nowait.common.api.ApiUtils; -import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; +import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; import com.nowait.domaincorerdb.user.entity.MemberDetails; import io.swagger.v3.oas.annotations.Operation; @@ -32,51 +32,51 @@ @RequiredArgsConstructor public class OrderController { - private final OrderService orderService; + private final OrderService orderService; - @GetMapping("/{storeId}") - @Operation(summary = "주점별 주문리스트 조회", description = "특정 주점에 대한 예약리스트 조회") - @ApiResponse(responseCode = "200", description = "주리스트 조회") - public ResponseEntity getOrderListByStoreId(@PathVariable Long storeId, - @AuthenticationPrincipal MemberDetails memberDetails) { - List response = orderService.findAllOrders(storeId,memberDetails); - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - response - ) - ); - } + @GetMapping("/{storeId}") + @Operation(summary = "주점별 주문리스트 조회", description = "특정 주점에 대한 예약리스트 조회") + @ApiResponse(responseCode = "200", description = "주리스트 조회") + public ResponseEntity getOrderListByStoreId(@PathVariable Long storeId, + @AuthenticationPrincipal MemberDetails memberDetails) { + List response = orderService.findAllOrders(storeId, memberDetails); + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + response + ) + ); + } - @PatchMapping("/status/{orderId}") - @Operation(summary = "주문 상태 변경", description = "특정 주문의 상태를 변경.") - @ApiResponse(responseCode = "200", description = "주문 상태 변경 성공") - @ApiResponse(responseCode = "400", description = "주문을 찾을 수 없음") - public ResponseEntity updateOrderStatus( - @PathVariable Long orderId, - @RequestBody@Valid OrderStatusUpdateRequestDto requestDto, - @AuthenticationPrincipal MemberDetails memberDetails - ) { - OrderStatusUpdateResponseDto response = orderService.updateOrderStatus( - orderId,requestDto.getOrderStatus(),memberDetails); - return ResponseEntity - .status(HttpStatus.OK) - .body(ApiUtils.success(response)); - } + @PatchMapping("/status/{orderId}") + @Operation(summary = "주문 상태 변경", description = "특정 주문의 상태를 변경.") + @ApiResponse(responseCode = "200", description = "주문 상태 변경 성공") + @ApiResponse(responseCode = "400", description = "주문을 찾을 수 없음") + public ResponseEntity updateOrderStatus( + @PathVariable Long orderId, + @RequestBody @Valid OrderStatusUpdateRequestDto requestDto, + @AuthenticationPrincipal MemberDetails memberDetails + ) { + OrderStatusUpdateResponseDto response = orderService.updateOrderStatus( + orderId, requestDto.getOrderStatus(), memberDetails); + return ResponseEntity + .status(HttpStatus.OK) + .body(ApiUtils.success(response)); + } - @GetMapping("/sales") - @Operation(summary = "오늘의 매출 조회", description = "오늘의 매출을 조회합니다.") - @ApiResponse(responseCode = "200", description = "오늘의 매출 조회 성공") - public ResponseEntity getTodaySales(@AuthenticationPrincipal MemberDetails memberDetails) { - OrderSalesSumResponse sales = orderService.getSaleSumByStoreId(memberDetails); + @GetMapping("/sales") + @Operation(summary = "오늘의 매출 조회", description = "오늘의 매출을 조회합니다.") + @ApiResponse(responseCode = "200", description = "오늘의 매출 조회 성공") + public ResponseEntity getTodaySales(@AuthenticationPrincipal MemberDetails memberDetails) { + OrderSalesSumDetail sales = orderService.getSaleSumByStoreId(memberDetails); - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - sales - ) - ); - } + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + sales + ) + ); + } } diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java index 0e23034e..3065b77e 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java @@ -9,7 +9,7 @@ import com.nowait.applicationadmin.order.dto.OrderResponseDto; import com.nowait.applicationadmin.order.dto.OrderStatusUpdateResponseDto; import com.nowait.common.enums.Role; -import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; +import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; import com.nowait.domaincorerdb.order.entity.OrderStatus; import com.nowait.domaincorerdb.order.entity.UserOrder; import com.nowait.domaincorerdb.order.exception.OrderNotFoundException; @@ -34,13 +34,13 @@ public class OrderService { @Transactional(readOnly = true) public List findAllOrders(Long storeId, MemberDetails memberDetails) { - User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); - storeRepository.findByStoreIdAndDeletedFalse(storeId) - .orElseThrow(StoreNotFoundException::new); + User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); + storeRepository.findByStoreIdAndDeletedFalse(storeId).orElseThrow(StoreNotFoundException::new); if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) { throw new OrderViewUnauthorizedException(); } - return orderRepository.findAllByStore_StoreId(storeId).stream() + return orderRepository.findAllByStore_StoreId(storeId) + .stream() .map(OrderResponseDto::fromEntity) .collect(Collectors.toList()); } @@ -48,9 +48,8 @@ public List findAllOrders(Long storeId, MemberDetails memberDe @Transactional public OrderStatusUpdateResponseDto updateOrderStatus(Long orderId, OrderStatus newStatus, MemberDetails memberDetails) { - User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); - UserOrder userOrder = orderRepository.findById(orderId) - .orElseThrow(OrderNotFoundException::new); + User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); + UserOrder userOrder = orderRepository.findById(orderId).orElseThrow(OrderNotFoundException::new); if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(userOrder.getStore().getStoreId())) { throw new OrderUpdateUnauthorizedException(); } @@ -59,8 +58,8 @@ public OrderStatusUpdateResponseDto updateOrderStatus(Long orderId, OrderStatus } @Transactional(readOnly = true) - public OrderSalesSumResponse getSaleSumByStoreId(MemberDetails memberDetails) { - User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); + public OrderSalesSumDetail getSaleSumByStoreId(MemberDetails memberDetails) { + User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); Long storeId = user.getStoreId(); if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) { diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumResponse.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java similarity index 69% rename from nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumResponse.java rename to nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java index 5dc279e8..ddbff760 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumResponse.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java @@ -5,13 +5,14 @@ @Getter @Builder -public class OrderSalesSumResponse { +public class OrderSalesSumDetail { Long storeId; Integer todaySalesSum; Integer yesterdaySalesSum; Integer previousDaySales; - public OrderSalesSumResponse(Long storeId, Integer todaySalesSum, Integer yesterdaySalesSum, Integer previousDaySales) { + public OrderSalesSumDetail(Long storeId, Integer todaySalesSum, Integer yesterdaySalesSum, + Integer previousDaySales) { this.storeId = storeId; this.todaySalesSum = todaySalesSum; this.yesterdaySalesSum = yesterdaySalesSum; diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java index c02d1a77..b3f79a1c 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java @@ -1,8 +1,8 @@ package com.nowait.domaincorerdb.order.repository; -import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; +import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; public interface OrderCustomRepository { - OrderSalesSumResponse findSalesSumByStoreId(Long storeId); + OrderSalesSumDetail findSalesSumByStoreId(Long storeId); } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java index c828a64e..12ccb2ee 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java @@ -5,7 +5,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; -import com.nowait.domaincorerdb.order.dto.OrderSalesSumResponse; +import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; import com.nowait.domaincorerdb.order.entity.QUserOrder; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -20,7 +20,7 @@ public OrderCustomRepositoryImpl(JPAQueryFactory queryFactory) { QUserOrder u = QUserOrder.userOrder; @Override - public OrderSalesSumResponse findSalesSumByStoreId(Long storeId) { + public OrderSalesSumDetail findSalesSumByStoreId(Long storeId) { // 1. 날짜 기준 설정 (시작은 자정, 끝은 다음 날 자정) LocalDate today = LocalDate.now(); LocalDate yesterday = today.minusDays(1); @@ -71,6 +71,6 @@ public OrderSalesSumResponse findSalesSumByStoreId(Long storeId) { if (previousDaySales == null) previousDaySales = 0; // 4. 응답 객체 생성 - return new OrderSalesSumResponse(storeId, todaySum, yesterdaySum, previousDaySales); + return new OrderSalesSumDetail(storeId, todaySum, yesterdaySum, previousDaySales); } } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java index ff051a83..54c2b7b6 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java @@ -7,10 +7,12 @@ import org.springframework.stereotype.Repository; import com.nowait.domaincorerdb.order.entity.UserOrder; + @Repository -public interface OrderRepository extends JpaRepository, OrderCustomRepository { +public interface OrderRepository extends JpaRepository, OrderCustomRepository { boolean existsBySignatureAndCreatedAtAfter(String signature, LocalDateTime createdAt); List findByStore_StoreIdAndTableIdAndSessionId(Long storeId, Long tableId, String sessionId); + List findAllByStore_StoreId(Long storeId); } From 7cbf0d0b2b05f1aa213b7962534de8f9bc474c5a Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 17:35:35 +0900 Subject: [PATCH 11/19] =?UTF-8?q?feat(UserOrder):=20=EB=A7=A4=EC=B6=9C=20?= =?UTF-8?q?=EC=88=9C=EC=9C=84=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/controller/OrderController.java | 14 ++ .../order/service/OrderService.java | 13 ++ .../order/dto/TopSalesStoresDetail.java | 25 +++ .../repository/OrderCustomRepository.java | 5 + .../repository/OrderCustomRepositoryImpl.java | 186 +++++++++++++++++- 5 files changed, 240 insertions(+), 3 deletions(-) create mode 100644 nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/TopSalesStoresDetail.java diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java index 23649fb0..0826eb47 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java @@ -18,6 +18,7 @@ import com.nowait.applicationadmin.order.service.OrderService; import com.nowait.common.api.ApiUtils; import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; +import com.nowait.domaincorerdb.order.dto.TopSalesStoresDetail; import com.nowait.domaincorerdb.user.entity.MemberDetails; import io.swagger.v3.oas.annotations.Operation; @@ -79,4 +80,17 @@ public ResponseEntity getTodaySales(@AuthenticationPrincipal MemberDetails me ) ); } + + @GetMapping("/top-sales") + public ResponseEntity getTopSalesStores(@AuthenticationPrincipal MemberDetails memberDetails) { + List topSalesStoresDetail = orderService.getTop5StoresBySalesToday(memberDetails); + + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + topSalesStoresDetail + ) + ); + } } diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java index 3065b77e..c0d3db14 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java @@ -10,6 +10,7 @@ import com.nowait.applicationadmin.order.dto.OrderStatusUpdateResponseDto; import com.nowait.common.enums.Role; import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; +import com.nowait.domaincorerdb.order.dto.TopSalesStoresDetail; import com.nowait.domaincorerdb.order.entity.OrderStatus; import com.nowait.domaincorerdb.order.entity.UserOrder; import com.nowait.domaincorerdb.order.exception.OrderNotFoundException; @@ -68,4 +69,16 @@ public OrderSalesSumDetail getSaleSumByStoreId(MemberDetails memberDetails) { return orderRepository.findSalesSumByStoreId(storeId); } + + @Transactional(readOnly = true) + public List getTop5StoresBySalesToday(MemberDetails memberDetails) { + User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); + Long storeId = user.getStoreId(); + + if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) { + throw new OrderViewUnauthorizedException(); + } + + return orderRepository.getTop4PlusMine(storeId); + } } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/TopSalesStoresDetail.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/TopSalesStoresDetail.java new file mode 100644 index 00000000..acc0d2d3 --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/TopSalesStoresDetail.java @@ -0,0 +1,25 @@ +package com.nowait.domaincorerdb.order.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class TopSalesStoresDetail { + private Long storeId; + private String storeName; + private Long departmentId; + private String departmentName; + private Integer totalSales; + private Long storeRank; + + public TopSalesStoresDetail(Long storeId, String storeName, Long departmentId, String departmentName, Integer totalSales, + Long storeRank) { + this.storeId = storeId; + this.storeName = storeName; + this.departmentId = departmentId; + this.departmentName = departmentName; + this.totalSales = totalSales; + this.storeRank = storeRank; + } +} diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java index b3f79a1c..77d2747d 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepository.java @@ -1,8 +1,13 @@ package com.nowait.domaincorerdb.order.repository; +import java.util.List; + import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; +import com.nowait.domaincorerdb.order.dto.TopSalesStoresDetail; public interface OrderCustomRepository { OrderSalesSumDetail findSalesSumByStoreId(Long storeId); + + List getTop4PlusMine(Long storeId); } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java index 12ccb2ee..c2c2d1c9 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java @@ -4,9 +4,20 @@ import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import com.nowait.domaincorerdb.department.entity.QDepartment; import com.nowait.domaincorerdb.order.dto.OrderSalesSumDetail; +import com.nowait.domaincorerdb.order.dto.TopSalesStoresDetail; import com.nowait.domaincorerdb.order.entity.QUserOrder; +import com.nowait.domaincorerdb.store.entity.QStore; +import com.querydsl.core.Tuple; import com.querydsl.jpa.impl.JPAQueryFactory; public class OrderCustomRepositoryImpl implements OrderCustomRepository { @@ -18,6 +29,8 @@ public OrderCustomRepositoryImpl(JPAQueryFactory queryFactory) { } QUserOrder u = QUserOrder.userOrder; + QStore s = QStore.store; + QDepartment d = QDepartment.department; @Override public OrderSalesSumDetail findSalesSumByStoreId(Long storeId) { @@ -66,11 +79,178 @@ public OrderSalesSumDetail findSalesSumByStoreId(Long storeId) { .fetchOne(); // null 방어 처리 - if (todaySum == null) todaySum = 0; - if (yesterdaySum == null) yesterdaySum = 0; - if (previousDaySales == null) previousDaySales = 0; + if (todaySum == null) + todaySum = 0; + if (yesterdaySum == null) + yesterdaySum = 0; + if (previousDaySales == null) + previousDaySales = 0; // 4. 응답 객체 생성 return new OrderSalesSumDetail(storeId, todaySum, yesterdaySum, previousDaySales); } + + @Override + public List getTop4PlusMine(Long userStoreId) { + LocalDate today = LocalDate.now(); + LocalDateTime todayStart = today.atStartOfDay(); + LocalDateTime todayEnd = today.plusDays(1).atStartOfDay(); // 내일 00:00:00 + + // 1. 전체 주점 및 순위 맵 + List allStores = getAllStores(todayStart, todayEnd); + Map rankMap = getRankMap(allStores); + + // 2. 내 주점의 순위가 5위 이하인지 확인 + Integer userRank = rankMap.get(userStoreId); + + // 3. 상위 5개 주점 조회 (내 주점 포함 여부는 나중에 확인) + List result = getTopNStores(allStores, rankMap, 5); + Set already = result.stream() + .map(TopSalesStoresDetail::getStoreId) + .collect(Collectors.toSet()); + + // 4. 내 주점 추가 (내 주점이 포함되지 않으면 추가) + TopSalesStoresDetail myStore = getMyStoreDetail(allStores, rankMap, userStoreId); + if (myStore == null) + myStore = getZeroSalesStore(userStoreId); + + if (myStore != null && !already.contains(userStoreId)) { + // 내 주점이 5위 이하로 밀린 경우 + if (userRank > 5) { + result = result.stream() + .sorted(Comparator.comparing(TopSalesStoresDetail::getStoreRank, + Comparator.nullsLast(Comparator.naturalOrder()))) + .limit(4) + .collect(Collectors.toList()); + // 5위 자리에 내 주점 추가하고 나머지 4개만 보여줌 + result.add(myStore); + } + } + + // 5. 결과가 6개가 되지 않도록 자르고 5개로 제한 + result = result.stream() + .sorted(Comparator.comparing(TopSalesStoresDetail::getStoreRank, + Comparator.nullsLast(Comparator.naturalOrder()))) + .collect(Collectors.toList()); + + return result; + } + + private List getAllStores(LocalDateTime todayStart, LocalDateTime todayEnd) { + return queryFactory + .select(u.store.storeId, u.store.name, u.store.departmentId, u.totalPrice.sum()) + .from(u) + .where( + u.createdAt.goe(todayStart), + u.createdAt.lt(todayEnd), + u.status.eq(COOKED) + ) + .groupBy(u.store.storeId, u.store.name, u.store.departmentId) + .orderBy(u.totalPrice.sum().desc()) + .fetch(); + } + + private Map getRankMap(List allStores) { + Map rankMap = new HashMap<>(); + int rank = 1; + for (Tuple t : allStores) { + rankMap.put(t.get(u.store.storeId), rank++); + } + return rankMap; + } + + private List getTopNStores(List allStores, Map rankMap, int n) { + // 1. departmentId 목록을 추출 + Set departmentIds = allStores.stream() + .map(t -> t.get(u.store.departmentId)) + .collect(Collectors.toSet()); + + // 2. departmentId에 대한 학과 이름을 한번에 가져오기 + Map departmentNameMap = getDepartmentNames(departmentIds); + + List list = new ArrayList<>(); + for (int i = 0; i < Math.min(n, allStores.size()); i++) { + Tuple t = allStores.get(i); + Long storeId = t.get(u.store.storeId); + String storeName = t.get(u.store.name); + Long departmentId = t.get(u.store.departmentId); + + // 학과 이름 가져오기 + String departmentName = departmentNameMap.getOrDefault(departmentId, "Unknown"); + + list.add(new TopSalesStoresDetail( + storeId, + storeName, + t.get(u.store.departmentId), + departmentName, + t.get(u.totalPrice.sum()), + rankMap.get(storeId).longValue() + )); + } + return list; + } + + private TopSalesStoresDetail getMyStoreDetail(List allStores, Map rankMap, Long userStoreId) { + Tuple myStore = allStores.stream() + .filter(t -> t.get(u.store.storeId).equals(userStoreId)) + .findFirst() + .orElse(null); + + Long departmentId = myStore.get(u.store.departmentId); + + // departmentId에 대한 학과 이름을 한번에 가져오기 + Map departmentNameMap = getDepartmentNames(Set.of(departmentId)); + String departmentName = departmentNameMap.getOrDefault(departmentId, "Unknown"); + + if (myStore == null) + return null; + Long storeId = myStore.get(u.store.storeId); + return new TopSalesStoresDetail( + storeId, + myStore.get(u.store.name), + myStore.get(u.store.departmentId), + departmentName, + myStore.get(u.totalPrice.sum()), + rankMap.get(storeId).longValue() + ); + } + + private TopSalesStoresDetail getZeroSalesStore(Long userStoreId) { + Tuple zeroTuple = queryFactory + .select(s.storeId, s.name, s.departmentId) + .from(s) + .where(s.storeId.eq(userStoreId)) + .fetchOne(); + + Long departmentId = zeroTuple.get(u.store.departmentId); + // departmentId에 대한 학과 이름을 한번에 가져오기 + Map departmentNameMap = getDepartmentNames(Set.of(departmentId)); + String departmentName = departmentNameMap.getOrDefault(departmentId, "Unknown"); + + if (zeroTuple == null) + return null; + return new TopSalesStoresDetail( + zeroTuple.get(s.storeId), + zeroTuple.get(s.name), + zeroTuple.get(s.departmentId), + departmentName, + 0, + null + ); + } + + // 한 번에 학과 이름을 가져오는 메서드 + private Map getDepartmentNames(Set departmentIds) { + List departmentTuples = queryFactory + .select(d.Id, d.name) + .from(d) + .where(d.Id.in(departmentIds)) + .fetch(); + + Map departmentNameMap = new HashMap<>(); + for (Tuple t : departmentTuples) { + departmentNameMap.put(t.get(d.Id), t.get(d.name)); + } + return departmentNameMap; + } } From 66e4f3fb41c4ca01df6bb538c677947c212e8d80 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 17:36:02 +0900 Subject: [PATCH 12/19] =?UTF-8?q?feat(Department):=20=ED=95=99=EA=B3=BC=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=9C=84=ED=95=9C=20department?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../department/entity/Department.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java new file mode 100644 index 00000000..59838165 --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java @@ -0,0 +1,24 @@ +package com.nowait.domaincorerdb.department.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "departments") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class Department { + + @Id + private Long Id; + + @Column(nullable = false) + private String name; +} From 20ffe4bf106bf5f78ed82540145c92fbcf4c22bc Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 19:58:24 +0900 Subject: [PATCH 13/19] =?UTF-8?q?feat:=20Redis=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nowait-domain/domain-redis/build.gradle | 36 +++++++++++++++++ .../domaincoreredis/config/RedisConfig.java | 40 +++++++++++++++++++ .../service/StoreRankCacheService.java | 10 +++++ settings.gradle | 1 + 4 files changed, 87 insertions(+) create mode 100644 nowait-domain/domain-redis/build.gradle create mode 100644 nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/config/RedisConfig.java create mode 100644 nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/service/StoreRankCacheService.java diff --git a/nowait-domain/domain-redis/build.gradle b/nowait-domain/domain-redis/build.gradle new file mode 100644 index 00000000..8a6470e6 --- /dev/null +++ b/nowait-domain/domain-redis/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'java-library' +} + +jar { + enabled = true +} + + +group = 'com.nowait' +version = rootProject.version + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':nowait-common') + + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + // SWAGGER + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0' + + compileOnly 'org.projectlombok:lombok:1.18.26' + annotationProcessor 'org.projectlombok:lombok:1.18.26' + + testImplementation 'org.junit.jupiter:junit-jupiter' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' +} diff --git a/nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/config/RedisConfig.java b/nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/config/RedisConfig.java new file mode 100644 index 00000000..57e8b919 --- /dev/null +++ b/nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/config/RedisConfig.java @@ -0,0 +1,40 @@ +package com.nowait.domaincoreredis.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + @Value("${spring.data.redis.host}") + private String host; + + @Value("${spring.data.redis.port}") + private int port; + + @Bean + public RedisConnectionFactory redisConnectionFactory() { + return new LettuceConnectionFactory(host, port); + } + + @Bean + public RedisTemplate redisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + + redisTemplate.setConnectionFactory(redisConnectionFactory()); + + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new StringRedisSerializer()); + + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(new StringRedisSerializer()); + + redisTemplate.setDefaultSerializer(new StringRedisSerializer()); + + return redisTemplate; + } +} diff --git a/nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/service/StoreRankCacheService.java b/nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/service/StoreRankCacheService.java new file mode 100644 index 00000000..444aedcf --- /dev/null +++ b/nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/service/StoreRankCacheService.java @@ -0,0 +1,10 @@ +package com.nowait.domaincoreredis.service; + +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +@Service +public class StoreRankCacheService { + + private RedisTemplate redisTemplate; +} diff --git a/settings.gradle b/settings.gradle index 24f20718..89991c90 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,4 +6,5 @@ include 'nowait-common' include 'nowait-domain:domain-core-rdb' include 'nowait-domain:domain-admin-rdb' include 'nowait-domain:domain-user-rdb' +include 'nowait-domain:domain-redis' include 'nowait-infra' From fdc23dce470d53628a6ba82c45fb235b91a47001 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 20:16:48 +0900 Subject: [PATCH 14/19] =?UTF-8?q?refactor(Department):=20Java=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EC=BB=A8=EB=B2=A4=EC=85=98=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EA=B2=8C=20=EB=B3=80=EC=88=98=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/nowait/domaincorerdb/department/entity/Department.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java index 59838165..51c54577 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/department/entity/Department.java @@ -17,7 +17,7 @@ public class Department { @Id - private Long Id; + private Long id; @Column(nullable = false) private String name; From 4707bf5c475e36d4be94e348d51c637fd9cea267 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 20:17:55 +0900 Subject: [PATCH 15/19] =?UTF-8?q?refactor:=20private=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=20=EC=A0=9C=ED=95=9C=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domaincorerdb/order/dto/OrderSalesSumDetail.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java index ddbff760..a3688ab2 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java @@ -6,10 +6,10 @@ @Getter @Builder public class OrderSalesSumDetail { - Long storeId; - Integer todaySalesSum; - Integer yesterdaySalesSum; - Integer previousDaySales; + private Long storeId; + private Integer todaySalesSum; + private Integer yesterdaySalesSum; + private Integer previousDaySales; public OrderSalesSumDetail(Long storeId, Integer todaySalesSum, Integer yesterdaySalesSum, Integer previousDaySales) { From 125ffc26acabe520ea6e8fd79622e8f2be2e9d9f Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 20:18:40 +0900 Subject: [PATCH 16/19] =?UTF-8?q?refactor(UserOrder):=20=EC=8A=A4=EC=9B=A8?= =?UTF-8?q?=EA=B1=B0=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applicationadmin/order/controller/OrderController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java index 0826eb47..16246fbc 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java @@ -82,6 +82,8 @@ public ResponseEntity getTodaySales(@AuthenticationPrincipal MemberDetails me } @GetMapping("/top-sales") + @Operation(summary = "오늘의 매출 상위 5개 주점 조회", description = "오늘의 매출이 가장 높은 상위 5개 주점을 조회합니다.") + @ApiResponse(responseCode = "200", description = "오늘의 매출 상위 5개 주점 조회 성공") public ResponseEntity getTopSalesStores(@AuthenticationPrincipal MemberDetails memberDetails) { List topSalesStoresDetail = orderService.getTop5StoresBySalesToday(memberDetails); From 1ec1a60e03f6c1b73aff4e830ad9c67d4aeb1613 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 20:20:32 +0900 Subject: [PATCH 17/19] =?UTF-8?q?refactor(UserOrder):=20null=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20=EC=A0=84=EC=97=90=20zeroTuple=EC=9D=84=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20NullPointerException=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/repository/OrderCustomRepositoryImpl.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java index c2c2d1c9..18b7e5eb 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java @@ -28,9 +28,9 @@ public OrderCustomRepositoryImpl(JPAQueryFactory queryFactory) { this.queryFactory = queryFactory; } - QUserOrder u = QUserOrder.userOrder; - QStore s = QStore.store; - QDepartment d = QDepartment.department; + private static final QUserOrder u = QUserOrder.userOrder; + private static final QStore s = QStore.store; + private static final QDepartment d = QDepartment.department; @Override public OrderSalesSumDetail findSalesSumByStoreId(Long storeId) { @@ -222,13 +222,14 @@ private TopSalesStoresDetail getZeroSalesStore(Long userStoreId) { .where(s.storeId.eq(userStoreId)) .fetchOne(); + if (zeroTuple == null) + return null; + Long departmentId = zeroTuple.get(u.store.departmentId); // departmentId에 대한 학과 이름을 한번에 가져오기 Map departmentNameMap = getDepartmentNames(Set.of(departmentId)); String departmentName = departmentNameMap.getOrDefault(departmentId, "Unknown"); - if (zeroTuple == null) - return null; return new TopSalesStoresDetail( zeroTuple.get(s.storeId), zeroTuple.get(s.name), From 82616029e03c9596422f879c6774b96e32070ae8 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 20:23:42 +0900 Subject: [PATCH 18/19] =?UTF-8?q?refactor(UserOrder):=20=EB=88=84=EC=A0=81?= =?UTF-8?q?=EB=A7=A4=EC=B6=9C=EC=97=90=20=EB=A7=9E=EB=8A=94=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=AA=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/dto/OrderSalesSumDetail.java | 6 +++--- .../repository/OrderCustomRepositoryImpl.java | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java index a3688ab2..fe3b25ee 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/dto/OrderSalesSumDetail.java @@ -9,13 +9,13 @@ public class OrderSalesSumDetail { private Long storeId; private Integer todaySalesSum; private Integer yesterdaySalesSum; - private Integer previousDaySales; + private Integer cumulativeSalesBeforeYesterday; public OrderSalesSumDetail(Long storeId, Integer todaySalesSum, Integer yesterdaySalesSum, - Integer previousDaySales) { + Integer cumulativeSalesBeforeYesterday) { this.storeId = storeId; this.todaySalesSum = todaySalesSum; this.yesterdaySalesSum = yesterdaySalesSum; - this.previousDaySales = previousDaySales; + this.cumulativeSalesBeforeYesterday = cumulativeSalesBeforeYesterday; } } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java index 18b7e5eb..d97167a9 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java @@ -68,7 +68,7 @@ public OrderSalesSumDetail findSalesSumByStoreId(Long storeId) { ) .fetchOne(); - Integer previousDaySales = queryFactory + Integer cumulativeSalesBeforeYesterday = queryFactory .select(u.totalPrice.sum()) .from(u) .where( @@ -83,11 +83,11 @@ public OrderSalesSumDetail findSalesSumByStoreId(Long storeId) { todaySum = 0; if (yesterdaySum == null) yesterdaySum = 0; - if (previousDaySales == null) - previousDaySales = 0; + if (cumulativeSalesBeforeYesterday == null) + cumulativeSalesBeforeYesterday = 0; // 4. 응답 객체 생성 - return new OrderSalesSumDetail(storeId, todaySum, yesterdaySum, previousDaySales); + return new OrderSalesSumDetail(storeId, todaySum, yesterdaySum, cumulativeSalesBeforeYesterday); } @Override @@ -243,14 +243,14 @@ private TopSalesStoresDetail getZeroSalesStore(Long userStoreId) { // 한 번에 학과 이름을 가져오는 메서드 private Map getDepartmentNames(Set departmentIds) { List departmentTuples = queryFactory - .select(d.Id, d.name) + .select(d.id, d.name) .from(d) - .where(d.Id.in(departmentIds)) + .where(d.id.in(departmentIds)) .fetch(); Map departmentNameMap = new HashMap<>(); for (Tuple t : departmentTuples) { - departmentNameMap.put(t.get(d.Id), t.get(d.name)); + departmentNameMap.put(t.get(d.id), t.get(d.name)); } return departmentNameMap; } From e7455508fd3b82148ce4c91ae49b8883cf20b95f Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 15 Jul 2025 20:24:49 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refactor(UserOrder):=20null=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20=EC=A0=84=EC=97=90=20myStore=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20NullPointerException=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/repository/OrderCustomRepositoryImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java index d97167a9..341940bb 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderCustomRepositoryImpl.java @@ -196,14 +196,15 @@ private TopSalesStoresDetail getMyStoreDetail(List allStores, Map departmentNameMap = getDepartmentNames(Set.of(departmentId)); String departmentName = departmentNameMap.getOrDefault(departmentId, "Unknown"); - if (myStore == null) - return null; Long storeId = myStore.get(u.store.storeId); return new TopSalesStoresDetail( storeId,