From 88c936ec6b7630d9a0e8299a72016f503b99f39b Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 10:58:25 +0900 Subject: [PATCH 01/33] =?UTF-8?q?=ED=95=99=EC=8A=B5=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EA=B4=80=EB=A6=AC=20-=20=EC=9E=AC=ED=95=A0=EB=8B=B9?= =?UTF-8?q?=20=EA=B0=80=EB=8A=A5=ED=95=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A7=84=ED=96=89=EB=A5=A0=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/label/LabelAllocateRepositoryImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java index fc237e03..c0f045a7 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryImpl.java @@ -1510,10 +1510,10 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto labelingAssignmentEntity.analUid.eq(analEntity.getId()), labelingAssignmentEntity.workerUid.ne(userId)) .groupBy(memberEntity.userRole, memberEntity.employeeNo, memberEntity.name) - .having( - completeCnt - .multiply(2) - .goe(totalCnt)) // 진행률 평균 이상인 것들만 조회 => percent 를 바로 쓰면 having절에 무리가 갈 수 있다고 함 + // .having( + // completeCnt + // .multiply(2) + // .goe(totalCnt)) // 진행률 평균 이상인 것들만 조회 => 조건 제거 .orderBy( completeCnt .desc()) // TODO: 현재는 잔여건수가 제일 적은(=완료건수가 높은) 순서로 desc, 추후 도엽번호? PNU? 로 정렬하여 -- 2.49.1 From 833e444a0884dfec6a46f34111d4edb4eb2772a1 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 11:11:49 +0900 Subject: [PATCH 02/33] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EA=B4=80=EB=A6=AC=20-?= =?UTF-8?q?=20=EC=8B=9C=EA=B0=84=EB=8C=80=20=EB=B3=80=ED=99=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/repository/log/AuditLogRepositoryImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/AuditLogRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/AuditLogRepositoryImpl.java index 47104e69..3ad03117 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/AuditLogRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/log/AuditLogRepositoryImpl.java @@ -244,7 +244,7 @@ public class AuditLogRepositoryImpl extends QuerydslRepositorySupport menuEntity.menuNm.as("menuName"), auditLogEntity.eventType.as("eventType"), Expressions.stringTemplate( - "to_char({0}, 'YYYY-MM-DD HH:mm')", auditLogEntity.createdDate) + "to_char({0}, 'YYYY-MM-DD HH24:MI')", auditLogEntity.createdDate) .as("logDateTime"), Projections.constructor( AuditLogDto.LogDetail.class, @@ -308,7 +308,7 @@ public class AuditLogRepositoryImpl extends QuerydslRepositorySupport AuditLogDto.MenuDetail.class, auditLogEntity.id.as("logId"), Expressions.stringTemplate( - "to_char({0}, 'YYYY-MM-DD HH:mm')", auditLogEntity.createdDate) + "to_char({0}, 'YYYY-MM-DD HH24:MI')", auditLogEntity.createdDate) .as("logDateTime"), memberEntity.name.as("userName"), memberEntity.employeeNo.as("loginId"), @@ -375,7 +375,7 @@ public class AuditLogRepositoryImpl extends QuerydslRepositorySupport AuditLogDto.UserDetail.class, auditLogEntity.id.as("logId"), Expressions.stringTemplate( - "to_char({0}, 'YYYY-MM-DD HH:mm')", auditLogEntity.createdDate) + "to_char({0}, 'YYYY-MM-DD HH24:MI')", auditLogEntity.createdDate) .as("logDateTime"), menuEntity.menuNm.as("menuName"), auditLogEntity.eventType.as("eventType"), -- 2.49.1 From a5249d6e60b41830fc7c17a6d10d0a062a813f79 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 11:14:33 +0900 Subject: [PATCH 03/33] =?UTF-8?q?=EC=97=90=EB=9F=AC=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EB=A0=88=EB=B2=A8=20CodeExpose=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/kamcoback/log/dto/ErrorLogDto.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) 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 61dcf1f2..36d7fc4d 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,5 +1,6 @@ package com.kamco.cd.kamcoback.log.dto; +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; import com.kamco.cd.kamcoback.common.utils.enums.EnumType; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; @@ -13,6 +14,30 @@ import org.springframework.data.domain.Sort; public class ErrorLogDto { + @CodeExpose + @Getter + public enum LogErrorLevel implements EnumType { + WARNING("Warning"), + ERROR("Error"), + CRITICAL("Critical"); + + private final String desc; + + LogErrorLevel(String desc) { + this.desc = desc; + } + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + @Schema(name = "ErrorLogBasic", description = "에러로그 기본 정보") @Getter @Setter @@ -76,26 +101,4 @@ public class ErrorLogDto { return PageRequest.of(page, size); } } - - public enum LogErrorLevel implements EnumType { - WARNING("Warning"), - ERROR("Error"), - CRITICAL("Critical"); - - private final String desc; - - LogErrorLevel(String desc) { - this.desc = desc; - } - - @Override - public String getId() { - return name(); - } - - @Override - public String getText() { - return desc; - } - } } -- 2.49.1 From a26a8668a8c4858998e17a7a5bc4731142752a5f Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 11:32:23 +0900 Subject: [PATCH 04/33] =?UTF-8?q?=EC=98=81=EC=83=81=EA=B4=80=EB=A6=AC=20-?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=EC=97=90=20=EB=8F=84=EC=97=BD=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=97=AC=EB=B6=80=20join=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/mapsheet/MapSheetMngRepositoryImpl.java | 4 ++++ 1 file changed, 4 insertions(+) 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 9730282b..5bb4fbfa 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 @@ -313,6 +313,10 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .from(mapSheetMngEntity) .leftJoin(mapSheetMngHstEntity) .on(mapSheetMngEntity.mngYyyy.eq(mapSheetMngHstEntity.mngYyyy)) + .innerJoin(mapInkx5kEntity) + .on( + mapSheetMngHstEntity.mapSheetNum.eq(mapInkx5kEntity.mapidcdNo), + mapInkx5kEntity.useInference.eq(CommonUseStatus.USE)) .where(whereBuilder) .groupBy(mapSheetMngEntity.mngYyyy) .fetchOne(); -- 2.49.1 From 6b23a5d739b0c83e1aea87bbac7d6cbd914db51b Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 12:21:56 +0900 Subject: [PATCH 05/33] =?UTF-8?q?shp=ED=8C=8C=EC=9D=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20jar=20=EA=B2=BD=EB=A1=9C=20=EB=B3=80=EA=B2=BD,=20?= =?UTF-8?q?=EC=B6=94=EB=A1=A0=EC=A7=84=ED=96=89=EC=A4=91=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inference/dto/InferenceResultDto.java | 15 +++++++++++++++ .../Inference/MapSheetLearnRepositoryImpl.java | 3 +++ src/main/resources/application-dev.yml | 2 +- src/main/resources/application-prod.yml | 2 +- 4 files changed, 20 insertions(+), 2 deletions(-) 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 5197790f..55a91e56 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 @@ -309,6 +309,15 @@ public class InferenceResultDto { @Schema(description = "모델3 분석 대기") private Integer m3PendingJobs; + @Schema(description = "모델1 분석 진행중") + private Integer m1RunningJobs; + + @Schema(description = "모델2 분석 진행중") + private Integer m2RunningJobs; + + @Schema(description = "모델3 분석 진행중") + private Integer m3RunningJobs; + @Schema(description = "모델1 분석 완료") private Integer m1CompletedJobs; @@ -391,6 +400,9 @@ public class InferenceResultDto { Integer m1PendingJobs, Integer m2PendingJobs, Integer m3PendingJobs, + Integer m1RunningJobs, + Integer m2RunningJobs, + Integer m3RunningJobs, Integer m1CompletedJobs, Integer m2CompletedJobs, Integer m3CompletedJobs, @@ -418,6 +430,9 @@ public class InferenceResultDto { this.m1PendingJobs = m1PendingJobs; this.m2PendingJobs = m2PendingJobs; this.m3PendingJobs = m3PendingJobs; + this.m1RunningJobs = m1RunningJobs; + this.m2RunningJobs = m2RunningJobs; + this.m3RunningJobs = m3RunningJobs; this.m1CompletedJobs = m1CompletedJobs; this.m2CompletedJobs = m2CompletedJobs; this.m3CompletedJobs = m3CompletedJobs; diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java index 1fea40a5..b8e9c04b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java @@ -205,6 +205,9 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto mapSheetLearnEntity.m1PendingJobs, mapSheetLearnEntity.m2PendingJobs, mapSheetLearnEntity.m3PendingJobs, + mapSheetLearnEntity.m1RunningJobs, + mapSheetLearnEntity.m2RunningJobs, + mapSheetLearnEntity.m3RunningJobs, mapSheetLearnEntity.m1CompletedJobs, mapSheetLearnEntity.m2CompletedJobs, mapSheetLearnEntity.m3CompletedJobs, diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e5e34fe3..8da78a03 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -108,7 +108,7 @@ inference: url: http://10.100.0.11:8000/jobs batch-url: http://10.100.0.11:8000/batches geojson-dir: /kamco-nfs/requests/ - jar-path: /kamco-nfs/dataset/shp-exporter-1.0.0.jar + jar-path: /kamco-nfs/dataset/shp/shp-exporter-1.0.0.jar inference-server-name: server1,server2,server3,server4 gukyuin: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 46cd9a73..40dd35f3 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -63,7 +63,7 @@ inference: url: http://10.100.0.11:8000/jobs batch-url: http://10.100.0.11:8000/batches geojson-dir: /kamco-nfs/requests/ - jar-path: /kamco-nfs/dataset/shp-exporter-1.0.0.jar + jar-path: /kamco-nfs/dataset/shp/shp-exporter-1.0.0.jar inference-server-name: server1,server2,server3,server4 gukyuin: -- 2.49.1 From af25143cd53ffbc2f460d7b6ec60b4a9e413d2af Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 12:29:44 +0900 Subject: [PATCH 06/33] =?UTF-8?q?=EC=98=81=EC=83=81=EA=B4=80=EB=A6=AC=20-?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=EC=B6=94=EB=A1=A0=EC=A0=9C=EC=99=B8/?= =?UTF-8?q?=ED=95=B4=EC=A0=9C=20=EB=A1=9C=EC=A7=81,=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/MapSheetMngFileJobCoreService.java | 5 ++- .../mapsheet/MapSheetMngRepositoryImpl.java | 4 ++ .../MapSheetMngFileJobRepositoryCustom.java | 3 +- .../MapSheetMngFileJobRepositoryImpl.java | 4 +- .../service/MapSheetMngFileJobService.java | 40 ++++++++----------- 5 files changed, 28 insertions(+), 28 deletions(-) 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 352e600b..64cad2a8 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 @@ -1,5 +1,6 @@ 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.scheduler.MapSheetMngFileJobRepository; import com.kamco.cd.kamcoback.scheduler.dto.MapSheetMngDto; @@ -69,7 +70,7 @@ public class MapSheetMngFileJobCoreService { strtYyyy, endYyyy, mapSheetNum); } - public void updateException5kMapSheet(String mapSheetNum) { - mapSheetMngFileJobRepository.updateException5kMapSheet(mapSheetNum); + public void updateException5kMapSheet(String mapSheetNum, CommonUseStatus commonUseStatus) { + mapSheetMngFileJobRepository.updateException5kMapSheet(mapSheetNum, commonUseStatus); } } 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 5bb4fbfa..e67af416 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 @@ -169,6 +169,10 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .from(mapSheetMngEntity) .leftJoin(mapSheetMngHstEntity) .on(mapSheetMngEntity.mngYyyy.eq(mapSheetMngHstEntity.mngYyyy)) + .innerJoin(mapInkx5kEntity) + .on( + mapSheetMngHstEntity.mapSheetNum.eq(mapInkx5kEntity.mapidcdNo), + mapInkx5kEntity.useInference.eq(CommonUseStatus.USE)) .where(whereBuilder) // .offset(pageable.getOffset()) // .limit(pageable.getPageSize()) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryCustom.java index d05930c6..41c3ddf1 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryCustom.java @@ -1,5 +1,6 @@ package com.kamco.cd.kamcoback.postgres.repository.scheduler; +import com.kamco.cd.kamcoback.common.enums.CommonUseStatus; import com.kamco.cd.kamcoback.scheduler.dto.MapSheetMngDto; import com.kamco.cd.kamcoback.scheduler.dto.MapSheetMngDto.MngHstDto; import java.util.List; @@ -21,5 +22,5 @@ public interface MapSheetMngFileJobRepositoryCustom { public Long findByHstMapSheetBeforeYyyyListCount(int strtYyyy, int endYyyy, String mapSheetNum); - public void updateException5kMapSheet(String mapSheetNum); + public void updateException5kMapSheet(String mapSheetNum, CommonUseStatus commonUseStatus); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java index ef68bf7a..0e1a121b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java @@ -257,11 +257,11 @@ public class MapSheetMngFileJobRepositoryImpl extends QuerydslRepositorySupport } @Override - public void updateException5kMapSheet(String mapSheetNum) { + public void updateException5kMapSheet(String mapSheetNum, CommonUseStatus commonUseStatus) { long updateCount = queryFactory .update(mapInkx5kEntity) - .set(mapInkx5kEntity.useInference, CommonUseStatus.AUTO_EXCEPT) + .set(mapInkx5kEntity.useInference, commonUseStatus) .where(mapInkx5kEntity.mapidcdNo.eq(mapSheetNum)) .execute(); } 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 8758120b..a88cf617 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 @@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.scheduler.service; import static java.lang.String.CASE_INSENSITIVE_ORDER; +import com.kamco.cd.kamcoback.common.enums.CommonUseStatus; import com.kamco.cd.kamcoback.common.utils.FIleChecker; import com.kamco.cd.kamcoback.common.utils.FIleChecker.Basic; import com.kamco.cd.kamcoback.postgres.core.MapSheetMngFileJobCoreService; @@ -79,26 +80,22 @@ public class MapSheetMngFileJobService { for (MngHstDto item : mapSheetFileNotYetList) { // 5K도엽 자동추론제외 - Long exceptCheckCnt = - this.mapSheetAutoExceptionUpdate(item.getMngYyyy(), item.getMapSheetNum()); + // Long exceptCheckCnt = + // this.mapSheetAutoExceptionUpdate(item.getMngYyyy(), item.getMapSheetNum()); // 도엽별 파일 체크 진행중으로 변경 item.setDataState("PROCESSING"); item.setUseInference("USE"); - if (exceptCheckCnt == 0) { - item.setUseInference("EXCEPT"); - } + // if (exceptCheckCnt == 0) { + // item.setUseInference("EXCEPT"); + // } mngHstDataSyncStateUpdate(item); // 1. MngHstDto 객체의 필드 값에 접근 - // hstUid = item.getHstUid(); - // syncState = item.getSyncState(); - srchDto.setMaxDepth(10); srchDto.setDirPath(item.getSyncMngPath()); srchDto.setExtension("tif,tfw"); srchDto.setFileNm(item.getMapSheetNum()); - // srchDto.setFileNm("34602047"); System.out.println( "UID: " @@ -112,8 +109,6 @@ public class MapSheetMngFileJobService { + " .tif,tfw"); // 도엽번호로 파일 찾기 - // basicList = this.getFilesDepthAll(srchDto); - basicList = FIleChecker.getFilesFromAllDepth( srchDto.getDirPath(), @@ -137,13 +132,18 @@ public class MapSheetMngFileJobService { if (tfwCnt == 0 && tifCnt == 0) { syncState = "NOFILE"; + + item.setUseInference("EXCEPT"); // hst 테이블 use_inference EXCEPT 하기 + // tb_map_inkx_5k 테이블 자동 추론제외 update + mapSheetMngFileJobCoreService.updateException5kMapSheet( + item.getMapSheetNum(), CommonUseStatus.AUTO_EXCEPT); + } else { + // tb_map_inkx_5k 테이블 자동 추론제외 해제 -> 사용으로 처리 + mapSheetMngFileJobCoreService.updateException5kMapSheet( + item.getMapSheetNum(), CommonUseStatus.USE); } for (Basic item2 : basicList) { - // System.out.println("path: " + item2.getParentPath()); - // System.out.println("path: " + item2.getFileNm()); - // System.out.println("path: " + item2.getFullPath()); - MngFileAddReq addReq = new MngFileAddReq(); addReq.setMngYyyy(item.getMngYyyy()); addReq.setMapSheetNum(item.getMapSheetNum()); @@ -240,9 +240,6 @@ public class MapSheetMngFileJobService { return 1L; } - // List mapSheetNums = new ArrayList<>(); - // mapSheetNums.add(mapSheetNum); - int strtYyyy = mngYyyy - syncAutoExceptionBeforeYearCnt + 1; int endYyyy = mngYyyy; @@ -251,13 +248,10 @@ public class MapSheetMngFileJobService { mapSheetMngFileJobCoreService.findByHstMapSheetBeforeYyyyListCount( strtYyyy, endYyyy, mapSheetNum); - // System.out.println("mapSheetAutoExceptionUpdate mapSheetNum == " + mapSheetNum); - // System.out.println("mapSheetAutoExceptionUpdate strtYyyy == " + strtYyyy); - // System.out.println("mapSheetAutoExceptionUpdate endYyyy == " + endYyyy); - // System.out.println("mapSheetAutoExceptionUpdate beforeCnt == " + beforeCnt); if (beforeCnt == 0) { System.out.println("mapSheetAutoExceptionUpdate inference == 자동추론제외"); - mapSheetMngFileJobCoreService.updateException5kMapSheet(mapSheetNum); + mapSheetMngFileJobCoreService.updateException5kMapSheet( + mapSheetNum, CommonUseStatus.AUTO_EXCEPT); } return beforeCnt; -- 2.49.1 From efd6567024683904936df1bb65cc23cb7c57c333 Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 13:17:19 +0900 Subject: [PATCH 07/33] =?UTF-8?q?=EC=B6=94=EB=A1=A0=EC=A7=84=ED=96=89=20?= =?UTF-8?q?=ED=8D=BC=EC=84=BC=ED=8A=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/kamcoback/inference/dto/InferenceResultDto.java | 10 ++++++++-- .../postgres/core/InferenceResultCoreService.java | 2 ++ .../kamcoback/postgres/entity/MapSheetLearnEntity.java | 3 +++ .../Inference/MapSheetLearnRepositoryImpl.java | 3 ++- 4 files changed, 15 insertions(+), 3 deletions(-) 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 55a91e56..2ee05262 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 @@ -395,6 +395,10 @@ public class InferenceResultDto { @Schema(description = "모델3 버전") private String modelVer3; + @Schema(description = "탑지 도엽 수") + @JsonIgnore + private Long totalJobs; + public InferenceStatusDetailDto( Long detectingCnt, Integer m1PendingJobs, @@ -425,7 +429,8 @@ public class InferenceResultDto { String mapSheetScope, String modelVer1, String modelVer2, - String modelVer3) { + String modelVer3, + Long totalJobs) { this.detectingCnt = detectingCnt; this.m1PendingJobs = m1PendingJobs; this.m2PendingJobs = m2PendingJobs; @@ -456,12 +461,13 @@ public class InferenceResultDto { this.modelVer1 = modelVer1; this.modelVer2 = modelVer2; this.modelVer3 = modelVer3; + this.totalJobs = totalJobs; } @Schema(description = "진행률") @JsonProperty("progress") private int getProgress() { - long tiles = this.detectingCnt; // 도엽수 + long tiles = this.totalJobs == null ? 0L : this.totalJobs; // 도엽수 int models = 3; // 모델 개수 int completed = this.m1CompletedJobs 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 9dda7e4c..5738e28b 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 @@ -113,6 +113,8 @@ public class InferenceResultCoreService { mapSheetLearnEntity.setCreatedUid(userUtil.getId()); mapSheetLearnEntity.setMapSheetCnt(mapSheetName); mapSheetLearnEntity.setDetectingCnt(0L); + mapSheetLearnEntity.setTotalJobs((long) detectingCnt); + // 회차는 국유인 반영할때 update로 변경됨 // mapSheetLearnEntity.setStage( // mapSheetLearnRepository.getLearnStage(req.getCompareYyyy(), req.getTargetYyyy())); diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.java index cb7d4aed..fa6ab43f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.java @@ -196,6 +196,9 @@ public class MapSheetLearnEntity { @Column(name = "uid", nullable = false) private String uid = UUID.randomUUID().toString().replace("-", "").toUpperCase(); + @Column(name = "total_jobs") + private Long totalJobs; + public InferenceResultDto.ResultList toDto() { return new InferenceResultDto.ResultList( this.uuid, diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java index b8e9c04b..a03bcd4b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java @@ -230,7 +230,8 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto mapSheetLearnEntity.mapSheetScope, m1Model.modelVer.as("model1Ver"), m2Model.modelVer.as("model2Ver"), - m3Model.modelVer.as("model3Ver"))) + m3Model.modelVer.as("model3Ver"), + mapSheetLearnEntity.totalJobs)) .from(mapSheetLearnEntity) .leftJoin(m1Model) .on(m1Model.uuid.eq(mapSheetLearnEntity.m1ModelUuid)) -- 2.49.1 From 88107ac61603fa45d596f66f08500cafce749a00 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 13:48:18 +0900 Subject: [PATCH 08/33] =?UTF-8?q?=EC=98=81=EC=83=81=EA=B4=80=EB=A6=AC=20-?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=EC=B6=94=EB=A1=A0=EC=A0=9C=EC=99=B8=20upd?= =?UTF-8?q?ate=ED=95=A0=20=EB=95=8C=20update=5Fdttm=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/scheduler/MapSheetMngFileJobRepositoryImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java index 0e1a121b..f1ac9905 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/scheduler/MapSheetMngFileJobRepositoryImpl.java @@ -262,6 +262,7 @@ public class MapSheetMngFileJobRepositoryImpl extends QuerydslRepositorySupport queryFactory .update(mapInkx5kEntity) .set(mapInkx5kEntity.useInference, commonUseStatus) + .set(mapInkx5kEntity.modifiedDate, ZonedDateTime.now()) .where(mapInkx5kEntity.mapidcdNo.eq(mapSheetNum)) .execute(); } -- 2.49.1 From c8c5e8c0833959c4c03244642808c147a3134c68 Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 13:49:23 +0900 Subject: [PATCH 09/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../kamcoback/inference/service/InferenceStatusService.java | 6 ++++++ .../kamco/cd/kamcoback/upload/service/UploadService.java | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceStatusService.java diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceStatusService.java b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceStatusService.java new file mode 100644 index 00000000..6958f1a6 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceStatusService.java @@ -0,0 +1,6 @@ +package com.kamco.cd.kamcoback.inference.service; + +import org.springframework.stereotype.Service; + +@Service +public class InferenceStatusService {} diff --git a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java index b4c104de..0c018467 100644 --- a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java +++ b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java @@ -11,6 +11,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.util.Objects; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -104,7 +105,7 @@ public class UploadService { upRes.setResMsg("chunkIndex:" + chunkIndex + " 업로드 애러"); } - if (chunkIndex == chunkTotalIndex) { + if (Objects.equals(chunkIndex, chunkTotalIndex)) { upAddReqDto.setUploadId(dto.getUploadId()); upAddReqDto.setStatus(FileUploadStatus.DONE.name()); -- 2.49.1 From bbf0073f35ca6e9541eb896f7ad1da4c2b9de689 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 15:44:47 +0900 Subject: [PATCH 10/33] =?UTF-8?q?=EC=98=81=EC=83=81=EA=B4=80=EB=A6=AC=20-?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=EC=B6=94=EB=A1=A0=EC=A0=9C=EC=99=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20uploadPair=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapsheet/MapSheetMngApiController.java | 8 ++++---- .../mapsheet/service/MapSheetMngService.java | 20 +++++++++---------- .../service/MapSheetMngFileJobService.java | 19 +++++++++--------- 3 files changed, 23 insertions(+), 24 deletions(-) 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 1ea19aad..d09d8a2d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java @@ -204,12 +204,12 @@ public class MapSheetMngApiController { @PostMapping(value = "/upload-pair", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResponseDto uploadPair( @RequestPart("tfw") MultipartFile tfwFile, - @RequestPart("tif") MultipartFile tifFile, - @RequestParam(value = "hstUid", required = false) Long hstUid, - @RequestParam(value = "overwrite", required = false) boolean overwrite) { + @RequestParam(value = "tifFileName") String tifFile, + @RequestParam(value = "tifFileSize") Long tifFileSize, + @RequestParam(value = "hstUid", required = false) Long hstUid) { return ApiResponseDto.createOK( - mapSheetMngService.uploadPair(tfwFile, tifFile, hstUid, overwrite)); + mapSheetMngService.uploadPair(tfwFile, tifFile, hstUid, tifFileSize)); } @Operation(summary = "영상관리 > 파일조회", description = "영상관리 > 파일조회") 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 2b2ce6a0..66c98948 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 @@ -107,7 +107,7 @@ public class MapSheetMngService { @Transactional public DmlReturn uploadPair( - MultipartFile tfwFile, MultipartFile tifFile, Long hstUid, Boolean overwrite) { + MultipartFile tfwFile, String tifFile, Long hstUid, Long tifFileSize) { String rootPath = syncRootDir; String tmpPath = syncTmpDir; @@ -134,7 +134,7 @@ public class MapSheetMngService { MngDto mngDto = mapSheetMngCoreService.findMapSheetMng(errDto.getMngYyyy()); String targetYearDir = mngDto.getMngPath(); - // 중복체크 -> 도엽/uuid 경로에 업로드 할 거라 overwrite 되지 않음 + // 중복체크 -> 도엽50k/uuid 경로에 업로드 할 거라 overwrite 되지 않음 // if (!overwrite) { // dmlReturn = // this.duplicateFile( @@ -146,7 +146,7 @@ public class MapSheetMngService { // 멀티파트 파일 tmp폴더 저장(파일형식 체크를 위해) String tfwTmpPath = tmpPath + tfwFile.getOriginalFilename(); - String tifTmpPath = tmpPath + tifFile.getOriginalFilename(); + String tifTmpPath = tmpPath + tifFile; if (!FIleChecker.multipartSaveTo(tfwFile, tfwTmpPath)) { return new DmlReturn("fail", "UPLOAD ERROR"); @@ -194,7 +194,7 @@ public class MapSheetMngService { } tfwTargetPath = Paths.get(uploadPath).resolve(tfwFile.getOriginalFilename()); - tifTargetPath = Paths.get(uploadPath).resolve(tifFile.getOriginalFilename()); + tifTargetPath = Paths.get(uploadPath).resolve(tifFile); if (!Files.exists(tifTargetPath)) { return new DmlReturn("fail", "TIF 파일이 정상적으로 업로드 되지 않았습니다. 확인해주세요."); @@ -213,7 +213,7 @@ public class MapSheetMngService { updReqSyncCheckState.setHstUid(hstUid); updReqSyncCheckState.setFilePath(uploadPath); updReqSyncCheckState.setSyncCheckTfwFileName(tfwFile.getOriginalFilename()); - updReqSyncCheckState.setSyncCheckTifFileName(tifFile.getOriginalFilename()); + updReqSyncCheckState.setSyncCheckTifFileName(tifFile); updReqSyncCheckState.setSyncCheckState("DONE"); mapSheetMngCoreService.updateMapSheetMngHstSyncCheckState(updReqSyncCheckState); // 파일정보 업데이트 @@ -233,9 +233,9 @@ public class MapSheetMngService { mapSheetMngCoreService.mngFileSave(addReq); - addReq.setFileName(tifFile.getOriginalFilename()); + addReq.setFileName(tifFile); addReq.setFileExt("tif"); - addReq.setFileSize(tifFile.getSize()); + addReq.setFileSize(tifFileSize); mapSheetMngCoreService.mngFileSave(addReq); return new DmlReturn("success", "파일 업로드 완료되었습니다."); @@ -279,14 +279,12 @@ public class MapSheetMngService { return new DmlReturn("success", fileUids.size() + "개 파일이 사용설정되었습니다."); } - public DmlReturn validationFile(MultipartFile tfwFile, MultipartFile tifFile) { + public DmlReturn validationFile(MultipartFile tfwFile, String 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")) { + } else if (!FIleChecker.checkExtensions(tifFile, "tif")) { return new DmlReturn("fail", "TIF FILENAME ERROR"); } 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 a88cf617..6241a2bb 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 @@ -132,15 +132,6 @@ public class MapSheetMngFileJobService { if (tfwCnt == 0 && tifCnt == 0) { syncState = "NOFILE"; - - item.setUseInference("EXCEPT"); // hst 테이블 use_inference EXCEPT 하기 - // tb_map_inkx_5k 테이블 자동 추론제외 update - mapSheetMngFileJobCoreService.updateException5kMapSheet( - item.getMapSheetNum(), CommonUseStatus.AUTO_EXCEPT); - } else { - // tb_map_inkx_5k 테이블 자동 추론제외 해제 -> 사용으로 처리 - mapSheetMngFileJobCoreService.updateException5kMapSheet( - item.getMapSheetNum(), CommonUseStatus.USE); } for (Basic item2 : basicList) { @@ -199,9 +190,19 @@ public class MapSheetMngFileJobService { // 도엽별 파일 체크 완료로 변경 item.setDataState("DONE"); + // syncState가 DONE 이 아닐 때 자동추론 제외, DONE 이면 사용 처리 if (syncState.isEmpty()) { syncState = "DONE"; + // tb_map_inkx_5k 테이블 자동 추론제외 해제 -> 사용으로 처리 + mapSheetMngFileJobCoreService.updateException5kMapSheet( + item.getMapSheetNum(), CommonUseStatus.USE); + } else { + item.setUseInference("EXCEPT"); // hst 테이블 use_inference EXCEPT 하기 + // tb_map_inkx_5k 테이블 자동 추론제외 update + mapSheetMngFileJobCoreService.updateException5kMapSheet( + item.getMapSheetNum(), CommonUseStatus.AUTO_EXCEPT); } + item.setSyncState(syncState); mngHstDataSyncStateUpdate(item); -- 2.49.1 From 9bdd4f57105d6d3af035ff6df7eab73396f7ae6a Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 15:45:27 +0900 Subject: [PATCH 11/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../upload/service/UploadService.java | 88 ++++++++++++++++--- 1 file changed, 76 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java index 0c018467..7372b7e2 100644 --- a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java +++ b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java @@ -108,20 +108,48 @@ public class UploadService { if (Objects.equals(chunkIndex, chunkTotalIndex)) { upAddReqDto.setUploadId(dto.getUploadId()); - upAddReqDto.setStatus(FileUploadStatus.DONE.name()); + upAddReqDto.setStatus(FileUploadStatus.DONE.name()); // DONE 말고 MERGING 추천 uploadSessionCoreService.updateUploadSessionStatus(upAddReqDto); + log.info( + "merge start: uploadId={}, fileName={}, chunkIndex={}, chunkTotalIndex={}, tmpDir={}, finalDir={}", + dto.getUploadId(), + fileName, + chunkIndex, + chunkTotalIndex, + tmpDataSetDir, + fianlDir); + try { this.mergeChunks(tmpDataSetDir, fianlDir, fileName, chunkTotalIndex); - upAddReqDto.setUploadId(dto.getUploadId()); upAddReqDto.setStatus("MERGED"); uploadSessionCoreService.updateUploadSessionStatus(upAddReqDto); + log.info( + "merge success: uploadId={}, fileName={}, outputDir={}", + dto.getUploadId(), + fileName, + fianlDir); + } catch (IOException e) { - // throw new RuntimeException(e); + + // 실패 상태도 남기는 걸 강추 + upAddReqDto.setStatus("MERGE_FAIL"); + uploadSessionCoreService.updateUploadSessionStatus(upAddReqDto); + + log.error( + "merge failed: uploadId={}, fileName={}, chunkIndex={}, chunkTotalIndex={}, tmpDir={}, finalDir={}", + dto.getUploadId(), + fileName, + chunkIndex, + chunkTotalIndex, + tmpDataSetDir, + fianlDir, + e); + upRes.setRes("fail"); - upRes.setResMsg("파일Chunk 병합(merge) 애러"); + upRes.setResMsg("파일Chunk 병합(merge) 오류"); return upRes; } } @@ -212,28 +240,64 @@ public class UploadService { return dto; } - public void mergeChunks(String tmpDir, String fianlDir, String fileName, int chunkTotalIndex) + public void mergeChunks(String tmpDir, String finalDir, String fileName, int chunkTotalIndex) throws IOException { + long start = System.currentTimeMillis(); + Path outputPath = Paths.get(finalDir, fileName); + + log.info( + "mergeChunks start: fileName={}, tmpDir={}, outputPath={}, lastChunkIndex={}", + fileName, + tmpDir, + outputPath, + chunkTotalIndex); + + long totalBytes = 0; - Path outputPath = Paths.get(fianlDir, fileName); try (FileChannel outChannel = - FileChannel.open(outputPath, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { + FileChannel.open( + outputPath, + StandardOpenOption.CREATE, + StandardOpenOption.WRITE, + StandardOpenOption.TRUNCATE_EXISTING)) { + for (int i = 0; i <= chunkTotalIndex; i++) { - Path chunkPath = Paths.get(tmpDir, i + ""); + Path chunkPath = Paths.get(tmpDir, String.valueOf(i)); try (FileChannel inChannel = FileChannel.open(chunkPath, StandardOpenOption.READ)) { - long transferred = 0; long size = inChannel.size(); + long transferred = 0; while (transferred < size) { transferred += inChannel.transferTo(transferred, size - transferred, outChannel); } + totalBytes += size; } - // 병합 후 즉시 삭제하여 디스크 공간 확보 + Files.delete(chunkPath); } + + try { + FIleChecker.deleteFolder(tmpDir); + } catch (Exception e) { + log.warn("tmpDir delete failed (merge already succeeded): tmpDir={}", tmpDir, e); + } + + } catch (IOException e) { + log.error( + "mergeChunks failed: fileName={}, tmpDir={}, outputPath={}, lastChunkIndex={}", + fileName, + tmpDir, + outputPath, + chunkTotalIndex, + e); + throw e; } - // 병합후 임시 폴더 삭제 - FIleChecker.deleteFolder(tmpDir); + log.info( + "mergeChunks done: fileName={}, outputPath={}, bytes={}, elapsedMs={}", + fileName, + outputPath, + totalBytes, + (System.currentTimeMillis() - start)); } } -- 2.49.1 From dc0f9689268291ef32eff6621543f7246d2a163d Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 16:16:02 +0900 Subject: [PATCH 12/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../common/enums/FileUploadStatus.java | 3 +- .../model/service/ModelMngService.java | 49 ++++++++++++++++++- .../upload/service/UploadService.java | 4 +- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/common/enums/FileUploadStatus.java b/src/main/java/com/kamco/cd/kamcoback/common/enums/FileUploadStatus.java index d6c1b004..d81ab6eb 100644 --- a/src/main/java/com/kamco/cd/kamcoback/common/enums/FileUploadStatus.java +++ b/src/main/java/com/kamco/cd/kamcoback/common/enums/FileUploadStatus.java @@ -12,7 +12,8 @@ public enum FileUploadStatus implements EnumType { INIT("초기화"), UPLOADING("업로드중"), DONE("업로드완료"), - MERGED("병합완료"); + MERGED("병합완료"), + MERGE_FAIL("병합 실패"); private final String desc; diff --git a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java index 79efd3fd..fec4824e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java @@ -19,12 +19,14 @@ import java.time.LocalDate; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @Service +@Log4j2 @RequiredArgsConstructor public class ModelMngService { @@ -71,11 +73,18 @@ public class ModelMngService { } public ApiResponseDto.ResponseObj insertModel(ModelMngDto.AddReq addReq) { + UUID uuid = UUID.randomUUID(); addReq.setUuid(uuid); addReq.setClsModelVersion(addReq.getModelVer()); addReq.setPriority(0d); + log.info( + "insertModel start: uuid={}, fileName={}, filePath={}", + uuid, + addReq.getFileName(), + addReq.getFilePath()); + ModelUploadResDto modelUploadResDto = new ModelUploadResDto(); try { FIleChecker.unzip(addReq.getFileName(), addReq.getFilePath()); @@ -88,6 +97,14 @@ public class ModelMngService { || modelUploadResDto.getClsModelFileName() == null || modelUploadResDto.getClsModelFileName().isEmpty()) { + log.warn( + "model file missing: uuid={}, path={}, cdModel={}, cdConfig={}, clsModel={}", + uuid, + addReq.getFilePath(), + modelUploadResDto.getCdModelFileName(), + modelUploadResDto.getCdModelConfigFileName(), + modelUploadResDto.getClsModelFileName()); + return new ApiResponseDto.ResponseObj( ApiResponseCode.NOT_FOUND, "pth,json,py파일이 모두 존재하지 않습니다"); } @@ -101,12 +118,20 @@ public class ModelMngService { } catch (IOException e) { // throw new RuntimeException(e); - + log.error( + "unzip or scan failed: uuid={}, fileName={}, filePath={}", + uuid, + addReq.getFileName(), + addReq.getFilePath(), + e); return new ApiResponseDto.ResponseObj(ApiResponseCode.NOT_FOUND, "파일이 존재하지 않습니다"); } Long modelUid = modelMngCoreService.insertModel(addReq); + log.info( + "model inserted: uuid={}, modelUid={}, modelVer={}", uuid, modelUid, addReq.getModelVer()); + ModelMetricAddReq modelMetricAddReq = new ModelMetricAddReq(); modelMetricAddReq.setModelUid(modelUid); modelMetricAddReq.setModelVerUid(modelUid); @@ -136,14 +161,28 @@ public class ModelMngService { modelMetricAddReq.setIou(iou); } catch (IOException e) { + log.error("metric json parse failed: uuid={}, jsonPath={}", uuid, filePath, e); return new ApiResponseDto.ResponseObj(ApiResponseCode.NOT_FOUND, "JSON파일 오류"); } modelMngCoreService.insertModelResultMetric(modelMetricAddReq); + log.info( + "model metric inserted: modelUid={}, f1={}, precision={}, recall={}, iou={}", + modelUid, + modelMetricAddReq.getF1Score(), + modelMetricAddReq.getPrecision(), + modelMetricAddReq.getRecall(), + modelMetricAddReq.getIou()); + String zipFilePath = addReq.getFilePath() + "/" + addReq.getFileName(); boolean isDeleted = FIleChecker.deleteFile(zipFilePath); + if (!isDeleted) { + log.warn("zip file delete failed: uuid={}, path={}", uuid, zipFilePath); + } + + log.info("insertModel success: uuid={}, modelUid={}", uuid, modelUid); return new ApiResponseDto.ResponseObj(ApiResponseDto.ApiResponseCode.OK, "등록되었습니다."); } @@ -174,6 +213,14 @@ public class ModelMngService { } */ + log.info( + "end uploadChunkModelFile: res={}, resMsg={}, uuid={}, filePath={}, fileName={}", + modelUploadResDto.getRes(), + modelUploadResDto.getResMsg(), + modelUploadResDto.getUuid(), + modelUploadResDto.getFilePath(), + modelUploadResDto.getFileName()); + return modelUploadResDto; } diff --git a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java index 7372b7e2..6d41bf62 100644 --- a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java +++ b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java @@ -123,7 +123,7 @@ public class UploadService { try { this.mergeChunks(tmpDataSetDir, fianlDir, fileName, chunkTotalIndex); - upAddReqDto.setStatus("MERGED"); + upAddReqDto.setStatus(FileUploadStatus.MERGED.name()); uploadSessionCoreService.updateUploadSessionStatus(upAddReqDto); log.info( @@ -135,7 +135,7 @@ public class UploadService { } catch (IOException e) { // 실패 상태도 남기는 걸 강추 - upAddReqDto.setStatus("MERGE_FAIL"); + upAddReqDto.setStatus(FileUploadStatus.MERGE_FAIL.name()); uploadSessionCoreService.updateUploadSessionStatus(upAddReqDto); log.error( -- 2.49.1 From ea03c5f07f752682cb68aaf3fe80feb5c59f5155 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 16:26:41 +0900 Subject: [PATCH 13/33] =?UTF-8?q?uploadPair,=20=EB=9D=BC=EB=B2=A8=EB=A7=81?= =?UTF-8?q?=20=ED=98=84=ED=99=A9=20=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kamco/cd/kamcoback/label/dto/LabelWorkDto.java | 3 +++ .../mapsheet/service/MapSheetMngService.java | 4 +++- .../repository/label/LabelWorkRepositoryImpl.java | 12 ++++++++---- .../members/MemberInactiveJobRepositoryImpl.java | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java b/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java index 89d569d4..b9af35e6 100644 --- a/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/label/dto/LabelWorkDto.java @@ -205,6 +205,9 @@ public class LabelWorkDto { @Schema(description = "1일전처리개수") private Long day1AgoDoneCnt; + @Schema(description = "계정 상태") + private String memberStatus; + public Long getRemainCnt() { return this.assignedCnt - this.doneCnt; } 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 66c98948..e6cfe73c 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 @@ -30,12 +30,14 @@ import java.nio.file.StandardCopyOption; import java.util.Comparator; import java.util.List; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +@Slf4j @Service @RequiredArgsConstructor @Transactional(readOnly = true) @@ -166,7 +168,7 @@ public class MapSheetMngService { List mngFiles = mapSheetMngCoreService.findByHstUidMapSheetFileList(hstUid); String uploadPath = ""; for (MngFilesDto dto : mngFiles) { - uploadPath = dto.getFilePath() + "/" + errDto.getUuid(); + uploadPath = dto.getFilePath(); break; } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java index 3150d1af..fea8e9d4 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelWorkRepositoryImpl.java @@ -350,7 +350,8 @@ public class LabelWorkRepositoryImpl implements LabelWorkRepositoryCustom { skipCnt.as("skipCnt"), day3AgoDoneCnt.as("day3AgoDoneCnt"), day2AgoDoneCnt.as("day2AgoDoneCnt"), - day1AgoDoneCnt.as("day1AgoDoneCnt"))) + day1AgoDoneCnt.as("day1AgoDoneCnt"), + memberEntity.status)) .from(labelingAssignmentEntity) .innerJoin(mapSheetAnalInferenceEntity) .on( @@ -361,7 +362,8 @@ public class LabelWorkRepositoryImpl implements LabelWorkRepositoryCustom { .innerJoin(memberEntity) .on(whereSubBuilder) .where(whereBuilder) - .groupBy(memberEntity.userRole, memberEntity.name, memberEntity.userId) + .groupBy( + memberEntity.userRole, memberEntity.name, memberEntity.userId, memberEntity.status) .orderBy(orderSpecifiers.toArray(new OrderSpecifier[0])) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -496,7 +498,8 @@ public class LabelWorkRepositoryImpl implements LabelWorkRepositoryCustom { skipCnt.as("skipCnt"), day3AgoDoneCnt.as("day3AgoDoneCnt"), day2AgoDoneCnt.as("day2AgoDoneCnt"), - day1AgoDoneCnt.as("day1AgoDoneCnt"))) + day1AgoDoneCnt.as("day1AgoDoneCnt"), + memberEntity.status)) .from(labelingAssignmentEntity) .innerJoin(mapSheetAnalInferenceEntity) .on( @@ -507,7 +510,8 @@ public class LabelWorkRepositoryImpl implements LabelWorkRepositoryCustom { .innerJoin(memberEntity) .on(whereSubBuilder) .where(whereBuilder) - .groupBy(memberEntity.userRole, memberEntity.name, memberEntity.userId) + .groupBy( + memberEntity.userRole, memberEntity.name, memberEntity.userId, memberEntity.status) .orderBy(orderSpecifiers.toArray(new OrderSpecifier[0])) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MemberInactiveJobRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MemberInactiveJobRepositoryImpl.java index 2408ace0..e90c6550 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MemberInactiveJobRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/members/MemberInactiveJobRepositoryImpl.java @@ -21,7 +21,7 @@ public class MemberInactiveJobRepositoryImpl implements MemberInactiveJobReposit @Override public List findInactiveLabelerReviewer() { - ZonedDateTime checkTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul")).minusDays(14); + ZonedDateTime checkTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul")).minusDays(28); return queryFactory .select(Projections.constructor(MemberInfo.class, memberEntity.id, memberEntity.employeeNo)) .from(memberEntity) -- 2.49.1 From 575c98f6514f6797cc26620227e06fe0b81fa91a Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 16:48:57 +0900 Subject: [PATCH 14/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java index 342ccd45..63ddada6 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java @@ -230,9 +230,9 @@ public class ModelMngDto { private int chunkTotalIndex; public double getUploadRate() { - if (this.chunkTotalIndex == 0) { - return 0.0; - } + // if (this.chunkTotalIndex == 0) { + // return 0.0; + // } return (double) (this.chunkIndex + 1) / (this.chunkTotalIndex + 1) * 100.0; } } -- 2.49.1 From 77ac5e5b995ceb716c6ed103227a23344d20a6da Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 16:49:21 +0900 Subject: [PATCH 15/33] =?UTF-8?q?=EC=98=81=EC=83=81=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D,=20=EC=83=81=EC=84=B8=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapsheet/MapSheetMngRepositoryImpl.java | 172 ++++++++++++------ 1 file changed, 118 insertions(+), 54 deletions(-) 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 e67af416..00bf82ef 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 @@ -100,48 +100,55 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .then(1L) .otherwise(0L) .sum(), - new CaseBuilder() - .when(mapSheetMngHstEntity.syncState.eq("NOTPAIR")) - .then(1L) - .otherwise(0L) - .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and(mapSheetMngHstEntity.syncState.eq("NOTPAIR"))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() - .when(mapSheetMngHstEntity.syncState.eq("DUPLICATE")) + .when( + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("NOTPAIR")))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and(mapSheetMngHstEntity.syncState.eq("DUPLICATE"))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncState - .eq("TYPEERROR") - .or(mapSheetMngHstEntity.syncState.eq("SIZEERROR"))) + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("DUPLICATE")))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and( mapSheetMngHstEntity .syncState @@ -151,28 +158,53 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .otherwise(0L) .sum(), new CaseBuilder() - .when(mapSheetMngHstEntity.syncState.eq("NOFILE")) + .when( + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and( + mapSheetMngHstEntity + .syncState + .eq("TYPEERROR") + .or( + mapSheetMngHstEntity.syncState.eq( + "SIZEERROR"))))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and(mapSheetMngHstEntity.syncState.eq("NOFILE"))) .then(1L) .otherwise(0L) .sum(), + new CaseBuilder() + .when( + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("NOFILE")))) + .then(1L) + .otherwise(0L) + .sum(), mapSheetMngEntity.createdDttm, mapSheetMngHstEntity.syncEndDttm.max())) .from(mapSheetMngEntity) .leftJoin(mapSheetMngHstEntity) .on(mapSheetMngEntity.mngYyyy.eq(mapSheetMngHstEntity.mngYyyy)) - .innerJoin(mapInkx5kEntity) - .on( - mapSheetMngHstEntity.mapSheetNum.eq(mapInkx5kEntity.mapidcdNo), - mapInkx5kEntity.useInference.eq(CommonUseStatus.USE)) + .leftJoin(mapInkx5kEntity) + .on(mapSheetMngHstEntity.mapSheetNum.eq(mapInkx5kEntity.mapidcdNo)) .where(whereBuilder) // .offset(pageable.getOffset()) // .limit(pageable.getPageSize()) @@ -248,48 +280,55 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .then(1L) .otherwise(0L) .sum(), - new CaseBuilder() - .when(mapSheetMngHstEntity.syncState.eq("NOTPAIR")) - .then(1L) - .otherwise(0L) - .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and(mapSheetMngHstEntity.syncState.eq("NOTPAIR"))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() - .when(mapSheetMngHstEntity.syncState.eq("DUPLICATE")) + .when( + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("NOTPAIR")))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and(mapSheetMngHstEntity.syncState.eq("DUPLICATE"))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncState - .eq("TYPEERROR") - .or(mapSheetMngHstEntity.syncState.eq("SIZEERROR"))) + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("DUPLICATE")))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and( mapSheetMngHstEntity .syncState @@ -299,28 +338,53 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .otherwise(0L) .sum(), new CaseBuilder() - .when(mapSheetMngHstEntity.syncState.eq("NOFILE")) + .when( + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and( + mapSheetMngHstEntity + .syncState + .eq("TYPEERROR") + .or( + mapSheetMngHstEntity.syncState.eq( + "SIZEERROR"))))) .then(1L) .otherwise(0L) .sum(), new CaseBuilder() .when( - mapSheetMngHstEntity - .syncCheckState - .eq("DONE") + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) .and(mapSheetMngHstEntity.syncState.eq("NOFILE"))) .then(1L) .otherwise(0L) .sum(), + new CaseBuilder() + .when( + mapInkx5kEntity + .useInference + .eq(CommonUseStatus.USE) + .and( + mapSheetMngHstEntity + .syncCheckState + .eq("DONE") + .and(mapSheetMngHstEntity.syncState.eq("NOFILE")))) + .then(1L) + .otherwise(0L) + .sum(), mapSheetMngEntity.createdDttm, mapSheetMngHstEntity.syncEndDttm.max())) .from(mapSheetMngEntity) .leftJoin(mapSheetMngHstEntity) .on(mapSheetMngEntity.mngYyyy.eq(mapSheetMngHstEntity.mngYyyy)) - .innerJoin(mapInkx5kEntity) - .on( - mapSheetMngHstEntity.mapSheetNum.eq(mapInkx5kEntity.mapidcdNo), - mapInkx5kEntity.useInference.eq(CommonUseStatus.USE)) + .leftJoin(mapInkx5kEntity) + .on(mapSheetMngHstEntity.mapSheetNum.eq(mapInkx5kEntity.mapidcdNo)) .where(whereBuilder) .groupBy(mapSheetMngEntity.mngYyyy) .fetchOne(); -- 2.49.1 From e4faa1ad7084cd064b052448b392d9e7c3c9e770 Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 16:51:08 +0900 Subject: [PATCH 16/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java index 63ddada6..bad925f3 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java @@ -230,9 +230,9 @@ public class ModelMngDto { private int chunkTotalIndex; public double getUploadRate() { - // if (this.chunkTotalIndex == 0) { - // return 0.0; - // } + if (chunkIndex < 0 || chunkTotalIndex < 0) { + return 0.0; + } return (double) (this.chunkIndex + 1) / (this.chunkTotalIndex + 1) * 100.0; } } -- 2.49.1 From 6ed679c8d670ca8777b015feeb34899cbed1683c Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 17:13:52 +0900 Subject: [PATCH 17/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../kamco/cd/kamcoback/model/service/ModelMngService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java index fec4824e..cec49d6f 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java @@ -106,7 +106,7 @@ public class ModelMngService { modelUploadResDto.getClsModelFileName()); return new ApiResponseDto.ResponseObj( - ApiResponseCode.NOT_FOUND, "pth,json,py파일이 모두 존재하지 않습니다"); + ApiResponseCode.NOT_FOUND, "pth,pt,py파일이 모두 존재하지 않습니다"); } addReq.setCdModelPath(modelUploadResDto.getCdModelPath()); @@ -231,7 +231,7 @@ public class ModelMngService { int endPos = 20; List files = - FIleChecker.getFilesFromAllDepth(dirPath, "*", "pth,py,json", 10, "name", startPos, endPos); + FIleChecker.getFilesFromAllDepth(dirPath, "*", "pth,py,pt", 10, "name", startPos, endPos); for (Basic dto : files) { // 예: 파일명 출력 및 추가 작업 @@ -243,7 +243,7 @@ public class ModelMngService { } else if (dto.getExtension().equals("py")) { modelUploadResDto.setCdModelConfigPath(foldNm); modelUploadResDto.setCdModelConfigFileName(dto.getFileNm()); - } else if (dto.getExtension().equals("json")) { + } else if (dto.getExtension().equals("pt")) { modelUploadResDto.setClsModelPath(foldNm); modelUploadResDto.setClsModelFileName(dto.getFileNm()); } -- 2.49.1 From 62305119a16da1358c557c1cb2b574f98d30670d Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 17:33:03 +0900 Subject: [PATCH 18/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../cd/kamcoback/model/dto/ModelMngDto.java | 2 ++ .../model/service/ModelMngService.java | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java index bad925f3..a85387a9 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/dto/ModelMngDto.java @@ -228,6 +228,8 @@ public class ModelMngDto { private String clsModelFileName; private int chunkIndex; private int chunkTotalIndex; + @JsonIgnore private String jsonPath; + @JsonIgnore private String jsonFileName; public double getUploadRate() { if (chunkIndex < 0 || chunkTotalIndex < 0) { diff --git a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java index cec49d6f..f7447f00 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java @@ -95,18 +95,21 @@ public class ModelMngService { || modelUploadResDto.getCdModelConfigFileName() == null || modelUploadResDto.getCdModelConfigFileName().isEmpty() || modelUploadResDto.getClsModelFileName() == null - || modelUploadResDto.getClsModelFileName().isEmpty()) { + || modelUploadResDto.getClsModelFileName().isEmpty() + || modelUploadResDto.getJsonFileName() == null + || modelUploadResDto.getJsonFileName().isEmpty()) { log.warn( - "model file missing: uuid={}, path={}, cdModel={}, cdConfig={}, clsModel={}", + "model file missing: uuid={}, path={}, cdModel={}, cdConfig={}, clsModel={}, jsonFileName={}", uuid, addReq.getFilePath(), modelUploadResDto.getCdModelFileName(), modelUploadResDto.getCdModelConfigFileName(), - modelUploadResDto.getClsModelFileName()); + modelUploadResDto.getClsModelFileName(), + modelUploadResDto.getJsonFileName()); return new ApiResponseDto.ResponseObj( - ApiResponseCode.NOT_FOUND, "pth,pt,py파일이 모두 존재하지 않습니다"); + ApiResponseCode.NOT_FOUND, "pth,pt,py,json파일이 모두 존재하지 않습니다"); } addReq.setCdModelPath(modelUploadResDto.getCdModelPath()); @@ -142,7 +145,7 @@ public class ModelMngService { modelMetricAddReq.setIou(0); ObjectMapper mapper = new ObjectMapper(); - String filePath = modelUploadResDto.getClsModelPath() + modelUploadResDto.getClsModelFileName(); + String filePath = modelUploadResDto.getJsonPath() + modelUploadResDto.getJsonFileName(); String dataJson = null; try { dataJson = Files.readString(Path.of(filePath)); @@ -231,7 +234,8 @@ public class ModelMngService { int endPos = 20; List files = - FIleChecker.getFilesFromAllDepth(dirPath, "*", "pth,py,pt", 10, "name", startPos, endPos); + FIleChecker.getFilesFromAllDepth( + dirPath, "*", "pth,py,pt,json", 10, "name", startPos, endPos); for (Basic dto : files) { // 예: 파일명 출력 및 추가 작업 @@ -246,6 +250,9 @@ public class ModelMngService { } else if (dto.getExtension().equals("pt")) { modelUploadResDto.setClsModelPath(foldNm); modelUploadResDto.setClsModelFileName(dto.getFileNm()); + } else if (dto.getExtension().equals("json")) { + modelUploadResDto.setJsonPath(foldNm); + modelUploadResDto.setJsonFileName(dto.getFileNm()); } } -- 2.49.1 From 1c477bc41fe4478b8d1d005c513a5333eb5e3fc9 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 17:33:27 +0900 Subject: [PATCH 19/33] =?UTF-8?q?=EC=98=81=EC=83=81=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B6=94=EB=A1=A0=EC=A0=9C=EC=99=B8=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 --- .../service/MapSheetMngFileJobService.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) 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 6241a2bb..ab1d9925 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 @@ -80,15 +80,15 @@ public class MapSheetMngFileJobService { for (MngHstDto item : mapSheetFileNotYetList) { // 5K도엽 자동추론제외 - // Long exceptCheckCnt = - // this.mapSheetAutoExceptionUpdate(item.getMngYyyy(), item.getMapSheetNum()); + Long exceptCheckCnt = + this.mapSheetAutoExceptionUpdate(item.getMngYyyy(), item.getMapSheetNum()); // 도엽별 파일 체크 진행중으로 변경 item.setDataState("PROCESSING"); item.setUseInference("USE"); - // if (exceptCheckCnt == 0) { - // item.setUseInference("EXCEPT"); - // } + if (exceptCheckCnt == 0) { + item.setUseInference("EXCEPT"); + } mngHstDataSyncStateUpdate(item); // 1. MngHstDto 객체의 필드 값에 접근 @@ -190,17 +190,8 @@ public class MapSheetMngFileJobService { // 도엽별 파일 체크 완료로 변경 item.setDataState("DONE"); - // syncState가 DONE 이 아닐 때 자동추론 제외, DONE 이면 사용 처리 if (syncState.isEmpty()) { syncState = "DONE"; - // tb_map_inkx_5k 테이블 자동 추론제외 해제 -> 사용으로 처리 - mapSheetMngFileJobCoreService.updateException5kMapSheet( - item.getMapSheetNum(), CommonUseStatus.USE); - } else { - item.setUseInference("EXCEPT"); // hst 테이블 use_inference EXCEPT 하기 - // tb_map_inkx_5k 테이블 자동 추론제외 update - mapSheetMngFileJobCoreService.updateException5kMapSheet( - item.getMapSheetNum(), CommonUseStatus.AUTO_EXCEPT); } item.setSyncState(syncState); @@ -237,14 +228,15 @@ public class MapSheetMngFileJobService { public Long mapSheetAutoExceptionUpdate(int mngYyyy, String mapSheetNum) { // 2025년 이전 파일싱크는 무조건 이전3년이 존재하지 않으므로 자동추론제외를 진행하지 않는다.(전년도 파일이 무조건 존재하는 것으로 리턴) - if (syncAutoExceptionStartYear > mngYyyy) { - return 1L; - } + // if (syncAutoExceptionStartYear > mngYyyy) { + // return 1L; + // } - int strtYyyy = mngYyyy - syncAutoExceptionBeforeYearCnt + 1; + // int strtYyyy = mngYyyy - syncAutoExceptionBeforeYearCnt + 1; + int strtYyyy = 2020; int endYyyy = mngYyyy; - // 본년도+이전년도가 3개년인 도엽 확인 + // 본년도+이전년도가 3개년인 도엽 확인 -> 2020년도부터 현재까지 Long beforeCnt = mapSheetMngFileJobCoreService.findByHstMapSheetBeforeYyyyListCount( strtYyyy, endYyyy, mapSheetNum); @@ -253,6 +245,9 @@ public class MapSheetMngFileJobService { System.out.println("mapSheetAutoExceptionUpdate inference == 자동추론제외"); mapSheetMngFileJobCoreService.updateException5kMapSheet( mapSheetNum, CommonUseStatus.AUTO_EXCEPT); + } else { + // 하나라도 있으면 USE + mapSheetMngFileJobCoreService.updateException5kMapSheet(mapSheetNum, CommonUseStatus.USE); } return beforeCnt; -- 2.49.1 From db5325a1fa3ec2478545b1f7e8a88a61c174713b Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 17:48:46 +0900 Subject: [PATCH 20/33] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=93=B1=EB=A1=9D=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 --- .../model/service/ModelMngService.java | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java index f7447f00..14d2a9af 100644 --- a/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/model/service/ModelMngService.java @@ -15,6 +15,7 @@ import com.kamco.cd.kamcoback.upload.service.UploadService; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.time.LocalDate; import java.util.List; import java.util.UUID; @@ -237,22 +238,43 @@ public class ModelMngService { FIleChecker.getFilesFromAllDepth( dirPath, "*", "pth,py,pt,json", 10, "name", startPos, endPos); + boolean hasPt = false; // pt 파일 존재 여부 + for (Basic dto : files) { // 예: 파일명 출력 및 추가 작업 String foldNm = dto.getFullPath().replace(dto.getFileNm(), ""); - if (dto.getExtension().equals("pth")) { - modelUploadResDto.setCdModelPath(foldNm); - modelUploadResDto.setCdModelFileName(dto.getFileNm()); - } else if (dto.getExtension().equals("py")) { - modelUploadResDto.setCdModelConfigPath(foldNm); - modelUploadResDto.setCdModelConfigFileName(dto.getFileNm()); - } else if (dto.getExtension().equals("pt")) { - modelUploadResDto.setClsModelPath(foldNm); - modelUploadResDto.setClsModelFileName(dto.getFileNm()); - } else if (dto.getExtension().equals("json")) { - modelUploadResDto.setJsonPath(foldNm); - modelUploadResDto.setJsonFileName(dto.getFileNm()); + switch (dto.getExtension()) { + case "pth" -> { + modelUploadResDto.setCdModelPath(foldNm); + modelUploadResDto.setCdModelFileName(dto.getFileNm()); + } + case "py" -> { + modelUploadResDto.setCdModelConfigPath(foldNm); + modelUploadResDto.setCdModelConfigFileName(dto.getFileNm()); + } + case "pt" -> { + modelUploadResDto.setClsModelPath(foldNm); + modelUploadResDto.setClsModelFileName(dto.getFileNm()); + hasPt = true; + } + case "json" -> { + modelUploadResDto.setJsonPath(foldNm); + modelUploadResDto.setJsonFileName(dto.getFileNm()); + } + } + } + + if (!hasPt) { + + String defaultPath = "/kamco-nfs/ckpt/classification/"; + String defaultFileName = "v5-best.pt"; + + Path ptPath = Paths.get(defaultPath, defaultFileName); + + if (Files.exists(ptPath)) { + modelUploadResDto.setClsModelPath(defaultPath); + modelUploadResDto.setClsModelFileName(defaultFileName); } } -- 2.49.1 From ef7c7b1c7e7d19a834f671915abf1ca2c5d55a94 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 19:52:01 +0900 Subject: [PATCH 21/33] =?UTF-8?q?=EC=98=81=EC=83=81=EA=B4=80=EB=A6=AC=20ch?= =?UTF-8?q?unk,=20uploadPair=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapsheet/MapSheetMngApiController.java | 3 +++ .../kamcoback/mapsheet/dto/MapSheetMngDto.java | 5 ++++- .../mapsheet/service/MapSheetMngService.java | 9 ++++++--- .../postgres/core/MapSheetMngCoreService.java | 6 +++++- .../postgres/entity/MapSheetMngHstEntity.java | 3 +++ .../mapsheet/MapSheetMngRepositoryCustom.java | 3 +++ .../mapsheet/MapSheetMngRepositoryImpl.java | 17 +++++++++++++++-- .../cd/kamcoback/upload/dto/UploadDto.java | 4 ++++ .../kamcoback/upload/service/UploadService.java | 17 +++++++++++++---- 9 files changed, 56 insertions(+), 11 deletions(-) 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 d09d8a2d..3e976db4 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; @@ -322,6 +323,7 @@ public class MapSheetMngApiController { @PostMapping(value = "/file-chunk-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResponseDto fileChunkUpload( @RequestParam("hstUid") Long hstUid, + @RequestParam("uuid") UUID uuid, @RequestParam("fileName") String fileName, @RequestParam("fileSize") long fileSize, @RequestParam("chunkIndex") Integer chunkIndex, @@ -338,6 +340,7 @@ public class MapSheetMngApiController { upAddReqDto.setChunkIndex(chunkIndex); upAddReqDto.setChunkTotalIndex(chunkTotalIndex); upAddReqDto.setUploadDivi(uploadDivi); + upAddReqDto.setUuid(uuid); upAddReqDto.setFinalPath(syncRootDir); upAddReqDto.setTempPath(syncRootTmpDir); 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 9285815e..02d65de8 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 @@ -258,6 +258,7 @@ public class MapSheetMngDto { private String mapSheetPath; private UUID uuid; + private String uploadId; // private List fileArray; @@ -278,7 +279,8 @@ public class MapSheetMngDto { String errorCheckTfwFileName, String errorCheckTifFileName, String mapSheetPath, - UUID uuid) { + UUID uuid, + String uploadId) { this.hstUid = hstUid; this.mngYyyy = mngYyyy; this.mapSheetNum = mapSheetNum; @@ -298,6 +300,7 @@ public class MapSheetMngDto { this.errorCheckTifFileName = errorCheckTifFileName; this.mapSheetPath = mapSheetPath; this.uuid = uuid; + this.uploadId = uploadId; } private String getSyncStateName(String enumId) { 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 e6cfe73c..1cb762f5 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 @@ -148,7 +148,7 @@ public class MapSheetMngService { // 멀티파트 파일 tmp폴더 저장(파일형식 체크를 위해) String tfwTmpPath = tmpPath + tfwFile.getOriginalFilename(); - String tifTmpPath = tmpPath + tifFile; + // String tifTmpPath = tmpPath + tifFile; if (!FIleChecker.multipartSaveTo(tfwFile, tfwTmpPath)) { return new DmlReturn("fail", "UPLOAD ERROR"); @@ -393,7 +393,6 @@ public class MapSheetMngService { uploadPath = Paths.get(referPath).getParent().toString() + "/" + errDto.getRefMapSheetNum(); } - upAddReqDto.setUuid(errDto.getUuid()); upAddReqDto.setFinalPath(uploadPath + "/"); upAddReqDto.setTempPath(upAddReqDto.getTempPath() + "/"); @@ -402,7 +401,7 @@ public class MapSheetMngService { ModelUploadResDto modelUploadResDto = new ModelUploadResDto(); // 병합 다 했는데 gdalinfo 가 fail 이면 삭제? - if (upRes.getRes().equals("MERGED")) { + if (upAddReqDto.getStatus().equals("MERGED")) { if (!FIleChecker.cmmndGdalInfo(upRes.getFilePath() + "/" + upRes.getFileName())) { Path filePath = Paths.get(upRes.getFilePath()); Files.deleteIfExists(filePath); @@ -410,6 +409,10 @@ public class MapSheetMngService { modelUploadResDto.setResMsg("TIF TYPE ERROR"); return modelUploadResDto; } + + // upload_id, uuid 를 update + mapSheetMngCoreService.updateMapSheetMngHstUploadId( + hstUid, upAddReqDto.getUuid(), upRes.getUploadId()); } modelUploadResDto.setRes(upRes.getRes()); 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 d304561c..680b1a87 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 @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -319,5 +320,8 @@ public class MapSheetMngCoreService { 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); + } } 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 index a08e6ca3..1d082990 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java @@ -163,6 +163,9 @@ public class MapSheetMngHstEntity extends CommonDateEntity { @Column(name = "uuid") private UUID uuid; + @Column(name = "upload_id") + private String uploadId; + // 파일정보 업데이트 public void updateFileInfos(Long tifSizeBytes, Long tfwSizeBytes) { tifSizeBytes = tifSizeBytes == null ? 0L : tifSizeBytes; 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 3d30f371..521f110d 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 @@ -11,6 +11,7 @@ import com.kamco.cd.kamcoback.postgres.entity.YearEntity; import jakarta.validation.Valid; import java.util.List; import java.util.Optional; +import java.util.UUID; import org.springframework.data.domain.Page; public interface MapSheetMngRepositoryCustom { @@ -77,4 +78,6 @@ public interface MapSheetMngRepositoryCustom { Page getYears(YearSearchReq req); List getSceneInference(String yyyy, List mapSheetNums); + + void updateMapSheetMngHstUploadId(Long hstUid, UUID uuid, String uploadId); } 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 00bf82ef..05025161 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 @@ -34,6 +34,7 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.UUID; import org.hibernate.query.Query; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -460,7 +461,8 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport mapSheetMngHstEntity.syncCheckTfwFileName, mapSheetMngHstEntity.syncCheckTifFileName, mapSheetMngHstEntity.mapSheetPath, - mapSheetMngHstEntity.uuid)) + mapSheetMngHstEntity.uuid, + mapSheetMngHstEntity.uploadId)) .from(mapSheetMngHstEntity) .innerJoin(mapInkx5kEntity) .on( @@ -526,7 +528,8 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport mapSheetMngHstEntity.syncCheckTfwFileName, mapSheetMngHstEntity.syncCheckTifFileName, mapSheetMngHstEntity.mapSheetPath, - mapSheetMngHstEntity.uuid)) + mapSheetMngHstEntity.uuid, + mapSheetMngHstEntity.uploadId)) .from(mapSheetMngHstEntity) .innerJoin(mapInkx5kEntity) .on(mapSheetMngHstEntity.mapSheetNum.eq(mapInkx5kEntity.mapidcdNo)) @@ -1075,6 +1078,16 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .fetch(); } + @Override + public void updateMapSheetMngHstUploadId(Long hstUid, UUID uuid, String uploadId) { + queryFactory + .update(mapSheetMngHstEntity) + .set(mapSheetMngHstEntity.uploadId, uploadId) + .set(mapSheetMngHstEntity.uuid, uuid) + .where(mapSheetMngHstEntity.hstUid.eq(hstUid)) + .execute(); + } + private BooleanExpression eqYearStatus(QYearEntity years, String status) { if (status == null) { return null; diff --git a/src/main/java/com/kamco/cd/kamcoback/upload/dto/UploadDto.java b/src/main/java/com/kamco/cd/kamcoback/upload/dto/UploadDto.java index 5ca61ac4..38d72a6b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/upload/dto/UploadDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/upload/dto/UploadDto.java @@ -43,6 +43,7 @@ public class UploadDto { @NoArgsConstructor @AllArgsConstructor public static class UploadAddReq { + @Schema(description = "업로드 ID", example = "각데이터의 식별키") private String uploadId; @@ -144,6 +145,7 @@ public class UploadDto { @NoArgsConstructor @AllArgsConstructor public static class uploadDto { + @Schema(description = "업로드 ID", example = "각데이터의 식별키") private String uploadId; @@ -189,6 +191,7 @@ public class UploadDto { @NoArgsConstructor @AllArgsConstructor public static class UploadRes { + private String res; private String resMsg; private UUID uuid; @@ -196,6 +199,7 @@ public class UploadDto { private String fileName; private int chunkIndex; private int chunkTotalIndex; + private String uploadId; public double getUploadRate() { if (this.chunkTotalIndex == 0) { diff --git a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java index 6d41bf62..2f79660e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java +++ b/src/main/java/com/kamco/cd/kamcoback/upload/service/UploadService.java @@ -60,7 +60,9 @@ public class UploadService { UploadDto.UploadRes upRes = new UploadDto.UploadRes(); long datasetId = 0; - if (upAddReqDto.getDatasetId() != null) datasetId = upAddReqDto.getDatasetId(); + if (upAddReqDto.getDatasetId() != null) { + datasetId = upAddReqDto.getDatasetId(); + } String uploadId = System.currentTimeMillis() + ""; // UUID uuid = UUID.randomUUID(); UUID uuid = upAddReqDto.getUuid(); @@ -86,7 +88,9 @@ public class UploadService { // 세션 신규,중복체크(초기화 포함) UploadDto.uploadDto dto = this.checkUploadSession(upAddReqDto, upRes); - if (!upRes.getRes().equals("success")) return upRes; + if (!upRes.getRes().equals("success")) { + return upRes; + } status = FileUploadStatus.UPLOADING.name(); upAddReqDto.setStatus(status); @@ -97,7 +101,9 @@ public class UploadService { } // 폴더 생성 및 체크 - if (!checkChunkFoler(upRes, tmpDataSetDir, fianlDir)) return upRes; + if (!checkChunkFoler(upRes, tmpDataSetDir, fianlDir)) { + return upRes; + } // chunk저장하기 if (!FIleChecker.multipartChunkSaveTo(file, tmpDataSetDir, chunkIndex)) { @@ -232,7 +238,10 @@ public class UploadService { uploadSessionCoreService.updateUploadSessionStatus(upAddReqDto); } - if (dto != null) upRes.setUuid(dto.getUuid()); + if (dto != null) { + upRes.setUuid(dto.getUuid()); + upRes.setUploadId(dto.getUploadId()); + } upRes.setChunkIndex(upAddReqDto.getChunkIndex()); upRes.setChunkTotalIndex(upAddReqDto.getChunkTotalIndex()); -- 2.49.1 From 22193d5200916720d493fdc513cff7eac29fa333 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 27 Jan 2026 20:20:54 +0900 Subject: [PATCH 22/33] =?UTF-8?q?=EC=97=90=EB=9F=AC=EB=A1=9C=EA=B7=B8=20ac?= =?UTF-8?q?tionType=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kamco/cd/kamcoback/config/GlobalExceptionHandler.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java b/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java index 755d5322..85907d1a 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/GlobalExceptionHandler.java @@ -4,10 +4,12 @@ import com.kamco.cd.kamcoback.auth.CustomUserDetails; import com.kamco.cd.kamcoback.common.exception.CustomApiException; import com.kamco.cd.kamcoback.common.exception.DuplicateFileException; import com.kamco.cd.kamcoback.common.exception.ValidationException; +import com.kamco.cd.kamcoback.common.utils.HeaderUtil; import com.kamco.cd.kamcoback.config.api.ApiLogFunction; import com.kamco.cd.kamcoback.config.api.ApiResponseDto; import com.kamco.cd.kamcoback.config.api.ApiResponseDto.ApiResponseCode; import com.kamco.cd.kamcoback.log.dto.ErrorLogDto; +import com.kamco.cd.kamcoback.log.dto.EventType; import com.kamco.cd.kamcoback.members.exception.MemberException; import com.kamco.cd.kamcoback.postgres.entity.ErrorLogEntity; import com.kamco.cd.kamcoback.postgres.repository.log.ErrorLogRepository; @@ -466,10 +468,14 @@ public class GlobalExceptionHandler { .collect(Collectors.joining("\n")) .substring(0, 255); + String actionType = HeaderUtil.get(request, "kamco-action-type"); + ErrorLogEntity errorLogEntity = new ErrorLogEntity( request.getRequestURI(), - ApiLogFunction.getEventType(request), + actionType == null + ? ApiLogFunction.getEventType(request) + : EventType.fromName(actionType), logErrorLevel, String.valueOf(httpStatus.value()), errorCode.getText(), -- 2.49.1 From 6af8584526a67139bef4eda22b2ba92ca05f9046 Mon Sep 17 00:00:00 2001 From: teddy Date: Tue, 27 Jan 2026 20:38:42 +0900 Subject: [PATCH 23/33] =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kamcoback/layer/LayerApiController.java | 70 ++++ .../kamco/cd/kamcoback/layer/dto/WmtsDto.java | 27 ++ .../cd/kamcoback/layer/dto/WmtsLayerInfo.java | 277 ++++++++++++++++ .../layer/service/GeojsonService.java | 3 + .../kamcoback/layer/service/TileService.java | 10 + .../kamcoback/layer/service/WmsService.java | 10 + .../kamcoback/layer/service/WmtsService.java | 301 ++++++++++++++++++ .../postgres/entity/MapLayerEntity.java | 80 +++++ .../repository/layer/LayerRepository.java | 7 + .../layer/LayerRepositoryCustom.java | 3 + .../repository/layer/LayerRepositoryImpl.java | 6 + src/main/resources/application-dev.yml | 4 + src/main/resources/application-prod.yml | 4 + 13 files changed, 802 insertions(+) create mode 100644 src/main/java/com/kamco/cd/kamcoback/layer/LayerApiController.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsDto.java create mode 100755 src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsLayerInfo.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/layer/service/GeojsonService.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/layer/service/TileService.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/layer/service/WmsService.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/layer/service/WmtsService.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapLayerEntity.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/layer/LayerRepository.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/layer/LayerRepositoryCustom.java create mode 100644 src/main/java/com/kamco/cd/kamcoback/postgres/repository/layer/LayerRepositoryImpl.java diff --git a/src/main/java/com/kamco/cd/kamcoback/layer/LayerApiController.java b/src/main/java/com/kamco/cd/kamcoback/layer/LayerApiController.java new file mode 100644 index 00000000..f3eed1cf --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/layer/LayerApiController.java @@ -0,0 +1,70 @@ +package com.kamco.cd.kamcoback.layer; + +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; +import com.kamco.cd.kamcoback.layer.dto.WmtsDto.WmtsAddReqDto; +import com.kamco.cd.kamcoback.layer.dto.WmtsLayerInfo; +import com.kamco.cd.kamcoback.layer.service.WmtsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "레이어 관리", description = "레이어 관리 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/layer") +public class LayerApiController { + + private final WmtsService wmtsService; + + @Operation(summary = "wmts tile 조회", description = "wmts tile 조회 api") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "검색 성공", + content = + @Content( + mediaType = "application/json", + array = @ArraySchema(schema = @Schema(implementation = String.class)))), + @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) + @GetMapping("/wmts/tile") + public ApiResponseDto> getWmtsTile() { + return ApiResponseDto.ok(wmtsService.getTile()); + } + + @Operation(summary = "wmts tile 상세 조회", description = "wmts tile 상세 조회 api") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "검색 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = WmtsLayerInfo.class))), + @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) + @PostMapping("/wmts") + public ApiResponseDto getWmtsTileDetail( + @Parameter(description = "선택한 tile", example = "959022EFCAA448D1A325FA7B8ABEA10D") + @RequestBody + WmtsAddReqDto dto) { + wmtsService.save(dto); + return ApiResponseDto.ok(null); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsDto.java b/src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsDto.java new file mode 100644 index 00000000..966d0a77 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsDto.java @@ -0,0 +1,27 @@ +package com.kamco.cd.kamcoback.layer.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +public class WmtsDto { + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class WmtsAddReqDto { + private String title; + private String description; + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class WmtsAddDto { + private WmtsLayerInfo wmtsLayerInfo; + private String description; + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsLayerInfo.java b/src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsLayerInfo.java new file mode 100755 index 00000000..331b3611 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/layer/dto/WmtsLayerInfo.java @@ -0,0 +1,277 @@ +package com.kamco.cd.kamcoback.layer.dto; + +import java.util.ArrayList; +import java.util.List; + +/** WMTS 레이어 정보를 담는 DTO 클래스 */ +public class WmtsLayerInfo { + + public String identifier; + public String title; + public String abstractText; + public List keywords = new ArrayList<>(); + public BoundingBox boundingBox; + public List formats = new ArrayList<>(); + public List tileMatrixSetLinks = new ArrayList<>(); + public List resourceUrls = new ArrayList<>(); + public List