diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java index 3dd7922d..31fedefb 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java @@ -399,10 +399,14 @@ public class InferenceDetailDto { public static class InferenceBatchSheet { private Long id; + private UUID uuid; private Long m1BatchId; private Long m2BatchId; private Long m3BatchId; private String status; private String runningModelType; + private UUID m1ModelUuid; + private UUID m2ModelUuid; + private UUID m3ModelUuid; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceProgressDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceProgressDto.java index 63c073e1..b3d6edae 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceProgressDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceProgressDto.java @@ -11,36 +11,36 @@ import lombok.Setter; public class InferenceProgressDto { private InferenceProgressDto.pred_requests_areas pred_requests_areas; - private String model1_version; - private String model2_version; - private String model3_version; - private String cd_model_path; - private String cd_model_config; - private String cls_model_path; - private String cls_model_version; - private String cd_model_type; + private String modelVersion; + private String cdModelPath; + private String cdModelFileName; + private String cdModelConfigPath; + private String cdModelConfigFileName; + private String cdModelClsPath; + private String cdModelClsFileName; + private String clsModelVersion; private Integer priority; public InferenceProgressDto( InferenceProgressDto.pred_requests_areas pred_requests_areas, - String model1_version, - String model2_version, - String model3_version, - String cd_model_path, - String cd_model_config, - String cls_model_path, - String cls_model_version, - String cd_model_type, + String modelVersion, + String cdModelPath, + String cdModelFileName, + String cdModelConfigPath, + String cdModelConfigFileName, + String cdModelClsPath, + String cdModelClsFileName, + String clsModelVersion, Integer priority) { this.pred_requests_areas = pred_requests_areas; - this.model1_version = model1_version; - this.model2_version = model2_version; - this.model3_version = model3_version; - this.cd_model_path = cd_model_path; - this.cd_model_config = cd_model_config; - this.cls_model_path = cls_model_path; - this.cls_model_version = cls_model_version; - this.cd_model_type = cd_model_type; + this.modelVersion = modelVersion; + this.cdModelPath = cdModelPath; + this.cdModelFileName = cdModelFileName; + this.cdModelConfigPath = cdModelConfigPath; + this.cdModelConfigFileName = cdModelConfigFileName; + this.cdModelClsPath = cdModelClsPath; + this.cdModelClsFileName = cdModelClsFileName; + this.clsModelVersion = clsModelVersion; this.priority = priority; } 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 69b85394..c555d7d8 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 @@ -8,6 +8,7 @@ import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import java.time.Duration; import java.time.LocalDate; import java.time.ZonedDateTime; import java.util.Arrays; @@ -200,6 +201,7 @@ public class InferenceResultDto { @NoArgsConstructor @AllArgsConstructor public static class InferenceStatusDetailDto { + private String title; private Integer compareYyyy; private Integer targetYyyy; @@ -207,7 +209,15 @@ public class InferenceResultDto { private String mapSheetScope; @JsonFormatDttm private ZonedDateTime inferStartDttm; @JsonFormatDttm private ZonedDateTime inferEndDttm; - private Long detectingCnt; + private Long detectingCnt = 0L; + private Long detectingEndCnt = 0L; + + @JsonFormatDttm private ZonedDateTime m1ModelStartDttm; + @JsonFormatDttm private ZonedDateTime m1ModelEndDttm; + @JsonFormatDttm private ZonedDateTime m2ModelStartDttm; + @JsonFormatDttm private ZonedDateTime m2ModelEndDttm; + @JsonFormatDttm private ZonedDateTime m3ModelStartDttm; + @JsonFormatDttm private ZonedDateTime m3ModelEndDttm; private String model1Ver; private String model2Ver; @@ -222,6 +232,13 @@ public class InferenceResultDto { ZonedDateTime inferStartDttm, ZonedDateTime inferEndDttm, Long detectingCnt, + Long detectingEndCnt, + ZonedDateTime m1ModelStartDttm, + ZonedDateTime m1ModelEndDttm, + ZonedDateTime m2ModelStartDttm, + ZonedDateTime m2ModelEndDttm, + ZonedDateTime m3ModelStartDttm, + ZonedDateTime m3ModelEndDttm, String model1Ver, String model2Ver, String model3Ver) { @@ -233,19 +250,27 @@ public class InferenceResultDto { this.inferStartDttm = inferStartDttm; this.inferEndDttm = inferEndDttm; this.detectingCnt = detectingCnt; + this.detectingEndCnt = detectingEndCnt; + this.m1ModelStartDttm = m1ModelStartDttm; + this.m1ModelEndDttm = m1ModelEndDttm; + this.m2ModelStartDttm = m2ModelStartDttm; + this.m2ModelEndDttm = m2ModelEndDttm; + this.m3ModelStartDttm = m3ModelStartDttm; + this.m3ModelEndDttm = m3ModelEndDttm; this.model1Ver = model1Ver; this.model2Ver = model2Ver; this.model3Ver = model3Ver; + + if (this.detectingEndCnt == null) this.detectingEndCnt = 0L; } private String usedServerName; - private Long detectingEndCnt = 7L; private String model1VerStatus = "PROCCESING"; private String model1VerStatusName = "진행중"; private String model2VerStatus = "PROCCESING"; private String model2VerStatusName = "진행중"; private String model3VerStatus = "PROCCESING"; - private String model4VerStatusName = "진행중"; + private String model3VerStatusName = "진행중"; public String getDetectOptionName() { if (this.detectOption.equals("EXCL")) return "추론제외"; @@ -253,9 +278,55 @@ public class InferenceResultDto { } public String getMapSheetScopeName() { - if (this.detectOption.equals("ALL")) return "전체"; + if (this.mapSheetScope.equals("ALL")) return "전체"; return "부분"; } + + public double getDetectingRate() { + if (this.detectingCnt == null || this.detectingCnt == 0L) { + return 0.0; + } + + if (this.detectingEndCnt == null) this.detectingEndCnt = 0L; + + return (double) (this.detectingEndCnt / this.detectingCnt) * 100.0; + } + + public String getM1DurationFormatted() { + if (this.m1ModelStartDttm == null || this.m1ModelEndDttm == null) { + return "00:00:00"; + } + Duration duration = Duration.between(m1ModelStartDttm, m1ModelEndDttm); + long hours = duration.toHours(); + long minutes = duration.toMinutesPart(); + long seconds = duration.toSecondsPart(); + + return String.format("%02d:%02d:%02d", hours, minutes, seconds); + } + + public String getM2DurationFormatted() { + if (this.m2ModelStartDttm == null || this.m2ModelEndDttm == null) { + return "00:00:00"; + } + Duration duration = Duration.between(this.m2ModelStartDttm, this.m2ModelEndDttm); + long hours = duration.toHours(); + long minutes = duration.toMinutesPart(); + long seconds = duration.toSecondsPart(); + + return String.format("%02d:%02d:%02d", hours, minutes, seconds); + } + + public String getM3DurationFormatted() { + if (this.m3ModelStartDttm == null || this.m3ModelEndDttm == null) { + return "00:00:00"; + } + Duration duration = Duration.between(this.m3ModelStartDttm, this.m3ModelEndDttm); + long hours = duration.toHours(); + long minutes = duration.toMinutesPart(); + long seconds = duration.toSecondsPart(); + + return String.format("%02d:%02d:%02d", hours, minutes, seconds); + } } @Getter @@ -372,7 +443,13 @@ public class InferenceResultDto { private String status; private String type; private ZonedDateTime inferStartDttm; + private ZonedDateTime inferEndDttm; + private Long detectEndCnt; private String modelComparePath; private String modelTargetPath; + private String modelModelPath; + private ZonedDateTime modelStartDttm; + private ZonedDateTime modelEndDttm; + private Long updateUid; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java index 8e134a30..7e21b5dc 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java @@ -212,6 +212,7 @@ public class InferenceResultService { saveInferenceAiDto.setInferStartDttm(ZonedDateTime.now()); saveInferenceAiDto.setModelComparePath(modelComparePath); saveInferenceAiDto.setModelTargetPath(modelTargetPath); + saveInferenceAiDto.setModelStartDttm(ZonedDateTime.now()); inferenceResultCoreService.update(saveInferenceAiDto); } @@ -412,8 +413,11 @@ public class InferenceResultService { String serverNames = ""; for (InferenceServerStatusDto server : servers) { - if (serverNames.equals("")) serverNames = server.getServerName(); - else serverNames = serverNames + "," + server.getServerName(); + if (serverNames.equals("")) { + serverNames = server.getServerName(); + } else { + serverNames = serverNames + "," + server.getServerName(); + } } InferenceStatusDetailDto dto = inferenceResultCoreService.getInferenceStatus(uuid); 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 70ea79b2..ba34833c 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 @@ -6,6 +6,7 @@ import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.Dashboard; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.InferenceBatchSheet; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet; +import com.kamco.cd.kamcoback.inference.dto.InferenceProgressDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceStatusDetailDto; @@ -24,6 +25,7 @@ import com.kamco.cd.kamcoback.postgres.repository.scene.MapInkx5kRepository; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityNotFoundException; import jakarta.validation.constraints.NotNull; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -229,16 +231,46 @@ public class InferenceResultCoreService { if (request.getType().equals("M1")) { entity.setM1ModelBatchId(request.getBatchId()); + + if (request.getModelStartDttm() != null) { + entity.setM1ModelStartDttm(request.getModelStartDttm()); + } + + if (request.getModelEndDttm() != null) { + entity.setM1ModelEndDttm(request.getModelEndDttm()); + } + } else if (request.getType().equals("M2")) { entity.setM2ModelBatchId(request.getBatchId()); + + if (request.getModelStartDttm() != null) { + entity.setM2ModelStartDttm(request.getModelStartDttm()); + } + + if (request.getModelEndDttm() != null) { + entity.setM2ModelEndDttm(request.getModelEndDttm()); + } + } else if (request.getType().equals("M3")) { entity.setM3ModelBatchId(request.getBatchId()); + + if (request.getModelStartDttm() != null) { + entity.setM3ModelStartDttm(request.getModelStartDttm()); + } + + if (request.getModelEndDttm() != null) { + entity.setM3ModelEndDttm(request.getModelEndDttm()); + } } if (request.getInferStartDttm() != null) { entity.setInferStartDttm(request.getInferStartDttm()); } + if (request.getInferEndDttm() != null) { + entity.setInferEndDttm(request.getInferEndDttm()); + } + if (request.getModelComparePath() != null) { entity.setModelComparePath(request.getModelComparePath()); } @@ -247,8 +279,23 @@ public class InferenceResultCoreService { entity.setModelTargetPath(request.getModelTargetPath()); } - entity.setRunningModelType(request.getType()); - entity.setStatus(request.getStatus()); + if (request.getDetectEndCnt() != null) { + entity.setDetectEndCnt(request.getDetectEndCnt()); + } + + if (request.getType() != null) { + entity.setRunningModelType(request.getType()); + } + + if (request.getStatus() != null) { + entity.setStatus(request.getStatus()); + } + + if (request.getUpdateUid() != null) { + entity.setUpdatedUid(request.getUpdateUid()); + } + + entity.setUpdatedDttm(ZonedDateTime.now()); } public List getInferenceServerStatusList() { @@ -263,17 +310,20 @@ public class InferenceResultCoreService { InferenceBatchSheet inferenceBatchSheet = new InferenceBatchSheet(); inferenceBatchSheet.setId(entity.getId()); + inferenceBatchSheet.setUuid(entity.getUuid()); inferenceBatchSheet.setM1BatchId(entity.getM1ModelBatchId()); inferenceBatchSheet.setM2BatchId(entity.getM2ModelBatchId()); inferenceBatchSheet.setM3BatchId(entity.getM3ModelBatchId()); inferenceBatchSheet.setStatus(entity.getStatus()); inferenceBatchSheet.setRunningModelType(entity.getRunningModelType()); + inferenceBatchSheet.setM1ModelUuid(entity.getM1ModelUuid()); + inferenceBatchSheet.setM2ModelUuid(entity.getM2ModelUuid()); + inferenceBatchSheet.setM3ModelUuid(entity.getM3ModelUuid()); return inferenceBatchSheet; } - public SaveInferenceAiDto getInferenceAiResultById(Long id) { - - return null; + public InferenceProgressDto getInferenceAiResultById(Long id, String type, UUID modelUuid) { + return mapSheetLearnRepository.getInferenceAiResultById(id, modelUuid); } public InferenceStatusDetailDto getInferenceStatus(UUID uuid) { 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 54000bc1..26fe8129 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 @@ -124,6 +124,24 @@ public class MapSheetLearnEntity { @Column(name = "model_target_path") private String modelTargetPath; + @Column(name = "m1_model_start_dttm") + private ZonedDateTime m1ModelStartDttm; + + @Column(name = "m2_model_start_dttm") + private ZonedDateTime m2ModelStartDttm; + + @Column(name = "m3_model_start_dttm") + private ZonedDateTime m3ModelStartDttm; + + @Column(name = "m1_model_end_dttm") + private ZonedDateTime m1ModelEndDttm; + + @Column(name = "m2_model_end_dttm") + private ZonedDateTime m2ModelEndDttm; + + @Column(name = "m3_model_end_dttm") + private ZonedDateTime m3ModelEndDttm; + public InferenceResultDto.ResultList toDto() { return new InferenceResultDto.ResultList( this.uuid, diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryCustom.java index 6b19c288..8b8ecac5 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryCustom.java @@ -20,7 +20,7 @@ public interface MapSheetLearnRepositoryCustom { Optional getInferenceResultByStatus(String status); - Optional getInferenceAiResultById(Long id); + InferenceProgressDto getInferenceAiResultById(Long id, UUID modelUuid); public InferenceStatusDetailDto getInferenceStatus(UUID 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 a6522291..931585bb 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 @@ -171,6 +171,7 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto mapSheetLearnEntity.inferStartDttm, mapSheetLearnEntity.inferEndDttm, mapSheetLearnEntity.detectingCnt, + mapSheetLearnEntity.detectEndCnt, m1Model.modelVer.as("model1Ver"), m2Model.modelVer.as("model2Ver"), m3Model.modelVer.as("model3Ver"))) @@ -188,32 +189,34 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto } @Override - public Optional getInferenceAiResultById(Long id) { - // InferenceProgressDto dto = - // queryFactory - // .select( - // Projections.constructor( - // InferenceProgressDto.class, - // Projections.constructor( - // InferenceProgressDto.pred_requests_areas.class, - // mapSheetLearnEntity.compareYyyy, - // mapSheetLearnEntity.targetYyyy, - // mapSheetLearnEntity.modelComparePath, - // mapSheetLearnEntity.modelTargetPath - // ), - // modelMngEntity.uuid.eq(mapSheetLearnEntity.m1ModelUuid).as("m1ModelUuid"), - // modelMngEntity.uuid.eq(mapSheetLearnEntity.m2ModelUuid).as("m2ModelUuid"), - // mapSheetLearnEntity.cdModelPath, - // mapSheetLearnEntity.cdModelConfig, - // mapSheetLearnEntity.clsModelPath, - // mapSheetLearnEntity.clsModelVersion, - // mapSheetLearnEntity.cdModelType, - // mapSheetLearnEntity.priority - // ) - // ) - // .from(mapSheetLearnEntity) - // .where(mapSheetLearnEntity.id.eq(id)) - // .fetchOne(); - return Optional.empty(); + public InferenceProgressDto getInferenceAiResultById(Long id, UUID modelUuid) { + + QModelMngEntity model = new QModelMngEntity("model"); + + InferenceProgressDto dto = + queryFactory + .select( + Projections.constructor( + InferenceProgressDto.class, + Projections.constructor( + InferenceProgressDto.pred_requests_areas.class, + mapSheetLearnEntity.compareYyyy, + mapSheetLearnEntity.targetYyyy, + mapSheetLearnEntity.modelComparePath, + mapSheetLearnEntity.modelTargetPath), + model.modelVer.as("modelVer"), + model.cdModelPath.as("cdModelPath"), + model.cdModelFileName.as("cdModelFileName"), + model.cdModelConfigPath.as("cdModelConfigPath"), + model.cdModelConfigFileName.as("cdModelConfigFileName"), + model.clsModelPath, + model.clsModelFileName, + model.clsModelVersion)) + .from(mapSheetLearnEntity) + .join(model) + .on(model.uuid.eq(modelUuid)) + .where(mapSheetLearnEntity.id.eq(id)) + .fetchOne(); + return dto; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetInferenceJobService.java b/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetInferenceJobService.java index 4599d04d..7dcaff75 100644 --- a/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetInferenceJobService.java +++ b/src/main/java/com/kamco/cd/kamcoback/scheduler/service/MapSheetInferenceJobService.java @@ -1,19 +1,30 @@ package com.kamco.cd.kamcoback.scheduler.service; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.kamco.cd.kamcoback.common.exception.CustomApiException; import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient; import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient.ExternalCallResult; import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.InferenceBatchSheet; +import com.kamco.cd.kamcoback.inference.dto.InferenceProgressDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.SaveInferenceAiDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.Status; +import com.kamco.cd.kamcoback.inference.dto.InferenceSendDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceSendDto.pred_requests_areas; import com.kamco.cd.kamcoback.postgres.core.InferenceResultCoreService; import com.kamco.cd.kamcoback.scheduler.dto.JobStatusDto; +import jakarta.transaction.Transactional; +import java.time.ZonedDateTime; import java.util.List; +import java.util.Map; +import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -31,13 +42,18 @@ public class MapSheetInferenceJobService { @Value("${inference.batch-url}") private String batchUrl; + @Value("${spring.profiles.active}") + private String profile; + + @Value("${inference.url}") + private String inferenceUrl; + + /** 추론 진행 배치 1분 */ @Scheduled(fixedDelay = 60_000) + @Transactional public void runBatch() { - log.info("1분 배치 시작"); try { - // TODO: 배치 로직 작성 - InferenceBatchSheet batchSheet = inferenceResultCoreService.getInferenceResultByStatus(Status.IN_PROGRESS.getId()); @@ -80,64 +96,131 @@ public class MapSheetInferenceJobService { String type = batchSheet.getRunningModelType(); if (type.equals("M1")) { - + // M1 완료되었으면 M2 실행 + this.startInference( + batchSheet.getId(), batchSheet.getUuid(), "M2", batchSheet.getM2ModelUuid()); + // 종료시간 + this.updateProcessingEndTimeByModel(batchSheet.getUuid(), ZonedDateTime.now(), "M1"); } else if (type.equals("M2")) { - + // M1 완료되었으면 M3 실행 + this.startInference( + batchSheet.getId(), batchSheet.getUuid(), "M3", batchSheet.getM3ModelUuid()); + // 종료시간 + this.updateProcessingEndTimeByModel(batchSheet.getUuid(), ZonedDateTime.now(), "M2"); } else if (type.equals("M3")) { - + // 완료 + SaveInferenceAiDto saveInferenceAiDto = new SaveInferenceAiDto(); + saveInferenceAiDto.setUuid(batchSheet.getUuid()); + saveInferenceAiDto.setStatus(Status.END.getId()); + saveInferenceAiDto.setInferEndDttm(ZonedDateTime.now()); + inferenceResultCoreService.update(saveInferenceAiDto); + // 종료시간 + this.updateProcessingEndTimeByModel(batchSheet.getUuid(), ZonedDateTime.now(), "M3"); } + } else { + SaveInferenceAiDto saveInferenceAiDto = new SaveInferenceAiDto(); + saveInferenceAiDto.setUuid(batchSheet.getUuid()); + saveInferenceAiDto.setStatus(Status.IN_PROGRESS.getId()); + saveInferenceAiDto.setDetectEndCnt(dto.getCompletedJobs().longValue()); + inferenceResultCoreService.update(saveInferenceAiDto); } - System.out.println(dto); - - Thread.sleep(3000); // 예시: 처리 시간 3초 - - } catch (InterruptedException | JsonProcessingException e) { + } catch (JsonProcessingException e) { Thread.currentThread().interrupt(); log.error("배치 중 인터럽트 발생", e); } - - log.info("1분 배치 종료"); } - private void startInference(Long id, String type) { - // InferenceResultDto.SaveInferenceAiDto req - // inferenceResultCoreService.getInferenceResultByU - // - // List mapSheetNum = req.getMapSheetNum(); - // List mapSheetNumList = new ArrayList<>(); - // - // for (MapSheetNumDto mapSheetDto : mapSheetNum) { - // mapSheetNumList.add(mapSheetDto.getMapSheetNum()); - // } - // - // String modelComparePath = - // this.getSceneInference(String.valueOf(req.getCompareYyyy()), mapSheetNumList); - // String modelTargetPath = - // this.getSceneInference(String.valueOf(req.getTargetYyyy()), mapSheetNumList); - // - // pred_requests_areas predRequestsAreas = new pred_requests_areas(); - // predRequestsAreas.setInput1_year(req.getCompareYyyy()); - // predRequestsAreas.setInput2_year(req.getTargetYyyy()); - // predRequestsAreas.setInput1_scene_path(modelComparePath); - // predRequestsAreas.setInput2_scene_path(modelTargetPath); - // - // InferenceSendDto m1 = this.getModelInfo(req.getModel1Uuid()); - // InferenceSendDto m2 = this.getModelInfo(req.getModel2Uuid()); - // InferenceSendDto m3 = this.getModelInfo(req.getModel3Uuid()); - // - // m1.setPred_requests_areas(predRequestsAreas); - // m2.setPred_requests_areas(predRequestsAreas); - // m3.setPred_requests_areas(predRequestsAreas); - // - // Long batchId = this.ensureAccepted(m1); - // - // SaveInferenceAiDto saveInferenceAiDto = new SaveInferenceAiDto(); - // saveInferenceAiDto.setUuid(uuid); - // saveInferenceAiDto.setBatchId(batchId); - // saveInferenceAiDto.setStatus(Status.IN_PROGRESS.getId()); - // saveInferenceAiDto.setType("M1"); - // saveInferenceAiDto.setInferStartDttm(ZonedDateTime.now()); - // inferenceResultCoreService.update(saveInferenceAiDto); + private void startInference(Long id, UUID uuid, String type, UUID modelUuid) { + + InferenceProgressDto progressDto = + inferenceResultCoreService.getInferenceAiResultById(id, type, modelUuid); + + pred_requests_areas predRequestsAreas = new pred_requests_areas(); + predRequestsAreas.setInput1_year(progressDto.getPred_requests_areas().getInput1_year()); + predRequestsAreas.setInput2_year(progressDto.getPred_requests_areas().getInput2_year()); + predRequestsAreas.setInput1_scene_path( + progressDto.getPred_requests_areas().getInput1_scene_path()); + predRequestsAreas.setInput2_scene_path( + progressDto.getPred_requests_areas().getInput2_scene_path()); + + InferenceSendDto m = new InferenceSendDto(); + m.setModel_version(progressDto.getModelVersion()); + m.setCd_model_path(progressDto.getCdModelPath() + "/" + progressDto.getCdModelFileName()); + m.setCd_model_config( + progressDto.getCdModelConfigPath() + "/" + progressDto.getCdModelConfigFileName()); + m.setCls_model_path( + progressDto.getCdModelClsPath() + "/" + progressDto.getCdModelClsFileName()); + m.setCls_model_version(progressDto.getClsModelVersion()); + m.setCd_model_type(type); + m.setPriority(progressDto.getPriority()); + + // 추론 다음모델 실행 + Long batchId = this.ensureAccepted(m); + + SaveInferenceAiDto saveInferenceAiDto = new SaveInferenceAiDto(); + saveInferenceAiDto.setUuid(uuid); + saveInferenceAiDto.setBatchId(batchId); + saveInferenceAiDto.setStatus(Status.IN_PROGRESS.getId()); + saveInferenceAiDto.setType(type); + saveInferenceAiDto.setModelStartDttm(ZonedDateTime.now()); + inferenceResultCoreService.update(saveInferenceAiDto); + } + + private Long ensureAccepted(InferenceSendDto dto) { + log.info("dto null? {}", dto == null); + ObjectMapper om = new ObjectMapper(); + try { + log.info("dto json={}", om.writeValueAsString(dto)); + } catch (Exception e) { + log.error(e.getMessage()); + } + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + + // TODO 추후 삭제 + if ("local".equals(profile)) { + dto.getPred_requests_areas().setInput1_scene_path("/kamco-nfs/requests/2023_local.geojson"); + dto.getPred_requests_areas().setInput2_scene_path("/kamco-nfs/requests/2024_local.geojson"); + } + + ExternalCallResult result = + externalHttpClient.call(inferenceUrl, HttpMethod.POST, dto, headers, String.class); + + int status = result.statusCode(); + String body = result.body(); + + if (status < 200 || status >= 300) { + throw new CustomApiException("BAD_GATEWAY", HttpStatus.BAD_GATEWAY); + } + + Long batchId = 0L; + + try { + List> list = + om.readValue(body, new TypeReference>>() {}); + + Integer batchIdInt = (Integer) list.get(0).get("batch_id"); + batchId = batchIdInt.longValue(); + if (list.isEmpty()) { + throw new IllegalStateException("Inference response is empty"); + } + + } catch (Exception e) { + log.error(e.getMessage()); + } + + return batchId; + } + + private void updateProcessingEndTimeByModel(UUID uuid, ZonedDateTime dateTime, String type) { + SaveInferenceAiDto saveInferenceAiDto = new SaveInferenceAiDto(); + saveInferenceAiDto.setUuid(uuid); + saveInferenceAiDto.setUpdateUid(0L); + saveInferenceAiDto.setModelEndDttm(dateTime); + saveInferenceAiDto.setType(type); + inferenceResultCoreService.update(saveInferenceAiDto); } }