77import lombok .extern .slf4j .Slf4j ;
88import org .springframework .stereotype .Service ;
99import org .springframework .transaction .annotation .Transactional ;
10+ import umc7th .bulk .global .error .GeneralErrorCode ;
11+ import umc7th .bulk .global .error .exception .CustomException ;
12+ import umc7th .bulk .group .entity .Group ;
13+ import umc7th .bulk .group .repository .GroupRepository ;
1014import umc7th .bulk .meal .entity .MealType ;
1115import umc7th .bulk .mealItem .entity .MealItem ;
1216import umc7th .bulk .mealMealItemMapping .entity .MealMealItemMapping ;
1923import umc7th .bulk .record .upload .S3Service ;
2024import umc7th .bulk .recordedFood .entity .RecordedFood ;
2125import umc7th .bulk .recordedFood .repository .RecordedFoodRepository ;
26+ import umc7th .bulk .stageRecord .entity .StageRecord ;
27+ import umc7th .bulk .stageRecord .repository .StageRecordRepository ;
2228import umc7th .bulk .user .domain .User ;
2329import umc7th .bulk .user .repository .UserRepository ;
2430import umc7th .bulk .user .service .UserService ;
@@ -42,6 +48,9 @@ public class RecordServiceImpl implements RecordService {
4248 private final UserService userService ;
4349 private final UserRepository userRepository ;
4450
51+ private final StageRecordRepository stageRecordRepository ;
52+ private final GroupRepository groupRepository ;
53+
4554 @ Transactional
4655 public RecordResponseDto createRecord (RecordRequestDto .Create requestDto ) {
4756 // 사용자 조회
@@ -58,6 +67,10 @@ public RecordResponseDto createRecord(RecordRequestDto.Create requestDto) {
5867 throw new IllegalArgumentException ("이미 해당 날짜와 끼니에 대한 기록이 존재합니다." );
5968 }
6069
70+ // 사용자의 해당 날짜 기록 확인
71+ boolean hasRecordToday = recordRepository .existsByUserAndDate (user , requestDto .getDate ());
72+
73+
6174 // 사용자의 끼니(MealType)에 해당하는 식단 데이터 조회
6275 List <MealMealItemMapping > mealMappings = mealMealItemMappingRepository .findByMeal_LocalDateAndMeal_Type (
6376 requestDto .getDate (), requestDto .getMealType ());
@@ -80,6 +93,14 @@ public RecordResponseDto createRecord(RecordRequestDto.Create requestDto) {
8093
8194 Record savedRecord = recordRepository .save (record );
8295
96+ // 하루에 한 번이라도 기록하면 record_complete = true 설정
97+ if (!hasRecordToday ) {
98+ user .markRecordComplete ();
99+ userRepository .save (user );
100+ }
101+
102+ checkAndAdvanceStage (user .getGroup ());
103+
83104 // MealItem을 기반으로 RecordedFood 생성
84105 List <RecordedFood > recordedFoods = mealMappings .stream ()
85106 .map (MealMealItemMapping ::getMealItem )
@@ -158,6 +179,10 @@ public RecordResponseDto createNotFollowedRecord(RecordRequestDto.CreateNotFollo
158179 // MealType 변환
159180 MealType type = requestDto .getMealType ();
160181
182+ // 사용자의 해당 날짜 기록 확인
183+ boolean hasRecordToday = recordRepository .existsByUserAndDate (user , requestDto .getDate ());
184+
185+
161186 String uploadedImageUrl = null ;
162187 String gptRawResponseString = null ;
163188
@@ -262,6 +287,14 @@ public RecordResponseDto createNotFollowedRecord(RecordRequestDto.CreateNotFollo
262287 Record savedRecord = recordRepository .save (record );
263288 log .info ("✅ Record 저장 완료: recordId={}" , savedRecord .getId ());
264289
290+ // 하루에 한 번이라도 기록하면 record_complete = true 설정
291+ if (!hasRecordToday ) {
292+ user .markRecordComplete ();
293+ userRepository .save (user );
294+ }
295+
296+ checkAndAdvanceStage (user .getGroup ());
297+
265298 // Response 생성
266299 return RecordResponseDto .builder ()
267300 .recordId (savedRecord .getId ())
@@ -356,5 +389,41 @@ public RecordResponseDto.TodaySummary getTodayRecord(User user) {
356389 .build ();
357390 }
358391
392+ public void checkAndAdvanceStage (Group group ) {
393+ // 현재 그룹에서 recordComplete = true인 유저 수 확인
394+ int recordedCount = userRepository .countByGroupAndRecordCompleteTrue (group );
395+
396+ if (recordedCount >= 5 ) {
397+ advanceStage (group );
398+ }
399+ }
400+
401+ private void advanceStage (Group group ) {
402+ // 현재 그룹의 가장 최신 스테이지 가져오기
403+ StageRecord currentStageRecord = stageRecordRepository
404+ .findTopByGroupOrderByStageNumberDesc (group )
405+ .orElseThrow (() -> new CustomException (GeneralErrorCode .GROUP_NOT_FOUND_404 ));
406+
407+ // 현재 스테이지 완료 처리
408+ currentStageRecord .completeStage ();
409+ stageRecordRepository .save (currentStageRecord );
410+
411+ // 그룹의 현재 스테이지 증가
412+ group .advanceStage ();
413+ groupRepository .save (group );
414+
415+ // 새로운 스테이지 기록 생성
416+ StageRecord newStageRecord = StageRecord .builder ()
417+ .group (group )
418+ .stageNumber (group .getCurrentStage ())
419+ .totalUsers ((int ) userRepository .countByGroup (group ))
420+ .recordedUsers (0 ) // 새로운 스테이지이므로 기록된 사용자 0명부터 시작
421+ .isCompleted (false )
422+ .build ();
423+
424+ stageRecordRepository .save (newStageRecord );
425+ }
426+
427+
359428
360429}
0 commit comments