Skip to content

Commit f28bc50

Browse files
committed
보상 ê´연결
1 parent 71a91dd commit f28bc50

File tree

6 files changed

+174
-139
lines changed

6 files changed

+174
-139
lines changed

backend/src/main/java/com/back/domain/mission/listener/DailyCompletedEventListener.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

backend/src/main/java/com/back/domain/mission/listener/MissionCompletedEventListener.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

backend/src/main/java/com/back/domain/mission/listener/WeeklyCompletedEventListener.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

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

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

33
import com.back.domain.mission.entity.*;
4-
import com.back.domain.mission.event.*;
5-
import com.back.domain.mission.repository.*;
4+
import com.back.domain.mission.event.DailyCompletedEvent;
5+
import com.back.domain.mission.event.MissionCompletedEvent;
6+
import com.back.domain.mission.event.WeeklyCompletedEvent;
7+
import com.back.domain.mission.repository.DailyCompletionLogRepository;
8+
import com.back.domain.mission.repository.MissionCompletionLogRepository;
9+
import com.back.domain.mission.repository.SubGoalCompletionLogRepository;
10+
import com.back.domain.reward.entity.RewardType;
11+
import com.back.domain.reward.service.RewardService;
612
import com.back.domain.statistics.service.StatisticsService;
713
import com.back.global.util.TimeProvider;
814
import lombok.RequiredArgsConstructor;
@@ -27,8 +33,8 @@ public class CompletionCheckService {
2733

2834
private final StatisticsService statisticsService;
2935
private final ApplicationEventPublisher applicationEventPublisher;
36+
private final RewardService rewardService;
3037

31-
// Task 완료 시: 모든 완료 조건 체크
3238
public void checkAllCompletions(Integer memberId, Task task, LocalDate date) {
3339
SubGoal subGoal = task.getSubGoal();
3440
Mission mission = subGoal.getMission();
@@ -38,7 +44,6 @@ public void checkAllCompletions(Integer memberId, Task task, LocalDate date) {
3844
checkMissionCompletion(memberId, mission);
3945
}
4046

41-
// Task 취소 시: 완료 상태 재검증
4247
public void recheckAfterCancellation(Integer memberId, Task task, LocalDate date) {
4348
SubGoal subGoal = task.getSubGoal();
4449
Mission mission = subGoal.getMission();
@@ -48,23 +53,28 @@ public void recheckAfterCancellation(Integer memberId, Task task, LocalDate date
4853
recheckMissionCompletion(memberId, mission);
4954
}
5055

56+
// ========== 데일리 ==========
5157

52-
// 데일리 완료 체크
5358
private void checkDailyCompletion(Integer memberId, LocalDate date) {
5459
if (dailyCompletionLogRepository.existsByMemberIdAndCompletedDate(memberId, date)) {
5560
return;
5661
}
5762

5863
Integer progress = calculateService.calculateDailyProgress(memberId, date);
5964

60-
if (progress >= 100) {
65+
if (progress >= 80) {
6166
dailyCompletionLogRepository.save(DailyCompletionLog.builder()
6267
.memberId(memberId)
6368
.completedDate(date)
6469
.build());
6570

6671
statisticsService.onDailyCompleted(memberId, date);
6772

73+
try {
74+
rewardService.giveRewardByType(memberId, RewardType.DAILYCLEAR);
75+
} catch (Exception ignored) {
76+
}
77+
6878
applicationEventPublisher.publishEvent(DailyCompletedEvent.builder()
6979
.memberId(memberId)
7080
.completedDate(date)
@@ -80,22 +90,23 @@ private void recheckDailyCompletion(Integer memberId, LocalDate date) {
8090

8191
Integer progress = calculateService.calculateDailyProgress(memberId, date);
8292

83-
if (progress < 100) {
93+
if (progress < 80) {
8494
dailyCompletionLogRepository.delete(logOpt.get());
8595
statisticsService.onDailyCancelled(memberId, date);
96+
8697
}
8798
}
8899

100+
// ========== 주차 ==========
89101

90-
// 주차 완료 체크
91102
private void checkWeeklyCompletion(Integer memberId, SubGoal subGoal) {
92103
if (subGoalCompletionLogRepository.existsBySubGoalIdAndMemberId(subGoal.getId(), memberId)) {
93104
return;
94105
}
95106

96107
Integer progress = calculateService.calculateWeekProgressForMember(subGoal, memberId);
97108

98-
if (progress >= 100) {
109+
if (progress >= 80) {
99110
subGoalCompletionLogRepository.save(SubGoalCompletionLog.builder()
100111
.subGoalId(subGoal.getId())
101112
.memberId(memberId)
@@ -105,6 +116,11 @@ private void checkWeeklyCompletion(Integer memberId, SubGoal subGoal) {
105116

106117
statisticsService.onWeeklyCompleted(memberId);
107118

119+
try {
120+
rewardService.giveRewardByType(memberId, RewardType.WEEKLYCLEAR);
121+
} catch (Exception ignored) {
122+
}
123+
108124
applicationEventPublisher.publishEvent(WeeklyCompletedEvent.builder()
109125
.memberId(memberId)
110126
.subGoalId(subGoal.getId())
@@ -123,21 +139,22 @@ private void recheckWeeklyCompletion(Integer memberId, SubGoal subGoal) {
123139

124140
Integer progress = calculateService.calculateWeekProgressForMember(subGoal, memberId);
125141

126-
if (progress < 100) {
142+
if (progress < 80) {
127143
subGoalCompletionLogRepository.delete(logOpt.get());
128144
statisticsService.onWeeklyCancelled(memberId);
129145
}
130146
}
131147

132-
// 미션 완료 체크
148+
// ========== 미션 ==========
149+
133150
private void checkMissionCompletion(Integer memberId, Mission mission) {
134151
if (missionCompletionLogRepository.existsByMissionIdAndMemberId(mission.getId(), memberId)) {
135152
return;
136153
}
137154

138155
Integer progress = calculateService.calculateMissionProgressForMember(mission, memberId);
139156

140-
if (progress >= 100) {
157+
if (progress >= 80) {
141158
LocalDate today = timeProvider.today();
142159

143160
missionCompletionLogRepository.save(MissionCompletionLog.builder()
@@ -148,6 +165,11 @@ private void checkMissionCompletion(Integer memberId, Mission mission) {
148165

149166
statisticsService.onMissionCompleted(memberId, mission.isPartyMission());
150167

168+
try {
169+
rewardService.giveRewardByType(memberId, RewardType.CHALLENGECLEAR);
170+
} catch (Exception ignored) {
171+
}
172+
151173
applicationEventPublisher.publishEvent(MissionCompletedEvent.builder()
152174
.missionId(mission.getId())
153175
.memberId(memberId)
@@ -156,6 +178,7 @@ private void checkMissionCompletion(Integer memberId, Mission mission) {
156178
.completedDate(today)
157179
.build());
158180

181+
159182
if (!mission.isPartyMission() && !mission.isCompleted()) {
160183
mission.setCompleted(true);
161184
}
@@ -170,10 +193,11 @@ private void recheckMissionCompletion(Integer memberId, Mission mission) {
170193

171194
Integer progress = calculateService.calculateMissionProgressForMember(mission, memberId);
172195

173-
if (progress < 100) {
196+
if (progress < 80) {
174197
missionCompletionLogRepository.delete(logOpt.get());
175198
statisticsService.onMissionCancelled(memberId, mission.isPartyMission());
176199

200+
177201
if (!mission.isPartyMission()) {
178202
mission.setCompleted(false);
179203
}

backend/src/main/java/com/back/domain/reward/service/RewardService.java

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,120 @@ else if(rewardContent.getContentType() == ContentType.TITLE)
9393
}
9494
}
9595

96+
// 데일리/주차/미션 완료 시 즉시 보상 지급
97+
// DAILYCLEAR, WEEKLYCLEAR, CHALLENGECLEAR 타입 전용
98+
99+
public void giveRewardByType(Integer memberId, RewardType rewardType) {
100+
Member member = memberService.findById(memberId)
101+
.orElseThrow(() -> new IllegalArgumentException("Member not found"));
102+
103+
// requireValue=1인 즉시 보상만 조회
104+
List<Reward> rewards = rewardRepository.findByRewardTypeAndRequireValue(rewardType, 1);
105+
106+
for (Reward reward : rewards) {
107+
for (RewardContent content : reward.getRewards()) {
108+
applyRewardContent(member, content);
109+
}
110+
}
111+
}
112+
113+
// 완료 취소 시 즉시 보상 회수
114+
public void revokeRewardByType(Integer memberId, RewardType rewardType) {
115+
Member member = memberService.findById(memberId)
116+
.orElseThrow(() -> new IllegalArgumentException("Member not found"));
117+
118+
List<Reward> rewards = rewardRepository.findByRewardTypeAndRequireValue(rewardType, 1);
119+
120+
for (Reward reward : rewards) {
121+
for (RewardContent content : reward.getRewards()) {
122+
revokeRewardContent(member, content);
123+
}
124+
}
125+
}
126+
127+
128+
// 통계 업데이트 시 누적 달성 보상 지급
129+
// DAILY, WEEKLY, CHALLENGE 타입 전용
130+
public void giveAccumulatedRewards(Integer memberId, int previousValue, int currentValue, RewardType rewardType) {
131+
if (currentValue <= previousValue) return;
132+
133+
Member member = memberService.findById(memberId)
134+
.orElseThrow(() -> new IllegalArgumentException("Member not found"));
135+
136+
List<Reward> rewards = rewardRepository.findByRewardType(rewardType);
137+
138+
// 이전값과 현재값 사이의 달성 보상만 지급
139+
for (Reward reward : rewards) {
140+
if (reward.getRequireValue() > previousValue &&
141+
reward.getRequireValue() <= currentValue) {
142+
143+
for (RewardContent content : reward.getRewards()) {
144+
applyRewardContent(member, content);
145+
}
146+
}
147+
}
148+
}
149+
150+
// 통계 감소 시 누적 달성 보상 회수
151+
public void revokeAccumulatedRewards(Integer memberId, int previousValue, int currentValue, RewardType rewardType) {
152+
if (currentValue >= previousValue) return;
153+
154+
Member member = memberService.findById(memberId)
155+
.orElseThrow(() -> new IllegalArgumentException("Member not found"));
156+
157+
List<Reward> rewards = rewardRepository.findByRewardType(rewardType);
158+
159+
// 현재값과 이전값 사이의 달성 보상만 회수
160+
for (Reward reward : rewards) {
161+
if (reward.getRequireValue() > currentValue &&
162+
reward.getRequireValue() <= previousValue) {
163+
164+
for (RewardContent content : reward.getRewards()) {
165+
revokeRewardContent(member, content);
166+
}
167+
}
168+
}
169+
}
170+
171+
// 헬퍼 메서
172+
private void applyRewardContent(Member member, RewardContent content) {
173+
switch (content.getContentType()) {
174+
case XP:
175+
member.setXp(member.getXp() + content.getRewardValue());
176+
levelUpService.checkLevelUp(member.getId());
177+
break;
178+
179+
case MONEY:
180+
memberService.modifyStatus(member, member.getLevel(), member.getXp(),
181+
member.getMoney() + content.getRewardValue());
182+
break;
183+
184+
case ITEM:
185+
memberService.addItem(member, content.getRewardValue());
186+
break;
187+
188+
case TITLE:
189+
memberService.addTitle(member, content.getRewardValue());
190+
break;
191+
}
192+
}
193+
194+
private void revokeRewardContent(Member member, RewardContent content) {
195+
switch (content.getContentType()) {
196+
case XP:
197+
member.setXp(Math.max(0, member.getXp() - content.getRewardValue()));
198+
break;
199+
200+
case MONEY:
201+
int newMoney = Math.max(0, member.getMoney() - content.getRewardValue());
202+
memberService.modifyStatus(member, member.getLevel(), member.getXp(), newMoney);
203+
break;
204+
205+
case ITEM:
206+
break;
207+
208+
case TITLE:
209+
break;
210+
}
211+
}
96212
}

0 commit comments

Comments
 (0)