From 2377f471d2f2fb9815b55e16a25af6fd2350cc2f Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 2 Dec 2025 17:06:10 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=81=EC=83=81=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20>=20=EC=98=A4=EB=A5=98=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=AA=A9=EB=A1=9D=20API=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapsheet/MapSheetMngApiController.java | 29 ++--- .../mapsheet/dto/MapSheetMngDto.java | 117 ++++++++++++++++++ .../mapsheet/service/MapSheetMngService.java | 10 +- .../postgres/core/MapSheetMngCoreService.java | 21 ++++ .../postgres/entity/MapSheetMngEntity.java | 42 +++++++ .../postgres/entity/MapSheetMngHstEntity.java | 63 ++++++++++ .../mapsheet/MapSheetMngRepository.java | 6 + .../mapsheet/MapSheetMngRepositoryCustom.java | 12 ++ .../mapsheet/MapSheetMngRepositoryImpl.java | 100 +++++++++++++++ 9 files changed, 385 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngEntity.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepository.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java index f8a12e06..4c92bf0c 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java @@ -7,6 +7,7 @@ import com.kamco.cd.kamcoback.mapsheet.dto.FileDto; import com.kamco.cd.kamcoback.mapsheet.dto.FileDto.FilesDto; import com.kamco.cd.kamcoback.mapsheet.dto.FileDto.SrchFilesDto; import com.kamco.cd.kamcoback.mapsheet.dto.FileDto.SrchFoldersDto; +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; import com.kamco.cd.kamcoback.mapsheet.service.MapSheetMngService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -24,6 +25,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -84,18 +86,17 @@ public class MapSheetMngApiController { return ApiResponseDto.createOK(mapSheetMngService.getFilesAll(srchDto)); } - - - - - - - - - - - - - - + /** + * 오류데이터 목록 조회 + * @param searchReq + * @return + */ + @PostMapping("/error-list") + public ApiResponseDto> findMapSheetErrorList( + @RequestBody + @Valid + MapSheetMngDto.searchReq searchReq + ){ + return ApiResponseDto.ok(mapSheetMngService.findMapSheetErrorList(searchReq)); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java new file mode 100644 index 00000000..14b788e0 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java @@ -0,0 +1,117 @@ +package com.kamco.cd.kamcoback.mapsheet.dto; + +import com.kamco.cd.kamcoback.config.enums.EnumType; +import io.swagger.v3.oas.annotations.media.Schema; +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; + +import java.time.ZonedDateTime; + +public class MapSheetMngDto { + + @Schema(name = "searchReq", description = "영상관리 오류데이터 검색 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class searchReq { + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + private String sort; + private String searchValue; + private Integer mngYyyy; + + 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); + } + } + + @Schema(name = "ErrorDataDto", description = "영상관리 오류데이터 검색 리턴") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ErrorDataDto{ + private Long hstUid; + private Integer rowNum; + private String map50kName; + private String map5kName; + private Integer mapCodeSrc; + private String createdDttm; + private DataState dataState; + } + + @Getter + @AllArgsConstructor + public enum MngState implements EnumType { + COMPLETE("업로드 완료"), + IN_PROGRESS("진행중"), + FAILED("오류"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @Getter + @AllArgsConstructor + public enum SyncState implements EnumType { + COMPLETE("동기화 완료"), + IN_PROGRESS("진행중"), + FAIL("오류"), + NONE("미진행"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @Getter + @AllArgsConstructor + public enum DataState implements EnumType { + SUCCESS("정상"), + FAIL("데이터 없음"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } +} 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 5496b6b7..9b6ce149 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 @@ -19,8 +19,13 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; +import com.kamco.cd.kamcoback.postgres.core.MapSheetMngCoreService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.apache.commons.io.FilenameUtils; +import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,7 +34,7 @@ import org.springframework.transaction.annotation.Transactional; @Transactional(readOnly = true) public class MapSheetMngService { - //private final MapSheetAnalDataCoreService mapSheetAnalDataCoreService; + private final MapSheetMngCoreService mapSheetMngCoreService; public List getFolderAll(SrchFoldersDto srchDto) { @@ -169,4 +174,7 @@ public class MapSheetMngService { } + public Page findMapSheetErrorList(MapSheetMngDto.@Valid searchReq searchReq) { + return mapSheetMngCoreService.findMapSheetErrorList(searchReq); + } } 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 new file mode 100644 index 00000000..9bf0578a --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java @@ -0,0 +1,21 @@ +package com.kamco.cd.kamcoback.postgres.core; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; +import com.kamco.cd.kamcoback.postgres.repository.mapsheet.MapSheetMngRepository; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MapSheetMngCoreService { + + private final MapSheetMngRepository mapSheetMngRepository; + + public Page findMapSheetErrorList(MapSheetMngDto.@Valid searchReq searchReq) { + return mapSheetMngRepository.findMapSheetErrorList(searchReq); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngEntity.java new file mode 100644 index 00000000..b39df12c --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngEntity.java @@ -0,0 +1,42 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; +import com.kamco.cd.kamcoback.postgres.CommonDateEntity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.ZonedDateTime; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_mng") +public class MapSheetMngEntity extends CommonDateEntity { + @Id + @Column(name = "mng_yyyy") + private Integer mngYyyy; + + @Column(name = "mng_state") + @Enumerated(EnumType.STRING) + private MapSheetMngDto.MngState mngState; + + @Column(name = "sync_state") + @Enumerated(EnumType.STRING) + private MapSheetMngDto.SyncState syncState; + + @Column(name = "mng_state_dttm") + private ZonedDateTime mngStateDttm; + + @Column(name = "sync_state_dttm") + private ZonedDateTime syncStateDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @Column(name = "updated_uid") + private Long updatedUid; + + @Column(name = "mng_path") + private String mngPath; +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java new file mode 100644 index 00000000..d84fc41d --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java @@ -0,0 +1,63 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; +import com.kamco.cd.kamcoback.postgres.CommonDateEntity; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.ZonedDateTime; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_mng_hst") +public class MapSheetMngHstEntity extends CommonDateEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "hst_uid") + private Long hstUid; + + @Column(name = "mng_yyyy") + private Integer mngYyyy; + + @Column(name = "map_sheet_code") + private Integer mapSheetCode; + + @Column(name = "map_sheet_num") + private String mapSheetNum; + + @Column(name = "map_sheet_name") + private String mapSheetName; + + @Column(name = "map_sheet_code_src") + private Integer mapSheetCodeSrc; + + @Column(name = "scale_ratio") + private Integer scaleRatio; + + @Column(name = "data_state") + @Enumerated(EnumType.STRING) + private MapSheetMngDto.DataState dataState; + + @Column(name = "data_state_dttm") + private ZonedDateTime dataStateDttm; + + @Column(name = "use_inference") + private Boolean useInference; + + @Column(name = "use_inference_dttm") + private ZonedDateTime useInferenceDttm; + + @Column(name = "map_sheet_path") + private String mapSheetPath; + + @Column(name = "ref_map_sheet_num") + private Long refMapSheetNum; + + @Column(name = "created_uid") + private Long createdUid; + + @Column(name = "updated_uid") + private Long updatedUid; +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepository.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepository.java new file mode 100644 index 00000000..f8b09f92 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepository.java @@ -0,0 +1,6 @@ +package com.kamco.cd.kamcoback.postgres.repository.mapsheet; + +import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MapSheetMngRepository extends JpaRepository, MapSheetMngRepositoryCustom {} 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 new file mode 100644 index 00000000..d2403684 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java @@ -0,0 +1,12 @@ +package com.kamco.cd.kamcoback.postgres.repository.mapsheet; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; +import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngEntity; +import jakarta.validation.Valid; +import org.springframework.data.domain.Page; + +import java.util.List; + +public interface MapSheetMngRepositoryCustom { + Page findMapSheetErrorList(MapSheetMngDto.@Valid searchReq searchReq); +} 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 new file mode 100644 index 00000000..85cda867 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java @@ -0,0 +1,100 @@ +package com.kamco.cd.kamcoback.postgres.repository.mapsheet; + +import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; +import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.NumberExpression; +import com.querydsl.core.types.dsl.StringExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.validation.Valid; +import jdk.jfr.Experimental; +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; + +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngHstEntity.mapSheetMngHstEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetMngEntity.mapSheetMngEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapInkx5kEntity.mapInkx5kEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapInkx50kEntity.mapInkx50kEntity; + +import java.util.List; +import java.util.Objects; + +public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport + implements MapSheetMngRepositoryCustom { + + private final JPAQueryFactory queryFactory; + private final StringExpression NULL_STRING = Expressions.stringTemplate("cast(null as text)"); + + public MapSheetMngRepositoryImpl(JPAQueryFactory queryFactory) { + super(MapSheetMngHstEntity.class); + this.queryFactory = queryFactory; + } + + @Override + public Page findMapSheetErrorList(MapSheetMngDto.@Valid searchReq searchReq) { + + Pageable pageable = PageRequest.of(searchReq.getPage(), searchReq.getSize()); + List foundContent = queryFactory + .select( + Projections.constructor( + MapSheetMngDto.ErrorDataDto.class, + mapSheetMngHstEntity.hstUid, + rowNum(), + Expressions.stringTemplate("concat({0}, {1})", mapSheetMngHstEntity.mapSheetName, mapInkx50kEntity.mapidcdNo), + Expressions.stringTemplate("concat({0}, substring({1}, {2}, {3}))", mapSheetMngHstEntity.mapSheetName, mapSheetMngHstEntity.mapSheetNum, 6, 8), + mapSheetMngHstEntity.mapSheetCodeSrc, + Expressions.stringTemplate("to_char({0}, 'YYYY-MM-DD')", mapSheetMngHstEntity.createdDate), + mapSheetMngHstEntity.dataState + ) + ) + .from(mapSheetMngHstEntity) + .innerJoin(mapInkx5kEntity) + .on(mapSheetMngHstEntity.mapSheetCode.eq(mapInkx5kEntity.fid)) + .leftJoin(mapInkx50kEntity) + .on(mapInkx5kEntity.fidK50.eq(mapInkx50kEntity.fid.longValue())) + .where( + mapSheetMngHstEntity.mngYyyy.eq(searchReq.getMngYyyy()), + mapSheetMngHstEntity.dataState.eq(MapSheetMngDto.DataState.FAIL), //오류만 검색 + mapSheetErrorSearchValue(searchReq) + ) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(mapSheetMngHstEntity.createdDate.desc()) + .fetch(); + + Long countQuery = queryFactory + .select(mapSheetMngHstEntity.hstUid.count()) + .from(mapSheetMngHstEntity) + .innerJoin(mapInkx5kEntity) + .on(mapSheetMngHstEntity.mapSheetCode.eq(mapInkx5kEntity.fid)) + .leftJoin(mapInkx50kEntity) + .on(mapInkx5kEntity.fidK50.eq(mapInkx50kEntity.fid.longValue())) + .where( + mapSheetMngHstEntity.mngYyyy.eq(searchReq.getMngYyyy()), + mapSheetMngHstEntity.dataState.eq(MapSheetMngDto.DataState.FAIL), //오류만 검색 + mapSheetErrorSearchValue(searchReq) + ) + .fetchOne(); + + return new PageImpl<>(foundContent, pageable, countQuery); + } + + private NumberExpression rowNum(){ + return Expressions.numberTemplate(Integer.class, "row_number() over(order by {0} desc)", mapSheetMngHstEntity.createdDate); + } + + private BooleanExpression mapSheetErrorSearchValue(MapSheetMngDto.searchReq searchReq) { + if (Objects.isNull(searchReq.getSearchValue())) { + return null; + } + + // 검색어 1개 값이 도엽명 or 도엽번호 like 검색 + return Expressions.booleanTemplate("{0} like '%" + searchReq.getSearchValue() + "%'", mapSheetMngHstEntity.mapSheetName) + .or(Expressions.booleanTemplate("{0} like '%" + searchReq.getSearchValue() + "%'", mapSheetMngHstEntity.mapSheetNum)); + } +}