Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
import com.umc.yeogi_gal_lae.api.budget.domain.Budget;
import com.umc.yeogi_gal_lae.api.budget.dto.AICourseBudgetResponse;
import com.umc.yeogi_gal_lae.api.budget.dto.BudgetAssignment;
import com.umc.yeogi_gal_lae.api.budget.dto.BudgetDetailResponse;
import com.umc.yeogi_gal_lae.api.budget.dto.BudgetResponse;
import com.umc.yeogi_gal_lae.api.budget.dto.DailyBudgetAssignmentResponse;
import com.umc.yeogi_gal_lae.api.budget.repository.BudgetRepository;
import com.umc.yeogi_gal_lae.api.budget.service.BudgetService;
import com.umc.yeogi_gal_lae.global.common.response.Response;
import com.umc.yeogi_gal_lae.global.error.ErrorCode;
import com.umc.yeogi_gal_lae.global.success.SuccessCode;
import java.time.LocalDate;
import java.util.Collections;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -47,17 +49,32 @@ public Response<BudgetResponse> generateAndStoreBudget(@PathVariable Long aiCour
* GET /api/budget/{id} Budget 엔티티의 id로 저장된 예산 추천 데이터를 조회하고, 이를 DailyBudgetAssignmentResponse DTO 리스트로 변환하여 반환합니다.
*/
@GetMapping("/{budgetId}")
public Response<List<DailyBudgetAssignmentResponse>> getBudget(@PathVariable Long budgetId) {
public Response<BudgetDetailResponse> getBudget(@PathVariable Long budgetId) {
Optional<Budget> budgetOpt = budgetService.getBudgetById(budgetId);
if (!budgetOpt.isPresent()) {
return Response.of(ErrorCode.NOT_FOUND, null);
}
Budget budget = budgetOpt.get();
Map<String, List<BudgetAssignment>> budgetMap = budgetService.getBudgetMapById(budgetId);
List<DailyBudgetAssignmentResponse> responseList = BudgetConverter.toDailyBudgetAssignmentResponseList(
List<DailyBudgetAssignmentResponse> dailyAssignments = BudgetConverter.toDailyBudgetAssignmentResponseList(
budgetMap);
return Response.of(SuccessCode.OK, responseList);

// AICourse를 통해 TripPlan 정보를 조회 (TripPlan 클래스가 startDate와 endDate를 LocalDate 타입으로 제공한다고 가정)
String imageUrl = budget.getAiCourse().getTripPlan().getImageUrl();
LocalDate startDate = budget.getAiCourse().getTripPlan().getStartDate();
LocalDate endDate = budget.getAiCourse().getTripPlan().getEndDate();

BudgetDetailResponse detailResponse = BudgetDetailResponse.builder()
.dailyAssignments(dailyAssignments)
.imageUrl(imageUrl)
.startDate(startDate)
.endDate(endDate)
.build();

return Response.of(SuccessCode.OK, detailResponse);
}


@GetMapping("/{aiCourseId}/budgetIds")
public Response<List<AICourseBudgetResponse>> getBudgetIdsByAiCourseId(@PathVariable Long aiCourseId) {
List<com.umc.yeogi_gal_lae.api.budget.domain.Budget> budgets =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.umc.yeogi_gal_lae.api.budget.domain;

public enum BudgetType {
MEAL,
ACTIVITY,
SHOPPING,
TRANSPORT
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.umc.yeogi_gal_lae.api.budget.dto;

import com.umc.yeogi_gal_lae.api.budget.domain.BudgetType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -11,6 +12,6 @@
@Builder
public class BudgetAssignment {
private String placeName;
private String budgetType;
private BudgetType budgetType;
private Double recommendedAmount;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.umc.yeogi_gal_lae.api.budget.dto;

import java.time.LocalDate;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BudgetDetailResponse {
private String imageUrl;
private LocalDate startDate;
private LocalDate endDate;
private List<DailyBudgetAssignmentResponse> dailyAssignments;

}
Original file line number Diff line number Diff line change
Expand Up @@ -80,28 +80,29 @@ private String buildBudgetPrompt(String scheduleJson) {
prompt.append("Given the following travel schedule in JSON format: ")
.append(scheduleJson)
.append(", generate budget recommendations for each day. ");
prompt.append("For each place, assign exactly one budget type and a recommended amount. ");
prompt.append(
"For each place, assign exactly one budget type (one of MEAL, ACTIVITY, SHOPPING, TRANSPORT) and a recommended amount. ");
prompt.append(
"Output the result as a JSON object where each key is the day (e.g., '1일차') and each value is an array of objects with the fields: 'placeName', 'budgetType', and 'recommendedAmount'. ");
prompt.append("Example output:\n");
prompt.append("{\n");
prompt.append(" \"1일차\": [\n");
prompt.append(
" {\"placeName\": \"장소 예시\", \"budgetType\": \"activityBudget\", \"recommendedAmount\": 20000},\n");
" {\"placeName\": \"Example Place\", \"budgetType\": \"ACTIVITY\", \"recommendedAmount\": 20000},\n");
prompt.append(
" {\"placeName\": \"음식점 예시\", \"budgetType\": \"mealBudget\", \"recommendedAmount\": 15000}\n");
" {\"placeName\": \"Example Restaurant\", \"budgetType\": \"MEAL\", \"recommendedAmount\": 15000}\n");
prompt.append(" ],\n");
prompt.append(" \"2일차\": [\n");
prompt.append(
" {\"placeName\": \"장소 예시\", \"budgetType\": \"activityBudget\", \"recommendedAmount\": 25000}\n");
" {\"placeName\": \"Another Place\", \"budgetType\": \"ACTIVITY\", \"recommendedAmount\": 25000}\n");
prompt.append(" ]\n");
prompt.append("}");
return prompt.toString();
}

private String callGptApi(String prompt) {
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", "gpt-4");
requestBody.put("model", "gpt-4o-mini");
Map<String, String> message = new HashMap<>();
message.put("role", "user");
message.put("content", prompt);
Expand Down