diff --git a/mooney/src/main/java/tamtam/mooney/domain/mission/repository/MissionRepository.java b/mooney/src/main/java/tamtam/mooney/domain/mission/repository/MissionRepository.java index b53ddf0..fef359f 100644 --- a/mooney/src/main/java/tamtam/mooney/domain/mission/repository/MissionRepository.java +++ b/mooney/src/main/java/tamtam/mooney/domain/mission/repository/MissionRepository.java @@ -33,7 +33,16 @@ public interface MissionRepository extends JpaRepository { "AND :today BETWEEN m.startDate AND m.endDate") List findWeeklyMissionPlacesByUser(@Param("userId") Long userId, @Param("today") LocalDate today); - Mission findMissionByPlace(@NotNull String place); + @Query(""" + SELECT m FROM Mission m + WHERE m.categoryBudget.monthlyBudget.user.userId = :userId + AND m.place = :place + AND :today BETWEEN m.startDate AND m.endDate + ORDER BY m.createdAt DESC +""") + List findActiveMissionsByUserAndPlace(@Param("userId") Long userId, + @Param("place") String place, + @Param("today") LocalDate today); // ✅ 다음 주 미션이 존재하는지 확인하는 쿼리 추가 @Query("SELECT COUNT(m) FROM Mission m " + diff --git a/mooney/src/main/java/tamtam/mooney/domain/mission/service/MissionService.java b/mooney/src/main/java/tamtam/mooney/domain/mission/service/MissionService.java index ddddc42..f802358 100644 --- a/mooney/src/main/java/tamtam/mooney/domain/mission/service/MissionService.java +++ b/mooney/src/main/java/tamtam/mooney/domain/mission/service/MissionService.java @@ -71,17 +71,24 @@ public List getWeeklyMissionsDetail(LocalDate today) { } // 미션 데이터(방문 횟수, 사용한 금액) 업데이트 - expense 발생할 때마다 미션에 해당하는지 보고 미션에 해당되면 추적해서 저장 - public void updateMission(User user, String payee, long amount){ + public void updateMission(User user, String payee, long amount) { LocalDate today = LocalDate.now(); List missionPlaces = missionRepository.findWeeklyMissionPlacesByUser(user.getUserId(), today); + + // missionPlaces에 포함된 경우의 처리 if (missionPlaces.contains(payee)) { - // missionPlaces에 포함된 경우의 처리 - Mission mission = missionRepository.findMissionByPlace(payee); - //해당 미션의 numOfExpense와 amountOfExpense에 더하기 - mission.addExpense(amount); + List activeMissions = missionRepository.findActiveMissionsByUserAndPlace(user.getUserId(), payee, today); + + if (!activeMissions.isEmpty()) { + //해당 미션의 numOfExpense와 amountOfExpense에 더하기 + Mission latestMission = activeMissions.get(0); // 가장 최근 것 하나만 사용 + latestMission.addExpense(amount); + } } } + + //미션 상태 업데이트 public float updateMissionResult(LocalDate today){ User user = userService.getCurrentUser();