Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -58,27 +58,45 @@ public Page<TaskEntity> findTasksAssignedByManager(Long processorId, Pageable pa

@Override
public List<TeamMemberTaskResponse> findTeamStatus(Long memberId, FilterTeamStatusRequest filter) {
// 1. 담당자 목록을 가져옴 (페이징 제거)
List<Long> 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<TaskEntity> 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()
Expand Down Expand Up @@ -111,48 +129,10 @@ public List<TeamMemberTaskResponse> 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<TaskEntity> 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<TaskEntity> findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) {
BooleanBuilder builder = createFilter(filterTaskListRequest);
Expand Down
Loading