From 9128e62356205fd2516e3a1dedcfb98508728bb0 Mon Sep 17 00:00:00 2001 From: lsh9672 Date: Wed, 18 Jun 2025 17:37:16 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EA=B3=A0=EA=B0=9D=EC=9A=A9=20?= =?UTF-8?q?=EB=B6=84=EC=84=9D=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EA=B8=8D?= =?UTF-8?q?=EC=A0=95=20=EC=9A=94=EC=95=BD=20=EB=82=B4=EC=9A=A9=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hi/analytics/biz/domain/AiFeedback.java | 3 ++ .../biz/service/AnalyticsService.java | 7 ++++ .../biz/usecase/in/AnalyticsUseCase.java | 4 +++ .../biz/usecase/out/AIServicePort.java | 8 +++++ .../biz/usecase/out/ExternalReviewPort.java | 8 +++++ .../infra/dto/AiAnalysisResponse.java | 3 ++ .../dto/CustomerPositiveReviewResponse.java | 35 +++++++++++++++++++ .../infra/gateway/AIServiceAdapter.java | 10 +++++- .../gateway/AnalyticsRepositoryAdapter.java | 2 ++ .../infra/gateway/ExternalReviewAdapter.java | 7 +++- .../gateway/entity/AiFeedbackEntity.java | 4 +++ 11 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 analytics/src/main/java/com/ktds/hi/analytics/infra/dto/CustomerPositiveReviewResponse.java diff --git a/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/AiFeedback.java b/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/AiFeedback.java index fd68587..f97689f 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/AiFeedback.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/AiFeedback.java @@ -29,6 +29,9 @@ public class AiFeedback { private List recommendations; private String sentimentAnalysis; private Double confidenceScore; + + private String positiveSummary; + private LocalDateTime generatedAt; private LocalDateTime createdAt; private LocalDateTime updatedAt; 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 c295630..615492b 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 @@ -537,6 +537,7 @@ public class AnalyticsService implements AnalyticsUseCase { .recommendations(aiFeedback.getRecommendations()) .sentimentAnalysis(aiFeedback.getSentimentAnalysis()) .confidenceScore(aiFeedback.getConfidenceScore()) + .positiveSummary(aiFeedback.getPositiveSummary()) .totalReviewsAnalyzed(getTotalReviewsCount(storeId, request.getDays())) .actionPlans(actionPlans) //TODO : 사용하는 값은 아니지만 의존성을 위해 그대로 둠, 추후에 변경 필요. .analyzedAt(aiFeedback.getGeneratedAt()) @@ -581,6 +582,11 @@ public class AnalyticsService implements AnalyticsUseCase { } } + @Override + public CustomerPositiveReviewResponse getCustomerPositiveReview(Long storeId) { + return null; + } + /** * 실제 AI를 호출하는 개선된 피드백 생성 메서드 * 기존 generateAIFeedback()의 하드코딩 부분을 실제 AI 호출로 수정 @@ -613,6 +619,7 @@ public class AnalyticsService implements AnalyticsUseCase { .recommendations(aiFeedback.getRecommendations()) .sentimentAnalysis(aiFeedback.getSentimentAnalysis()) .confidenceScore(aiFeedback.getConfidenceScore()) + .positiveSummary(aiFeedback.getPositiveSummary()) .generatedAt(LocalDateTime.now()) .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) diff --git a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/in/AnalyticsUseCase.java b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/in/AnalyticsUseCase.java index 450c156..a3d85a5 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/in/AnalyticsUseCase.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/in/AnalyticsUseCase.java @@ -46,4 +46,8 @@ public interface AnalyticsUseCase { */ List generateActionPlansFromFeedback(ActionPlanCreateRequest request,Long feedbackId); + + // 🔥 고객용 긍정 리뷰 조회 API 추가 + CustomerPositiveReviewResponse getCustomerPositiveReview(Long storeId); + } diff --git a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/AIServicePort.java b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/AIServicePort.java index e003514..a239354 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/AIServicePort.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/AIServicePort.java @@ -35,4 +35,12 @@ public interface AIServicePort { * 실행 계획 생성 */ List generateActionPlan(List actionPlanSelect, AiFeedback feedback); + + // 🔥 고객용 긍정 리뷰 요약 생성 메서드 추가 + /** + * 긍정적인 리뷰만을 분석하여 고객용 요약 생성 + * @param positiveReviews 긍정적인 리뷰 목록 + * @return 고객에게 보여줄 긍정적인 요약 + */ + String generateCustomerPositiveSummary(List positiveReviews); } diff --git a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ExternalReviewPort.java b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ExternalReviewPort.java index 266bd11..fb51da2 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ExternalReviewPort.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ExternalReviewPort.java @@ -18,6 +18,14 @@ public interface ExternalReviewPort { */ List getRecentReviews(Long storeId, Integer days); + // 🔥 긍정적인 리뷰만 조회하는 메서드 추가 + /** + * 긍정적인 리뷰만 조회 (평점 4점 이상) + * @param storeId 매장 ID + * @param days 조회 기간 (일) + * @return 긍정적인 리뷰 목록 + */ + List getPositiveReviews(Long storeId, Integer days); /** * 리뷰 개수 조회 diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiAnalysisResponse.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiAnalysisResponse.java index 6387aac..49a2edc 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiAnalysisResponse.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiAnalysisResponse.java @@ -43,6 +43,9 @@ public class AiAnalysisResponse { @Schema(description = "감정 분석 결과") private String sentimentAnalysis; + @Schema(description = "긍정 분석 요약") + private String positiveSummary; + @Schema(description = "신뢰도 점수") private Double confidenceScore; diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/CustomerPositiveReviewResponse.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/CustomerPositiveReviewResponse.java new file mode 100644 index 0000000..f0f5927 --- /dev/null +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/CustomerPositiveReviewResponse.java @@ -0,0 +1,35 @@ +package com.ktds.hi.analytics.infra.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 고객용 긍정 리뷰 응답 DTO + */ +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "고객용 긍정 리뷰 응답") +public class CustomerPositiveReviewResponse { + + @Schema(description = "매장 ID") + private Long storeId; + + @Schema(description = "긍정적인 리뷰 요약") + private String positiveSummary; + + + @Schema(description = "분석된 총 리뷰 수") + private Integer totalReviewsAnalyzed; + + @Schema(description = "분석 일시") + private LocalDateTime analyzedAt; +} + diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AIServiceAdapter.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AIServiceAdapter.java index 0de96fa..f58d74d 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AIServiceAdapter.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AIServiceAdapter.java @@ -275,6 +275,11 @@ public class AIServiceAdapter implements AIServicePort { } } + @Override + public String generateCustomerPositiveSummary(List positiveReviews) { + return ""; + } + /** * OpenAI API를 호출하여 전체 리뷰 분석 수행 */ @@ -286,13 +291,14 @@ public class AIServiceAdapter implements AIServicePort { 다음은 한 매장의 고객 리뷰들입니다. 이를 분석하여 다음 JSON 형식으로 답변해주세요: { - "summary": "전체적인 분석 요약(2-3문장)", + "summary": "전체적인 분석 요약(1-2문장)", "positivePoints": ["긍정적 요소1", "긍정적 요소2", "긍정적 요소3"], "negativePoints": ["부정적 요소1", "부정적 요소2", "부정적 요소3"], "improvementPoints": ["개선점1", "개선점2", "개선점3"], "recommendations": ["추천사항1", "추천사항2", "추천사항3"], "sentimentAnalysis": "전체적인 감정 분석 결과", "confidenceScore": 0.85 + "positiveSummary": "리뷰중에 긍정적인 내용만 분석 요약(1~2문장)" } 리뷰 목록: @@ -306,6 +312,7 @@ public class AIServiceAdapter implements AIServicePort { 4. 신뢰도 점수는 0.0-1.0 사이의 값으로 리뷰정보를 보고 적절히 판단. 5. summary에는 전체적인 리뷰 분석에 대한 요약이 잘 담기게 작성하고 **같은 강조하는 문자 없이 텍스트로만 나타내주세요 6. 분석한 내용에 `(백틱) 이 들어가지 않도록 해주세요. + 7. positiveSummary에는 긍정적인 내용만 있어야 합니다, summary에 있는 내용에서 긍정적인 부분만 작성해주세요. """, reviewsText ); @@ -402,6 +409,7 @@ public class AIServiceAdapter implements AIServicePort { .improvementPoints((List) result.get("improvementPoints")) .recommendations((List) result.get("recommendations")) .sentimentAnalysis((String) result.get("sentimentAnalysis")) + .positiveSummary((String) result.get("positiveSummary")) .confidenceScore(((Number) result.get("confidenceScore")).doubleValue()) .generatedAt(LocalDateTime.now()) .build(); diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AnalyticsRepositoryAdapter.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AnalyticsRepositoryAdapter.java index 2eb52c5..e08d601 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AnalyticsRepositoryAdapter.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/AnalyticsRepositoryAdapter.java @@ -109,6 +109,7 @@ public class AnalyticsRepositoryAdapter implements AnalyticsPort { .improvementPoints(parseJsonToList(entity.getImprovementPointsJson())) .recommendations(parseJsonToList(entity.getRecommendationsJson())) .sentimentAnalysis(entity.getSentimentAnalysis()) + .positiveSummary(entity.getPositiveSummary()) .confidenceScore(entity.getConfidenceScore()) .generatedAt(entity.getGeneratedAt()) .createdAt(entity.getCreatedAt()) @@ -128,6 +129,7 @@ public class AnalyticsRepositoryAdapter implements AnalyticsPort { .negativePointsJson(parseListToJson(domain.getNegativePoints())) .improvementPointsJson(parseListToJson(domain.getImprovementPoints())) .recommendationsJson(parseListToJson(domain.getRecommendations())) + .positiveSummary(domain.getPositiveSummary()) .sentimentAnalysis(domain.getSentimentAnalysis()) .confidenceScore(domain.getConfidenceScore()) .generatedAt(domain.getGeneratedAt()) diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ExternalReviewAdapter.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ExternalReviewAdapter.java index 050adc3..df46ee4 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ExternalReviewAdapter.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ExternalReviewAdapter.java @@ -152,7 +152,12 @@ public class ExternalReviewAdapter implements ExternalReviewPort { return getDummyRecentReviews(storeId); } } - + + @Override + public List getPositiveReviews(Long storeId, Integer days) { + return List.of(); + } + @Override public Integer getReviewCount(Long storeId) { log.info("리뷰 개수 조회: storeId={}", storeId); diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/AiFeedbackEntity.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/AiFeedbackEntity.java index 1c14287..ab123da 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/AiFeedbackEntity.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/AiFeedbackEntity.java @@ -57,6 +57,10 @@ public class AiFeedbackEntity { @Column(name = "confidence_score") private Double confidenceScore; + + // 🔥 고객용 긍정 리뷰 요약 컬럼 추가 + @Column(name = "customer_positive_summary", columnDefinition = "TEXT") + private String positiveSummary; @Column(name = "generated_at") private LocalDateTime generatedAt;