Skip to content

Commit ebc88a9

Browse files
authored
Merge pull request #114 from prgrms-web-devcourse-final-project/feat/mission
fix : task 요구사항 수정
2 parents 0691dd6 + 752d532 commit ebc88a9

File tree

6 files changed

+74
-13
lines changed

6 files changed

+74
-13
lines changed

backend/src/main/java/com/back/domain/mission/dto/response/TaskResponse.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,21 @@ public class TaskResponse {
2222
private boolean hasBeenEdited; // 이미 수정됐는지 여부
2323
private boolean canEdit; // 지금 시점에 수정 가능한지 여부
2424
private LocalDate editDeadline; // 수정 마감일
25+
26+
private Integer missionId;
27+
private String missionTitle;
28+
private Integer subGoalId;
29+
private String subGoalTitle; // "1주차: 기초 체력 다지기"
30+
private Integer weekNum;
31+
32+
private PartyTaskProgressDto partyProgress; // 파티 미션일 때만
33+
@Getter
34+
@Setter
35+
@NoArgsConstructor
36+
@AllArgsConstructor
37+
@Builder
38+
public static class PartyTaskProgressDto {
39+
private Integer completedMembers; // 완료한 인원
40+
private Integer totalMembers; // 전체 인원 (ACCEPTED)
41+
}
2542
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,11 @@ List<TaskLog> findLastCompletedByTaskIds(
8484
@Param("taskIds") List<Integer> taskIds,
8585
@Param("memberId") Integer memberId
8686
);
87+
88+
boolean existsByTaskIdAndMemberIdAndDateAndStatus(
89+
Integer taskId,
90+
Integer memberId,
91+
LocalDate date,
92+
TaskStatus status
93+
);
8794
}

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,23 @@ public interface TaskRepository extends JpaRepository<Task, Integer> {
1717
List<Task> findBySubGoalId(Integer subGoalId);
1818

1919
@Query("""
20-
SELECT t FROM Task t
21-
JOIN t.subGoal sg
22-
JOIN sg.mission m
23-
WHERE m.member.id = :memberId
24-
AND :today BETWEEN sg.startDate AND sg.endDate
25-
AND t.dayNum = :dayOfWeek
26-
AND m.isCompleted = false
20+
SELECT DISTINCT t FROM Task t
21+
JOIN FETCH t.subGoal sg
22+
JOIN FETCH sg.mission m
23+
LEFT JOIN m.party p
24+
LEFT JOIN p.partyMembers pm
25+
WHERE (m.member.id = :memberId
26+
OR (pm.member.id = :memberId AND pm.status = 'ACCEPTED'))
27+
AND m.isCompleted = false
28+
AND t.dayNum = :dayNum
29+
AND :date BETWEEN sg.startDate AND sg.endDate
30+
AND :date BETWEEN m.startDate AND m.endDate
31+
ORDER BY m.id, sg.orderNum, t.dayNum
2732
""")
2833
List<Task> findTodayTasks(
2934
@Param("memberId") Integer memberId,
30-
@Param("today") LocalDate today,
31-
@Param("dayOfWeek") Integer dayOfWeek
35+
@Param("date") LocalDate date,
36+
@Param("dayNum") int dayNum
3237
);
3338

3439
@Query("""

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.mission.service;
22

3+
import com.back.domain.mission.dto.response.TaskResponse;
34
import com.back.domain.mission.entity.Mission;
45
import com.back.domain.mission.entity.SubGoal;
56
import com.back.domain.mission.entity.Task;
@@ -213,4 +214,24 @@ public Integer calculatePartyWeekAverage(SubGoal subGoal) {
213214

214215
return (int) (totalProgress / activeMembers.size());
215216
}
217+
218+
219+
public TaskResponse.PartyTaskProgressDto calculatePartyTaskProgress(Task task, LocalDate date) {
220+
Mission mission = task.getSubGoal().getMission();
221+
222+
if (!mission.isPartyMission()) {
223+
return null;
224+
}
225+
226+
List<PartyMember> activeMembers = mission.getParty().getPartyMembers().stream()
227+
.filter(pm -> pm.getStatus() == PartyMemberStatus.ACCEPTED)
228+
.toList();
229+
230+
long completedCount = activeMembers.stream()
231+
.filter(pm -> taskLogRepository.existsByTaskIdAndMemberIdAndDateAndStatus(
232+
task.getId(), pm.getMember().getId(), date, TaskStatus.COMPLETED))
233+
.count();
234+
235+
return new TaskResponse.PartyTaskProgressDto((int) completedCount, activeMembers.size());
236+
}
216237
}

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,19 +202,20 @@ public TaskResponse toTaskResponse(Task task, Integer memberId, LocalDate date)
202202
return convertToTaskResponse(task, memberId, date);
203203
}
204204

205-
206205
private TaskResponse convertToTaskResponse(Task task, Integer memberId, LocalDate date) {
207206
Optional<TaskLog> taskLog = taskLogRepository.findByTaskIdAndMemberIdAndDate(
208207
task.getId(), memberId, date);
209208

210209
TaskStatus status = taskLog.map(TaskLog::getStatus).orElse(TaskStatus.PENDING);
211-
212210
LocalDate lastCompletedDate = taskLogRepository
213211
.findTopByTaskIdAndMemberIdOrderByDateDesc(task.getId(), memberId)
214212
.map(TaskLog::getDate)
215213
.orElse(null);
216214

217-
return TaskResponse.builder()
215+
SubGoal subGoal = task.getSubGoal();
216+
Mission mission = subGoal.getMission();
217+
218+
TaskResponse.TaskResponseBuilder builder = TaskResponse.builder()
218219
.taskId(task.getId())
219220
.title(task.getTitle())
220221
.dayNum(task.getDayNum())
@@ -224,7 +225,17 @@ private TaskResponse convertToTaskResponse(Task task, Integer memberId, LocalDat
224225
.hasBeenEdited(task.getHasBeenEdited())
225226
.canEdit(task.canEdit())
226227
.editDeadline(task.getEditDeadline())
227-
.build();
228+
.missionId(mission.getId())
229+
.missionTitle(mission.getTitle())
230+
.subGoalId(subGoal.getId())
231+
.subGoalTitle(subGoal.getTitle())
232+
.weekNum(subGoal.getOrderNum());
233+
234+
if (mission.isPartyMission()) {
235+
builder.partyProgress(calculateService.calculatePartyTaskProgress(task, date));
236+
}
237+
238+
return builder.build();
228239
}
229240

230241
// 배치 변환 메서드 추가

db_dev.mv.db

28 KB
Binary file not shown.

0 commit comments

Comments
 (0)