From d2ca94ea5586f74319341714a943ad8f68e4df54 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Thu, 19 Feb 2026 15:34:18 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=ED=95=99=EC=8A=B5=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20>=20=EB=AA=A9=EB=A1=9D=20API=20=EB=A9=94=EB=AA=A8,?= =?UTF-8?q?=EC=9E=91=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/ModelTrainMngApiController.java | 4 +- .../training/model/dto/ModelTrainMngDto.java | 94 +++++++++++++++++++ .../model/service/ModelTrainMngService.java | 2 +- .../core/ModelTrainMngCoreService.java | 9 +- .../model/ModelMngRepositoryCustom.java | 3 +- .../model/ModelMngRepositoryImpl.java | 39 +++++++- 6 files changed, 140 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java index 8068bd0..2a081cf 100644 --- a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java +++ b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java @@ -6,7 +6,7 @@ import com.kamco.cd.training.dataset.dto.DatasetDto.DatasetReq; import com.kamco.cd.training.dataset.dto.DatasetDto.SelectDataSet; import com.kamco.cd.training.model.dto.ModelConfigDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto; -import com.kamco.cd.training.model.dto.ModelTrainMngDto.Basic; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ListDto; import com.kamco.cd.training.model.service.ModelTrainMngService; import com.kamco.cd.training.train.service.ModelTestMetricsJobService; import com.kamco.cd.training.train.service.ModelTrainMetricsJobService; @@ -55,7 +55,7 @@ public class ModelTrainMngApiController { @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @GetMapping("/list") - public ApiResponseDto> findByModelList( + public ApiResponseDto> findByModelList( @Parameter( description = "상태코드", example = "IN_PROGRESS", 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 3b4c0db..c1e2db1 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 @@ -218,4 +218,98 @@ public class ModelTrainMngDto { @Schema(description = "메모", example = "메모 입니다.") private String memo; } + + @Schema(name = "모델학습관리 목록", description = "모델학습관리 목록") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class ListDto { + + private Long id; + private UUID uuid; + private String modelVer; + @JsonFormatDttm private ZonedDateTime startDttm; + @JsonFormatDttm private ZonedDateTime step1StrtDttm; + @JsonFormatDttm private ZonedDateTime step1EndDttm; + @JsonFormatDttm private ZonedDateTime step2StrtDttm; + @JsonFormatDttm private ZonedDateTime step2EndDttm; + private String step1Status; + private String step2Status; + private String statusCd; + private String trainType; + private String modelNo; + private Long currentAttemptId; + private String requestPath; + + private String packingState; + private ZonedDateTime packingStrtDttm; + private ZonedDateTime packingEndDttm; + + private String memo; + private String userNm; + + public String getStatusName() { + if (this.statusCd == null || this.statusCd.isBlank()) return null; + try { + return TrainStatusType.valueOf(this.statusCd).getText(); // 또는 getName() + } catch (IllegalArgumentException e) { + return this.statusCd; // 매핑 못하면 코드 그대로 반환(원하면 null 처리) + } + } + + public String getStep1StatusName() { + if (this.step1Status == null || this.step1Status.isBlank()) return null; + try { + return TrainStatusType.valueOf(this.step1Status).getText(); // 또는 getName() + } catch (IllegalArgumentException e) { + return this.step1Status; // 매핑 못하면 코드 그대로 반환(원하면 null 처리) + } + } + + public String getStep2StatusName() { + if (this.step2Status == null || this.step2Status.isBlank()) return null; + try { + return TrainStatusType.valueOf(this.step2Status).getText(); // 또는 getName() + } catch (IllegalArgumentException e) { + return this.step2Status; // 매핑 못하면 코드 그대로 반환(원하면 null 처리) + } + } + + public String getTrainTypeName() { + if (this.trainType == null || this.trainType.isBlank()) return null; + try { + return TrainType.valueOf(this.trainType).getText(); // 또는 getName() + } catch (IllegalArgumentException e) { + return this.trainType; // 매핑 못하면 코드 그대로 반환(원하면 null 처리) + } + } + + private String formatDuration(ZonedDateTime start, ZonedDateTime end) { + if (start == null || end == null) { + return null; + } + + long totalSeconds = Math.abs(Duration.between(start, end).getSeconds()); + + long hours = totalSeconds / 3600; + long minutes = (totalSeconds % 3600) / 60; + long seconds = totalSeconds % 60; + + return String.format("%d시간 %d분 %d초", hours, minutes, seconds); + } + + public String getStep1Duration() { + return formatDuration(this.step1StrtDttm, this.step1EndDttm); + } + + public String getStep2Duration() { + return formatDuration(this.step2StrtDttm, this.step2EndDttm); + } + + public String getPackingDuration() { + return formatDuration(this.packingStrtDttm, this.packingEndDttm); + } + } } diff --git a/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java b/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java index 345218e..a5fb3d2 100644 --- a/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java +++ b/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java @@ -38,7 +38,7 @@ public class ModelTrainMngService { * @param searchReq 검색 조건 * @return 페이징 처리된 모델 목록 */ - public Page getModelList(SearchReq searchReq) { + public Page getModelList(SearchReq searchReq) { return modelTrainMngCoreService.findByModelList(searchReq); } diff --git a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java index 25f7906..2b92a9f 100644 --- a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java +++ b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java @@ -10,7 +10,7 @@ import com.kamco.cd.training.dataset.dto.DatasetDto.DatasetReq; import com.kamco.cd.training.dataset.dto.DatasetDto.SelectDataSet; import com.kamco.cd.training.model.dto.ModelConfigDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto; -import com.kamco.cd.training.model.dto.ModelTrainMngDto.Basic; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ListDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto.TrainingDataset; import com.kamco.cd.training.postgres.entity.ModelConfigEntity; import com.kamco.cd.training.postgres.entity.ModelDatasetEntity; @@ -53,9 +53,10 @@ public class ModelTrainMngCoreService { * @param searchReq 검색 조건 * @return 페이징 처리된 모델 목록 */ - public Page findByModelList(ModelTrainMngDto.SearchReq searchReq) { - Page entityPage = modelMngRepository.findByModels(searchReq); - return entityPage.map(ModelMasterEntity::toDto); + public Page findByModelList(ModelTrainMngDto.SearchReq searchReq) { + // Page entityPage = modelMngRepository.findByModels(searchReq); + // return entityPage.map(ModelMasterEntity::toDto); + return modelMngRepository.findByModels(searchReq); } /** diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java index ab83229..ec84098 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java @@ -1,6 +1,7 @@ package com.kamco.cd.training.postgres.repository.model; import com.kamco.cd.training.model.dto.ModelTrainMngDto; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ListDto; import com.kamco.cd.training.postgres.entity.ModelMasterEntity; import com.kamco.cd.training.train.dto.TrainRunRequest; import java.util.Optional; @@ -15,7 +16,7 @@ public interface ModelMngRepositoryCustom { * @param searchReq * @return */ - Page findByModels(ModelTrainMngDto.SearchReq searchReq); + Page findByModels(ModelTrainMngDto.SearchReq searchReq); Optional findByUuid(UUID uuid); diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java index 4ea1daf..9ef7c57 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java @@ -1,11 +1,13 @@ package com.kamco.cd.training.postgres.repository.model; +import static com.kamco.cd.training.postgres.entity.QMemberEntity.memberEntity; import static com.kamco.cd.training.postgres.entity.QModelConfigEntity.modelConfigEntity; import static com.kamco.cd.training.postgres.entity.QModelHyperParamEntity.modelHyperParamEntity; import static com.kamco.cd.training.postgres.entity.QModelMasterEntity.modelMasterEntity; import com.kamco.cd.training.common.enums.TrainStatusType; import com.kamco.cd.training.model.dto.ModelTrainMngDto; +import com.kamco.cd.training.model.dto.ModelTrainMngDto.ListDto; import com.kamco.cd.training.postgres.entity.ModelMasterEntity; import com.kamco.cd.training.train.dto.TrainRunRequest; import com.querydsl.core.BooleanBuilder; @@ -34,7 +36,7 @@ public class ModelMngRepositoryImpl implements ModelMngRepositoryCustom { * @return */ @Override - public Page findByModels(ModelTrainMngDto.SearchReq req) { + public Page findByModels(ModelTrainMngDto.SearchReq req) { Pageable pageable = req.toPageable(); BooleanBuilder builder = new BooleanBuilder(); @@ -52,9 +54,36 @@ public class ModelMngRepositoryImpl implements ModelMngRepositoryCustom { builder.and(modelMasterEntity.delYn.isFalse()); - List content = + List content = queryFactory - .selectFrom(modelMasterEntity) + .select( + Projections.constructor( + ListDto.class, + modelMasterEntity.id, + modelMasterEntity.uuid, + modelMasterEntity.modelVer, + modelMasterEntity.strtDttm, + modelMasterEntity.step1StrtDttm, + modelMasterEntity.step1EndDttm, + modelMasterEntity.step2StrtDttm, + modelMasterEntity.step2EndDttm, + modelMasterEntity.step1State, + modelMasterEntity.step2State, + modelMasterEntity.statusCd, + modelMasterEntity.trainType, + modelMasterEntity.modelNo, + modelMasterEntity.currentAttemptId, + modelMasterEntity.requestPath, + modelMasterEntity.packingState, + modelMasterEntity.packingStrtDttm, + modelMasterEntity.packingEndDttm, + modelConfigEntity.memo, + memberEntity.name)) + .from(modelMasterEntity) + .innerJoin(modelConfigEntity) + .on(modelMasterEntity.id.eq(modelConfigEntity.model.id)) + .leftJoin(memberEntity) + .on(modelMasterEntity.createdUid.eq(memberEntity.id)) .where(builder) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -66,6 +95,10 @@ public class ModelMngRepositoryImpl implements ModelMngRepositoryCustom { queryFactory .select(modelMasterEntity.count()) .from(modelMasterEntity) + .innerJoin(modelConfigEntity) + .on(modelMasterEntity.id.eq(modelConfigEntity.model.id)) + .leftJoin(memberEntity) + .on(modelMasterEntity.createdUid.eq(memberEntity.id)) .where(builder) .fetchOne();