[KC-99] 추론관리 등록 ai api 추가중, spotless 적용

This commit is contained in:
2026-01-09 16:12:21 +09:00
parent 3161b6dea7
commit 11b72e80cd
19 changed files with 355 additions and 77 deletions

View File

@@ -1,26 +1,44 @@
package com.kamco.cd.kamcoback.inference.service;
import com.kamco.cd.kamcoback.common.exception.CustomApiException;
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.Detail;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList;
import com.kamco.cd.kamcoback.inference.dto.InferenceSendDto;
import com.kamco.cd.kamcoback.model.dto.ModelMngDto.Basic;
import com.kamco.cd.kamcoback.postgres.core.InferenceResultCoreService;
import com.kamco.cd.kamcoback.postgres.core.MapSheetMngCoreService;
import com.kamco.cd.kamcoback.postgres.core.ModelMngCoreService;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
@Log4j2
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class InferenceResultService {
private final InferenceResultCoreService inferenceResultCoreService;
private final MapSheetMngCoreService mapSheetMngCoreService;
private final ModelMngCoreService modelMngCoreService;
private final WebClient webClient;
@Value("${inference.url}")
private String inferenceUrl;
/**
* 추론관리 목록
@@ -39,7 +57,85 @@ public class InferenceResultService {
*/
@Transactional
public UUID saveInferenceInfo(InferenceResultDto.RegReq req) {
return inferenceResultCoreService.saveInferenceInfo(req);
UUID uuid = inferenceResultCoreService.saveInferenceInfo(req);
// TODO tif 없으면 전년도 파일 조회 쿼리 추가해야함
// TODO 도엽 개수를 target 기준으로 맞춰야함
this.getSceneInference(String.valueOf(req.getCompareYyyy()), req.getMapSheetNum());
this.getSceneInference(String.valueOf(req.getTargetYyyy()), req.getMapSheetNum());
InferenceSendDto m1 = this.getModelInfo(req.getModel1Uuid());
InferenceSendDto m2 = this.getModelInfo(req.getModel2Uuid());
InferenceSendDto m3 = this.getModelInfo(req.getModel3Uuid());
// ensureAccepted(m1);
// ensureAccepted(m2);
// ensureAccepted(m3);
return uuid;
}
/**
* 추론 AI API 호출
*
* @param dto
*/
private Mono<Boolean> inferenceSend(InferenceSendDto dto) {
return webClient
.post()
.uri("http://localhost:8080/test") // inferenceUrl
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(dto)
.retrieve()
.toBodilessEntity()
.map(res -> res.getStatusCode().is2xxSuccessful())
.doOnNext(ok -> log.info("발송결과={}", ok))
.onErrorReturn(false);
}
private void ensureAccepted(InferenceSendDto dto) {
Boolean ok =
this.inferenceSend(dto)
.timeout(java.time.Duration.ofSeconds(3)) // 접수는 빨리 와야 함
.onErrorReturn(false) // 타임아웃/통신오류도 실패 처리
.block(java.time.Duration.ofSeconds(4)); // 최종 안전장치 (짧게!)
if (!Boolean.TRUE.equals(ok)) {
// 여기서 예외가 터져야 @Transactional 롤백됨
throw new CustomApiException("BAD_GATEWAY", HttpStatus.BAD_GATEWAY);
}
}
/**
* 모델정보 조회 dto 생성 후 반환
*
* @param id
* @return
*/
private InferenceSendDto getModelInfo(Long id) {
Basic modelInfo = modelMngCoreService.findByModelUuid(id);
InferenceSendDto sendDto = new InferenceSendDto();
sendDto.setModel_version(modelInfo.getModelVer());
sendDto.setCd_model_path(modelInfo.getCdModelPath());
sendDto.setCd_model_config(modelInfo.getCdModelConfig());
sendDto.setCls_model_path(modelInfo.getClsModelPath());
// sendDto.setCls_model_version(modelInfo.getCls);
sendDto.setCd_model_type(modelInfo.getModelType());
// sendDto.setPriority(modelInfo.getPriority());
return sendDto;
}
/**
* geojson 파일 생성
*
* @param yyyy
* @param mapSheetNums
*/
private void getSceneInference(String yyyy, List<String> mapSheetNums) {
mapSheetMngCoreService.getSceneInference(yyyy, mapSheetNums);
}
/**