From f96e58048b448f3294a4c50d1006efe4eb0dc2b6 Mon Sep 17 00:00:00 2001 From: lsh9672 Date: Tue, 17 Jun 2025 14:21:18 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EC=A3=BC=EB=AC=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EC=A1=B0=ED=9A=8C=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=ED=86=B5=EA=B3=84=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(=EB=A9=94=EB=89=B4=EC=9D=B4=EB=A6=84=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 --- .../biz/service/AnalyticsService.java | 1 - .../hi/analytics/infra/dto/OrderResponse.java | 1 + .../infra/gateway/OrderDataAdapter.java | 10 +++++++- .../java/com/ktds/hi/store/domain/Order.java | 1 + .../infra/gateway/OrderRepositoryAdapter.java | 23 +++++++++++++++---- .../repository/OrderJpaRepository.java | 14 +++++++++++ 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/analytics/src/main/java/com/ktds/hi/analytics/biz/service/AnalyticsService.java b/analytics/src/main/java/com/ktds/hi/analytics/biz/service/AnalyticsService.java index 3a2ceeb..e73938b 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/biz/service/AnalyticsService.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/biz/service/AnalyticsService.java @@ -152,7 +152,6 @@ public class AnalyticsService implements AnalyticsUseCase { log.info("매장 통계 조회 시작: storeId={}, startDate={}, endDate={}", storeId, startDate, endDate); try { - // 1. 캐시 키 생성 // 1. 캐시 키 생성 및 확인 String cacheKey = String.format("statistics:store:%d:%s:%s", storeId, startDate, endDate); var cachedResult = cachePort.getAnalyticsCache(cacheKey); diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/OrderResponse.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/OrderResponse.java index 8467107..db53165 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/OrderResponse.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/OrderResponse.java @@ -16,6 +16,7 @@ public class OrderResponse { private Long id; private Long storeId; private Long menuId; + private String menuName; private Integer customerAge; private String customerGender; private BigDecimal orderAmount; diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/OrderDataAdapter.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/OrderDataAdapter.java index aeb4c47..215df20 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/OrderDataAdapter.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/OrderDataAdapter.java @@ -116,6 +116,14 @@ public class OrderDataAdapter implements OrderDataPort { // 연령대별 분포 계산 Map ageDistribution = calculateCustomerAgeDistribution(orders); + //메뉴명 매핑 + Map menuIdToName = orders.stream() + .collect(Collectors.toMap( + OrderResponse::getMenuId, + OrderResponse::getMenuName, + (existing, replacement) -> existing // 중복시 기존값 유지 + )); + // 인기 메뉴 계산 (메뉴ID별 주문 횟수) - 실제로는 메뉴명을 가져와야 하지만 임시로 메뉴ID 사용 List popularMenus = orders.stream() .collect(Collectors.groupingBy( @@ -125,7 +133,7 @@ public class OrderDataAdapter implements OrderDataPort { .entrySet().stream() .sorted(Map.Entry.comparingByValue().reversed()) .limit(4) - .map(entry -> "메뉴" + entry.getKey()) // 실제로는 메뉴명으로 변환 필요 + .map(entry -> menuIdToName.get(entry.getKey())) // 실제로는 메뉴명으로 변환 필요 .collect(Collectors.toList()); return OrderStatistics.builder() diff --git a/store/src/main/java/com/ktds/hi/store/domain/Order.java b/store/src/main/java/com/ktds/hi/store/domain/Order.java index 19e0d46..0dd29dd 100644 --- a/store/src/main/java/com/ktds/hi/store/domain/Order.java +++ b/store/src/main/java/com/ktds/hi/store/domain/Order.java @@ -14,6 +14,7 @@ public class Order { private Long id; private Long storeId; private Long menuId; + private String menuName; private Integer customerAge; private String customerGender; private BigDecimal orderAmount; diff --git a/store/src/main/java/com/ktds/hi/store/infra/gateway/OrderRepositoryAdapter.java b/store/src/main/java/com/ktds/hi/store/infra/gateway/OrderRepositoryAdapter.java index bb4168a..aab15f6 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/gateway/OrderRepositoryAdapter.java +++ b/store/src/main/java/com/ktds/hi/store/infra/gateway/OrderRepositoryAdapter.java @@ -28,12 +28,27 @@ public class OrderRepositoryAdapter implements OrderRepositoryPort { @Override public List findOrdersByStoreIdAndPeriod(Long storeId, LocalDateTime startDate, LocalDateTime endDate) { - return orderJpaRepository.findByStoreIdAndOrderDateBetween(storeId, startDate, endDate) - .stream() - .map(this::toDomain) - .collect(Collectors.toList()); + + // return orderJpaRepository.findByStoreIdAndOrderDateBetween(storeId, startDate, endDate) + // .stream() + // .map(this::toDomain) + // .collect(Collectors.toList()); + + return orderJpaRepository.findByStoreIdAndOrderDateBetweenWithMenuName(storeId, startDate, endDate) + .stream() + .map(result -> { + OrderEntity entity = (OrderEntity) result[0]; + String menuName = (String) result[1]; + + Order order = this.toDomain(entity); // 기존 toDomain 메서드 활용 + order.setMenuName(menuName); // menuName만 별도로 설정 + return order; + }) + .toList(); } + + @Override public Optional findOrderById(Long orderId) { return orderJpaRepository.findById(orderId) diff --git a/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/OrderJpaRepository.java b/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/OrderJpaRepository.java index 510c732..c3884ba 100644 --- a/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/OrderJpaRepository.java +++ b/store/src/main/java/com/ktds/hi/store/infra/gateway/repository/OrderJpaRepository.java @@ -1,12 +1,16 @@ package com.ktds.hi.store.infra.gateway.repository; +import com.ktds.hi.store.domain.Order; import com.ktds.hi.store.infra.gateway.entity.OrderEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.List; +import io.lettuce.core.dynamic.annotation.Param; + @Repository public interface OrderJpaRepository extends JpaRepository { @@ -17,4 +21,14 @@ public interface OrderJpaRepository extends JpaRepository { LocalDateTime startDate, LocalDateTime endDate ); + + //기간 조회시, 메뉴명을 조회하기 위해서 조인하는 쿼리 + @Query("SELECT o, m.menuName FROM OrderEntity o LEFT JOIN MenuEntity m ON o.menuId = m.id " + + "WHERE o.storeId = :storeId AND o.orderDate BETWEEN :startDate AND :endDate") + List findByStoreIdAndOrderDateBetweenWithMenuName( + @Param("storeId") Long storeId, + @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate + ); + } \ No newline at end of file