Skip to content

Commit e8f68e8

Browse files
Merge pull request #24 from Central-MakeUs/feature/apple-login-split
Feature/apple login split
2 parents 67d4efd + 6f8f243 commit e8f68e8

17 files changed

Lines changed: 274 additions & 52 deletions

src/main/java/com/nitrogen/domain/expense/controller/ExpenseReportController.java

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
import com.nitrogen.domain.expense.dto.report.summary.MonthlyReportSummaryResponse;
66
import com.nitrogen.domain.expense.dto.report.summary.SummaryRecordResponse;
77
import com.nitrogen.domain.expense.dto.report.summary.WeeklyReportResponse;
8+
import com.nitrogen.domain.expense.dto.weeklyAndmonthly.TotalOpenStatusResponse;
89
import com.nitrogen.domain.expense.repository.ExpenseRepository;
910
import com.nitrogen.domain.expense.service.inquiry.ExpenseInquiryService;
1011
import com.nitrogen.domain.expense.service.report.DailyRetrospectReportService;
1112
import com.nitrogen.domain.expense.service.report.WeeklyRecordService;
13+
import com.nitrogen.domain.expense.service.report.TotalOpenStatusService;
1214
import com.nitrogen.domain.expense.service.report.WeeklyDetailRecordService;
1315
import com.nitrogen.domain.user.entity.CustomUserDetails;
1416
import com.nitrogen.global.apiPayload.ApiResponse;
@@ -40,6 +42,7 @@ public class ExpenseReportController {
4042
private final DailyRetrospectReportService dailyRetrospectReportService;
4143
private final ExpenseRepository expenseRepository;
4244
private final ExpenseInquiryService expenseInquiryService;
45+
private final TotalOpenStatusService totalOpenStatusService;
4346

4447
@Operation(summary = "메인화면 분석 리포트 조회", description = "이번 달 총 소비 금액과 지난주 주간 분석 리포트를 한 번에 조회합니다.")
4548
@GetMapping("/summary_record")
@@ -73,8 +76,10 @@ public ApiResponse<SummaryRecordResponse> getSummaryRecord(@AuthenticationPrinci
7376
while (!checkDate.isAfter(lastAvailableMonday)) {
7477
LocalDate sunday = checkDate.plusDays(6);
7578

76-
if (expenseRepository.existsByUserUserIdAndExpendedAtBetween(userId, checkDate, sunday)) {
77-
int weekOfMonth = checkDate.get(WeekFields.ISO.weekOfMonth());
79+
LocalDate thursday = checkDate.plusDays(3);
80+
if (thursday.getYear() == nowDate.getYear() && thursday.getMonthValue() == nowDate.getMonthValue()
81+
&& expenseRepository.existsByUserUserIdAndExpendedAtBetween(userId, checkDate, sunday)) {
82+
int weekOfMonth = thursday.get(WeekFields.ISO.weekOfMonth());
7883
weeklyReports.add(weeklyRecordService.generateWeeklyReport(userId, checkDate, sunday, weekOfMonth));
7984
}
8085
checkDate = checkDate.plusWeeks(1);
@@ -83,25 +88,45 @@ public ApiResponse<SummaryRecordResponse> getSummaryRecord(@AuthenticationPrinci
8388
return ApiResponse.onSuccess(new SummaryRecordResponse(monthlyReport, weeklyReports));
8489
}
8590

86-
@Operation(summary = "주간 분석 상세 리포트 조회", description = "특정 주차의 감정 분석, 만족도 통계, TOP 3 지출 내역 등 상세 데이터를 조회합니다.")
91+
@Operation(summary = "주간 분석 상세 리포트 조회", description = "해당 월의 열람 가능한 모든 주차에 대한 상세 리포트를 리스트로 조회합니다.")
8792
@GetMapping("/weekly_detail")
88-
public ApiResponse<WeeklyDetailReportResponse> getWeeklyDetailReport(
93+
public ApiResponse<List<WeeklyDetailReportResponse>> getWeeklyDetailReport(
8994
@AuthenticationPrincipal CustomUserDetails userDetails,
90-
@RequestParam("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
95+
@RequestParam int year,
96+
@RequestParam int month) {
9197

9298
Long userId = userDetails.getUserId();
99+
LocalDateTime nowDateTime = LocalDateTime.now();
100+
LocalDate nowDate = nowDateTime.toLocalDate();
93101

94-
LocalDate start = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
95-
LocalDate end = start.plusDays(6);
102+
LocalDate startOfMonth = LocalDate.of(year, month, 1);
96103

97-
int month = date.getMonthValue();
98-
int weekOfMonth = date.get(WeekFields.ISO.weekOfMonth()) + 1;
99-
String weekRange = String.format("%d년 %d월 %d주차 분석 리포트", date.getYear(), month, weekOfMonth);
104+
LocalDateTime thisWeekGenTime = nowDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).atTime(8, 0);
100105

101-
WeeklyDetailReportResponse response = weeklyDetailRecordService.generateWeeklyDetailReport(
102-
userId, start, end, weekRange);
106+
LocalDate lastAvailableMonday = nowDateTime.isBefore(thisWeekGenTime)
107+
? nowDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusWeeks(2)
108+
: nowDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusWeeks(1);
103109

104-
return ApiResponse.onSuccess(response);
110+
LocalDate checkDate = startOfMonth.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
111+
112+
List<WeeklyDetailReportResponse> responses = new ArrayList<>();
113+
114+
while (!checkDate.isAfter(lastAvailableMonday)) {
115+
LocalDate sunday = checkDate.plusDays(6);
116+
117+
LocalDate thursday = checkDate.plusDays(3);
118+
if (thursday.getYear() == year && thursday.getMonthValue() == month
119+
&& expenseRepository.existsByUserUserIdAndExpendedAtBetween(userId, checkDate, sunday)) {
120+
int weekOfMonth = thursday.get(WeekFields.ISO.weekOfMonth());
121+
String weekRange = String.format("%d년 %d월 %d주차 분석 리포트", thursday.getYear(), thursday.getMonthValue(), weekOfMonth);
122+
123+
responses.add(weeklyDetailRecordService.generateWeeklyDetailReport(
124+
userId, checkDate, sunday, weekRange));
125+
}
126+
checkDate = checkDate.plusWeeks(1);
127+
}
128+
129+
return ApiResponse.onSuccess(responses);
105130
}
106131

107132
@Operation(summary = "일별 종합 소비 만족도 조회", description = "당일 모든 지출에 대한 회고가 완료된 경우, 전체 만족도 평균을 문구로 반환합니다.")
@@ -127,6 +152,20 @@ public ApiResponse<List<MonthlyReportSummaryResponse>> getMonthlyTotalList(
127152
return ApiResponse.onSuccess(response);
128153
}
129154

155+
@Operation(summary = "월 + 주차별 open 상태 통합 조회",
156+
description = "특정 월의 총 지출액, 주차별 리포트 오픈 여부, 월간 리포트 오픈 여부를 한 번에 조회합니다.")
157+
@GetMapping("/total_open_status")
158+
public ApiResponse<TotalOpenStatusResponse> getTotalOpenStatus(
159+
@AuthenticationPrincipal CustomUserDetails userDetails,
160+
@RequestParam int year,
161+
@RequestParam int month) {
162+
163+
Long userId = userDetails.getUserId();
164+
TotalOpenStatusResponse response = totalOpenStatusService.getTotalOpenStatus(userId, year, month);
165+
166+
return ApiResponse.onSuccess(response);
167+
}
168+
130169
@Operation(summary = "분석 리포트 도착 알림 카드 조회",
131170
description = "생성한 월별 분석 리포트 알림 카드 목록을 반환합니다. 확인한 리포트는 isChecked=true로\n" +
132171
" 표시됩니다. 이전 달 미확인과 무관하게 최신 리포트도 노출됩니다.")

src/main/java/com/nitrogen/domain/expense/controller/remind_grouping_expenselist/WeeklyExpenseDetailController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ public ApiResponse<WeeklyExpenseDetailResponse> getWeeklyExpenseDetails(
2929
@AuthenticationPrincipal CustomUserDetails userDetails,
3030
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate start,
3131
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate end,
32-
@RequestParam String weekRange,
3332
@RequestParam EmotionType emotionType
3433
) {
3534
Long userId = userDetails.getUserId();
3635

3736
WeeklyExpenseDetailResponse response = weeklyExpenseDetailService.getWeeklyExpenseDetailList(
38-
userId, start, end, weekRange, emotionType
37+
userId, start, end, emotionType
3938
);
4039

4140
return ApiResponse.onSuccess(response);

src/main/java/com/nitrogen/domain/expense/dto/report/detail/WeeklyDetailReportResponse.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package com.nitrogen.domain.expense.dto.report.detail;
22

3+
import com.nitrogen.domain.expense.dto.report.summary.EmotionDetailSummary;
34
import com.nitrogen.domain.expense.dto.report.summary.EmotionSummary;
4-
import com.nitrogen.domain.expense.entity.Expense;
5+
import com.nitrogen.domain.expense.dto.report.summary.EvaluationSummary;
56

67
import java.util.List;
78

89
public record WeeklyDetailReportResponse(
910

1011
String weekRange, // 주간 범위
12+
String weekStartDate, // 주간 시작일 (yyyy.MM.dd)
13+
String weekEndDate, // 주간 종료일 (yyyy.MM.dd)
14+
String emotionFeedbackMessage, // 마음항목 관점 평균만족도 문장(상단)
1115
EmotionSummary topEmotion, // 가장 많이 소비한 마음
12-
String inAvarageEvaluation, // 평균점수에 해당하는 문장
16+
String evaluationFeedbackMessage, // 소비회고 관점 평균만족도 문장(하단)
1317
List<EvaluationSummary> evaluationSummaries, // 가장 많이 소비한 마음
18+
List<EmotionDetailSummary> emotionDetails, // 그아래로 전체 마음 순위별 요약 리스트(감정별 만족도 분포 포함)
1419
List<ExpenseSimpleResponse> top3Expenses,
1520
long emotionTotalAmount, // 마음 당 총 소비건수
1621
long weeklyTotalCount, // 주간 총 소비개수
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.nitrogen.domain.expense.dto.report.summary;
2+
3+
import java.util.List;
4+
5+
public record EmotionDetailSummary(
6+
String emotionDescription,
7+
long totalAmount,
8+
long count,
9+
String feedbackMessage,
10+
List<EvaluationSummary> evaluationSummaries
11+
) {}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.nitrogen.domain.expense.dto.report.summary;
22

3-
import com.nitrogen.domain.expense.entity.enums.EmotionType;
3+
import com.fasterxml.jackson.annotation.JsonInclude;
44

55
public record EmotionSummary(
66
String emotionDescription,
77
long totalAmount,
8-
long count
8+
long count,
9+
@JsonInclude(JsonInclude.Include.NON_NULL)
10+
String feedbackMessage
911
) {}

src/main/java/com/nitrogen/domain/expense/dto/report/detail/EvaluationSummary.java renamed to src/main/java/com/nitrogen/domain/expense/dto/report/summary/EvaluationSummary.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.nitrogen.domain.expense.dto.report.detail;
1+
package com.nitrogen.domain.expense.dto.report.summary;
22

33
import com.nitrogen.domain.expense.entity.enums.EvaluationType;
44

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.nitrogen.domain.expense.dto.weeklyAndmonthly;
2+
3+
import java.util.List;
4+
/*
5+
월 + 주차별 open 상태 통합 API
6+
*/
7+
public record TotalOpenStatusResponse (
8+
int year,
9+
int month,
10+
long totalAmount,
11+
List<WeeklyOpenStatus> weeklyReports,
12+
boolean monthlyIsOpened
13+
){
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.nitrogen.domain.expense.dto.weeklyAndmonthly;
2+
3+
/*
4+
주차별 묶음 항목용
5+
*/
6+
public record WeeklyOpenStatus(
7+
int week,
8+
boolean isOpened
9+
) {
10+
}

src/main/java/com/nitrogen/domain/expense/entity/enums/EvaluationFeedback.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ public enum EvaluationFeedback {
5252
this.sentences = sentences;
5353
}
5454

55-
public static String getRandomSentence(double score) {
55+
public static String getRandomSentence(double score, long seed) {
5656
for (EvaluationFeedback feedback : values()) {
5757
if (score >= feedback.min && score < feedback.max) {
58-
int randomIndex = new Random().nextInt(feedback.sentences.size());
59-
return feedback.sentences.get(randomIndex);
58+
int index = new Random(seed).nextInt(feedback.sentences.size());
59+
return feedback.sentences.get(index);
6060
}
6161
}
6262
return "데이터가 부족하여 분석할 수 없습니다."; // 0개

src/main/java/com/nitrogen/domain/expense/entity/enums/EvaluationType.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44

55
@Getter
66
public enum EvaluationType {
7-
VERY_SATISFIED("정말 만족했어요"),
8-
SATISFIED("대체로 만족해요"),
9-
NORMAL("그냥 그랬어요"),
10-
DISAPPOINTED("조금 아쉬워요"),
11-
VERY_DISAPPOINTED("별로였어요");
7+
VERY_SATISFIED("정말 만족했어요", 5.0),
8+
SATISFIED("대체로 만족해요", 4.0),
9+
NORMAL("그냥 그랬어요", 3.0),
10+
DISAPPOINTED("조금 아쉬워요", 2.0),
11+
VERY_DISAPPOINTED("별로였어요", 1.0);
1212

1313
private final String evaluation_description;
14-
EvaluationType(String evaluation_description){ this.evaluation_description = evaluation_description;}
14+
private final double score;
15+
EvaluationType(String evaluation_description, double score){
16+
this.evaluation_description = evaluation_description;
17+
this.score = score;
18+
}
1519
}

0 commit comments

Comments
 (0)