Skip to content

Commit 4894e46

Browse files
committed
fix : 개ì� 보상 달성률 -> 개수로 변경
1 parent e3fb8d6 commit 4894e46

File tree

3 files changed

+51
-50
lines changed

3 files changed

+51
-50
lines changed

backend/src/main/java/com/back/domain/mission/repository/TaskLogRepository.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,14 @@ Long countDailyTasks(
6666
@Param("date") LocalDate date,
6767
@Param("dayNum") Integer dayNum);
6868

69-
70-
69+
@Query("SELECT COUNT(tl) FROM TaskLog tl " +
70+
"WHERE tl.memberId = :memberId " +
71+
"AND tl.date = :date " +
72+
"AND tl.status = :status")
7173
Long countByMemberIdAndDateAndStatus(
72-
Integer memberId, LocalDate date, TaskStatus status);
74+
@Param("memberId") Integer memberId,
75+
@Param("date") LocalDate date,
76+
@Param("status") TaskStatus status);
7377

7478
// 완료된 태스크 수 조회 (미션 진행률용)
7579
@Query("SELECT COUNT(tl) FROM TaskLog tl " +

backend/src/main/java/com/back/domain/mission/service/CompletionCheckService.java

Lines changed: 11 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.back.domain.mission.service;
22

33
import com.back.domain.mission.entity.*;
4+
import com.back.domain.mission.enums.TaskStatus;
45
import com.back.domain.mission.event.DailyCompletedEvent;
56
import com.back.domain.mission.event.MissionCompletedEvent;
67
import com.back.domain.mission.event.WeeklyCompletedEvent;
78
import com.back.domain.mission.repository.DailyCompletionLogRepository;
89
import com.back.domain.mission.repository.MissionCompletionLogRepository;
910
import com.back.domain.mission.repository.SubGoalCompletionLogRepository;
11+
import com.back.domain.mission.repository.TaskLogRepository;
1012
import com.back.domain.reward.entity.RewardType;
1113
import com.back.domain.reward.service.RewardService;
1214
import com.back.domain.statistics.service.StatisticsService;
@@ -34,7 +36,7 @@ public class CompletionCheckService {
3436
private final StatisticsService statisticsService;
3537
private final ApplicationEventPublisher applicationEventPublisher;
3638
private final RewardService rewardService;
37-
39+
private final TaskLogRepository taskLogRepository;
3840
public void checkAllCompletions(Integer memberId, Task task, LocalDate date) {
3941
SubGoal subGoal = task.getSubGoal();
4042
Mission mission = subGoal.getMission();
@@ -55,59 +57,27 @@ public void recheckAfterCancellation(Integer memberId, Task task, LocalDate date
5557

5658
// ========== 데일리 ==========
5759
private void checkDailyCompletion(Integer memberId, LocalDate date) {
58-
System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━");
59-
System.out.println("🔍 checkDailyCompletion 시작");
60-
System.out.println("memberId: " + memberId);
61-
System.out.println("date: " + date);
62-
63-
boolean alreadyCompleted = dailyCompletionLogRepository.existsByMemberIdAndCompletedDate(memberId, date);
64-
System.out.println("이미 완료?: " + alreadyCompleted);
65-
66-
if (alreadyCompleted) {
67-
System.out.println("❌ 이미 완료됨 - 리턴");
68-
System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━");
60+
if (dailyCompletionLogRepository.existsByMemberIdAndCompletedDate(memberId, date)) {
6961
return;
7062
}
7163

72-
System.out.println("데일리 진행률 계산 중...");
73-
Integer progress = calculateService.calculateDailyProgress(memberId, date);
74-
System.out.println("데일리 진행률: " + progress + "%");
64+
Long completedCount = taskLogRepository.countByMemberIdAndDateAndStatus(
65+
memberId, date, TaskStatus.COMPLETED);
7566

76-
if (progress >= 80) {
77-
System.out.println("✅ 진행률 80% 이상!");
78-
79-
System.out.println("DailyCompletionLog 저장 중...");
67+
if (completedCount >= 1) {
8068
dailyCompletionLogRepository.save(DailyCompletionLog.builder()
8169
.memberId(memberId)
8270
.completedDate(date)
8371
.build());
84-
System.out.println("✅ DailyCompletionLog 저장 완료!");
8572

86-
System.out.println("통계 업데이트 중...");
8773
statisticsService.onDailyCompleted(memberId, date);
88-
System.out.println("✅ 통계 업데이트 완료!");
8974

90-
System.out.println("데일리 보상 지급 중...");
91-
try {
92-
rewardService.giveRewardByType(memberId, RewardType.DAILYCLEAR);
93-
System.out.println("✅ 데일리 보상 지급 완료!");
94-
} catch (Exception e) {
95-
System.out.println("❌ 데일리 보상 지급 실패: " + e.getMessage());
96-
e.printStackTrace();
97-
}
9875

99-
System.out.println("데일리 이벤트 발행 중...");
10076
applicationEventPublisher.publishEvent(DailyCompletedEvent.builder()
10177
.memberId(memberId)
10278
.completedDate(date)
10379
.build());
104-
System.out.println("✅ 데일리 이벤트 발행 완료!");
105-
106-
System.out.println("✅✅✅ checkDailyCompletion 전체 완료!");
107-
} else {
108-
System.out.println("❌ 진행률 부족: " + progress + "% < 80%");
10980
}
110-
System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━");
11181
}
11282

11383
private void recheckDailyCompletion(Integer memberId, LocalDate date) {
@@ -116,15 +86,13 @@ private void recheckDailyCompletion(Integer memberId, LocalDate date) {
11686

11787
if (logOpt.isEmpty()) return;
11888

119-
Integer progress = calculateService.calculateDailyProgress(memberId, date);
89+
Long completedCount = taskLogRepository.countByMemberIdAndDateAndStatus(
90+
memberId, date, TaskStatus.COMPLETED);
12091

121-
if (progress < 80) {
92+
if (completedCount < 1) {
12293
dailyCompletionLogRepository.delete(logOpt.get());
12394
statisticsService.onDailyCancelled(memberId, date);
124-
try {
125-
rewardService.revokeRewardByType(memberId, RewardType.DAILYCLEAR);
126-
} catch (Exception ignored) {
127-
}
95+
12896
}
12997
}
13098

backend/src/main/java/com/back/domain/mission/service/TaskService.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import com.back.domain.mission.repository.TaskLogRepository;
1818
import com.back.domain.mission.repository.TaskRepository;
1919
import com.back.domain.party.party.entity.PartyMemberStatus;
20+
import com.back.domain.reward.entity.RewardType;
21+
import com.back.domain.reward.service.RewardService;
2022
import com.back.global.util.TimeProvider;
2123
import lombok.RequiredArgsConstructor;
2224
import org.springframework.context.ApplicationEventPublisher;
@@ -42,6 +44,7 @@ public class TaskService {
4244
private final ApplicationEventPublisher eventPublisher;
4345
private final CompletionCheckService completionCheckService;
4446
private final MemberService memberService;
47+
private final RewardService rewardService;
4548

4649
// 태스크 완료/취소 처리 (체크박스 토글)
4750
// 당일만 처리 가능
@@ -94,19 +97,45 @@ public TaskCompleteResponse completeTask(Integer memberId, TaskCompleteRequest r
9497
// 4. 저장
9598
taskLogRepository.save(taskLog);
9699

97-
// 5. 이벤트 발행 (COMPLETED일 때만 - 보상 처리용)
100+
// 🆕 5. Task 완료/취소 시 즉시 보상 처리
98101
if (finalStatus == TaskStatus.COMPLETED) {
99102
System.out.println("━━━━━━━━━━━━━━━━━━━━");
100103
System.out.println("✅ Task 완료!");
101104
System.out.println("memberId: " + memberId);
102105
System.out.println("taskId: " + task.getId());
103-
System.out.println("checkAllCompletions 호출!");
104106

105-
completionCheckService.checkAllCompletions(memberId, task, today);
107+
// 🆕 Task 완료 즉시 보상 지급
108+
System.out.println("🎁 Task 완료 보상 지급 중...");
109+
try {
110+
rewardService.giveRewardByType(memberId, RewardType.DAILYCLEAR);
111+
System.out.println("✅ Task 완료 보상 지급 완료! (XP +400, 골드 +10)");
112+
} catch (Exception e) {
113+
System.out.println("❌ Task 완료 보상 지급 실패: " + e.getMessage());
114+
e.printStackTrace();
115+
}
106116

117+
System.out.println("checkAllCompletions 호출!");
118+
completionCheckService.checkAllCompletions(memberId, task, today);
107119
System.out.println("━━━━━━━━━━━━━━━━━━━━");
120+
108121
} else if (finalStatus == TaskStatus.CANCELLED) {
122+
System.out.println("━━━━━━━━━━━━━━━━━━━━");
123+
System.out.println("❌ Task 취소!");
124+
System.out.println("memberId: " + memberId);
125+
System.out.println("taskId: " + task.getId());
126+
127+
// 🆕 Task 취소 시 보상 회수
128+
System.out.println("🔙 Task 취소 보상 회수 중...");
129+
try {
130+
rewardService.revokeRewardByType(memberId, RewardType.DAILYCLEAR);
131+
System.out.println("✅ Task 취소 보상 회수 완료! (XP -400, 골드 -10)");
132+
} catch (Exception e) {
133+
System.out.println("❌ Task 취소 보상 회수 실패: " + e.getMessage());
134+
e.printStackTrace();
135+
}
136+
109137
completionCheckService.recheckAfterCancellation(memberId, task, today);
138+
System.out.println("━━━━━━━━━━━━━━━━━━━━");
110139
}
111140

112141
List<Integer> titleIdsAfter = memberService.getMemberTitleIds(memberId);
@@ -116,10 +145,10 @@ public TaskCompleteResponse completeTask(Integer memberId, TaskCompleteRequest r
116145
.toList();
117146

118147
List<String> newTitleNames = memberService.getTitleNames(newTitleIds);
148+
119149
// 7. 응답 생성
120150
return buildTaskCompleteResponse(task, mission, memberId, today, finalStatus, newTitleNames);
121151
}
122-
123152
// 오늘의 태스크 조회
124153
@Transactional(readOnly = true)
125154
public List<TaskResponse> getTodayTasks(Integer memberId) {

0 commit comments

Comments
 (0)