diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java index 01e6ab03..b1bf71a0 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.*; @Tag(name = "변화탐지", description = "변화탐지 API") @RequiredArgsConstructor @RestController -@RequestMapping("/api/change-detection") +@RequestMapping({"/api/change-detection", "/demo/api/change-detection"}) @Transactional public class ChangeDetectionApiController { @@ -41,11 +41,12 @@ public class ChangeDetectionApiController { } @Operation(summary = "변화탐지 분류별 건수", description = "변화탐지 분류별 건수") - @GetMapping("/class-count/{id}") + @GetMapping("/class-count") public ApiResponseDto> getChangeDetectionClassCount( - @Parameter(description = "변화탐지 년도(차수) /year-list 의 analUid", example = "1") @PathVariable - Long id) { - return ApiResponseDto.ok(changeDetectionService.getChangeDetectionClassCount(id)); + @Parameter(description = "변화탐지 년도(차수) /year-list 의 analUid", example = "1") @RequestParam + Long id, + @Parameter(description = "탐지된 도엽번호", example = "34602060") @RequestParam String mapSheetNum) { + return ApiResponseDto.ok(changeDetectionService.getChangeDetectionClassCount(id, mapSheetNum)); } @Operation(summary = "변화탐지 COG Url", description = "변화탐지 COG Url") @@ -64,4 +65,29 @@ public class ChangeDetectionApiController { public ApiResponseDto> getChangeDetectionYearList() { return ApiResponseDto.ok(changeDetectionService.getChangeDetectionYearList()); } + + @Operation(summary = "변화탐지 탐지된 도엽 목록", description = "변화탐지 탐지된 도엽 목록") + @GetMapping("/map-list") + public ApiResponseDto> getChangeDetectionMapSheetList( + @Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid) { + return ApiResponseDto.ok(changeDetectionService.getChangeDetectionMapSheetList(analUid)); + } + + @Operation(summary = "변화탐지 결과 Polygon", description = "변화탐지 결과 Polygon") + @GetMapping("/polygon") + public ApiResponseDto> getChangeDetectionPolygonList( + @Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid, + @Parameter(description = "도엽번호", example = "34602060") @RequestParam String mapSheetNum) { + return ApiResponseDto.ok( + changeDetectionService.getChangeDetectionPolygonList(analUid, mapSheetNum)); + } + + @Operation(summary = "변화탐지 결과 Point", description = "변화탐지 결과 Point") + @GetMapping("/point") + public ApiResponseDto> getChangeDetectionPointList( + @Parameter(description = "년도목록 id", example = "1") @RequestParam Long analUid, + @Parameter(description = "도엽번호", example = "34602060") @RequestParam String mapSheetNum) { + return ApiResponseDto.ok( + changeDetectionService.getChangeDetectionPointList(analUid, mapSheetNum)); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java index fa71e98b..6fd40b2b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/dto/ChangeDetectionDto.java @@ -18,7 +18,6 @@ public class ChangeDetectionDto { private Long id; private Geometry polygon; private Double centroidX; - ; private Double centroidY; } @@ -68,6 +67,17 @@ public class ChangeDetectionDto { private String baseMapSheetNum; } + @Schema(name = "MapSheetList", description = "년도에 해당하는 도엽 목록") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class MapSheetList { + private String mapSheetNum; + private String mapSheetName; + private String alias; + } + @Schema(name = "PolygonGeometry", description = "폴리곤 리턴 객체") @Getter @Setter @@ -75,37 +85,30 @@ public class ChangeDetectionDto { @AllArgsConstructor public static class PointGeometry { private Long geoUid; - private String type; // "Point" - private Geometry coordinates; // Point 값 - private String before_class; // 기준 분류 - private String after_class; // 비교 분류 + private Geometry geometry; // Point 값 + private String classCd; // after 분류 } @Schema(name = "PolygonGeometry", description = "폴리곤 리턴 객체") @Getter - @Setter @NoArgsConstructor @AllArgsConstructor public static class PolygonGeometry { private Long geoUid; - private String type; // "MultiPolygon" - private Geometry coordinates; // Polygon 값 - private Double center_latitude; // 폴리곤 중심 위도 - private Double center_longitude; // 폴리곤 중심 경도 + private Geometry geometry; // Polygon 값 + private PolygonProperties properties; } @Schema(name = "PolygonProperties", description = "폴리곤 정보") @Getter - @Setter - @NoArgsConstructor @AllArgsConstructor public static class PolygonProperties { private Double area; // 면적 - private String before_year; // 기준년도 - private Double before_confidence; // 기준 신뢰도(확률) - private String before_class; // 기준 분류 - private String after_year; // 비교년도 - private Double after_confidence; // 비교 신뢰도(확률) - private String after_class; // 비교 분류 + private Integer beforeYear; // 기준년도 + private Double beforeConfidence; // 기준 신뢰도(확률) + private String beforeClass; // 기준 분류 + private Integer afterYear; // 비교년도 + private Double afterConfidence; // 비교 신뢰도(확률) + private String afterClass; // 비교 분류 } } diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java index 929b93e0..0fb8f5f7 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/service/ChangeDetectionService.java @@ -21,8 +21,9 @@ public class ChangeDetectionService { return changeDetectionCoreService.getPolygonToJson(); } - public List getChangeDetectionClassCount(Long id) { - return changeDetectionCoreService.getChangeDetectionClassCount(id); + public List getChangeDetectionClassCount( + Long id, String mapSheetNum) { + return changeDetectionCoreService.getChangeDetectionClassCount(id, mapSheetNum); } public ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req) { @@ -32,4 +33,18 @@ public class ChangeDetectionService { public List getChangeDetectionYearList() { return changeDetectionCoreService.getChangeDetectionYearList(); } + + public List getChangeDetectionPolygonList( + Long analUid, String mapSheetNum) { + return changeDetectionCoreService.getChangeDetectionPolygonList(analUid, mapSheetNum); + } + + public List getChangeDetectionPointList( + Long analUid, String mapSheetNum) { + return changeDetectionCoreService.getChangeDetectionPointList(analUid, mapSheetNum); + } + + public List getChangeDetectionMapSheetList(Long analUid) { + return changeDetectionCoreService.getChangeDetectionMapSheetList(analUid); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/common/enums/DetectionClassification.java b/src/main/java/com/kamco/cd/kamcoback/common/enums/DetectionClassification.java index dbc578cc..a3a2bd7c 100644 --- a/src/main/java/com/kamco/cd/kamcoback/common/enums/DetectionClassification.java +++ b/src/main/java/com/kamco/cd/kamcoback/common/enums/DetectionClassification.java @@ -41,4 +41,14 @@ public enum DetectionClassification { return ETC; } } + + /** + * Desc 한글명 get 하기 + * + * @return + */ + public static String fromStrDesc(String text) { + DetectionClassification dtf = fromString(text); + return dtf.getDesc(); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java index 760ac5e5..b61086d9 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java @@ -103,9 +103,9 @@ public class InferenceResultApiController { @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) - @GetMapping("/detail") + @GetMapping("/detail/{id}") public ApiResponseDto getInferenceDetail( - @Parameter(description = "목록 id", example = "1") @RequestParam Long id) { + @Parameter(description = "목록 id", example = "1") @PathVariable Long id) { return ApiResponseDto.ok(inferenceResultService.getDetail(id)); } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java index ee1506e3..e093b8c3 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java @@ -148,47 +148,14 @@ public class InferenceResultDto { @Getter public static class Dashboard { - Integer compareYyyy; - Integer targetYyyy; - Long mapSheetNum; - String classBeforeName; + String classAfterCd; String classAfterName; - Long classBeforeCnt; Long classAfterCnt; - @JsonFormatDttm ZonedDateTime createdDttm; - Long createdUid; - @JsonFormatDttm ZonedDateTime updatedDttm; - Long updatedUid; - Long refMapSheetNum; - Long dataUid; - public Dashboard( - Integer compareYyyy, - Integer targetYyyy, - Long mapSheetNum, - String classBeforeName, - String classAfterName, - Long classBeforeCnt, - Long classAfterCnt, - ZonedDateTime createdDttm, - Long createdUid, - ZonedDateTime updatedDttm, - Long updatedUid, - Long refMapSheetNum, - Long dataUid) { - this.compareYyyy = compareYyyy; - this.targetYyyy = targetYyyy; - this.mapSheetNum = mapSheetNum; - this.classBeforeName = classBeforeName; - this.classAfterName = classAfterName; - this.classBeforeCnt = classBeforeCnt; + public Dashboard(String classAfterCd, Long classAfterCnt) { + this.classAfterCd = classAfterCd; + this.classAfterName = DetectionClassification.fromString(classAfterCd).getDesc(); this.classAfterCnt = classAfterCnt; - this.createdDttm = createdDttm; - this.createdUid = createdUid; - this.updatedDttm = updatedDttm; - this.updatedUid = updatedUid; - this.refMapSheetNum = refMapSheetNum; - this.dataUid = dataUid; } } @@ -196,9 +163,13 @@ public class InferenceResultDto { public static class Detail { AnalResSummary summary; + List dashboard; + Long totalCnt; - public Detail(AnalResSummary summary) { + public Detail(AnalResSummary summary, List dashboard, Long totalCnt) { this.summary = summary; + this.dashboard = dashboard; + this.totalCnt = totalCnt; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java index 2494a080..76490500 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.inference.service; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.Dashboard; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.Detail; import com.kamco.cd.kamcoback.postgres.core.InferenceResultCoreService; import java.util.List; @@ -37,6 +38,16 @@ public class InferenceResultService { return inferenceResultCoreService.getInferenceResultSummary(id); } + /** + * 분석결과 상세 class name별 탐지 개수 + * + * @param id + * @return + */ + public List getDashboard(Long id) { + return inferenceResultCoreService.getDashboard(id); + } + /** * 분석결과 상세 목록 * @@ -57,7 +68,14 @@ public class InferenceResultService { public Detail getDetail(Long id) { // summary InferenceResultDto.AnalResSummary summary = this.getInferenceResultSummary(id); - return new Detail(summary); + + // Dashboard + List dashboards = this.getDashboard(id); + + // 전체 탐지건수 + Long totalCnt = dashboards.stream().mapToLong(Dashboard::getClassAfterCnt).sum(); + + return new Detail(summary, dashboards, totalCnt); } /** diff --git a/src/main/java/com/kamco/cd/kamcoback/log/ErrorLogApiController.java b/src/main/java/com/kamco/cd/kamcoback/log/ErrorLogApiController.java index 6c56e10f..dcc9670a 100644 --- a/src/main/java/com/kamco/cd/kamcoback/log/ErrorLogApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/log/ErrorLogApiController.java @@ -31,11 +31,18 @@ public class ErrorLogApiController { @RequestParam(required = false) LocalDate endDate, @RequestParam int page, @RequestParam(defaultValue = "20") int size) { - ErrorLogDto.ErrorSearchReq searchReq = - new ErrorLogDto.ErrorSearchReq( - logErrorLevel, eventType, startDate, endDate, page, size, "created_dttm,desc"); - Page result = errorLogService.findLogByError(searchReq); + try { - return ApiResponseDto.ok(result); + ErrorLogDto.ErrorSearchReq searchReq = + new ErrorLogDto.ErrorSearchReq( + logErrorLevel, eventType, startDate, endDate, page, size, "created_dttm,desc"); + Page result = errorLogService.findLogByError(searchReq); + return ApiResponseDto.ok(result); + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/log/dto/ErrorLogDto.java b/src/main/java/com/kamco/cd/kamcoback/log/dto/ErrorLogDto.java index f4e85c17..4b0f73ad 100644 --- a/src/main/java/com/kamco/cd/kamcoback/log/dto/ErrorLogDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/log/dto/ErrorLogDto.java @@ -1,11 +1,8 @@ package com.kamco.cd.kamcoback.log.dto; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; import com.kamco.cd.kamcoback.config.enums.EnumType; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; -import java.time.ZonedDateTime; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -18,43 +15,21 @@ public class ErrorLogDto { @Schema(name = "ErrorLogBasic", description = "에러로그 기본 정보") @Getter + @Setter + @AllArgsConstructor public static class Basic { - @JsonIgnore private final Long id; - private final String requestId; + private final Long id; + private final String serviceName; + private final String menuNm; + private final String loginId; + private final String userName; private final EventType errorType; + private final String errorName; private final LogErrorLevel errorLevel; private final String errorCode; private final String errorMessage; - private final String stackTrace; - private final Long handlerUid; - - @JsonFormatDttm private final ZonedDateTime handledDttm; - - @JsonFormatDttm private final ZonedDateTime createdDttm; - - public Basic( - Long id, - String requestId, - EventType errorType, - LogErrorLevel errorLevel, - String errorCode, - String errorMessage, - String stackTrace, - Long handlerUid, - ZonedDateTime handledDttm, - ZonedDateTime createdDttm) { - this.id = id; - this.requestId = requestId; - this.errorType = errorType; - this.errorLevel = errorLevel; - this.errorCode = errorCode; - this.errorMessage = errorMessage; - this.stackTrace = stackTrace; - this.handlerUid = handlerUid; - this.handledDttm = handledDttm; - this.createdDttm = createdDttm; - } + private final String createDate; // to_char해서 가져옴 } @Schema(name = "ErrorSearchReq", description = "에러로그 검색 요청") diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java index 56290b7a..90701b72 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/ChangeDetectionCoreService.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.changedetection.dto.ChangeDetectionDto; +import com.kamco.cd.kamcoback.common.enums.DetectionClassification; import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity; import com.kamco.cd.kamcoback.postgres.repository.changedetection.ChangeDetectionRepository; import java.util.List; @@ -51,8 +52,20 @@ public class ChangeDetectionCoreService { .collect(Collectors.toList()); } - public List getChangeDetectionClassCount(Long id) { - return changeDetectionRepository.getChangeDetectionClassCount(id); + public List getChangeDetectionClassCount( + Long id, String mapSheetNum) { + List list = + changeDetectionRepository.getChangeDetectionClassCount(id, mapSheetNum); + + return list.stream() + .map( + s -> { + String classCd = String.valueOf(s.getClassCd()); + s.setClassCd(DetectionClassification.fromString(classCd).name()); + s.setClassName(DetectionClassification.fromStrDesc(classCd)); + return s; + }) + .collect(Collectors.toList()); } public ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req) { @@ -62,4 +75,27 @@ public class ChangeDetectionCoreService { public List getChangeDetectionYearList() { return changeDetectionRepository.getChangeDetectionYearList(); } + + public List getChangeDetectionPolygonList( + Long analUid, String mapSheetNum) { + return changeDetectionRepository.getChangeDetectionPolygonList(analUid, mapSheetNum); + } + + public List getChangeDetectionPointList( + Long analUid, String mapSheetNum) { + return changeDetectionRepository.getChangeDetectionPointList(analUid, mapSheetNum); + } + + public List getChangeDetectionMapSheetList(Long analUid) { + List list = + changeDetectionRepository.getChangeDetectionMapSheetList(analUid); + return list.stream() + .map( + s -> { + String name = s.getMapSheetName(); + s.setAlias(name + s.getMapSheetNum().substring(5, 8)); + return s; + }) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/InferenceResultCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/InferenceResultCoreService.java index 18ed6596..bbf1ea90 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/InferenceResultCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/InferenceResultCoreService.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.postgres.core; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.Dashboard; import com.kamco.cd.kamcoback.postgres.repository.Inference.InferenceResultRepository; import jakarta.persistence.EntityNotFoundException; import java.util.List; @@ -39,6 +40,16 @@ public class InferenceResultCoreService { return summary; } + /** + * 분석결과 상세 class name별 탐지 개수 + * + * @param id + * @return + */ + public List getDashboard(Long id) { + return inferenceResultRepository.getDashboard(id); + } + /** * 분석결과 상세 목록 * diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/DemoLearningAnalysisSceneItemEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/DemoLearningAnalysisSceneItemEntity.java new file mode 100644 index 00000000..9fb661b9 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/DemoLearningAnalysisSceneItemEntity.java @@ -0,0 +1,34 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; +import jakarta.persistence.*; +import java.time.ZonedDateTime; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Table(name = "demo_learning_analysis_scene_item") +@Entity +public class DemoLearningAnalysisSceneItemEntity { + @Id + @GeneratedValue( + strategy = GenerationType.SEQUENCE, + generator = "demo_learning_analysis_scene_item_group_item_id_gen") + @SequenceGenerator( + name = "demo_learning_analysis_scene_item_group_item_id_gen", + sequenceName = "demo_learning_analysis_scene_item_group_item_id_seq", + allocationSize = 1) + @Column(name = "group_item_id", nullable = false) + private Long id; + + @Column(name = "group_id") + private Long groupId; + + @Column(name = "fid") + private Long fid; + + @JsonFormatDttm + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntity.java index b25a386c..ca43c9c8 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntity.java @@ -5,8 +5,7 @@ import jakarta.persistence.EmbeddedId; import jakarta.persistence.Entity; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import java.time.ZonedDateTime; +import java.time.OffsetDateTime; import lombok.Getter; import lombok.Setter; import org.hibernate.annotations.ColumnDefault; @@ -19,24 +18,22 @@ public class MapSheetAnalSttcEntity { @EmbeddedId private MapSheetAnalSttcEntityId id; - @ColumnDefault("0") @Column(name = "class_before_cnt") private Long classBeforeCnt; - @ColumnDefault("0") @Column(name = "class_after_cnt") private Long classAfterCnt; @ColumnDefault("now()") @Column(name = "created_dttm") - private ZonedDateTime createdDttm; + private OffsetDateTime createdDttm; @Column(name = "created_uid") private Long createdUid; @ColumnDefault("now()") @Column(name = "updated_dttm") - private ZonedDateTime updatedDttm; + private OffsetDateTime updatedDttm; @Column(name = "updated_uid") private Long updatedUid; @@ -45,15 +42,6 @@ public class MapSheetAnalSttcEntity { @Column(name = "ref_map_sheet_num", nullable = false) private Long refMapSheetNum; - @NotNull - @Column(name = "data_uid", nullable = false) - private Long dataUid; - - @Size(max = 30) - @Column(name = "class_before_cd", length = 30) - private String classBeforeCd; - - @Size(max = 30) - @Column(name = "class_after_cd", length = 30) - private String classAfterCd; + @Column(name = "class_after_prob_avg") + private Double classAfterProbAvg; } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntityId.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntityId.java index b117dcb4..3e0fd801 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntityId.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalSttcEntityId.java @@ -3,18 +3,20 @@ package com.kamco.cd.kamcoback.postgres.entity; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import java.io.Serializable; import java.util.Objects; import lombok.Getter; import lombok.Setter; import org.hibernate.Hibernate; +import org.hibernate.annotations.ColumnDefault; @Getter @Setter @Embeddable public class MapSheetAnalSttcEntityId implements Serializable { - private static final long serialVersionUID = 2285491656408229553L; + private static final long serialVersionUID = 3649782418773406961L; @NotNull @Column(name = "compare_yyyy", nullable = false) @@ -28,6 +30,25 @@ public class MapSheetAnalSttcEntityId implements Serializable { @Column(name = "map_sheet_num", nullable = false) private Long mapSheetNum; + @NotNull + @Column(name = "data_uid", nullable = false) + private Long dataUid; + + @Size(max = 30) + @NotNull + @ColumnDefault("NULL") + @Column(name = "class_before_cd", nullable = false, length = 30) + private String classBeforeCd; + + @Size(max = 30) + @NotNull + @ColumnDefault("NULL") + @Column(name = "class_after_cd", nullable = false, length = 30) + private String classAfterCd; + + @Column(name = "anal_uid") + private Long analUid; + @Override public boolean equals(Object o) { if (this == o) { @@ -38,12 +59,17 @@ public class MapSheetAnalSttcEntityId implements Serializable { } MapSheetAnalSttcEntityId entity = (MapSheetAnalSttcEntityId) o; return Objects.equals(this.targetYyyy, entity.targetYyyy) + && Objects.equals(this.analUid, entity.analUid) + && Objects.equals(this.dataUid, entity.dataUid) + && Objects.equals(this.classAfterCd, entity.classAfterCd) && Objects.equals(this.compareYyyy, entity.compareYyyy) + && Objects.equals(this.classBeforeCd, entity.classBeforeCd) && Objects.equals(this.mapSheetNum, entity.mapSheetNum); } @Override public int hashCode() { - return Objects.hash(targetYyyy, compareYyyy, mapSheetNum); + return Objects.hash( + targetYyyy, analUid, dataUid, classAfterCd, compareYyyy, classBeforeCd, mapSheetNum); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryCustom.java index 11abfda5..629d4ef9 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryCustom.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.postgres.repository.Inference; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.Dashboard; import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; @@ -16,4 +17,6 @@ public interface InferenceResultRepositoryCustom { Long id, InferenceResultDto.SearchGeoReq searchGeoReq); List getSheets(Long id); + + List getDashboard(Long id); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java index 9c142efa..603766cc 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/InferenceResultRepositoryImpl.java @@ -1,10 +1,12 @@ package com.kamco.cd.kamcoback.postgres.repository.Inference; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.Dashboard; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.SearchGeoReq; import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataEntity; import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataGeomEntity; import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalEntity; +import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalSttcEntity; import com.kamco.cd.kamcoback.postgres.entity.QModelMngEntity; import com.kamco.cd.kamcoback.postgres.entity.QModelVerEntity; import com.querydsl.core.BooleanBuilder; @@ -33,6 +35,8 @@ public class InferenceResultRepositoryImpl implements InferenceResultRepositoryC QMapSheetAnalDataEntity.mapSheetAnalDataEntity; private final QMapSheetAnalDataGeomEntity mapSheetAnalDataGeomEntity = QMapSheetAnalDataGeomEntity.mapSheetAnalDataGeomEntity; + private final QMapSheetAnalSttcEntity mapSheetAnalSttcEntity = + QMapSheetAnalSttcEntity.mapSheetAnalSttcEntity; /** * 분석결과 목록 조회 @@ -134,6 +138,27 @@ public class InferenceResultRepositoryImpl implements InferenceResultRepositoryC return content; } + /** + * 분석결과 상세 class name별 탐지 개수 + * + * @param id + * @return + */ + @Override + public List getDashboard(Long id) { + return queryFactory + .select( + Projections.constructor( + Dashboard.class, + mapSheetAnalSttcEntity.id.classAfterCd, + mapSheetAnalSttcEntity.classAfterCnt.sum())) + .from(mapSheetAnalSttcEntity) + .where(mapSheetAnalSttcEntity.id.analUid.eq(id)) + .groupBy(mapSheetAnalSttcEntity.id.classAfterCd) + .orderBy(mapSheetAnalSttcEntity.id.classAfterCd.asc()) + .fetch(); + } + /** * 분석결과 상세 목록 * diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java index 228fa7fc..43d79c77 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryCustom.java @@ -9,9 +9,17 @@ public interface ChangeDetectionRepositoryCustom { List findPolygonJson(); - List getChangeDetectionClassCount(Long id); + List getChangeDetectionClassCount(Long id, String mapSheetNum); ChangeDetectionDto.CogUrlDto getChangeDetectionCogUrl(ChangeDetectionDto.CogUrlReq req); List getChangeDetectionYearList(); + + List getChangeDetectionPolygonList( + Long analUid, String mapSheetNum); + + List getChangeDetectionPointList( + Long analUid, String mapSheetNum); + + List getChangeDetectionMapSheetList(Long analUid); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java index a2e32780..43eb2647 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/changedetection/ChangeDetectionRepositoryImpl.java @@ -1,5 +1,6 @@ package com.kamco.cd.kamcoback.postgres.repository.changedetection; +import static com.kamco.cd.kamcoback.postgres.entity.QDemoLearningAnalysisSceneItemEntity.demoLearningAnalysisSceneItemEntity; import static com.kamco.cd.kamcoback.postgres.entity.QImageryEntity.imageryEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapInkx5kEntity.mapInkx5kEntity; import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataEntity.mapSheetAnalDataEntity; @@ -13,6 +14,7 @@ import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.StringExpression; +import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; @@ -43,20 +45,23 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport } @Override - public List getChangeDetectionClassCount(Long id) { + public List getChangeDetectionClassCount( + Long id, String mapSheetNum) { return queryFactory .select( Projections.constructor( ChangeDetectionDto.CountDto.class, - mapSheetAnalSttcEntity.classAfterCd.toUpperCase(), - null, // TOOD classAfterName 삭제해서 수정 필요 + mapSheetAnalSttcEntity.classAfterCd.as("classCd"), + mapSheetAnalSttcEntity.classAfterCd.as("classNm"), // 앞단 CoreService 에서 한글명으로 변환 mapSheetAnalSttcEntity.classAfterCnt.sum())) .from(mapSheetAnalEntity) .innerJoin(mapSheetAnalDataEntity) .on(mapSheetAnalDataEntity.analUid.eq(mapSheetAnalEntity.id)) .innerJoin(mapSheetAnalSttcEntity) .on(mapSheetAnalSttcEntity.dataUid.eq(mapSheetAnalDataEntity.id)) - .where(mapSheetAnalEntity.id.eq(id)) + .where( + mapSheetAnalEntity.id.eq(id), + mapSheetAnalSttcEntity.id.mapSheetNum.eq(Long.valueOf(mapSheetNum))) .groupBy(mapSheetAnalSttcEntity.classAfterCd) .fetch(); } @@ -99,6 +104,72 @@ public class ChangeDetectionRepositoryImpl extends QuerydslRepositorySupport .fetch(); } + @Override + public List getChangeDetectionPolygonList( + Long analUid, String mapSheetNum) { + return queryFactory + .select( + Projections.constructor( + ChangeDetectionDto.PolygonGeometry.class, + mapSheetAnalDataGeomEntity.id, + mapSheetAnalDataGeomEntity.geom, // polygon + Projections.constructor( + ChangeDetectionDto.PolygonProperties.class, + mapSheetAnalDataGeomEntity.area, + mapSheetAnalDataGeomEntity.compareYyyy, + mapSheetAnalDataGeomEntity.classBeforeProb, + mapSheetAnalDataGeomEntity.classBeforeCd.toUpperCase(), + mapSheetAnalDataGeomEntity.targetYyyy, + mapSheetAnalDataGeomEntity.classAfterProb, + mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase()))) + .from(mapSheetAnalDataGeomEntity) + .where( + mapSheetAnalDataGeomEntity.dataUid.in( + JPAExpressions.select(mapSheetAnalDataEntity.id) + .from(mapSheetAnalDataEntity) + .where(mapSheetAnalDataEntity.analUid.eq(analUid))), + mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum))) + .fetch(); + } + + @Override + public List getChangeDetectionPointList( + Long analUid, String mapSheetNum) { + return queryFactory + .select( + Projections.constructor( + ChangeDetectionDto.PointGeometry.class, + mapSheetAnalDataGeomEntity.id, + mapSheetAnalDataGeomEntity.geomCenter, // point + mapSheetAnalDataGeomEntity.classAfterCd.toUpperCase())) + .from(mapSheetAnalDataGeomEntity) + .where( + mapSheetAnalDataGeomEntity.dataUid.in( + JPAExpressions.select(mapSheetAnalDataEntity.id) + .from(mapSheetAnalDataEntity) + .where(mapSheetAnalDataEntity.analUid.eq(analUid))), + mapSheetAnalDataGeomEntity.mapSheetNum.eq(Long.valueOf(mapSheetNum))) + .fetch(); + } + + @Override + public List getChangeDetectionMapSheetList(Long analUid) { + return queryFactory + .select( + Projections.constructor( + ChangeDetectionDto.MapSheetList.class, + mapInkx5kEntity.mapidcdNo, + mapInkx5kEntity.mapidNm, + mapInkx5kEntity.mapidNm // alias 앞단 core에서 + )) + .from(demoLearningAnalysisSceneItemEntity) + .innerJoin(mapInkx5kEntity) + .on(demoLearningAnalysisSceneItemEntity.fid.eq(mapInkx5kEntity.fid.longValue())) + .where(demoLearningAnalysisSceneItemEntity.groupId.eq(analUid)) + .orderBy(mapInkx5kEntity.mapidNm.asc(), mapInkx5kEntity.mapidcdNo.asc()) + .fetch(); + } + private StringExpression makeCogUrl(Integer year) { return new CaseBuilder() .when(imageryEntity.year.eq(year)) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/ErrorLogRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/ErrorLogRepositoryImpl.java index 854590c4..0efa6bc6 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/ErrorLogRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/ErrorLogRepositoryImpl.java @@ -43,7 +43,7 @@ public class ErrorLogRepositoryImpl extends QuerydslRepositorySupport Projections.constructor( ErrorLogDto.Basic.class, errorLogEntity.id.as("logId"), - Expressions.constant("한국자산관리공사"), // serviceName + Expressions.stringTemplate("{0}", "한국자산관리공사"), // serviceName menuEntity.menuNm.as("menuName"), userEntity.userId.as("loginId"), userEntity.userNm.as("userName"), @@ -54,7 +54,8 @@ public class ErrorLogRepositoryImpl extends QuerydslRepositorySupport errorLogEntity.errorCode.as("errorCode"), errorLogEntity.errorMessage.as("errorMessage"), errorLogEntity.stackTrace.as("errorDetail"), - errorLogEntity.createdDate)) + Expressions.stringTemplate( + "to_char({0}, 'YYYY-MM-DD')", errorLogEntity.createdDate))) .from(errorLogEntity) .leftJoin(auditLogEntity) .on(errorLogEntity.id.eq(auditLogEntity.errorLogUid)) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2cbc49dc..84e951a0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -22,7 +22,7 @@ spring: leak-detection-threshold: 60000 jpa: hibernate: - ddl-auto: update # 스키마 검증만 수행, 자동 변경하지 않음 (안전) + ddl-auto: update # 테이블이 없으면 생성, 있으면 업데이트 properties: hibernate: jdbc: @@ -65,7 +65,7 @@ geojson: error-directory: ~/geojson/error temp-directory: /tmp/geojson_extract cron-expression: "0/30 * * * * *" # 매 30초마다 실행 - supported-extensions: + supported-extensions: - zip - tar - tar.gz