작업현황 수정

This commit is contained in:
Moon
2026-01-06 12:02:37 +09:00
parent 89459b780f
commit 341b1c8f2e
3 changed files with 85 additions and 64 deletions

View File

@@ -126,6 +126,12 @@ public class LabelWorkerApiController {
String userRole, String userRole,
@Parameter(description = "검색어", example = "20261201") @RequestParam(required = false) @Parameter(description = "검색어", example = "20261201") @RequestParam(required = false)
String searchVal, String searchVal,
@Parameter(
description = "정렬",
example = "",
schema = @Schema(allowableValues = {"remindCnt desc", "doneCnt desc"}))
@RequestParam(required = false)
String sort,
@Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0") @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0")
int page, int page,
@Parameter(description = "페이지 크기", example = "20") @RequestParam(defaultValue = "20") @Parameter(description = "페이지 크기", example = "20") @RequestParam(defaultValue = "20")
@@ -139,6 +145,7 @@ public class LabelWorkerApiController {
searchReq.setUserRole(userRole); searchReq.setUserRole(userRole);
searchReq.setSearchVal(searchVal); searchReq.setSearchVal(searchVal);
searchReq.setUuid(uuid); searchReq.setUuid(uuid);
searchReq.setSort(sort);
searchReq.setPage(page); searchReq.setPage(page);
searchReq.setSize(size); searchReq.setSize(size);
return ApiResponseDto.ok(labelWorkService.findlabelWorkStateList(searchReq)); return ApiResponseDto.ok(labelWorkService.findlabelWorkStateList(searchReq));

View File

@@ -211,6 +211,9 @@ public class LabelWorkDto {
@Schema(description = "종료일", example = "20261201") @Schema(description = "종료일", example = "20261201")
private String uuid; private String uuid;
@Schema(description = "정렬(remindCnt desc, doneCnt desc)", example = "remindCnt desc")
private String sort;
public Pageable toPageable() { public Pageable toPageable() {
return PageRequest.of(page, size); return PageRequest.of(page, size);

View File

@@ -6,6 +6,7 @@ import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceG
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMemberEntity.memberEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMemberEntity.memberEntity;
import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelState;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto; import com.kamco.cd.kamcoback.label.dto.LabelWorkDto;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMng; import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMng;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMngDetail; import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMngDetail;
@@ -13,8 +14,11 @@ import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.WorkerState;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalInferenceEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalInferenceEntity;
import com.querydsl.core.BooleanBuilder; import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Projections; import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.core.types.dsl.DateTimePath;
import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.core.types.dsl.NumberExpression;
import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.core.types.dsl.StringExpression;
@@ -26,6 +30,7 @@ import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -208,21 +213,14 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
@Override @Override
public Page<WorkerState> findlabelWorkStateList(LabelWorkDto.WorkerStateSearchReq searchReq) { public Page<WorkerState> findlabelWorkStateList(LabelWorkDto.WorkerStateSearchReq searchReq) {
Pageable pageable = PageRequest.of(searchReq.getPage(), searchReq.getSize()); Pageable pageable = PageRequest.of(searchReq.getPage(), searchReq.getSize());
BooleanBuilder whereBuilder = new BooleanBuilder(); BooleanBuilder whereBuilder = new BooleanBuilder();
BooleanBuilder whereSubBuilder = new BooleanBuilder(); BooleanBuilder whereSubBuilder = new BooleanBuilder();
List<OrderSpecifier<?>> orderSpecifiers = new ArrayList<>();
UUID uuid = UUID.fromString(searchReq.getUuid()); UUID uuid = UUID.fromString(searchReq.getUuid());
LocalDate threeDaysAgo = LocalDate.now().minusDays(3);
String s3 = threeDaysAgo.format(DateTimeFormatter.ofPattern("YYYY-MM-DD"));
LocalDate twoDaysAgo = LocalDate.now().minusDays(2);
String s2 = twoDaysAgo.format(DateTimeFormatter.ofPattern("YYYY-MM-DD"));
LocalDate oneDaysAgo = LocalDate.now().minusDays(1);
String s1 = oneDaysAgo.format(DateTimeFormatter.ofPattern("YYYY-MM-DD"));
if (searchReq.getUserRole() != null && !searchReq.getUserRole().isEmpty()) { if (searchReq.getUserRole() != null && !searchReq.getUserRole().isEmpty()) {
whereSubBuilder.and(memberEntity.userRole.eq(searchReq.getUserRole())); whereSubBuilder.and(memberEntity.userRole.eq(searchReq.getUserRole()));
} }
@@ -238,6 +236,43 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
whereSubBuilder.and(labelingAssignmentEntity.workerUid.eq(memberEntity.userId)); whereSubBuilder.and(labelingAssignmentEntity.workerUid.eq(memberEntity.userId));
NumberExpression<Long> assignedCnt = labelingAssignmentEntity.workerUid.count();
NumberExpression<Long> doneCnt =
this.caseSumExpression(labelingAssignmentEntity.workState.eq(LabelState.DONE.name()));
NumberExpression<Long> skipCnt =
this.caseSumExpression(labelingAssignmentEntity.workState.eq(LabelState.SKIP.name()));
NumberExpression<Long> day3AgoDoneCnt =
this.caseSumExpression(
labelingAssignmentEntity
.workState
.eq(LabelState.DONE.name())
.and(this.fromDateEqExpression(labelingAssignmentEntity.modifiedDate, -3)));
NumberExpression<Long> day2AgoDoneCnt =
this.caseSumExpression(
labelingAssignmentEntity
.workState
.eq(LabelState.DONE.name())
.and(this.fromDateEqExpression(labelingAssignmentEntity.modifiedDate, -2)));
NumberExpression<Long> day1AgoDoneCnt =
this.caseSumExpression(
labelingAssignmentEntity
.workState
.eq(LabelState.DONE.name())
.and(this.fromDateEqExpression(labelingAssignmentEntity.modifiedDate, -1)));
NumberExpression<Long> remainingCnt = assignedCnt.subtract(doneCnt);
if (searchReq.getSort() == null || searchReq.getSort().isEmpty()) {
orderSpecifiers.add(memberEntity.name.asc());
} else if (searchReq.getSort().equals("doneCnt desc")) {
orderSpecifiers.add(doneCnt.desc());
} else if (searchReq.getSort().equals("remindCnt desc")) {
orderSpecifiers.add(remainingCnt.desc());
}
List<WorkerState> foundContent = List<WorkerState> foundContent =
queryFactory queryFactory
.select( .select(
@@ -246,61 +281,12 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
memberEntity.userRole, memberEntity.userRole,
memberEntity.name, memberEntity.name,
memberEntity.userId, memberEntity.userId,
labelingAssignmentEntity.workerUid.count().as("assignedCnt"), assignedCnt.as("assignedCnt"),
new CaseBuilder() doneCnt.as("doneCnt"),
.when(labelingAssignmentEntity.workState.eq("DONE")) skipCnt.as("skipCnt"),
.then(1L) day3AgoDoneCnt.as("day3AgoDoneCnt"),
.otherwise(0L) day2AgoDoneCnt.as("day2AgoDoneCnt"),
.sum() day1AgoDoneCnt.as("day1AgoDoneCnt")))
.as("doneCnt"),
new CaseBuilder()
.when(labelingAssignmentEntity.workState.eq("SKIP"))
.then(1L)
.otherwise(0L)
.sum()
.as("skipCnt"),
new CaseBuilder()
.when(
labelingAssignmentEntity
.workState
.eq("DONE")
.and(
Expressions.stringTemplate(
"to_char({0}, 'YYYY-MM-DD')",
labelingAssignmentEntity.modifiedDate)
.eq(s3)))
.then(1L)
.otherwise(0L)
.sum()
.as("day3AgoDoneCnt"),
new CaseBuilder()
.when(
labelingAssignmentEntity
.workState
.eq("DONE")
.and(
Expressions.stringTemplate(
"to_char({0}, 'YYYY-MM-DD')",
labelingAssignmentEntity.modifiedDate)
.eq(s2)))
.then(1L)
.otherwise(0L)
.sum()
.as("day2AgoDoneCnt"),
new CaseBuilder()
.when(
labelingAssignmentEntity
.workState
.eq("DONE")
.and(
Expressions.stringTemplate(
"to_char({0}, 'YYYY-MM-DD')",
labelingAssignmentEntity.modifiedDate)
.eq(s1)))
.then(1L)
.otherwise(0L)
.sum()
.as("day1AgoDoneCnt")))
.from(labelingAssignmentEntity) .from(labelingAssignmentEntity)
.innerJoin(mapSheetAnalInferenceEntity) .innerJoin(mapSheetAnalInferenceEntity)
.on( .on(
@@ -312,6 +298,7 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
.on(whereSubBuilder) .on(whereSubBuilder)
.where(whereBuilder) .where(whereBuilder)
.groupBy(memberEntity.userRole, memberEntity.name, memberEntity.userId) .groupBy(memberEntity.userRole, memberEntity.name, memberEntity.userId)
.orderBy(orderSpecifiers.toArray(new OrderSpecifier[0]))
.offset(pageable.getOffset()) .offset(pageable.getOffset())
.limit(pageable.getPageSize()) .limit(pageable.getPageSize())
.fetch(); .fetch();
@@ -413,4 +400,28 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
mapSheetAnalInferenceEntity.createdDttm) mapSheetAnalInferenceEntity.createdDttm)
.fetchOne(); .fetchOne();
} }
public NumberExpression<Long> caseSumExpression(BooleanExpression condition) {
NumberExpression<Long> sumExp =
new CaseBuilder()
.when(labelingAssignmentEntity.workState.eq("DONE"))
.then(1L)
.otherwise(0L)
.sum();
return sumExp;
}
public BooleanExpression fromDateEqExpression(DateTimePath<ZonedDateTime> path, int addDayCnt) {
LocalDate threeDaysAgo = LocalDate.now().plusDays(addDayCnt);
String toDate = threeDaysAgo.format(DateTimeFormatter.ofPattern("YYYY-MM-DD"));
// System.out.println("toDate == " + toDate);
BooleanExpression condition =
Expressions.stringTemplate("to_char({0}, 'YYYY-MM-DD')", path).eq(toDate);
return condition;
}
} }