diff --git a/src/main/java/com/kamco/cd/kamcoback/Innopam/dto/DetectMastDto.java b/src/main/java/com/kamco/cd/kamcoback/Innopam/dto/DetectMastDto.java index 3ec944e7..3a4a7e7e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/Innopam/dto/DetectMastDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/Innopam/dto/DetectMastDto.java @@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.Innopam.dto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -38,7 +39,7 @@ public class DetectMastDto { @Schema(description = "after 연도", example = "2024") private String cprsAdYr; - @NotBlank + @NotNull @Schema(description = "차수(회차)", example = "4") private Integer dtctSno; diff --git a/src/main/java/com/kamco/cd/kamcoback/label/LabelAllocateApiController.java b/src/main/java/com/kamco/cd/kamcoback/label/LabelAllocateApiController.java index 00e507de..f0b65270 100644 --- a/src/main/java/com/kamco/cd/kamcoback/label/LabelAllocateApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/label/LabelAllocateApiController.java @@ -55,8 +55,8 @@ public class LabelAllocateApiController { } @Operation( - summary = "작업현황 관리 (라벨링, 검수 진행률 요약정보, 작업자 목록)", - description = "작업현황 관리 (라벨링, 검수 진행률 요약정보, 작업자 목록)") + summary = "작업현황 관리 (라벨링, 검수 진행률 요약정보)", + description = "작업현황 관리 (라벨링, 검수 진행률 요약정보)") @ApiResponses( value = { @ApiResponse(responseCode = "200", description = "조회 성공"), 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..1e68e5a9 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 @@ -103,8 +103,6 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto .update(mapSheetAnalDataInferenceGeomEntity) .set(mapSheetAnalDataInferenceGeomEntity.labelState, LabelState.ASSIGNED.getId()) .set(mapSheetAnalDataInferenceGeomEntity.labelStateDttm, ZonedDateTime.now()) - .set(mapSheetAnalDataInferenceGeomEntity.testState, InspectState.UNCONFIRM.getId()) - .set(mapSheetAnalDataInferenceGeomEntity.testStateDttm, ZonedDateTime.now()) .where(mapSheetAnalDataInferenceGeomEntity.geoUid.in(geoUidList)) .execute(); @@ -648,24 +646,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 +679,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(); } 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 39fc3860..a7de04c2 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 @@ -306,14 +306,14 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport .fetch(); Long countQuery = - queryFactory - .select(labelingAssignmentEntity.workerUid.countDistinct()) - .from(labelingAssignmentEntity) - .innerJoin(memberEntity) - .on(whereSubBuilder) - .where(whereBuilder) - //.groupBy(memberEntity.userRole, memberEntity.name, memberEntity.userId) - .fetchOne(); + queryFactory + .select(labelingAssignmentEntity.workerUid.countDistinct()) + .from(labelingAssignmentEntity) + .innerJoin(memberEntity) + .on(whereSubBuilder) + .where(whereBuilder) + // .groupBy(memberEntity.userRole, memberEntity.name, memberEntity.userId) + .fetchOne(); return new PageImpl<>(foundContent, pageable, countQuery); }