From adcf8f0a8d82b68a429ecb2b0a1a980ed983f63b Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Wed, 14 Jan 2026 17:25:54 +0900 Subject: [PATCH] =?UTF-8?q?=EB=9D=BC=EB=B2=A8=EB=A7=81=20=ED=88=B4=20?= =?UTF-8?q?=EB=9D=BC=EB=B2=A8=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/TrainingDataLabelCoreService.java | 4 +- .../TrainingDataLabelRepositoryCustom.java | 4 +- .../TrainingDataLabelRepositoryImpl.java | 66 +++-- .../TrainingDataLabelApiController.java | 270 +++++++++--------- .../dto/TrainingDataLabelDto.java | 8 +- .../service/TrainingDataLabelService.java | 4 +- 6 files changed, 187 insertions(+), 169 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 d1904e6f..08dc40f8 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 @@ -4,7 +4,7 @@ import com.kamco.cd.kamcoback.postgres.repository.trainingdata.TrainingDataLabel import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DefaultPaging; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DetailRes; -import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.GeoFeatureRequest.Properties; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelFeatureRequest.LabelProperties; 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.SummaryRes; @@ -42,7 +42,7 @@ public class TrainingDataLabelCoreService { } public void updateLabelingPolygonClass( - Long inferenceGeomUid, Geometry geometry, Properties properties, String status) { + Long inferenceGeomUid, Geometry geometry, LabelProperties properties, String status) { trainingDataLabelRepository.updateLabelingPolygonClass( inferenceGeomUid, geometry, properties, status); } 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 3c37c4f8..d6cf2458 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 @@ -3,7 +3,7 @@ package com.kamco.cd.kamcoback.postgres.repository.trainingdata; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DefaultPaging; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DetailRes; -import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.GeoFeatureRequest.Properties; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelFeatureRequest.LabelProperties; 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.SummaryRes; @@ -25,7 +25,7 @@ public interface TrainingDataLabelRepositoryCustom { void updateLabelingSkipState(Long inferenceGeomUid, String status); void updateLabelingPolygonClass( - Long inferenceGeomUid, Geometry geometry, Properties properties, String status); + Long inferenceGeomUid, Geometry geometry, LabelProperties properties, String status); SummaryRes getSummary(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 index b5fa25ca..cb22f514 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 @@ -11,15 +11,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelState; import com.kamco.cd.kamcoback.postgres.entity.LabelingAssignmentEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataInferenceGeomEntity; +import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnDataGeomEntity; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.ChangeDetectionInfo; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.ClassificationInfo; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DefaultPaging; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DetailRes; -import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.GeoFeatureRequest.Properties; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.InferenceDataGeometry; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.InferenceDataGeometry.InferenceProperties; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.InspectionResultInfo; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelFeatureRequest.LabelProperties; 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.LearnDataGeometry; @@ -204,7 +205,7 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport @Override public void updateLabelingPolygonClass( - Long inferenceGeomUid, Geometry geometry, Properties properties, String status) { + Long inferenceGeomUid, Geometry geometry, LabelProperties properties, String status) { // inference_geom 테이블에 상태 업데이트 queryFactory .update(mapSheetAnalDataInferenceGeomEntity) @@ -225,28 +226,45 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport "MapSheetAnalDataInferenceGeomEntity not found for analUid: "); } - // learn_data_geom 에 insert - queryFactory - .insert(mapSheetLearnDataGeomEntity) - .columns( - mapSheetLearnDataGeomEntity.geoUid, - mapSheetLearnDataGeomEntity.afterYyyy, - mapSheetLearnDataGeomEntity.beforeYyyy, - mapSheetLearnDataGeomEntity.classAfterCd, - mapSheetLearnDataGeomEntity.classBeforeCd, - mapSheetLearnDataGeomEntity.geom, - mapSheetLearnDataGeomEntity.createdDate, - mapSheetLearnDataGeomEntity.modifiedDate) - .values( - inferenceGeomUid, - entity.getTargetYyyy(), - entity.getCompareYyyy(), - properties.getAfterClass().toLowerCase(), - properties.getBeforeClass().toLowerCase(), - geometry, - ZonedDateTime.now(), - ZonedDateTime.now()) - .execute(); + MapSheetLearnDataGeomEntity learnEntity = + queryFactory + .selectFrom(mapSheetLearnDataGeomEntity) + .where(mapSheetLearnDataGeomEntity.geoUid.eq(inferenceGeomUid)) + .fetchOne(); + + if (Objects.isNull(learnEntity)) { + // learn_data_geom 에 insert + queryFactory + .insert(mapSheetLearnDataGeomEntity) + .columns( + mapSheetLearnDataGeomEntity.geoUid, + mapSheetLearnDataGeomEntity.afterYyyy, + mapSheetLearnDataGeomEntity.beforeYyyy, + mapSheetLearnDataGeomEntity.classAfterCd, + mapSheetLearnDataGeomEntity.classBeforeCd, + mapSheetLearnDataGeomEntity.geom, + mapSheetLearnDataGeomEntity.createdDate, + mapSheetLearnDataGeomEntity.modifiedDate) + .values( + inferenceGeomUid, + entity.getTargetYyyy(), + entity.getCompareYyyy(), + properties.getAfterClass().toLowerCase(), + properties.getBeforeClass().toLowerCase(), + geometry, + ZonedDateTime.now(), + ZonedDateTime.now()) + .execute(); + } else { + queryFactory + .update(mapSheetLearnDataGeomEntity) + .set(mapSheetLearnDataGeomEntity.geom, geometry) + .set(mapSheetLearnDataGeomEntity.classAfterCd, properties.getAfterClass().toLowerCase()) + .set(mapSheetLearnDataGeomEntity.classBeforeCd, properties.getBeforeClass().toLowerCase()) + .set(mapSheetLearnDataGeomEntity.modifiedDate, ZonedDateTime.now()) + .where(mapSheetLearnDataGeomEntity.geoUid.eq(inferenceGeomUid)) + .execute(); + } } @Override 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 76f6b710..510f5a20 100644 --- a/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/trainingdata/TrainingDataLabelApiController.java @@ -89,7 +89,7 @@ public class TrainingDataLabelApiController { }) @PostMapping public ApiResponseDto saveLabelingFeature( - @RequestBody TrainingDataLabelDto.GeoFeatureRequest request) { + @RequestBody TrainingDataLabelDto.LabelFeatureRequest request) { return ApiResponseDto.okObject(trainingDataLabelService.saveLabelingFeature(request)); } @@ -150,147 +150,147 @@ public class TrainingDataLabelApiController { description = "1개의 polygon이 저장된 경우 응답 예시", value = """ - { - "code": "OK", - "message": null, - "data": { - "assignmentUid": "4f9ebc8b-6635-4177-b42f-7efc9c7b4c02", - "changeDetectionInfo": { - "mapSheetInfo": "NI52-3-13-1", - "detectionYear": "2023-2024", - "beforeClass": { - "classification": "waste", - "probability": 0.95 - }, - "afterClass": { - "classification": "land", - "probability": 0.98 - }, - "area": 1250.5, - "detectionAccuracy": 0.96, - "pnu": 1234567890 - }, - "inspectionResultInfo": { - "verificationResult": "완료", - "inappropriateReason": "" - }, - "geom": { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] - }, - "properties": { - "beforeClass": "waste", - "afterClass": "land" - } - }, - "beforeCogUrl": "https://storage.example.com/cog/2023/NI52-3-13-1.tif", - "afterCogUrl": "https://storage.example.com/cog/2024/NI52-3-13-1.tif", - "mapBox": { - "type": "Polygon", - "coordinates": [[[126.65, 34.58], [126.67, 34.58], [126.67, 34.60], [126.65, 34.60], [126.65, 34.58]]] - }, - "learnGeometries": [ - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] - }, - "properties": { - "beforeClass": "waste", - "afterClass": "land" - } - } - ] - } + { + "code": "OK", + "message": null, + "data": { + "assignmentUid": "4f9ebc8b-6635-4177-b42f-7efc9c7b4c02", + "changeDetectionInfo": { + "mapSheetInfo": "NI52-3-13-1", + "detectionYear": "2023-2024", + "beforeClass": { + "classification": "waste", + "probability": 0.95 + }, + "afterClass": { + "classification": "land", + "probability": 0.98 + }, + "area": 1250.5, + "detectionAccuracy": 0.96, + "pnu": 1234567890 + }, + "inspectionResultInfo": { + "verificationResult": "완료", + "inappropriateReason": "" + }, + "geom": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] + }, + "properties": { + "beforeClass": "waste", + "afterClass": "land" + } + }, + "beforeCogUrl": "https://storage.example.com/cog/2023/NI52-3-13-1.tif", + "afterCogUrl": "https://storage.example.com/cog/2024/NI52-3-13-1.tif", + "mapBox": { + "type": "Polygon", + "coordinates": [[[126.65, 34.58], [126.67, 34.58], [126.67, 34.60], [126.65, 34.60], [126.65, 34.58]]] + }, + "learnGeometries": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] + }, + "properties": { + "beforeClass": "waste", + "afterClass": "land" } - """), + } + ] + } + } + """), @io.swagger.v3.oas.annotations.media.ExampleObject( name = "여러 polygon 조회", description = "3개의 polygon이 저장된 경우 응답 예시", value = """ - { - "code": "OK", - "message": null, - "data": { - "assignmentUid": "4f9ebc8b-6635-4177-b42f-7efc9c7b4c02", - "changeDetectionInfo": { - "mapSheetInfo": "NI52-3-13-1", - "detectionYear": "2023-2024", - "beforeClass": { - "classification": "waste", - "probability": 0.95 - }, - "afterClass": { - "classification": "land", - "probability": 0.98 - }, - "area": 1250.5, - "detectionAccuracy": 0.96, - "pnu": 1234567890 - }, - "inspectionResultInfo": { - "verificationResult": "완료", - "inappropriateReason": "" - }, - "geom": { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] - }, - "properties": { - "beforeClass": "waste", - "afterClass": "land" - } - }, - "beforeCogUrl": "https://storage.example.com/cog/2023/NI52-3-13-1.tif", - "afterCogUrl": "https://storage.example.com/cog/2024/NI52-3-13-1.tif", - "mapBox": { - "type": "Polygon", - "coordinates": [[[126.65, 34.58], [126.67, 34.58], [126.67, 34.60], [126.65, 34.60], [126.65, 34.58]]] - }, - "learnGeometries": [ - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] - }, - "properties": { - "beforeClass": "waste", - "afterClass": "land" - } - }, - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[126.665, 34.585], [126.664, 34.584], [126.666, 34.586], [126.665, 34.585]]] - }, - "properties": { - "beforeClass": "forest", - "afterClass": "building" - } - }, - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[126.660, 34.590], [126.659, 34.589], [126.661, 34.591], [126.660, 34.590]]] - }, - "properties": { - "beforeClass": "grassland", - "afterClass": "concrete" - } - } - ] - } + { + "code": "OK", + "message": null, + "data": { + "assignmentUid": "4f9ebc8b-6635-4177-b42f-7efc9c7b4c02", + "changeDetectionInfo": { + "mapSheetInfo": "NI52-3-13-1", + "detectionYear": "2023-2024", + "beforeClass": { + "classification": "waste", + "probability": 0.95 + }, + "afterClass": { + "classification": "land", + "probability": 0.98 + }, + "area": 1250.5, + "detectionAccuracy": 0.96, + "pnu": 1234567890 + }, + "inspectionResultInfo": { + "verificationResult": "완료", + "inappropriateReason": "" + }, + "geom": { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] + }, + "properties": { + "beforeClass": "waste", + "afterClass": "land" + } + }, + "beforeCogUrl": "https://storage.example.com/cog/2023/NI52-3-13-1.tif", + "afterCogUrl": "https://storage.example.com/cog/2024/NI52-3-13-1.tif", + "mapBox": { + "type": "Polygon", + "coordinates": [[[126.65, 34.58], [126.67, 34.58], [126.67, 34.60], [126.65, 34.60], [126.65, 34.58]]] + }, + "learnGeometries": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[[126.663, 34.588], [126.662, 34.587], [126.664, 34.589], [126.663, 34.588]]] + }, + "properties": { + "beforeClass": "waste", + "afterClass": "land" } - """) + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[[126.665, 34.585], [126.664, 34.584], [126.666, 34.586], [126.665, 34.585]]] + }, + "properties": { + "beforeClass": "forest", + "afterClass": "building" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[[126.660, 34.590], [126.659, 34.589], [126.661, 34.591], [126.660, 34.590]]] + }, + "properties": { + "beforeClass": "grassland", + "afterClass": "concrete" + } + } + ] + } + } + """) })), @ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content), @ApiResponse(responseCode = "404", description = "데이터를 찾을 수 없음", content = @Content), 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 7be9ee6c..b45f2c1c 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 @@ -96,12 +96,12 @@ public class TrainingDataLabelDto { } } - @Schema(name = "GeoFeatureRequest", description = "polygon 저장") + @Schema(name = "LabelFeatureRequest", description = "polygon 저장") @Getter @Setter @NoArgsConstructor @AllArgsConstructor - public static class GeoFeatureRequest { + public static class LabelFeatureRequest { @Schema(description = "assignmentUid", example = "4f9ebc8b-6635-4177-b42f-7efc9c7b4c02") private String assignmentUid; @@ -148,10 +148,10 @@ public class TrainingDataLabelDto { """) private Geometry geometry; - private Properties properties; + private LabelProperties properties; @Getter - public static class Properties { + public static class LabelProperties { @Schema(description = "beforeClass", example = "WASTE") private String beforeClass; 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 159e3d2a..9e31efce 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 @@ -6,7 +6,7 @@ import com.kamco.cd.kamcoback.postgres.core.TrainingDataLabelCoreService; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DefaultPaging; import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.DetailRes; -import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.GeoFeatureRequest; +import com.kamco.cd.kamcoback.trainingdata.dto.TrainingDataLabelDto.LabelFeatureRequest; 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.SummaryRes; @@ -36,7 +36,7 @@ public class TrainingDataLabelService { } @Transactional - public ResponseObj saveLabelingFeature(GeoFeatureRequest request) { + public ResponseObj saveLabelingFeature(LabelFeatureRequest request) { String status = ""; String assignmentUid = request.getAssignmentUid(); Long inferenceGeomUid =