diff --git a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java index 92216f10..4aeea5c7 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java @@ -198,7 +198,6 @@ public class ModelMngDto { @NoArgsConstructor @AllArgsConstructor public static class ModelMetricAddReq { - private Long modelUid; private Long modelVerUid; private double f1Score; diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelCoreService.java new file mode 100644 index 00000000..e58c3bec --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelCoreService.java @@ -0,0 +1,19 @@ +package com.kamco.cd.kamcoback.postgres.core; + +import com.kamco.cd.kamcoback.postgres.repository.trainingdata.TrainingDataLabelRepository; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class TrainingDataLabelCoreService { + + private final TrainingDataLabelRepository trainingDataLabelRepository; + + public Page findLabelingAssignedList(searchReq searchReq, String userId) { + return trainingDataLabelRepository.findLabelingAssignedList(searchReq, userId); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepository.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepository.java new file mode 100644 index 00000000..bbe821f1 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepository.java @@ -0,0 +1,7 @@ +package com.kamco.cd.kamcoback.postgres.repository.trainingdata; + +import com.kamco.cd.kamcoback.postgres.entity.LabelingAssignmentEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TrainingDataLabelRepository + extends JpaRepository, TrainingDataLabelRepositoryCustom {} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryCustom.java new file mode 100644 index 00000000..a4a694de --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryCustom.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.postgres.repository.trainingdata; + +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; +import org.springframework.data.domain.Page; + +public interface TrainingDataLabelRepositoryCustom { + + Page findLabelingAssignedList(searchReq searchReq, String userId); +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryImpl.java new file mode 100644 index 00000000..83fb8fa4 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/trainingdata/TrainingDataLabelRepositoryImpl.java @@ -0,0 +1,74 @@ +package com.kamco.cd.kamcoback.postgres.repository.trainingdata; + +import static com.kamco.cd.kamcoback.postgres.entity.QLabelingAssignmentEntity.labelingAssignmentEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapInkx5kEntity.mapInkx5kEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceGeomEntity.mapSheetAnalDataInferenceGeomEntity; + +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.searchReq; +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; + +public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport + implements TrainingDataLabelRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public TrainingDataLabelRepositoryImpl(JPAQueryFactory queryFactory) { + super(LabelingAssignmentEntity.class); + this.queryFactory = queryFactory; + } + + @Override + public Page findLabelingAssignedList(searchReq searchReq, String userId) { + Pageable pageable = PageRequest.of(searchReq.getPage(), searchReq.getSize()); + List list = + queryFactory + .select( + Projections.constructor( + LabelingListDto.class, + labelingAssignmentEntity.assignmentUid, + labelingAssignmentEntity.inferenceGeomUid, + labelingAssignmentEntity.workerUid, + labelingAssignmentEntity.workState, + labelingAssignmentEntity.assignGroupId, + mapInkx5kEntity.mapidNm, + mapSheetAnalDataInferenceGeomEntity.pnu)) + .from(labelingAssignmentEntity) + .innerJoin(mapSheetAnalDataInferenceGeomEntity) + .on( + labelingAssignmentEntity.inferenceGeomUid.eq( + mapSheetAnalDataInferenceGeomEntity.geoUid)) + .innerJoin(mapInkx5kEntity) + .on(labelingAssignmentEntity.assignGroupId.eq(mapInkx5kEntity.mapidcdNo)) + .where(labelingAssignmentEntity.workerUid.eq(userId)) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy( + labelingAssignmentEntity.assignGroupId.asc(), + labelingAssignmentEntity.inferenceGeomUid.asc()) + .fetch(); + + Long count = + queryFactory + .select(labelingAssignmentEntity.assignmentUid.count()) + .from(labelingAssignmentEntity) + .innerJoin(mapSheetAnalDataInferenceGeomEntity) + .on( + labelingAssignmentEntity.inferenceGeomUid.eq( + mapSheetAnalDataInferenceGeomEntity.geoUid)) + .innerJoin(mapInkx5kEntity) + .on(labelingAssignmentEntity.assignGroupId.eq(mapInkx5kEntity.mapidcdNo)) + .where(labelingAssignmentEntity.workerUid.eq(userId)) + .fetchOne(); + + return new PageImpl<>(list, pageable, count); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java new file mode 100644 index 00000000..a9b16b6b --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java @@ -0,0 +1,50 @@ +package com.kamco.cd.kamcoback.trainingdata; + +import com.kamco.cd.kamcoback.code.dto.CommonCodeDto; +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; +import com.kamco.cd.kamcoback.trainingdata.service.TrainingDataLabelService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "라벨링 툴 > 라벨러", description = "라벨링 툴 > 라벨러 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/training-data/label") +public class TrainingDataLabelApiController { + + private final TrainingDataLabelService trainingDataLabelService; + + @Operation(summary = "목록 조회", description = "라벨 할당 목록 조회") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "조회 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = CommonCodeDto.Basic.class))), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) + @GetMapping + public ApiResponseDto> findLabelingAssignedList( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size, + @RequestParam(defaultValue = "20260105001") String userId) { + TrainingDataLabelDto.searchReq searchReq = new TrainingDataLabelDto.searchReq(page, size, ""); + return ApiResponseDto.ok(trainingDataLabelService.findLabelingAssignedList(searchReq, userId)); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/dto/TrainingDataLabelDto.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/dto/TrainingDataLabelDto.java new file mode 100644 index 00000000..15c403a7 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/dto/TrainingDataLabelDto.java @@ -0,0 +1,54 @@ +package com.kamco.cd.kamcoback.trainingdata.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +public class TrainingDataLabelDto { + + @Schema(name = "LabelingListDto", description = "LabelingListDto") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class LabelingListDto { + + private UUID assignmentUid; + private Long inferenceGeomUid; + private String workerUid; + private String workState; + private String mapSheetNum; + private String mapIdNm; + private Long pnu; + } + + @Schema(name = "searchReq", description = "검색 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class searchReq { + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + private String sort; + + public Pageable toPageable() { + if (sort != null && !sort.isEmpty()) { + String[] sortParams = sort.split(","); + String property = sortParams[0]; + Sort.Direction direction = + sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC; + return PageRequest.of(page, size, Sort.by(direction, property)); + } + return PageRequest.of(page, size); + } + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java new file mode 100644 index 00000000..e0b859c6 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java @@ -0,0 +1,21 @@ +package com.kamco.cd.kamcoback.trainingdata.service; + +import com.kamco.cd.kamcoback.postgres.core.TrainingDataLabelCoreService; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +@Service +public class TrainingDataLabelService { + + private final TrainingDataLabelCoreService trainingDataLabelCoreService; + + public TrainingDataLabelService(TrainingDataLabelCoreService trainingDataLabelCoreService) { + this.trainingDataLabelCoreService = trainingDataLabelCoreService; + } + + public Page findLabelingAssignedList(searchReq searchReq, String userId) { + return trainingDataLabelCoreService.findLabelingAssignedList(searchReq, userId); + } +}