diff --git a/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/ActionPlan.java b/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/ActionPlan.java index 2cf1d96..2a24702 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/ActionPlan.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/biz/domain/ActionPlan.java @@ -21,6 +21,7 @@ public class ActionPlan { private Long id; private Long storeId; private Long userId; + private Long feedbackId; private String title; private String description; private String period; 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 3caffa1..9c51845 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 @@ -444,9 +444,10 @@ public class AnalyticsService implements AnalyticsUseCase { // 2. 실행계획 생성 (요청 시) List actionPlans = null; - if (Boolean.TRUE.equals(request.getGenerateActionPlan())) { - actionPlans = aiServicePort.generateActionPlan(aiFeedback); - } + //TODO : 추후에 AI 분석후에 바로 실행계획까지 생성해야 한다면 추가. + // if (Boolean.TRUE.equals(request.getGenerateActionPlan())) { + // actionPlans = aiServicePort.generateActionPlan(aiFeedback); + // } // 3. 응답 생성 AiAnalysisResponse response = AiAnalysisResponse.builder() @@ -459,7 +460,7 @@ public class AnalyticsService implements AnalyticsUseCase { .sentimentAnalysis(aiFeedback.getSentimentAnalysis()) .confidenceScore(aiFeedback.getConfidenceScore()) .totalReviewsAnalyzed(getTotalReviewsCount(storeId, request.getDays())) - .actionPlans(actionPlans) + .actionPlans(actionPlans) //TODO : 사용하는 값은 아니지만 의존성을 위해 그대로 둠, 추후에 변경 필요. .analyzedAt(aiFeedback.getGeneratedAt()) .build(); @@ -474,7 +475,7 @@ public class AnalyticsService implements AnalyticsUseCase { @Override @Transactional - public List generateActionPlansFromFeedback(Long feedbackId) { + public List generateActionPlansFromFeedback(ActionPlanCreateRequest request, Long feedbackId) { log.info("실행계획 생성: feedbackId={}", feedbackId); try { @@ -487,7 +488,7 @@ public class AnalyticsService implements AnalyticsUseCase { AiFeedback feedback = aiFeedback.get(); // 2. 기존 AIServicePort.generateActionPlan 메서드 활용 - List actionPlans = aiServicePort.generateActionPlan(aiFeedback.get()); + List actionPlans = aiServicePort.generateActionPlan(request.getActionPlanSelect(), aiFeedback.get()); // 3. DB에 실행계획 저장 @@ -593,7 +594,8 @@ public class AnalyticsService implements AnalyticsUseCase { // ActionPlan 도메인 객체 생성 (기존 ActionPlanService의 패턴과 동일하게) ActionPlan actionPlan = ActionPlan.builder() .storeId(feedback.getStoreId()) - .userId(1L) // AI가 생성한 계획이므로 userId는 null + .userId(0L) // AI가 생성한 계획이므로 userId는 0 + .feedbackId(feedback.getId()) .title("AI 추천 실행계획 " + (i + 1)) .description(planContent) .period("1개월") // 기본 실행 기간 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 eb13d03..b32ed09 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 @@ -44,6 +44,6 @@ public interface AnalyticsUseCase { /** * AI 피드백 기반 실행계획 생성 */ - List generateActionPlansFromFeedback(Long feedbackId); + List generateActionPlansFromFeedback(ActionPlanCreateRequest request,Long feedbackId); } 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 baafc08..30d4264 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 @@ -24,5 +24,5 @@ public interface AIServicePort { /** * 실행 계획 생성 */ - List generateActionPlan(AiFeedback feedback); + List generateActionPlan(List actionPlanSelect, AiFeedback feedback); } diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java index 50b6638..14fbb4d 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/controller/AnalyticsController.java @@ -154,10 +154,8 @@ public class AnalyticsController { log.info("실행계획 바디 데이터 => {}", request); + List actionPlans = analyticsUseCase.generateActionPlansFromFeedback(request,feedbackId); + return ResponseEntity.ok(SuccessResponse.of("실행계획 생성 완료")); - - // List actionPlans = analyticsUseCase.generateActionPlansFromFeedback(feedbackId); - - // return ResponseEntity.ok(SuccessResponse.of(actionPlans, "실행계획 생성 완료")); } } 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 978354b..b79ff67 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 @@ -125,25 +125,30 @@ public class AIServiceAdapter implements AIServicePort { } @Override - public List generateActionPlan(AiFeedback feedback) { + public List generateActionPlan(List actionPlanSelect, AiFeedback feedback) { log.info("OpenAI 실행 계획 생성 시작"); - try { + + StringBuffer planFormat = new StringBuffer(); + for(int i = 1; i <= actionPlanSelect.size(); i++) { + planFormat.append(i).append(" [구체적인 실행 계획 ").append(i).append("]\n"); + } String prompt = String.format( """ - 다음 AI 피드백을 바탕으로 구체적인 실행 계획 3개를 생성해주세요. + 다음 AI 피드백을 바탕으로 구체적인 실행 계획 %s개를 생성해주세요. 각 계획은 실행 가능하고 구체적이어야 합니다. 요약: %s 개선점: %s + 실행계획 내용은 점주가 반영할 수 있도록 구체적어야 합니다. 실행 계획을 다음 형식으로 작성해주세요: - 1. [구체적인 실행 계획 1] - 2. [구체적인 실행 계획 2] - 3. [구체적인 실행 계획 3] + %s """, + actionPlanSelect.size(), feedback.getSummary(), - String.join(", ", feedback.getImprovementPoints()) + String.join(", ", actionPlanSelect), + planFormat ); String result = callOpenAI(prompt); @@ -151,10 +156,9 @@ public class AIServiceAdapter implements AIServicePort { } catch (Exception e) { log.error("OpenAI 실행 계획 생성 중 오류 발생", e); + //TODO : 시연을 위해서 우선은 아래과 같이 처리, 추후에는 실행계획이 실패했다면 Runtime계열의 예외를 던지는게 좋을듯. return Arrays.asList( - "서비스 품질 개선을 위한 직원 교육 실시", - "고객 피드백 수집 체계 구축", - "매장 운영 프로세스 개선" + "실행계획 생성 실패. 재생성 필요" ); } } 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 12f06af..6f8fb33 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 @@ -79,6 +79,7 @@ public class ActionPlanRepositoryAdapter implements ActionPlanPort { private ActionPlanEntity toEntity(ActionPlan domain) { return ActionPlanEntity.builder() .id(domain.getId()) + .feedbackId(domain.getFeedbackId()) .storeId(domain.getStoreId()) .userId(domain.getUserId()) .title(domain.getTitle()) diff --git a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/ActionPlanEntity.java b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/ActionPlanEntity.java index f3a253b..39a65a6 100644 --- a/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/ActionPlanEntity.java +++ b/analytics/src/main/java/com/ktds/hi/analytics/infra/gateway/entity/ActionPlanEntity.java @@ -49,7 +49,10 @@ public class ActionPlanEntity { @Column(name = "user_id", nullable = false) private Long userId; - + + @Column(name = "feedback_id", nullable = true) + private Long feedbackId; + @Column(name = "title", nullable = false, length = 100) private String title;