From 5f05f4af51ea899459580f929ae31703cb1be5bd Mon Sep 17 00:00:00 2001 From: lsh9672 Date: Tue, 17 Jun 2025 13:47:49 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95(?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=20=EC=8B=A4=ED=96=89=EB=90=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EA=B3=84=ED=9A=8D=EC=9D=B4=20=EC=9E=88=EB=8B=A4?= =?UTF-8?q?=EB=A9=B4=20=ED=8C=A8=EC=8A=A4.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analytics/biz/service/AnalyticsService.java | 14 ++++++++++---- .../biz/usecase/out/ActionPlanPort.java | 5 +++++ .../infra/dto/AiFeedbackDetailResponse.java | 17 +++++++++++++++++ .../gateway/ActionPlanRepositoryAdapter.java | 7 ++++++- .../repository/ActionPlanJpaRepository.java | 9 +++++++++ 5 files changed, 47 insertions(+), 5 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 9c51845..3a2ceeb 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 @@ -115,7 +115,8 @@ public class AnalyticsService implements AnalyticsUseCase { // 2. AI 피드백이 없으면 새로 생성 aiFeedback = Optional.of(generateAIFeedback(storeId)); } - + + // 3. 응답 생성 AiFeedbackDetailResponse response = AiFeedbackDetailResponse.builder() .feedbackId(aiFeedback.get().getId()) @@ -128,6 +129,11 @@ public class AnalyticsService implements AnalyticsUseCase { .confidenceScore(aiFeedback.get().getConfidenceScore()) .generatedAt(aiFeedback.get().getGeneratedAt()) .build(); + + //(추가) 실행계획을 조회해서, 이미 생성된 improvementPoints인지 판단 + List actionPlanTitleList = actionPlanPort.findActionPlanTitleByFeedbackId(aiFeedback.get().getId()); + log.info("실행계획 확인 => {}", actionPlanTitleList.toString()); + response.updateImprovementCheck(actionPlanTitleList); //이미 생성된 실행계획 추가. log.info("AI 피드백 상세 조회 완료: storeId={}", storeId); return response; @@ -492,7 +498,7 @@ public class AnalyticsService implements AnalyticsUseCase { // 3. DB에 실행계획 저장 - saveGeneratedActionPlansToDatabase(feedback, actionPlans); + saveGeneratedActionPlansToDatabase(request.getActionPlanSelect(), feedback, actionPlans); log.info("실행계획 생성 완료: feedbackId={}, planCount={}", feedbackId, actionPlans.size()); return actionPlans; @@ -579,7 +585,7 @@ public class AnalyticsService implements AnalyticsUseCase { * 생성된 실행계획을 데이터베이스에 저장하는 메서드 * AI 피드백 기반으로 생성된 실행계획들을 ActionPlan 테이블에 저장 */ - private void saveGeneratedActionPlansToDatabase(AiFeedback feedback, List actionPlans) { + private void saveGeneratedActionPlansToDatabase(List actionPlanSelect, AiFeedback feedback, List actionPlans) { if (actionPlans.isEmpty()) { log.info("저장할 실행계획이 없습니다: storeId={}", feedback.getStoreId()); return; @@ -596,7 +602,7 @@ public class AnalyticsService implements AnalyticsUseCase { .storeId(feedback.getStoreId()) .userId(0L) // AI가 생성한 계획이므로 userId는 0 .feedbackId(feedback.getId()) - .title("AI 추천 실행계획 " + (i + 1)) + .title(actionPlanSelect.get(i)) .description(planContent) .period("1개월") // 기본 실행 기간 .status(PlanStatus.PLANNED) diff --git a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ActionPlanPort.java b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ActionPlanPort.java index c32556a..89c73f1 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ActionPlanPort.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/biz/usecase/out/ActionPlanPort.java @@ -30,4 +30,9 @@ public interface ActionPlanPort { * 실행 계획 삭제 */ void deleteActionPlan(Long planId); + + /** + * 피드백 id로 실행계획 title 조회 + */ + List findActionPlanTitleByFeedbackId(Long feedbackId); } diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiFeedbackDetailResponse.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiFeedbackDetailResponse.java index edefea4..f0e9080 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiFeedbackDetailResponse.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/dto/AiFeedbackDetailResponse.java @@ -7,6 +7,8 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * AI 피드백 상세 응답 DTO @@ -22,8 +24,23 @@ public class AiFeedbackDetailResponse { private String summary; private List positivePoints; private List improvementPoints; + private List existActionPlan; // improvemnetPoints 중에서 처리 된것. private List recommendations; private String sentimentAnalysis; private Double confidenceScore; private LocalDateTime generatedAt; + + + public void updateImprovementCheck(List actionPlanTitle){ + Set trimmedTitles = actionPlanTitle.stream() + .map(String::trim) + .collect(Collectors.toSet()); + + this.existActionPlan = + improvementPoints.stream() + .map(String::trim) + .filter(point -> trimmedTitles.stream() + .anyMatch(title -> title.contains(point))) + .toList(); + } } diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ActionPlanRepositoryAdapter.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ActionPlanRepositoryAdapter.java index 6f8fb33..2ca3951 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ActionPlanRepositoryAdapter.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/ActionPlanRepositoryAdapter.java @@ -52,7 +52,12 @@ public class ActionPlanRepositoryAdapter implements ActionPlanPort { public void deleteActionPlan(Long planId) { actionPlanJpaRepository.deleteById(planId); } - + + @Override + public List findActionPlanTitleByFeedbackId(Long feedbackId) { + return actionPlanJpaRepository.findActionPlanTitleByFeedbackId(feedbackId); + } + /** * Entity를 Domain으로 변환 */ diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/repository/ActionPlanJpaRepository.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/repository/ActionPlanJpaRepository.java index 4b0a8d8..d486110 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/repository/ActionPlanJpaRepository.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/repository/ActionPlanJpaRepository.java @@ -3,10 +3,13 @@ package com.ktds.hi.analytics.infra.gateway.repository; import com.ktds.hi.analytics.biz.domain.PlanStatus; import com.ktds.hi.analytics.infra.gateway.entity.ActionPlanEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; +import io.lettuce.core.dynamic.annotation.Param; + /** * 실행 계획 JPA 리포지토리 인터페이스 * 실행 계획 데이터의 CRUD 작업을 담당 @@ -33,4 +36,10 @@ public interface ActionPlanJpaRepository extends JpaRepository findByStoreIdAndUserIdOrderByCreatedAtDesc(Long storeId, Long userId); + + /** + * 피드백 id로 실행계획 title 조회 + */ + @Query("SELECT a.title FROM ActionPlanEntity a WHERE a.feedbackId = :feedbackId") + List findActionPlanTitleByFeedbackId(@Param("feedbackId")Long feedbackId); }