diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java index 84e8880c..b6fa1e00 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java @@ -12,7 +12,7 @@ import com.querydsl.core.types.dsl.DateTimePath; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; -import jakarta.persistence.TypedQuery; +import com.querydsl.core.types.dsl.CaseBuilder; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -58,27 +58,45 @@ public Page findTasksAssignedByManager(Long processorId, Pageable pa @Override public List findTeamStatus(Long memberId, FilterTeamStatusRequest filter) { - // 1. 담당자 목록을 가져옴 (페이징 제거) - List processorIds = queryFactory - .select(taskEntity.processor.memberId) - .from(taskEntity) - .groupBy(taskEntity.processor.memberId) - .orderBy("기여도순".equals(filter.sortBy()) ? - taskEntity.taskId.count().desc() : - taskEntity.processor.nickname.asc()) - .fetch(); + BooleanBuilder builder = new BooleanBuilder(); + + // 담당자 ID 필터링 + if (memberId != null) { + builder.and(taskEntity.processor.memberId.eq(memberId)); + } + + // 작업 타이틀 필터링 + if (filter.taskTitle() != null && !filter.taskTitle().isEmpty()) { + builder.and(taskEntity.title.containsIgnoreCase(filter.taskTitle())); + } + + // 1차 카테고리 필터링 + if (!filter.mainCategoryIds().isEmpty()) { + builder.and(taskEntity.category.mainCategory.categoryId.in(filter.mainCategoryIds())); + } - if (processorIds.isEmpty()) { - return List.of(); // 결과가 없으면 빈 리스트 반환 + // 2차 카테고리 필터링 + if (!filter.categoryIds().isEmpty()) { + builder.and(taskEntity.category.categoryId.in(filter.categoryIds())); } - // 2. 담당자별 작업 조회 (페이징 제거) + // 정렬 조건 적용 + OrderSpecifier orderBy = "기여도순".equals(filter.sortBy()) + ? new CaseBuilder() + .when(taskEntity.taskStatus.eq(TaskStatus.IN_PROGRESS) + .or(taskEntity.taskStatus.eq(TaskStatus.PENDING_COMPLETED))) + .then(1) + .otherwise(0) + .desc() + : taskEntity.processor.nickname.asc(); + + // 쿼리 실행 List taskEntities = queryFactory .selectFrom(taskEntity) - .where(taskEntity.processor.memberId.in(processorIds)) + .where(builder) + .orderBy(orderBy) .fetch(); - // 3. 담당자별 그룹핑 return taskEntities.stream() .collect(Collectors.groupingBy(t -> t.getProcessor().getMemberId())) .entrySet().stream() @@ -111,48 +129,10 @@ public List findTeamStatus(Long memberId, FilterTeamStat }).collect(Collectors.toList()); } - - - private String buildQueryString(FilterTeamStatusRequest filter) { - StringBuilder queryStr = new StringBuilder("SELECT t FROM TaskEntity t " + - "JOIN FETCH t.processor p " + - "WHERE (:memberId IS NULL OR p.memberId = :memberId) "); - - if (!filter.taskTitle().isEmpty()) { - queryStr.append("AND t.title LIKE :title "); - } - if (!filter.mainCategoryIds().isEmpty()) { - queryStr.append("AND t.category.mainCategory.id IN :mainCategories "); - } - if (!filter.categoryIds().isEmpty()) { - queryStr.append("AND t.category.id IN :categories "); - } - - if ("기여도순".equals(filter.sortBy())) { - queryStr.append("ORDER BY (SELECT COUNT(te) FROM TaskEntity te WHERE te.processor = p AND te.taskStatus IN ('IN_PROGRESS', 'PENDING_COMPLETED')) DESC"); - } else { - queryStr.append("ORDER BY p.nickname ASC"); - } - - return queryStr.toString(); - } - private boolean isValidTitle(FilterTeamStatusRequest filter) { return filter.taskTitle() != null && !filter.taskTitle().isEmpty(); } - private void setQueryParameters(TypedQuery query, FilterTeamStatusRequest filter) { - if (isValidTitle(filter)) { - query.setParameter("title", "%" + filter.taskTitle() + "%"); - } - if (!filter.mainCategoryIds().isEmpty()) { - query.setParameter("mainCategories", filter.mainCategoryIds()); - } - if (!filter.categoryIds().isEmpty()) { - query.setParameter("categories", filter.categoryIds()); - } - } - @Override public Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { BooleanBuilder builder = createFilter(filterTaskListRequest);