영상관리 수정

This commit is contained in:
Moon
2025-12-24 16:44:04 +09:00
parent 6b77637091
commit eea2933aa2
7 changed files with 211 additions and 121 deletions

View File

@@ -9,10 +9,10 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum MngStateType implements EnumType { public enum MngStateType implements EnumType {
NOTYET("미처리"), NOTYET("동기화 시작"),
PROCESSING("진행중"), PROCESSING("데이터 체크"),
DONE("싱크완"), DONE("동기화작업종"),
COMPLETE("작업완료"); TAKINGERROR("오류 데이터 처리중");
private final String desc; private final String desc;

View File

@@ -13,8 +13,7 @@ public enum SyncStateType implements EnumType {
NOFILE("파일없음"), NOFILE("파일없음"),
NOTPAIR("페어파일누락"), NOTPAIR("페어파일누락"),
DUPLICATE("파일중복"), DUPLICATE("파일중복"),
SIZEERROR("파일용량오류"), TYPEERROR("손상파일"),
TYPEERROR("파일형식오류"),
DONE("완료"); DONE("완료");
private final String desc; private final String desc;

View File

@@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.common.utils;
import static java.lang.String.CASE_INSENSITIVE_ORDER; import static java.lang.String.CASE_INSENSITIVE_ORDER;
import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto.DmlReturn;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
@@ -29,6 +30,7 @@ import lombok.Getter;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader; import org.geotools.gce.geotiff.GeoTiffReader;
import org.springframework.web.multipart.MultipartFile;
public class FIleChecker { public class FIleChecker {
@@ -455,6 +457,17 @@ public class FIleChecker {
return FIleChecker.getFilesFromAllDepth(dir, targetFileNm, extension, 100, "name", 0, 100); return FIleChecker.getFilesFromAllDepth(dir, targetFileNm, extension, 100, "name", 0, 100);
} }
public static int getFileCountFromAllDepth(
String dir, String targetFileNm, String extension) {
List<FIleChecker.Basic> basicList =
FIleChecker.getFilesFromAllDepth(dir, targetFileNm, extension);
return (int) basicList.stream()
.filter(dto -> dto.getExtension().toString().equals(extension))
.count();
}
public static Long getFileTotSize(List<FIleChecker.Basic> files) { public static Long getFileTotSize(List<FIleChecker.Basic> files) {
Long fileTotSize = 0L; Long fileTotSize = 0L;
@@ -465,6 +478,16 @@ public class FIleChecker {
return fileTotSize; 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) { public static boolean checkExtensions(String fileName, String ext) {
if (fileName == null) return false; if (fileName == null) return false;

View File

@@ -177,8 +177,10 @@ public class MapSheetMngApiController {
@RequestPart("tif") MultipartFile tifFile, @RequestPart("tif") MultipartFile tifFile,
@RequestParam(value = "hstUid", required = false) Long hstUid, @RequestParam(value = "hstUid", required = false) Long hstUid,
@RequestParam(value = "overwrite", required = false) boolean overwrite) { @RequestParam(value = "overwrite", required = false) boolean overwrite) {
return ApiResponseDto.createOK(
mapSheetMngService.uploadPair(tfwFile, tifFile, hstUid, overwrite));
return ApiResponseDto.createOK(mapSheetMngService.uploadPair(tfwFile, tifFile, hstUid, overwrite));
} }
@Operation(summary = "영상관리 > 파일조회", description = "영상관리 > 파일조회") @Operation(summary = "영상관리 > 파일조회", description = "영상관리 > 파일조회")

View File

@@ -85,9 +85,37 @@ public class MapSheetMngDto {
private Long syncDuplicateExecCnt; private Long syncDuplicateExecCnt;
private Long syncFaultCnt; private Long syncFaultCnt;
private Long syncFaultExecCnt; private Long syncFaultExecCnt;
private Long syncNoFileCnt;
private Long syncNoFileExecCnt;
@JsonFormatDttm private ZonedDateTime rgstStrtDttm; @JsonFormatDttm private ZonedDateTime rgstStrtDttm;
@JsonFormatDttm private ZonedDateTime rgstEndDttm; @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() { public double getSyncStateDoneRate() {
if (this.syncTotCnt == null || this.syncTotCnt == 0) { if (this.syncTotCnt == null || this.syncTotCnt == 0) {
return 0.0; return 0.0;
@@ -110,6 +138,8 @@ public class MapSheetMngDto {
return this.syncNotPaireExecCnt + this.syncDuplicateExecCnt + this.syncFaultExecCnt; return this.syncNotPaireExecCnt + this.syncDuplicateExecCnt + this.syncFaultExecCnt;
} }
public String getMngStateName() { public String getMngStateName() {
String enumId = this.mngState; String enumId = this.mngState;
if (enumId == null || enumId.isEmpty()) { if (enumId == null || enumId.isEmpty()) {
@@ -224,6 +254,8 @@ public class MapSheetMngDto {
this.errorCheckTifFileName = errorCheckTifFileName; this.errorCheckTifFileName = errorCheckTifFileName;
} }
private String getSyncStateName(String enumId) { private String getSyncStateName(String enumId) {
if (enumId == null || enumId.isEmpty()) { if (enumId == null || enumId.isEmpty()) {
enumId = "NOTYET"; enumId = "NOTYET";

View File

@@ -19,6 +19,7 @@ import java.nio.file.Paths;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -32,6 +33,16 @@ public class MapSheetMngService {
private final MapSheetMngCoreService mapSheetMngCoreService; private final MapSheetMngCoreService mapSheetMngCoreService;
private final FileConfig fileConfig; 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<MngDto> findMapSheetMngList() { public List<MngDto> findMapSheetMngList() {
return mapSheetMngCoreService.findMapSheetMngList(); return mapSheetMngCoreService.findMapSheetMngList();
} }
@@ -76,8 +87,10 @@ public class MapSheetMngService {
@Transactional @Transactional
public DmlReturn uploadPair(MultipartFile tfwFile, MultipartFile tifFile, Long hstUid, Boolean overwrite) { public DmlReturn uploadPair(MultipartFile tfwFile, MultipartFile tifFile, Long hstUid, Boolean overwrite) {
String rootPath = fileConfig.getRootSyncDir(); String rootPath = syncRootDir;
String tmpPath = fileConfig.getTmpSyncDir(); String tmpPath = syncTmpDir;
DmlReturn dmlReturn = new DmlReturn("success", "UPLOAD COMPLETE");
ErrorDataDto errDto = mapSheetMngCoreService.findMapSheetError(hstUid); ErrorDataDto errDto = mapSheetMngCoreService.findMapSheetError(hstUid);
@@ -90,19 +103,10 @@ public class MapSheetMngService {
return new DmlReturn("fail", "CREATE TEMP FOLDER ERROR"); return new DmlReturn("fail", "CREATE TEMP FOLDER ERROR");
} }
// 파일 유효성 검증 //업로드 파일 사이즈,확장자명 체크
if (tfwFile == null || tfwFile.isEmpty() || tfwFile.getSize() == 0) { dmlReturn = this.validationFile(tfwFile, tifFile);
return new DmlReturn("fail", "TFW SIZE 오류"); if( dmlReturn.getFlag().equals("fail") )return dmlReturn;
} 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");
}
MngDto mngDto = mapSheetMngCoreService.findMapSheetMng(errDto.getMngYyyy()); MngDto mngDto = mapSheetMngCoreService.findMapSheetMng(errDto.getMngYyyy());
String targetYearDir = mngDto.getMngPath(); String targetYearDir = mngDto.getMngPath();
@@ -110,13 +114,6 @@ public class MapSheetMngService {
// 중복체크 // 중복체크
if( !overwrite ) { if( !overwrite ) {
/*
List<FIleChecker.Basic> basicTfwList =
FIleChecker.getFilesFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw");
List<FIleChecker.Basic> basicTifList =
FIleChecker.getFilesFromAllDepth(targetYearDir, tifFile.getOriginalFilename(), "tif");
*/
int tfwCnt = FIleChecker.getFileCountFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw"); int tfwCnt = FIleChecker.getFileCountFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw");
int tifCnt = FIleChecker.getFileCountFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw"); int tifCnt = FIleChecker.getFileCountFromAllDepth(targetYearDir, tfwFile.getOriginalFilename(), "tfw");
@@ -217,6 +214,16 @@ public class MapSheetMngService {
return new DmlReturn("success", "파일 업로드 완료되었습니다."); 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<MngFilesDto> findHstUidToMapSheetFileList(Long hstUid) { public List<MngFilesDto> findHstUidToMapSheetFileList(Long hstUid) {
return mapSheetMngCoreService.findHstUidToMapSheetFileList(hstUid); return mapSheetMngCoreService.findHstUidToMapSheetFileList(hstUid);
} }

View File

@@ -79,18 +79,21 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
mapSheetMngEntity.mngState, mapSheetMngEntity.mngState,
mapSheetMngEntity.syncState, mapSheetMngEntity.syncState,
mapSheetMngEntity.syncCheckState, mapSheetMngEntity.syncCheckState,
mapSheetMngHstEntity.count(),
mapSheetMngHstEntity.count().as("syncTotalCnt"),
new CaseBuilder() new CaseBuilder()
.when(mapSheetMngHstEntity.dataState.eq("DONE")) .when(mapSheetMngHstEntity.dataState.eq("DONE"))
.then(1L) .then(1L)
.otherwise(0L) .otherwise(0L)
.sum() .sum()
.as("syncStateDoneCnt"), .as("syncStateDoneCnt"),
new CaseBuilder() new CaseBuilder()
.when(mapSheetMngHstEntity.syncState.ne("NOTYET")) .when(mapSheetMngHstEntity.syncState.ne("NOTYET"))
.then(1L) .then(1L)
.otherwise(0L) .otherwise(0L)
.sum(), .sum(),
new CaseBuilder() new CaseBuilder()
.when(mapSheetMngHstEntity.syncState.eq("NOTPAIR")) .when(mapSheetMngHstEntity.syncState.eq("NOTPAIR"))
.then(1L) .then(1L)
@@ -105,6 +108,7 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
.then(1L) .then(1L)
.otherwise(0L) .otherwise(0L)
.sum(), .sum(),
new CaseBuilder() new CaseBuilder()
.when(mapSheetMngHstEntity.syncState.eq("DUPLICATE")) .when(mapSheetMngHstEntity.syncState.eq("DUPLICATE"))
.then(1L) .then(1L)
@@ -119,6 +123,7 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
.then(1L) .then(1L)
.otherwise(0L) .otherwise(0L)
.sum(), .sum(),
new CaseBuilder() new CaseBuilder()
.when( .when(
mapSheetMngHstEntity mapSheetMngHstEntity
@@ -141,6 +146,23 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
.then(1L) .then(1L)
.otherwise(0L) .otherwise(0L)
.sum(), .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, mapSheetMngEntity.createdDttm,
mapSheetMngHstEntity.syncEndDttm.max())) mapSheetMngHstEntity.syncEndDttm.max()))
.from(mapSheetMngEntity) .from(mapSheetMngEntity)
@@ -199,80 +221,102 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
queryFactory queryFactory
.select( .select(
Projections.constructor( Projections.constructor(
MapSheetMngDto.MngDto.class, MapSheetMngDto.MngDto.class,
Expressions.numberTemplate( Expressions.numberTemplate(
Integer.class, Integer.class,
"row_number() over(order by {0} desc)", "row_number() over(order by {0} desc)",
mapSheetMngEntity.createdDttm), mapSheetMngEntity.createdDttm),
mapSheetMngEntity.mngYyyy, mapSheetMngEntity.mngYyyy,
mapSheetMngEntity.mngPath, mapSheetMngEntity.mngPath,
mapSheetMngEntity.mngState, mapSheetMngEntity.mngState,
mapSheetMngEntity.syncState, mapSheetMngEntity.syncState,
mapSheetMngEntity.syncCheckState, mapSheetMngEntity.syncCheckState,
mapSheetMngHstEntity.count(),
new CaseBuilder() mapSheetMngHstEntity.count().as("syncTotalCnt"),
.when(mapSheetMngHstEntity.dataState.eq("DONE")) new CaseBuilder()
.then(1L) .when(mapSheetMngHstEntity.dataState.eq("DONE"))
.otherwise(0L) .then(1L)
.sum() .otherwise(0L)
.as("syncStateDoneCnt"), .sum()
new CaseBuilder() .as("syncStateDoneCnt"),
.when(mapSheetMngHstEntity.syncState.ne("NOTYET"))
.then(1L) new CaseBuilder()
.otherwise(0L) .when(mapSheetMngHstEntity.syncState.ne("NOTYET"))
.sum(), .then(1L)
new CaseBuilder() .otherwise(0L)
.when(mapSheetMngHstEntity.syncState.eq("NOTPAIR")) .sum(),
.then(1L)
.otherwise(0L) new CaseBuilder()
.sum(), .when(mapSheetMngHstEntity.syncState.eq("NOTPAIR"))
new CaseBuilder() .then(1L)
.when( .otherwise(0L)
mapSheetMngHstEntity .sum(),
.syncCheckState new CaseBuilder()
.eq("DONE") .when(
.and(mapSheetMngHstEntity.syncState.eq("NOTPAIR"))) mapSheetMngHstEntity
.then(1L) .syncCheckState
.otherwise(0L) .eq("DONE")
.sum(), .and(mapSheetMngHstEntity.syncState.eq("NOTPAIR")))
new CaseBuilder() .then(1L)
.when(mapSheetMngHstEntity.syncState.eq("DUPLICATE")) .otherwise(0L)
.then(1L) .sum(),
.otherwise(0L)
.sum(), new CaseBuilder()
new CaseBuilder() .when(mapSheetMngHstEntity.syncState.eq("DUPLICATE"))
.when( .then(1L)
mapSheetMngHstEntity .otherwise(0L)
.syncCheckState .sum(),
.eq("DONE") new CaseBuilder()
.and(mapSheetMngHstEntity.syncState.eq("DUPLICATE"))) .when(
.then(1L) mapSheetMngHstEntity
.otherwise(0L) .syncCheckState
.sum(), .eq("DONE")
new CaseBuilder() .and(mapSheetMngHstEntity.syncState.eq("DUPLICATE")))
.when( .then(1L)
mapSheetMngHstEntity .otherwise(0L)
.syncState .sum(),
.eq("TYPEERROR")
.or(mapSheetMngHstEntity.syncState.eq("SIZEERROR"))) new CaseBuilder()
.then(1L) .when(
.otherwise(0L) mapSheetMngHstEntity
.sum(), .syncState
new CaseBuilder() .eq("TYPEERROR")
.when( .or(mapSheetMngHstEntity.syncState.eq("SIZEERROR")))
mapSheetMngHstEntity .then(1L)
.syncCheckState .otherwise(0L)
.eq("DONE") .sum(),
.and( new CaseBuilder()
mapSheetMngHstEntity .when(
.syncState mapSheetMngHstEntity
.eq("TYPEERROR") .syncCheckState
.or(mapSheetMngHstEntity.syncState.eq("SIZEERROR")))) .eq("DONE")
.then(1L) .and(
.otherwise(0L) mapSheetMngHstEntity
.sum(), .syncState
mapSheetMngEntity.createdDttm, .eq("TYPEERROR")
mapSheetMngHstEntity.syncEndDttm.max())) .or(mapSheetMngHstEntity.syncState.eq("SIZEERROR"))))
.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) .from(mapSheetMngEntity)
.leftJoin(mapSheetMngHstEntity) .leftJoin(mapSheetMngHstEntity)
.on(mapSheetMngEntity.mngYyyy.eq(mapSheetMngHstEntity.mngYyyy)) .on(mapSheetMngEntity.mngYyyy.eq(mapSheetMngHstEntity.mngYyyy))
@@ -295,24 +339,7 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport
mapSheetMngHstEntity.syncState.ne("DONE").and(mapSheetMngHstEntity.syncState.ne("NOTYET"))); mapSheetMngHstEntity.syncState.ne("DONE").and(mapSheetMngHstEntity.syncState.ne("NOTYET")));
if (searchReq.getSyncState() != null && !searchReq.getSyncState().isEmpty()) { 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()));
}
*/
whereBuilder.and(mapSheetMngHstEntity.syncState.eq(searchReq.getSyncState()));
} }
if (searchReq.getSyncCheckState() != null && !searchReq.getSyncCheckState().isEmpty()) { if (searchReq.getSyncCheckState() != null && !searchReq.getSyncCheckState().isEmpty()) {