diff --git a/src/main/java/com/umc/yeogi_gal_lae/api/budget/controller/BudgetController.java b/src/main/java/com/umc/yeogi_gal_lae/api/budget/controller/BudgetController.java index 176bf74f..4bb8c844 100644 --- a/src/main/java/com/umc/yeogi_gal_lae/api/budget/controller/BudgetController.java +++ b/src/main/java/com/umc/yeogi_gal_lae/api/budget/controller/BudgetController.java @@ -4,6 +4,7 @@ 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; @@ -11,6 +12,7 @@ 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; @@ -47,17 +49,32 @@ public Response generateAndStoreBudget(@PathVariable Long aiCour * GET /api/budget/{id} Budget 엔티티의 id로 저장된 예산 추천 데이터를 조회하고, 이를 DailyBudgetAssignmentResponse DTO 리스트로 변환하여 반환합니다. */ @GetMapping("/{budgetId}") - public Response> getBudget(@PathVariable Long budgetId) { + public Response getBudget(@PathVariable Long budgetId) { Optional budgetOpt = budgetService.getBudgetById(budgetId); if (!budgetOpt.isPresent()) { return Response.of(ErrorCode.NOT_FOUND, null); } + Budget budget = budgetOpt.get(); Map> budgetMap = budgetService.getBudgetMapById(budgetId); - List responseList = BudgetConverter.toDailyBudgetAssignmentResponseList( + List 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> getBudgetIdsByAiCourseId(@PathVariable Long aiCourseId) { List budgets = diff --git a/src/main/java/com/umc/yeogi_gal_lae/api/budget/domain/BudgetType.java b/src/main/java/com/umc/yeogi_gal_lae/api/budget/domain/BudgetType.java new file mode 100644 index 00000000..2cde79b8 --- /dev/null +++ b/src/main/java/com/umc/yeogi_gal_lae/api/budget/domain/BudgetType.java @@ -0,0 +1,8 @@ +package com.umc.yeogi_gal_lae.api.budget.domain; + +public enum BudgetType { + MEAL, + ACTIVITY, + SHOPPING, + TRANSPORT +} diff --git a/src/main/java/com/umc/yeogi_gal_lae/api/budget/dto/BudgetAssignment.java b/src/main/java/com/umc/yeogi_gal_lae/api/budget/dto/BudgetAssignment.java index bf9c29cd..92518945 100644 --- a/src/main/java/com/umc/yeogi_gal_lae/api/budget/dto/BudgetAssignment.java +++ b/src/main/java/com/umc/yeogi_gal_lae/api/budget/dto/BudgetAssignment.java @@ -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; @@ -11,6 +12,6 @@ @Builder public class BudgetAssignment { private String placeName; - private String budgetType; + private BudgetType budgetType; private Double recommendedAmount; } \ No newline at end of file diff --git a/src/main/java/com/umc/yeogi_gal_lae/api/budget/dto/BudgetDetailResponse.java b/src/main/java/com/umc/yeogi_gal_lae/api/budget/dto/BudgetDetailResponse.java new file mode 100644 index 00000000..80c26105 --- /dev/null +++ b/src/main/java/com/umc/yeogi_gal_lae/api/budget/dto/BudgetDetailResponse.java @@ -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 dailyAssignments; + +} diff --git a/src/main/java/com/umc/yeogi_gal_lae/api/budget/service/BudgetService.java b/src/main/java/com/umc/yeogi_gal_lae/api/budget/service/BudgetService.java index 2e4295fc..5d0a519c 100644 --- a/src/main/java/com/umc/yeogi_gal_lae/api/budget/service/BudgetService.java +++ b/src/main/java/com/umc/yeogi_gal_lae/api/budget/service/BudgetService.java @@ -80,20 +80,21 @@ 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(); @@ -101,7 +102,7 @@ private String buildBudgetPrompt(String scheduleJson) { private String callGptApi(String prompt) { Map requestBody = new HashMap<>(); - requestBody.put("model", "gpt-4"); + requestBody.put("model", "gpt-4o-mini"); Map message = new HashMap<>(); message.put("role", "user"); message.put("content", prompt);