From e55fe3f6d6ac1f500bd6ae16c48df15c407bf246 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Mon, 12 Jan 2026 10:55:29 +0900 Subject: [PATCH] =?UTF-8?q?[KC-168]=20=EB=9D=BC=EB=B2=A8=EB=A7=81=20?= =?UTF-8?q?=ED=88=B4=20-=20=EB=AA=A9=EB=A1=9D,=20=EC=83=81=EC=84=B8=20API?= =?UTF-8?q?=20=EB=82=98=EB=88=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/TrainingDataLabelCoreService.java | 5 + .../TrainingDataLabelRepositoryCustom.java | 3 + .../TrainingDataLabelRepositoryImpl.java | 92 ++++++++++--------- .../TrainingDataLabelApiController.java | 20 ++++ .../dto/TrainingDataLabelDto.java | 56 ++++++++--- .../service/TrainingDataLabelService.java | 5 + 6 files changed, 126 insertions(+), 55 deletions(-) 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 index 76f9d29c..c57ebc8d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/TrainingDataLabelCoreService.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.postgres.core; import com.kamco.cd.kamcoback.postgres.repository.trainingdata.TrainingDataLabelRepository; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingGeometryInfo; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; import lombok.RequiredArgsConstructor; @@ -17,4 +18,8 @@ public class TrainingDataLabelCoreService { searchReq searchReq, String userId, String status) { return trainingDataLabelRepository.findLabelingAssignedList(searchReq, userId, status); } + + public LabelingGeometryInfo findLabelingAssignedGeom(String assignmentUid) { + return trainingDataLabelRepository.findLabelingAssignedGeom(assignmentUid); + } } 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 index 604f3d32..62f9cbf6 100644 --- 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 @@ -1,5 +1,6 @@ package com.kamco.cd.kamcoback.postgres.repository.trainingdata; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingGeometryInfo; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; import org.springframework.data.domain.Page; @@ -7,4 +8,6 @@ import org.springframework.data.domain.Page; public interface TrainingDataLabelRepositoryCustom { Page findLabelingAssignedList(searchReq searchReq, String userId, String status); + + LabelingGeometryInfo findLabelingAssignedGeom(String assignmentUid); } 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 index 63c1310f..7c7a1a95 100644 --- 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 @@ -6,6 +6,7 @@ import static com.kamco.cd.kamcoback.postgres.entity.QMapInkx5kEntity.mapInkx5kE 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.LabelingGeometryInfo; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; import com.querydsl.core.types.Projections; @@ -18,6 +19,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.UUID; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; @@ -49,15 +51,7 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport labelingAssignmentEntity.workState, labelingAssignmentEntity.assignGroupId, mapInkx5kEntity.mapidNm, - mapSheetAnalDataInferenceGeomEntity.pnu, - Expressions.stringTemplate( - "ST_AsGeoJSON({0})", mapSheetAnalDataInferenceGeomEntity.geom), - makeCogUrl(mapSheetAnalDataInferenceGeomEntity.compareYyyy) - .max() - .as("beforeCogUrl"), - makeCogUrl(mapSheetAnalDataInferenceGeomEntity.targetYyyy) - .max() - .as("afterCogUrl"))) + mapSheetAnalDataInferenceGeomEntity.pnu)) .from(labelingAssignmentEntity) .innerJoin(mapSheetAnalDataInferenceGeomEntity) .on( @@ -65,28 +59,7 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport mapSheetAnalDataInferenceGeomEntity.geoUid)) .innerJoin(mapInkx5kEntity) .on(labelingAssignmentEntity.assignGroupId.eq(mapInkx5kEntity.mapidcdNo)) - .leftJoin(imageryEntity) - .on( - imageryEntity - .scene5k - .eq(labelingAssignmentEntity.assignGroupId) - .and( - imageryEntity - .year - .eq(mapSheetAnalDataInferenceGeomEntity.compareYyyy) - .or( - imageryEntity.year.eq( - mapSheetAnalDataInferenceGeomEntity.targetYyyy)))) .where(labelingAssignmentEntity.workerUid.eq(userId), statusInLabelState(status)) - .groupBy( - labelingAssignmentEntity.assignmentUid, - labelingAssignmentEntity.inferenceGeomUid, - labelingAssignmentEntity.workerUid, - labelingAssignmentEntity.workState, - labelingAssignmentEntity.assignGroupId, - mapInkx5kEntity.mapidNm, - mapSheetAnalDataInferenceGeomEntity.pnu, - mapSheetAnalDataInferenceGeomEntity.geom) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .orderBy( @@ -105,27 +78,60 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport mapSheetAnalDataInferenceGeomEntity.geoUid)) .innerJoin(mapInkx5kEntity) .on(labelingAssignmentEntity.assignGroupId.eq(mapInkx5kEntity.mapidcdNo)) - .leftJoin(imageryEntity) - .on( - imageryEntity - .scene5k - .eq(labelingAssignmentEntity.assignGroupId) - .and( - imageryEntity - .year - .eq(mapSheetAnalDataInferenceGeomEntity.compareYyyy) - .or( - imageryEntity.year.eq( - mapSheetAnalDataInferenceGeomEntity.targetYyyy)))) .where( labelingAssignmentEntity.workerUid.eq(userId), statusInLabelState(status)) - .groupBy(labelingAssignmentEntity.assignmentUid) .fetchOne()) .orElse(0L); return new PageImpl<>(list, pageable, count); } + @Override + public LabelingGeometryInfo findLabelingAssignedGeom(String assignmentUid) { + return queryFactory + .select( + Projections.constructor( + LabelingGeometryInfo.class, + labelingAssignmentEntity.assignmentUid, + labelingAssignmentEntity.inferenceGeomUid, + Expressions.stringTemplate( + "ST_AsGeoJSON({0})", mapSheetAnalDataInferenceGeomEntity.geom), + makeCogUrl(mapSheetAnalDataInferenceGeomEntity.compareYyyy) + .max() + .as("beforeCogUrl"), + makeCogUrl(mapSheetAnalDataInferenceGeomEntity.targetYyyy).max().as("afterCogUrl"), + Expressions.stringTemplate("ST_AsGeoJSON({0})", mapInkx5kEntity.geom))) + .from(labelingAssignmentEntity) + .innerJoin(mapSheetAnalDataInferenceGeomEntity) + .on( + labelingAssignmentEntity.inferenceGeomUid.eq( + mapSheetAnalDataInferenceGeomEntity.geoUid)) + .innerJoin(mapInkx5kEntity) + .on(labelingAssignmentEntity.assignGroupId.eq(mapInkx5kEntity.mapidcdNo)) + .leftJoin(imageryEntity) + .on( + imageryEntity + .scene5k + .eq(labelingAssignmentEntity.assignGroupId) + .and( + imageryEntity + .year + .eq(mapSheetAnalDataInferenceGeomEntity.compareYyyy) + .or(imageryEntity.year.eq(mapSheetAnalDataInferenceGeomEntity.targetYyyy)))) + .where(labelingAssignmentEntity.assignmentUid.eq(UUID.fromString(assignmentUid))) + .groupBy( + labelingAssignmentEntity.assignmentUid, + labelingAssignmentEntity.inferenceGeomUid, + labelingAssignmentEntity.workerUid, + labelingAssignmentEntity.workState, + labelingAssignmentEntity.assignGroupId, + mapInkx5kEntity.mapidNm, + mapSheetAnalDataInferenceGeomEntity.pnu, + mapSheetAnalDataInferenceGeomEntity.geom, + mapInkx5kEntity.geom) + .fetchOne(); + } + private StringExpression makeCogUrl(NumberPath year) { return new CaseBuilder() .when(imageryEntity.year.eq(year)) diff --git a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java index b013a608..483cd2b9 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java @@ -3,6 +3,7 @@ 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.LabelingGeometryInfo; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; import com.kamco.cd.kamcoback.trainingdata.service.TrainingDataLabelService; import io.swagger.v3.oas.annotations.Operation; @@ -49,4 +50,23 @@ public class TrainingDataLabelApiController { return ApiResponseDto.ok( trainingDataLabelService.findLabelingAssignedList(searchReq, userId, status)); } + + @Operation(summary = "상세 Geometry 조회", description = "라벨 할당 상세 Geometry 조회") + @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("/geom-info") + public ApiResponseDto findLabelingAssignedGeom( + @RequestParam(defaultValue = "4f9ebc8b-6635-4177-b42f-7efc9c7b4c02") String assignmentUid) { + return ApiResponseDto.ok(trainingDataLabelService.findLabelingAssignedGeom(assignmentUid)); + } } 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 index 9ab63131..8094e78d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/dto/TrainingDataLabelDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/dto/TrainingDataLabelDto.java @@ -29,10 +29,15 @@ public class TrainingDataLabelDto { private String mapSheetNum; private String mapIdNm; private Long pnu; - @JsonIgnore private String geom_data; // json string - private JsonNode geom; - private String beforeCogUrl; - private String afterCogUrl; + + // @JsonIgnore + // private String geomData; // json string + // private JsonNode geom; + // private String beforeCogUrl; + // private String afterCogUrl; + // @JsonIgnore + // private String mapBboxString; //json string + // private JsonNode mapBbox; public LabelingListDto( UUID assignmentUid, @@ -41,10 +46,7 @@ public class TrainingDataLabelDto { String workState, String mapSheetNum, String mapIdNm, - Long pnu, - String geom_data, - String beforeCogUrl, - String afterCogUrl) { + Long pnu) { this.assignmentUid = assignmentUid; this.inferenceGeomUid = inferenceGeomUid; this.workerUid = workerUid; @@ -52,18 +54,48 @@ public class TrainingDataLabelDto { this.mapSheetNum = mapSheetNum; this.mapIdNm = mapIdNm; this.pnu = pnu; + } + } + + @Schema(name = "LabelingGeometryInfo", description = "LabelingGeometryInfo") + @Getter + @Setter + @NoArgsConstructor + public static class LabelingGeometryInfo { + + private UUID assignmentUid; + private Long inferenceGeomUid; + @JsonIgnore private String geomData; // json string + private JsonNode geom; + private String beforeCogUrl; + private String afterCogUrl; + @JsonIgnore private String mapBboxString; // json string + private JsonNode mapBbox; + + public LabelingGeometryInfo( + UUID assignmentUid, + Long inferenceGeomUid, + String geomData, + String beforeCogUrl, + String afterCogUrl, + String mapBboxString) { + this.assignmentUid = assignmentUid; + this.inferenceGeomUid = inferenceGeomUid; + this.beforeCogUrl = beforeCogUrl; + this.afterCogUrl = afterCogUrl; ObjectMapper mapper = new ObjectMapper(); JsonNode geomJson; + JsonNode mapBboxJson; try { - geomJson = mapper.readTree(geom_data); + geomJson = mapper.readTree(geomData); + mapBboxJson = mapper.readTree(mapBboxString); } catch (JsonProcessingException e) { throw new RuntimeException(e); } - this.geom = geomJson; - this.beforeCogUrl = beforeCogUrl; - this.afterCogUrl = afterCogUrl; + this.geom = geomJson; + this.mapBbox = mapBboxJson; } } 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 index 8068801d..c400e87c 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/service/TrainingDataLabelService.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.trainingdata.service; import com.kamco.cd.kamcoback.postgres.core.TrainingDataLabelCoreService; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingGeometryInfo; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelingListDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.searchReq; import org.springframework.data.domain.Page; @@ -19,4 +20,8 @@ public class TrainingDataLabelService { searchReq searchReq, String userId, String status) { return trainingDataLabelCoreService.findLabelingAssignedList(searchReq, userId, status); } + + public LabelingGeometryInfo findLabelingAssignedGeom(String assignmentUid) { + return trainingDataLabelCoreService.findLabelingAssignedGeom(assignmentUid); + } }