From c8c88169810a1320ffba245f6c74cbd0198678ba Mon Sep 17 00:00:00 2001 From: teddy Date: Wed, 28 Jan 2026 11:46:51 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B6=94=EB=A1=A0=EC=8B=A4=ED=96=89=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 --- .../mapsheet/service/MapSheetMngService.java | 3 + .../postgres/core/MapLayerCoreService.java | 6 +- .../postgres/core/MapSheetMngCoreService.java | 29 +++-- .../core/MapSheetMngFileJobCoreService.java | 6 ++ .../entity/MapSheetMngYearYnEntity.java | 34 ++++++ .../entity/MapSheetMngYearYnEntityId.java | 46 ++++++++ .../mapsheet/MapSheetMngRepositoryCustom.java | 3 - .../mapsheet/MapSheetMngRepositoryImpl.java | 48 --------- .../mapsheet/MapSheetMngYearRepository.java | 9 ++ .../MapSheetMngYearRepositoryCustom.java | 10 ++ .../MapSheetMngYearRepositoryImpl.java | 101 ++++++++++++++++++ .../service/MapSheetMngFileJobService.java | 3 + 12 files changed, 233 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntity.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntityId.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepository.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryCustom.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryImpl.java diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java index cab42d71..bdd9d2ac 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java @@ -248,6 +248,9 @@ public class MapSheetMngService { addReq.setFileSize(tifFileSize); mapSheetMngCoreService.mngFileSave(addReq); + // 사용할 수 있는 이전 년도 도엽 테이블 저장 + mapSheetMngCoreService.saveSheetMngYear(); + return new DmlReturn("success", "파일 업로드 완료되었습니다."); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapLayerCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapLayerCoreService.java index 79734de6..16f7c259 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapLayerCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapLayerCoreService.java @@ -23,11 +23,13 @@ public class MapLayerCoreService { * @param addDto */ public void save(WmtsAddDto addDto) { - Long order = 0L; + Long order = 20L; MapLayerEntity entity = mapLayerRepository.findSortOrderDesc().orElse(null); + if (entity != null) { order = entity.getOrder() == null ? order : entity.getOrder() + 10; } + try { String rawJson = objectMapper.writeValueAsString(addDto.getWmtsLayerInfo()); // data 없는 형태로 저장 MapLayerEntity mapLayerEntity = new MapLayerEntity(); @@ -43,7 +45,5 @@ public class MapLayerCoreService { } catch (JsonProcessingException e) { throw new RuntimeException(e); } - - // } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java index 680b1a87..233fc813 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java @@ -16,6 +16,7 @@ import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngEntity; import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity; import com.kamco.cd.kamcoback.postgres.entity.YearEntity; import com.kamco.cd.kamcoback.postgres.repository.mapsheet.MapSheetMngRepository; +import com.kamco.cd.kamcoback.postgres.repository.mapsheet.MapSheetMngYearRepository; import jakarta.persistence.EntityNotFoundException; import jakarta.validation.Valid; import java.io.IOException; @@ -44,6 +45,7 @@ import org.springframework.transaction.annotation.Transactional; public class MapSheetMngCoreService { private final MapSheetMngRepository mapSheetMngRepository; + private final MapSheetMngYearRepository mapSheetMngYearRepository; @Value("${spring.profiles.active}") private String activeEnv; @@ -310,18 +312,23 @@ public class MapSheetMngCoreService { return mapSheetMngRepository.findByHstMapSheetTargetList(mngYyyy, mapIds); } - /** - * 변화탐지 실행 가능 비교년도 조회 - * - * @param mngYyyy - * @param mapId - * @return - */ - public List getByHstMapSheetCompareList(int mngYyyy, List mapId) { - return mapSheetMngRepository.findByHstMapSheetCompareList(mngYyyy, mapId); - } - public void updateMapSheetMngHstUploadId(Long hstUid, UUID uuid, String uploadId) { mapSheetMngRepository.updateMapSheetMngHstUploadId(hstUid, uuid, uploadId); } + + /** 변화탐지 실행 가능 비교년도 저장 */ + public void saveSheetMngYear() { + mapSheetMngYearRepository.saveFileInfo(); + } + + /** + * 변화탐지 실행 가능 비교년도 조회 + * + * @param mngYyyy 비교년도 + * @param mapId 5k 도엽번호 + * @return List + */ + public List getByHstMapSheetCompareList(int mngYyyy, List mapId) { + return mapSheetMngYearRepository.findByHstMapSheetCompareList(mngYyyy, mapId); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngFileJobCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngFileJobCoreService.java index 64cad2a8..59e6d858 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngFileJobCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngFileJobCoreService.java @@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.postgres.core; import com.kamco.cd.kamcoback.common.enums.CommonUseStatus; import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngFileEntity; +import com.kamco.cd.kamcoback.postgres.repository.mapsheet.MapSheetMngYearRepository; import com.kamco.cd.kamcoback.postgres.repository.scheduler.MapSheetMngFileJobRepository; import com.kamco.cd.kamcoback.scheduler.dto.MapSheetMngDto; import com.kamco.cd.kamcoback.scheduler.dto.MapSheetMngDto.MngHstDto; @@ -16,6 +17,7 @@ import org.springframework.stereotype.Service; public class MapSheetMngFileJobCoreService { private final MapSheetMngFileJobRepository mapSheetMngFileJobRepository; + private final MapSheetMngYearRepository mapSheetMngYearRepository; public Page findMapSheetMngList( MapSheetMngDto.@Valid MngSearchReq searchReq) { @@ -73,4 +75,8 @@ public class MapSheetMngFileJobCoreService { public void updateException5kMapSheet(String mapSheetNum, CommonUseStatus commonUseStatus) { mapSheetMngFileJobRepository.updateException5kMapSheet(mapSheetNum, commonUseStatus); } + + public void saveSheetMngYear() { + mapSheetMngYearRepository.saveFileInfo(); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntity.java new file mode 100644 index 00000000..8cc97b78 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntity.java @@ -0,0 +1,34 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import java.time.ZonedDateTime; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_mng_year_yn") +public class MapSheetMngYearYnEntity { + + @EmbeddedId private MapSheetMngYearYnEntityId id; + + @NotNull + @Column(name = "yn", nullable = false, length = Integer.MAX_VALUE) + private String yn; + + @NotNull + @ColumnDefault("now()") + @Column(name = "created_dttm", nullable = false) + private ZonedDateTime createdDttm; + + @NotNull + @ColumnDefault("now()") + @Column(name = "updated_dttm", nullable = false) + private ZonedDateTime updatedDttm; +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntityId.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntityId.java new file mode 100644 index 00000000..45e8bccf --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngYearYnEntityId.java @@ -0,0 +1,46 @@ +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; + +@Getter +@Setter +@Embeddable +public class MapSheetMngYearYnEntityId implements Serializable { + + private static final long serialVersionUID = 6282262062316057898L; + + @Size(max = 20) + @NotNull + @Column(name = "map_sheet_num", nullable = false, length = 20) + private String mapSheetNum; + + @NotNull + @Column(name = "mng_yyyy", nullable = false) + private Integer mngYyyy; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) { + return false; + } + MapSheetMngYearYnEntityId entity = (MapSheetMngYearYnEntityId) o; + return Objects.equals(this.mngYyyy, entity.mngYyyy) + && Objects.equals(this.mapSheetNum, entity.mapSheetNum); + } + + @Override + public int hashCode() { + return Objects.hash(mngYyyy, mapSheetNum); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java index 521f110d..6b985fc1 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java @@ -3,7 +3,6 @@ package com.kamco.cd.kamcoback.postgres.repository.mapsheet; import com.kamco.cd.kamcoback.common.geometry.GeoJsonFileWriter.ImageFeature; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; -import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.MngListCompareDto; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.MngListDto; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.YearSearchReq; import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity; @@ -67,8 +66,6 @@ public interface MapSheetMngRepositoryCustom { List findByHstMapSheetTargetList(int mngYyyy, List mapIds); - List findByHstMapSheetCompareList(int mngYyyy, List mapId); - MapSheetMngDto.MngFilesDto findByFileUidMapSheetFile(Long fileUid); void updateHstFileSizes(Long hstUid, long tifSizeBytes, long tfwSizeBytes, long totalSizeBytes); diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java index 05025161..86839830 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java @@ -12,7 +12,6 @@ import com.kamco.cd.kamcoback.common.geometry.GeoJsonFileWriter.ImageFeature; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; -import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.MngListCompareDto; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.MngListDto; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.YearSearchReq; import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity; @@ -648,53 +647,6 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .fetch(); } - /** - * 변화탐지 실행 가능 비교년도 조회 - * - * @param mngYyyy - * @param mapIds - * @return - */ - @Override - public List findByHstMapSheetCompareList(int mngYyyy, List mapIds) { - - String sql = - """ - SELECT - t.map_sheet_num, - t.map_years, - COALESCE(s.target_year, 0) AS before_year - FROM public.tb_map_sheet_years_map t - LEFT JOIN LATERAL ( - SELECT x::int AS target_year - FROM unnest(string_to_array(t.map_years, '>')) AS x - WHERE x::int <= :mngYyyy - ORDER BY x::int DESC - LIMIT 1 - ) s ON true - INNER JOIN tb_map_inkx_5k tmik - ON t.map_sheet_num = tmik.mapidcd_no AND tmik.use_inference = 'USE' - WHERE t.map_sheet_num = ANY(:mapIds) - """; - - @SuppressWarnings("unchecked") - List rows = - em.createNativeQuery(sql) - .setParameter("mngYyyy", mngYyyy) - .setParameter("mapIds", mapIds.toArray(new String[0])) - .getResultList(); - - return rows.stream() - .map( - r -> - new MngListCompareDto( - (String) r[1], // map_years - (String) r[0], // map_sheet_num - ((Number) r[2]).intValue() // before_year - )) - .toList(); - } - @Override public List findHstUidToMapSheetFileList(Long hstUid) { BooleanBuilder whereBuilder = new BooleanBuilder(); diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepository.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepository.java new file mode 100644 index 00000000..a4a1aafc --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepository.java @@ -0,0 +1,9 @@ +package com.kamco.cd.kamcoback.postgres.repository.mapsheet; + +import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngYearYnEntity; +import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngYearYnEntityId; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MapSheetMngYearRepository + extends JpaRepository, + MapSheetMngYearRepositoryCustom {} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryCustom.java new file mode 100644 index 00000000..c78ed8b7 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryCustom.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.postgres.repository.mapsheet; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.MngListCompareDto; +import java.util.List; + +public interface MapSheetMngYearRepositoryCustom { + void saveFileInfo(); + + List findByHstMapSheetCompareList(int mngYyyy, List mapIds); +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryImpl.java new file mode 100644 index 00000000..cacce77e --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngYearRepositoryImpl.java @@ -0,0 +1,101 @@ +package com.kamco.cd.kamcoback.postgres.repository.mapsheet; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.MngListCompareDto; +import com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngYearYnEntity; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.StringExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class MapSheetMngYearRepositoryImpl implements MapSheetMngYearRepositoryCustom { + + private final JPAQueryFactory queryFactory; + private final EntityManager em; + + /** 변화탐지 실행 가능 비교년도 저장 */ + @Override + public void saveFileInfo() { + + em.createNativeQuery("TRUNCATE TABLE tb_map_sheet_mng_year_yn").executeUpdate(); + + String sql = + """ + WITH bounds AS ( + SELECT + map_sheet_num, + MIN(mng_yyyy::int) AS min_y, + MAX(mng_yyyy::int) AS max_y + FROM tb_map_sheet_mng_files + GROUP BY map_sheet_num + ), + years AS ( + SELECT + b.map_sheet_num, + gs.y AS mng_yyyy + FROM bounds b + CROSS JOIN LATERAL generate_series(b.min_y, b.max_y) AS gs(y) + ), + exist AS ( + SELECT DISTINCT + map_sheet_num, + mng_yyyy::int AS mng_yyyy + FROM tb_map_sheet_mng_files + ), + src AS ( + SELECT + y.map_sheet_num, + y.mng_yyyy, + CASE + WHEN e.map_sheet_num IS NULL THEN 'N' + ELSE 'Y' + END AS yn + FROM years y + LEFT JOIN exist e + ON e.map_sheet_num = y.map_sheet_num + AND e.mng_yyyy = y.mng_yyyy + ) + INSERT INTO tb_map_sheet_mng_year_yn + (map_sheet_num, mng_yyyy, yn) + SELECT + map_sheet_num, + mng_yyyy, + yn + FROM src + ON CONFLICT (map_sheet_num, mng_yyyy) + DO UPDATE SET + yn = EXCLUDED.yn, + updated_dttm = now() + """; + + em.createNativeQuery(sql).executeUpdate(); + } + + /** + * 변화탐지 실행 가능 비교년도 조회 + * + * @param mngYyyy + * @param mapIds + * @return + */ + @Override + public List findByHstMapSheetCompareList(int mngYyyy, List mapIds) { + QMapSheetMngYearYnEntity y = QMapSheetMngYearYnEntity.mapSheetMngYearYnEntity; + + StringExpression mngYyyyStr = Expressions.stringTemplate("concat({0}, '')", mngYyyy); + + return queryFactory + .select( + Projections.constructor( + MngListCompareDto.class, mngYyyyStr, y.id.mapSheetNum, y.id.mngYyyy.max())) + .from(y) + .where(y.id.mapSheetNum.in(mapIds), y.yn.eq("Y"), y.id.mngYyyy.loe(mngYyyy)) + .groupBy(y.id.mapSheetNum) + .fetch(); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetMngFileJobService.java b/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetMngFileJobService.java index ab1d9925..6d782b9f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetMngFileJobService.java +++ b/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetMngFileJobService.java @@ -199,6 +199,9 @@ public class MapSheetMngFileJobService { mngHstDataSyncStateUpdate(item); } + // 사용할 수 있는 이전 년도 도엽 테이블 저장 + mapSheetMngFileJobCoreService.saveSheetMngYear(); + Long notyetCnt = this.mngDataStateDoneUpdate(mngYyyy); }