diff --git a/src/main/java/com/kamco/cd/kamcoback/common/enums/MngStateType.java b/src/main/java/com/kamco/cd/kamcoback/common/enums/MngStateType.java index 377c1fec..202e3757 100644 --- a/src/main/java/com/kamco/cd/kamcoback/common/enums/MngStateType.java +++ b/src/main/java/com/kamco/cd/kamcoback/common/enums/MngStateType.java @@ -9,10 +9,10 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum MngStateType implements EnumType { - NOTYET("미처리"), - PROCESSING("진행중"), - DONE("싱크완료"), - COMPLETE("작업완료"); + NOTYET("동기화 시작"), + PROCESSING("데이터 체크"), + DONE("동기화작업종료"), + TAKINGERROR("오류 데이터 처리중"); private final String desc; diff --git a/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncStateType.java b/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncStateType.java index f4a4ac6b..fc06e79b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncStateType.java +++ b/src/main/java/com/kamco/cd/kamcoback/common/enums/SyncStateType.java @@ -13,8 +13,7 @@ public enum SyncStateType implements EnumType { NOFILE("파일없음"), NOTPAIR("페어파일누락"), DUPLICATE("파일중복"), - SIZEERROR("파일용량오류"), - TYPEERROR("파일형식오류"), + TYPEERROR("손상파일"), DONE("완료"); private final String desc; diff --git a/src/main/java/com/kamco/cd/kamcoback/common/utils/FIleChecker.java b/src/main/java/com/kamco/cd/kamcoback/common/utils/FIleChecker.java index 7c188676..08b7ab8d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/common/utils/FIleChecker.java +++ b/src/main/java/com/kamco/cd/kamcoback/common/utils/FIleChecker.java @@ -29,6 +29,7 @@ import lombok.Getter; import org.apache.commons.io.FilenameUtils; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.gce.geotiff.GeoTiffReader; +import org.springframework.web.multipart.MultipartFile; public class FIleChecker { @@ -455,6 +456,15 @@ public class FIleChecker { return FIleChecker.getFilesFromAllDepth(dir, targetFileNm, extension, 100, "name", 0, 100); } + public static int getFileCountFromAllDepth(String dir, String targetFileNm, String extension) { + + List basicList = + FIleChecker.getFilesFromAllDepth(dir, targetFileNm, extension); + + return (int) + basicList.stream().filter(dto -> dto.getExtension().toString().equals(extension)).count(); + } + public static Long getFileTotSize(List files) { Long fileTotSize = 0L; @@ -465,6 +475,15 @@ public class FIleChecker { return fileTotSize; } + public static boolean validationMultipart(MultipartFile mfile) { + // 파일 유효성 검증 + if (mfile == null || mfile.isEmpty() || mfile.getSize() == 0) { + return false; + } + + return true; + } + public static boolean checkExtensions(String fileName, String ext) { if (fileName == null) return false; 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 32c8520f..0a871d75 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java @@ -177,6 +177,7 @@ public class MapSheetMngApiController { @RequestPart("tif") MultipartFile tifFile, @RequestParam(value = "hstUid", required = false) Long hstUid, @RequestParam(value = "overwrite", required = false) boolean overwrite) { + return ApiResponseDto.createOK( mapSheetMngService.uploadPair(tfwFile, tifFile, hstUid, overwrite)); } 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 index 300243b3..8ab46894 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java @@ -86,9 +86,38 @@ public class MapSheetMngDto { private Long syncDuplicateExecCnt; private Long syncFaultCnt; private Long syncFaultExecCnt; + private Long syncNoFileCnt; + private Long syncNoFileExecCnt; @JsonFormatDttm private ZonedDateTime rgstStrtDttm; @JsonFormatDttm private ZonedDateTime rgstEndDttm; + public String getMngState() { + + if (this.syncStateDoneCnt == 0) return "NOTYET"; + else if (this.syncStateDoneCnt < this.syncTotCnt) return "PROCESSING"; + + if ((this.syncNotPaireExecCnt + this.syncDuplicateExecCnt + this.syncFaultExecCnt) > 0) + return "TAKINGERROR"; + + return "DONE"; + } + + public String getSyncState() { + + if (this.syncStateDoneCnt == 0) return "NOTYET"; + else if (this.syncStateDoneCnt < this.syncTotCnt) return "PROCESSING"; + + return "DONE"; + } + + public String getDataCheckState() { + + if (this.syncDataCheckDoneCnt == 0) return "NOTYET"; + else if (this.syncDataCheckDoneCnt < this.syncTotCnt) return "PROCESSING"; + + return "DONE"; + } + public double getSyncStateDoneRate() { if (this.syncTotCnt == null || this.syncTotCnt == 0) { return 0.0; 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 ffa25353..e64ada93 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,6 +19,7 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,6 +33,15 @@ public class MapSheetMngService { private final MapSheetMngCoreService mapSheetMngCoreService; private final FileConfig fileConfig; + @Value("${file.sync-root-dir}") + private String syncRootDir; + + @Value("${file.sync-tmp-dir}") + private String syncTmpDir; + + @Value("${file.sync-file-extention}") + private String syncFileExtention; + public List findMapSheetMngList() { return mapSheetMngCoreService.findMapSheetMngList(); } @@ -77,8 +87,10 @@ public class MapSheetMngService { public DmlReturn uploadPair( MultipartFile tfwFile, MultipartFile tifFile, Long hstUid, Boolean overwrite) { - String rootPath = fileConfig.getRootSyncDir(); - String tmpPath = fileConfig.getTmpSyncDir(); + String rootPath = syncRootDir; + String tmpPath = syncTmpDir; + + DmlReturn dmlReturn = new DmlReturn("success", "UPLOAD COMPLETE"); ErrorDataDto errDto = mapSheetMngCoreService.findMapSheetError(hstUid); @@ -91,43 +103,21 @@ public class MapSheetMngService { return new DmlReturn("fail", "CREATE TEMP FOLDER ERROR"); } - // 파일 유효성 검증 - if (tfwFile == null || tfwFile.isEmpty() || tfwFile.getSize() == 0) { - return new DmlReturn("fail", "TFW SIZE 오류"); - } else if (tifFile == null || tifFile.isEmpty() || tifFile.getSize() == 0) { - return new DmlReturn("fail", "TIF SIZE 오류"); - } - - // 확장자명 체크 - if (!FIleChecker.checkExtensions(tfwFile.getOriginalFilename(), "tfw")) { - return new DmlReturn("fail", "TFW FILENAME ERROR"); - } else if (!FIleChecker.checkExtensions(tifFile.getOriginalFilename(), "tif")) { - return new DmlReturn("fail", "TIF FILENAME ERROR"); - } + // 업로드 파일 사이즈,확장자명 체크 + dmlReturn = this.validationFile(tfwFile, tifFile); + if (dmlReturn.getFlag().equals("fail")) return dmlReturn; MngDto mngDto = mapSheetMngCoreService.findMapSheetMng(errDto.getMngYyyy()); String targetYearDir = mngDto.getMngPath(); // 중복체크 - List basicTfwList = - FIleChecker.getFilesFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw"); - - List basicTifList = - FIleChecker.getFilesFromAllDepth(targetYearDir, tifFile.getOriginalFilename(), "tif"); - - int tfwCnt = - (int) - basicTfwList.stream() - .filter(dto -> dto.getExtension().toString().equals("tfw")) - .count(); - - int tifCnt = - (int) - basicTifList.stream() - .filter(dto -> dto.getExtension().toString().equals("tif")) - .count(); - if (!overwrite) { + + int tfwCnt = + FIleChecker.getFileCountFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw"); + int tifCnt = + FIleChecker.getFileCountFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw"); + if (tfwCnt > 0 || tifCnt > 0) { String tfwtifMsg = ""; if (tfwCnt > 0) tfwtifMsg = tfwFile.getOriginalFilename(); @@ -222,6 +212,17 @@ public class MapSheetMngService { return new DmlReturn("success", "파일 업로드 완료되었습니다."); } + public DmlReturn validationFile(MultipartFile tfwFile, MultipartFile tifFile) { + if (!FIleChecker.validationMultipart(tfwFile)) return new DmlReturn("fail", "TFW SIZE 오류"); + else if (!FIleChecker.validationMultipart(tifFile)) return new DmlReturn("fail", "TFW SIZE 오류"); + else if (!FIleChecker.checkExtensions(tfwFile.getOriginalFilename(), "tfw")) + return new DmlReturn("fail", "TFW FILENAME ERROR"); + else if (!FIleChecker.checkExtensions(tifFile.getOriginalFilename(), "tif")) + return new DmlReturn("fail", "TIF FILENAME ERROR"); + + return new DmlReturn("success", "파일체크"); + } + public List findHstUidToMapSheetFileList(Long hstUid) { return mapSheetMngCoreService.findHstUidToMapSheetFileList(hstUid); } 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 add560c9..eb512241 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 @@ -79,7 +79,7 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport mapSheetMngEntity.mngState, mapSheetMngEntity.syncState, mapSheetMngEntity.syncCheckState, - mapSheetMngHstEntity.count(), + mapSheetMngHstEntity.count().as("syncTotalCnt"), new CaseBuilder() .when(mapSheetMngHstEntity.dataState.eq("DONE")) .then(1L) @@ -141,6 +141,20 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .then(1L) .otherwise(0L) .sum(), + new CaseBuilder() + .when(mapSheetMngHstEntity.syncState.eq("NOFILE")) + .then(1L) + .otherwise(0L) + .sum(), + new CaseBuilder() + .when( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("NOFILE"))) + .then(1L) + .otherwise(0L) + .sum(), mapSheetMngEntity.createdDttm, mapSheetMngHstEntity.syncEndDttm.max())) .from(mapSheetMngEntity) @@ -209,7 +223,7 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport mapSheetMngEntity.mngState, mapSheetMngEntity.syncState, mapSheetMngEntity.syncCheckState, - mapSheetMngHstEntity.count(), + mapSheetMngHstEntity.count().as("syncTotalCnt"), new CaseBuilder() .when(mapSheetMngHstEntity.dataState.eq("DONE")) .then(1L) @@ -271,6 +285,20 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .then(1L) .otherwise(0L) .sum(), + new CaseBuilder() + .when(mapSheetMngHstEntity.syncState.eq("NOFILE")) + .then(1L) + .otherwise(0L) + .sum(), + new CaseBuilder() + .when( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("NOFILE"))) + .then(1L) + .otherwise(0L) + .sum(), mapSheetMngEntity.createdDttm, mapSheetMngHstEntity.syncEndDttm.max())) .from(mapSheetMngEntity) @@ -295,23 +323,6 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport mapSheetMngHstEntity.syncState.ne("DONE").and(mapSheetMngHstEntity.syncState.ne("NOTYET"))); if (searchReq.getSyncState() != null && !searchReq.getSyncState().isEmpty()) { - /* - if (searchReq.getSyncState().equals("NOTPAIR")) { - whereBuilder.and( - mapSheetMngHstEntity - .syncState - .eq("NOTPAIR") - .or(mapSheetMngHstEntity.syncState.eq("NOFILE"))); - } else if (searchReq.getSyncState().equals("FAULT")) { - whereBuilder.and( - mapSheetMngHstEntity - .syncState - .eq("SIZEERROR") - .or(mapSheetMngHstEntity.syncState.eq("TYPEERROR"))); - } else { - whereBuilder.and(mapSheetMngHstEntity.syncState.eq(searchReq.getSyncState())); - } - */ whereBuilder.and(mapSheetMngHstEntity.syncState.eq(searchReq.getSyncState())); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6b592c27..d64d7d1d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -64,17 +64,8 @@ management: include: - "health" -# GeoJSON 파일 모니터링 설정 -geojson: - monitor: - watch-directory: ~/geojson/upload - processed-directory: ~/geojson/processed - error-directory: ~/geojson/error - temp-directory: /tmp/geojson_extract - cron-expression: "0/30 * * * * *" # 매 30초마다 실행 - supported-extensions: - - zip - - tar - - tar.gz - - tgz - max-file-size: 104857600 # 100MB + +file: + sync-root-dir: /app/original-images/ + sync-tmp-dir: ${file.sync-root-dir}/tmp + sync-file-extention: tfw,tif