Merge pull request '라벨링 툴 라벨러 목록 상태 필터 추가' (#175) from feat/infer_dev_260107 into develop

Reviewed-on: https://kamco.gitea.gs.dabeeo.com/dabeeo/kamco-dabeeo-backoffice/pulls/175
This commit is contained in:
2026-01-09 17:51:14 +09:00
5 changed files with 52 additions and 32 deletions

View File

@@ -13,7 +13,8 @@ public class TrainingDataLabelCoreService {
private final TrainingDataLabelRepository trainingDataLabelRepository; private final TrainingDataLabelRepository trainingDataLabelRepository;
public Page<LabelingListDto> findLabelingAssignedList(searchReq searchReq, String userId) { public Page<LabelingListDto> findLabelingAssignedList(
return trainingDataLabelRepository.findLabelingAssignedList(searchReq, userId); searchReq searchReq, String userId, String status) {
return trainingDataLabelRepository.findLabelingAssignedList(searchReq, userId, status);
} }
} }

View File

@@ -6,5 +6,5 @@ import org.springframework.data.domain.Page;
public interface TrainingDataLabelRepositoryCustom { public interface TrainingDataLabelRepositoryCustom {
Page<LabelingListDto> findLabelingAssignedList(searchReq searchReq, String userId); Page<LabelingListDto> findLabelingAssignedList(searchReq searchReq, String userId, String status);
} }

View File

@@ -9,12 +9,15 @@ import com.kamco.cd.kamcoback.postgres.entity.LabelingAssignmentEntity;
import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto;
import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq;
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.Expressions; import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.core.types.dsl.StringExpression;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
@@ -32,7 +35,8 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport
} }
@Override @Override
public Page<LabelingListDto> findLabelingAssignedList(searchReq searchReq, String userId) { public Page<LabelingListDto> findLabelingAssignedList(
searchReq searchReq, String userId, String status) {
Pageable pageable = PageRequest.of(searchReq.getPage(), searchReq.getSize()); Pageable pageable = PageRequest.of(searchReq.getPage(), searchReq.getSize());
List<LabelingListDto> list = List<LabelingListDto> list =
queryFactory queryFactory
@@ -73,7 +77,7 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport
.or( .or(
imageryEntity.year.eq( imageryEntity.year.eq(
mapSheetAnalDataInferenceGeomEntity.targetYyyy)))) mapSheetAnalDataInferenceGeomEntity.targetYyyy))))
.where(labelingAssignmentEntity.workerUid.eq(userId)) .where(labelingAssignmentEntity.workerUid.eq(userId), statusInLabelState(status))
.groupBy( .groupBy(
labelingAssignmentEntity.assignmentUid, labelingAssignmentEntity.assignmentUid,
labelingAssignmentEntity.inferenceGeomUid, labelingAssignmentEntity.inferenceGeomUid,
@@ -91,30 +95,33 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport
.fetch(); .fetch();
Long count = Long count =
queryFactory Optional.ofNullable(
.select(labelingAssignmentEntity.assignmentUid.count()) queryFactory
.from(labelingAssignmentEntity) .select(labelingAssignmentEntity.assignmentUid.count())
.innerJoin(mapSheetAnalDataInferenceGeomEntity) .from(labelingAssignmentEntity)
.on( .innerJoin(mapSheetAnalDataInferenceGeomEntity)
labelingAssignmentEntity.inferenceGeomUid.eq( .on(
mapSheetAnalDataInferenceGeomEntity.geoUid)) labelingAssignmentEntity.inferenceGeomUid.eq(
.innerJoin(mapInkx5kEntity) mapSheetAnalDataInferenceGeomEntity.geoUid))
.on(labelingAssignmentEntity.assignGroupId.eq(mapInkx5kEntity.mapidcdNo)) .innerJoin(mapInkx5kEntity)
.leftJoin(imageryEntity) .on(labelingAssignmentEntity.assignGroupId.eq(mapInkx5kEntity.mapidcdNo))
.on( .leftJoin(imageryEntity)
imageryEntity .on(
.scene5k
.eq(labelingAssignmentEntity.assignGroupId)
.and(
imageryEntity imageryEntity
.year .scene5k
.eq(mapSheetAnalDataInferenceGeomEntity.compareYyyy) .eq(labelingAssignmentEntity.assignGroupId)
.or( .and(
imageryEntity.year.eq( imageryEntity
mapSheetAnalDataInferenceGeomEntity.targetYyyy)))) .year
.where(labelingAssignmentEntity.workerUid.eq(userId)) .eq(mapSheetAnalDataInferenceGeomEntity.compareYyyy)
.groupBy(labelingAssignmentEntity.assignmentUid) .or(
.fetchOne(); imageryEntity.year.eq(
mapSheetAnalDataInferenceGeomEntity.targetYyyy))))
.where(
labelingAssignmentEntity.workerUid.eq(userId), statusInLabelState(status))
.groupBy(labelingAssignmentEntity.assignmentUid)
.fetchOne())
.orElse(0L);
return new PageImpl<>(list, pageable, count); return new PageImpl<>(list, pageable, count);
} }
@@ -127,4 +134,13 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport
"{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename)) "{0} || {1}", imageryEntity.cogMiddlePath, imageryEntity.cogFilename))
.otherwise(""); .otherwise("");
} }
private BooleanExpression statusInLabelState(String status) {
if (Objects.isNull(status)) {
return null;
}
String[] arrStatus = status.split(",");
return labelingAssignmentEntity.workState.in(arrStatus);
}
} }

View File

@@ -43,8 +43,10 @@ public class TrainingDataLabelApiController {
public ApiResponseDto<Page<LabelingListDto>> findLabelingAssignedList( public ApiResponseDto<Page<LabelingListDto>> findLabelingAssignedList(
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size, @RequestParam(defaultValue = "20") int size,
@RequestParam(defaultValue = "20260105001") String userId) { @RequestParam(defaultValue = "01022223333") String userId,
@RequestParam(defaultValue = "ASSIGNED,SKIP,DONE", required = false) String status) {
TrainingDataLabelDto.searchReq searchReq = new TrainingDataLabelDto.searchReq(page, size, ""); TrainingDataLabelDto.searchReq searchReq = new TrainingDataLabelDto.searchReq(page, size, "");
return ApiResponseDto.ok(trainingDataLabelService.findLabelingAssignedList(searchReq, userId)); return ApiResponseDto.ok(
trainingDataLabelService.findLabelingAssignedList(searchReq, userId, status));
} }
} }

View File

@@ -15,7 +15,8 @@ public class TrainingDataLabelService {
this.trainingDataLabelCoreService = trainingDataLabelCoreService; this.trainingDataLabelCoreService = trainingDataLabelCoreService;
} }
public Page<LabelingListDto> findLabelingAssignedList(searchReq searchReq, String userId) { public Page<LabelingListDto> findLabelingAssignedList(
return trainingDataLabelCoreService.findLabelingAssignedList(searchReq, userId); searchReq searchReq, String userId, String status) {
return trainingDataLabelCoreService.findLabelingAssignedList(searchReq, userId, status);
} }
} }