diff --git a/src/main/java/com/kamco/cd/training/model/ModelTrainDetailApiController.java b/src/main/java/com/kamco/cd/training/model/ModelTrainDetailApiController.java index c4af03f..6bb3463 100644 --- a/src/main/java/com/kamco/cd/training/model/ModelTrainDetailApiController.java +++ b/src/main/java/com/kamco/cd/training/model/ModelTrainDetailApiController.java @@ -11,6 +11,7 @@ import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelTrainMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelValidationMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.TransferDetailDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto.Basic; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ModelProgressStepDto; import com.kamco.cd.training.model.service.ModelTrainDetailService; import com.kamco.cd.training.model.service.ModelTrainMngService; import io.swagger.v3.oas.annotations.Operation; @@ -304,4 +305,25 @@ public class ModelTrainDetailApiController { UUID uuid) { return ApiResponseDto.ok(modelTrainDetailService.getModelTrainFileInfo(uuid)); } + + @Operation(summary = "모델관리 > 모델별 진행 상황", description = "모델관리 > 모델별 진행 상황 API") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "조회 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = ModelProgressStepDto.class))), + @ApiResponse(responseCode = "404", description = "데이터셋을 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) + @GetMapping("/progress/{uuid}") + public ApiResponseDto> findModelTrainProgressInfo( + @Parameter(description = "모델 uuid", example = "95cb116c-380a-41c0-98d8-4d1142f15bbf") + @PathVariable + UUID uuid) { + return ApiResponseDto.ok(modelTrainDetailService.findModelTrainProgressInfo(uuid)); + } } diff --git a/src/main/java/com/kamco/cd/training/model/dto/ModelTrainMngDto.java b/src/main/java/com/kamco/cd/training/model/dto/ModelTrainMngDto.java index c1e2db1..54d174b 100644 --- a/src/main/java/com/kamco/cd/training/model/dto/ModelTrainMngDto.java +++ b/src/main/java/com/kamco/cd/training/model/dto/ModelTrainMngDto.java @@ -312,4 +312,16 @@ public class ModelTrainMngDto { return formatDuration(this.packingStrtDttm, this.packingEndDttm); } } + + @Getter + @Builder + @AllArgsConstructor + public static class ModelProgressStepDto { + + private int step; + private String status; + @JsonFormatDttm private ZonedDateTime startTime; + @JsonFormatDttm private ZonedDateTime endTime; + private boolean isError; + } } diff --git a/src/main/java/com/kamco/cd/training/model/service/ModelTrainDetailService.java b/src/main/java/com/kamco/cd/training/model/service/ModelTrainDetailService.java index 34f8480..7873f63 100644 --- a/src/main/java/com/kamco/cd/training/model/service/ModelTrainDetailService.java +++ b/src/main/java/com/kamco/cd/training/model/service/ModelTrainDetailService.java @@ -14,6 +14,7 @@ import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelValidationMetric import com.kamco.cd.training.model.dto.ModelTrainDetailDto.TransferDetailDto; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.TransferHyperSummary; import com.kamco.cd.training.model.dto.ModelTrainMngDto.Basic; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ModelProgressStepDto; import com.kamco.cd.training.postgres.core.ModelTrainDetailCoreService; import com.kamco.cd.training.postgres.core.ModelTrainMngCoreService; import java.util.ArrayList; @@ -121,4 +122,8 @@ public class ModelTrainDetailService { public ModelFileInfo getModelTrainFileInfo(UUID uuid) { return modelTrainDetailCoreService.getModelTrainFileInfo(uuid); } + + public List findModelTrainProgressInfo(UUID uuid) { + return modelTrainDetailCoreService.findModelTrainProgressInfo(uuid); + } } diff --git a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainDetailCoreService.java b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainDetailCoreService.java index 7573f3b..6e1b2b9 100644 --- a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainDetailCoreService.java +++ b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainDetailCoreService.java @@ -14,6 +14,7 @@ import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelTrainMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelValidationMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.TransferHyperSummary; import com.kamco.cd.training.model.dto.ModelTrainMngDto.Basic; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ModelProgressStepDto; import com.kamco.cd.training.postgres.entity.ModelMasterEntity; import com.kamco.cd.training.postgres.repository.model.ModelConfigRepository; import com.kamco.cd.training.postgres.repository.model.ModelDetailRepository; @@ -102,4 +103,8 @@ public class ModelTrainDetailCoreService { public ModelFileInfo getModelTrainFileInfo(UUID uuid) { return modelDetailRepository.getModelTrainFileInfo(uuid); } + + public List findModelTrainProgressInfo(UUID uuid) { + return modelDetailRepository.findModelTrainProgressInfo(uuid); + } } diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryCustom.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryCustom.java index 1f7cf09..dcde833 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryCustom.java @@ -9,6 +9,7 @@ import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelTestMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelTrainMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelValidationMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.TransferHyperSummary; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ModelProgressStepDto; import com.kamco.cd.training.postgres.entity.ModelMasterEntity; import java.util.List; import java.util.Optional; @@ -37,4 +38,6 @@ public interface ModelDetailRepositoryCustom { ModelBestEpoch getModelTrainBestEpoch(UUID uuid); ModelFileInfo getModelTrainFileInfo(UUID uuid); + + List findModelTrainProgressInfo(UUID uuid); } diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryImpl.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryImpl.java index f6a45b3..014c201 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelDetailRepositoryImpl.java @@ -19,12 +19,14 @@ import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelTestMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelTrainMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.ModelValidationMetrics; import com.kamco.cd.training.model.dto.ModelTrainDetailDto.TransferHyperSummary; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ModelProgressStepDto; import com.kamco.cd.training.postgres.entity.ModelMasterEntity; import com.kamco.cd.training.postgres.entity.QModelHyperParamEntity; import com.kamco.cd.training.postgres.entity.QModelMasterEntity; import com.querydsl.core.types.Projections; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -287,4 +289,70 @@ public class ModelDetailRepositoryImpl implements ModelDetailRepositoryCustom { .where(modelMasterEntity.uuid.eq(uuid)) .fetchOne(); } + + @Override + public List findModelTrainProgressInfo(UUID uuid) { + ModelMasterEntity entity = findByModelByUUID(uuid); + if (entity == null) { + return List.of(); + } + + List steps = new ArrayList<>(); + + // 0단계 : 대기 상태 + steps.add( + ModelProgressStepDto.builder() + .step(0) + .status(TrainStatusType.READY.getId()) + .startTime(entity.getCreatedDttm()) + .endTime(null) + .isError(false) + .build()); + + // 1단계 : Train/Validation 실행 + boolean step1Active = + entity.getStep1StrtDttm() != null + && !TrainStatusType.READY.getId().equals(entity.getStep1State()); + + if (step1Active) { + steps.add( + ModelProgressStepDto.builder() + .step(1) + .status(entity.getStep1State()) + .startTime(entity.getStep1StrtDttm()) + .endTime(entity.getStep1EndDttm()) + .isError(TrainStatusType.ERROR.getId().equals(entity.getStep1State())) + .build()); + } + + // 2단계 : Test 실행 + boolean step2Done = entity.getStep2State() != null; + + if (step2Done) { + steps.add( + ModelProgressStepDto.builder() + .step(2) + .status(entity.getStep2State()) + .startTime(entity.getStep2StrtDttm()) + .endTime(entity.getStep2EndDttm()) + .isError(TrainStatusType.ERROR.getId().equals(entity.getStep2State())) + .build()); + } + + // 3단계 : 패키징 + boolean step3Done = entity.getPackingState() != null; + + if (step3Done) { + steps.add( + ModelProgressStepDto.builder() + .step(3) + .status(entity.getPackingState()) + .startTime(entity.getPackingStrtDttm()) + .endTime(entity.getPackingEndDttm()) + .isError(TrainStatusType.ERROR.getId().equals(entity.getPackingState())) + .build()); + } + + return steps; + } }