diff --git a/src/main/java/com/kamco/cd/kamcoback/label/dto/WorkerStatsDto.java b/src/main/java/com/kamco/cd/kamcoback/label/dto/WorkerStatsDto.java index 5b4dab5c..9d03e89e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/label/dto/WorkerStatsDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/label/dto/WorkerStatsDto.java @@ -28,6 +28,9 @@ public class WorkerStatsDto { @Schema(description = "작업 시작일 (예: 2026-04-06)") private String startDate; + + @Schema(description = "프로젝트 UUID") + private String uuid; } @Getter diff --git a/src/main/java/com/kamco/cd/kamcoback/label/service/LabelAllocateService.java b/src/main/java/com/kamco/cd/kamcoback/label/service/LabelAllocateService.java index fa850685..8d3211ac 100644 --- a/src/main/java/com/kamco/cd/kamcoback/label/service/LabelAllocateService.java +++ b/src/main/java/com/kamco/cd/kamcoback/label/service/LabelAllocateService.java @@ -118,8 +118,10 @@ public class LabelAllocateService { public WorkerListResponse getWorkerStatistics( Long analUid, String workerType, String search, String sortType) { - // 프로젝트 정보 조회 (analUid가 있을 때만) - var projectInfo = labelAllocateCoreService.findProjectInfo(analUid); + // 프로젝트 정보 조회 (analUid가 없으면 최신 프로젝트 정보 조회) + var projectInfo = analUid != null + ? labelAllocateCoreService.findProjectInfo(analUid) + : labelAllocateCoreService.findLatestProjectInfo(); // 작업 진행 현황 조회 var progressInfo = labelAllocateCoreService.findWorkProgressInfo(analUid); diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelAllocateCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelAllocateCoreService.java index 30f788bd..ca31c812 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelAllocateCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/LabelAllocateCoreService.java @@ -56,6 +56,10 @@ public class LabelAllocateCoreService { return labelAllocateRepository.findProjectInfo(analUid); } + public ProjectInfo findLatestProjectInfo() { + return labelAllocateRepository.findLatestProjectInfo(); + } + public List findWorkerStatistics( Long analUid, String workerType, String search, String sortType) { return labelAllocateRepository.findWorkerStatistics(analUid, workerType, search, sortType); diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryCustom.java index ff30ac7a..187ded4d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/label/LabelAllocateRepositoryCustom.java @@ -33,6 +33,9 @@ public interface LabelAllocateRepositoryCustom { // 프로젝트 정보 조회 ProjectInfo findProjectInfo(Long analUid); + // 최신 프로젝트 정보 조회 (analUid 없이) + ProjectInfo findLatestProjectInfo(); + // 작업자 통계 조회 List findWorkerStatistics( Long analUid, String workerType, String search, String sortType); 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 f42b83c2..fbc7a3c3 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 @@ -648,24 +648,26 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto var result = queryFactory .select( - mapSheetAnalEntity.compareYyyy, - mapSheetAnalEntity.targetYyyy, - mapSheetAnalEntity.analTitle, - mapSheetAnalEntity.gukyuinApplyDttm, - mapSheetAnalEntity.analStrtDttm) - .from(mapSheetAnalEntity) - .where(mapSheetAnalEntity.id.eq(analUid)) + mapSheetAnalInferenceEntity.compareYyyy, + mapSheetAnalInferenceEntity.targetYyyy, + mapSheetAnalInferenceEntity.analTitle, + mapSheetAnalInferenceEntity.gukyuinApplyDttm, + mapSheetAnalInferenceEntity.analStrtDttm, + mapSheetAnalInferenceEntity.uuid) + .from(mapSheetAnalInferenceEntity) + .where(mapSheetAnalInferenceEntity.id.eq(analUid)) .fetchOne(); if (result == null) { return null; } - Integer compareYyyy = result.get(mapSheetAnalEntity.compareYyyy); - Integer targetYyyy = result.get(mapSheetAnalEntity.targetYyyy); - String analTitle = result.get(mapSheetAnalEntity.analTitle); - ZonedDateTime gukyuinApplyDttm = result.get(mapSheetAnalEntity.gukyuinApplyDttm); - ZonedDateTime analStrtDttm = result.get(mapSheetAnalEntity.analStrtDttm); + Integer compareYyyy = result.get(mapSheetAnalInferenceEntity.compareYyyy); + Integer targetYyyy = result.get(mapSheetAnalInferenceEntity.targetYyyy); + String analTitle = result.get(mapSheetAnalInferenceEntity.analTitle); + ZonedDateTime gukyuinApplyDttm = result.get(mapSheetAnalInferenceEntity.gukyuinApplyDttm); + ZonedDateTime analStrtDttm = result.get(mapSheetAnalInferenceEntity.analStrtDttm); + UUID uuid = result.get(mapSheetAnalInferenceEntity.uuid); // 변화탐지년도 생성 String detectionYear = @@ -679,6 +681,54 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto .round(round) .reflectionDate(formatDate(gukyuinApplyDttm)) .startDate(formatDate(analStrtDttm)) + .uuid(uuid != null ? uuid.toString() : null) + .build(); + } + + @Override + public ProjectInfo findLatestProjectInfo() { + // 최신 target_yyyy를 기준으로 프로젝트 정보 조회 + var result = + queryFactory + .select( + mapSheetAnalInferenceEntity.compareYyyy, + mapSheetAnalInferenceEntity.targetYyyy, + mapSheetAnalInferenceEntity.analTitle, + mapSheetAnalInferenceEntity.gukyuinApplyDttm, + mapSheetAnalInferenceEntity.analStrtDttm, + mapSheetAnalInferenceEntity.uuid) + .from(mapSheetAnalInferenceEntity) + .orderBy( + mapSheetAnalInferenceEntity.targetYyyy.desc(), + mapSheetAnalInferenceEntity.compareYyyy.desc(), + mapSheetAnalInferenceEntity.createdDttm.desc()) + .limit(1) + .fetchOne(); + + if (result == null) { + return null; + } + + Integer compareYyyy = result.get(mapSheetAnalInferenceEntity.compareYyyy); + Integer targetYyyy = result.get(mapSheetAnalInferenceEntity.targetYyyy); + String analTitle = result.get(mapSheetAnalInferenceEntity.analTitle); + ZonedDateTime gukyuinApplyDttm = result.get(mapSheetAnalInferenceEntity.gukyuinApplyDttm); + ZonedDateTime analStrtDttm = result.get(mapSheetAnalInferenceEntity.analStrtDttm); + UUID uuid = result.get(mapSheetAnalInferenceEntity.uuid); + + // 변화탐지년도 생성 + String detectionYear = + (compareYyyy != null && targetYyyy != null) ? compareYyyy + "-" + targetYyyy : null; + + // 회차 추출 (예: "8회차" → "8") + String round = extractRoundFromTitle(analTitle); + + return ProjectInfo.builder() + .detectionYear(detectionYear) + .round(round) + .reflectionDate(formatDate(gukyuinApplyDttm)) + .startDate(formatDate(analStrtDttm)) + .uuid(uuid != null ? uuid.toString() : null) .build(); }